打印
[STM8]

fmaster已经输出,有请香水城或其它高手,请回复?在线等..

[复制链接]
5284|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tuyanjun|  楼主 | 2011-9-1 09:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tuyanjun 于 2011-9-2 11:46 编辑

本人采样的是STM8S105C6T6芯片,执行以下指令时:

  PD_ODR|=0x10;                        BSET  0x500f,#4
  PD_ODR&=0xEF;                       BRES  0x500f,#4
产生一个PD4引脚的高电平,一片上运行程序用示波器测出来是260ns(约2个时钟周期)左右,一片上620ns(约5个时钟周期)左右。
此时本人用的时钟是8M,时长是125ns.
同样的程序写进同一型号的两个单片机里,指执行周期为什么差这么大???

同样的程序,却有上述问题!MCU工作正常,还可以串口通信。
沙发
IJK| | 2011-9-1 09:24 | 只看该作者
这种情况是有可能发生的,差异是由STM8的流水线造成的

使用特权

评论回复
板凳
tuyanjun|  楼主 | 2011-9-1 09:26 | 只看该作者

RE: 请香水城回复:重大问题

初步怀疑此芯片红色部分有bug.

时钟.JPG (50.88 KB )

时钟.JPG

使用特权

评论回复
地板
tuyanjun|  楼主 | 2011-9-1 09:36 | 只看该作者
请问IJK这样MCU的流水造成的,为什么一个MCU总是260ns,另一个总是620ns,反复烧写都不会变?如果是流水造成的应该会变啊

使用特权

评论回复
5
香水城| | 2011-9-1 09:56 | 只看该作者
请LZ在那两条指令之间加一个NOP,看看有什么结果?

使用特权

评论回复
6
tuyanjun|  楼主 | 2011-9-1 10:23 | 只看该作者
回复,香水城,加了一个nop指令还是这样的时间,
程序是如果

main()
{
        delay(1000);
        CLK_Init();
        init_relay_IO();       
       
while (1)
        {
                PD_ODR|=0x10; //照明
                //_asm("nop");
                PD_ODR&=0xEF;
                delay(60000);
        }
}

使用特权

评论回复
7
tuyanjun|  楼主 | 2011-9-1 10:58 | 只看该作者
香水可不以留下个邮箱啊:本人的邮箱号是:tuyanjun@sina.com

使用特权

评论回复
8
lost1421| | 2011-9-1 12:11 | 只看该作者
楼主是否漏了下面红色的部分:
void CLK_Init(void)
{
    CLK_ECKR = 0x01;// Enable HSE

    /* Configure clock prescaler */
    CLK_CKDIVR = 0x08;          /* fcpu=8M */
                                /* Fmaster=8M*/
               
    // To select external source by automtic switch
    CLK_SWCR |= 0x02;            // Enable switch 外部使用8M晶振
    CLK_SWR   = 0xB4;            // Select HSE
  
    while (!(CLK_SWCR & 0x08));  // Wait for switch done
  // verify the external clock is selected (optional)
    if (CLK_CMSR != 0xB4)        
      while(1);        //切换时钟没有成功,停止执行
    delay(10);
  
    CLK_CSSR |= 0x01;           //起动外部时钟保护
  
//CLK_CCOR  = 0x19; while(1){_RESET_WATCHDOG();}  //送出fmaster到引脚上
}

使用特权

评论回复
9
香水城| | 2011-9-1 12:15 | 只看该作者
楼主位说“同一型号的两个单片机”,是指同一块板还是不同电路板?如果是不同电路板,两者的晶体一样吗?试试看用内部的HSI提供时钟。

使用特权

评论回复
10
tuyanjun|  楼主 | 2011-9-1 12:53 | 只看该作者
已经试用过内部晶振过了

使用特权

评论回复
11
tuyanjun|  楼主 | 2011-9-1 12:57 | 只看该作者
使用内部晶HSI也是一样的的,fmaster还是8M,一个板子是220ns,另一个是620ns.
是在同一个型号的两块板子上,两个颗MCU。MCU型号是STM8S105c6t6

使用特权

评论回复
12
tuyanjun|  楼主 | 2011-9-1 13:03 | 只看该作者
void CLK_Init(void)
{
    /* Configure clock prescaler */
    CLK_CKDIVR = 0x09;          /* fcpu=8M */
    CLK_CSSR |= 0x01;           //起动外部时钟保护
       
        //CLK_CCOR  = 0x19; while(1){_RESET_WATCHDOG();}  //送出fmaster到引脚上
}

使用特权

评论回复
13
tuyanjun|  楼主 | 2011-9-1 13:08 | 只看该作者
我将时钟设置改成上面这样试过了,正好时长扩大一倍,示波器测出来,一块是512ns,另一块则变了1260ns
说明上图红圈的电路还是正常工作的。更不解释STM8的BUG了。

使用特权

评论回复
14
tuyanjun|  楼主 | 2011-9-1 15:02 | 只看该作者
别沉了,香水城还在吗??????????????????

使用特权

评论回复
15
香水城| | 2011-9-1 15:16 | 只看该作者
从楼主位程序中没有看到main中哪里调用了CLK_Init() ??????????

使用特权

评论回复
16
tuyanjun|  楼主 | 2011-9-1 15:17 | 只看该作者
程序全文如下

#include "STM8S105C_S.h"
#define _RESET_WATCHDOG() IWDG_KR=0xAA //喂狗
/************************函数*****************************/
void delay(unsigned int count)
{        while(count--);
        _RESET_WATCHDOG();  //喂狗同时也是封闭IWDG_PR和IWDG_RLR寄存器写功能  
}


/* ==========================================================================
// ROUTINE NAME: start_watchdog                                             
// INPUT/OUTPUT: None.                                                      
// DESCRIPTION:  起动看门狗并使之初始化. 定时时长是128kHz 固定二分频率64kHz,
//               再256分频得250Hz,计250个数得1s可产生一次复位
// ========================================================================*/
void start_watchdog(void){
                IWDG_KR=0xcc;  //起动IWDG命令
                IWDG_KR=0x55;  //开起IWDG_PR和IWDG_RLR寄存器写功能
                IWDG_PR|=0x06; //写入分频值256分频
                IWDG_RLR=250;  //128kHz时钟经过256分频再计250个时钟脉冲
                IWDG_KR=0xAA;  //喂狗同时也是封闭IWDG_PR和IWDG_RLR寄存器写功能  
}

/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: CLK_Init                                                     */
/* INPUT/OUTPUT: None.                                                        */
/* DESCRIPTION:  Initialize the clock source                                  */
/*               1) Configure fmaster prescaler.                              */
/*               2) Switch HSI to HSE.                                        */
/*               3) Enable CSS.                                               */
/* -------------------------------------------------------------------------- */
void CLK_Init(void)
{
    /* Configure clock prescaler */
    CLK_CKDIVR = 0x09;          /* fcpu=8M */
               
                                /* Fmaster=8M*/
                /*                                                                                                               
    // To select external source by automtic switch
    CLK_SWCR |= 0x02;            // Enable switch 外部使用8M晶振
    CLK_SWR   = 0xB4;            // Select HSE
               
    while (!(CLK_SWCR & 0x08));  // Wait for switch done
                // verify the external clock is selected (optional)
    if (CLK_CMSR != 0xB4)        
                    while(1);                                                                //切换时钟没有成功,停止执行
    delay(10);
                        */
    CLK_CSSR |= 0x01;           //起动外部时钟保护
       
        //CLK_CCOR  = 0x19; while(1){_RESET_WATCHDOG();}  //送出fmaster到引脚上
}

void init_relay_IO(void)
{
        PD_DDR |= 0x1f;  //set output
        PD_CR1 |= 0x1f;  //set pull推挽输出
        CFG_GCR |= 0x01;//禁用SWIM,执行本指令后不能仿真,烧写程序
                                                                        //口线PD1复用成IO口了
       
}

main()
{
        delay(1000);
        CLK_Init();
        init_relay_IO();       
       
while (1)
        {
                PD_ODR|=0x10; //照明
                //_asm("nop");
                PD_ODR&=0xEF;
                delay(60000);
        }
}

使用特权

评论回复
17
tuyanjun|  楼主 | 2011-9-1 15:21 | 只看该作者
本人做过多种情况的试验(所以程序多次修改),另外:出现指作令周期变长的产品数量约点总产品生产数量的15%(1台产品1片MCU)

使用特权

评论回复
18
香水城| | 2011-9-1 15:40 | 只看该作者
还有2点可以查查:1)没有看到等待HSE稳定的指令;2)看看Option byte的设置对不对。

使用特权

评论回复
19
tuyanjun|  楼主 | 2011-9-1 15:43 | 只看该作者
Option byte没有查;HSI也是这样的情况还用等稳定 吗??

使用特权

评论回复
20
香水城| | 2011-9-1 15:49 | 只看该作者
看到有下面这句话,有什么结果?

//CLK_CCOR  = 0x19; while(1){_RESET_WATCHDOG();}  //送出fmaster到引脚上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

86

帖子

2

粉丝