打印
[STM8]

STM8S HSE自动切换遇到的问题

[复制链接]
9859|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qigongwei|  楼主 | 2009-1-8 01:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    这两天遇到客户提出的一个问题,讲的是STM8S的时钟自动切换出现问题,始终无法切换到外部时钟源(HSE),但切换HSI、LSI均正常。    
    偶一听还有这种事?客户用来测试的硬件是ST官方的STM8/128-EVAL,MCU型号是STM8S208MBT6,版本:A,时间:801,供电5V。工作性质的习惯性思维,不会是客户对寄存器访问操作的失误导致的?
 
    自己看了一下STM8S的手册与CLK模块解释。

STM8S主时钟支持4个不同的时钟源:
1、1MHz - 24MHz外部晶体振荡器(HSE)
2、最大24MHz的高速时钟源(HSE user-ext)
3、内部16MHz高速 RC振荡器(HSI)
4、内部128KHz低速RC振荡器(LSI)
    每个时钟源均可自由切换、关闭;

    STM8S上电以后自动使用2MHz时钟(HSI/8),Reset成功后允许用户代码切换时钟源。切换时钟有两种方法,自动和手动两种,这里只说自动切换。
1、自动切换:
   1)、允许时钟自动切换模式,CLK_SWCR.SWEN = 1;
   2)、配置时钟源CLK_SWR = Clock source;
       此时原来的HSI时钟源还能就是主时钟,操作完成后硬件自动置位CLK_SWCR.SWBY = 1,外部时钟源开始起振;
   3)、HSE时钟准备好,CLK_CMSR = CLK_SWR;
   4)、检查CLK_SWCR.SWBSY  ?=   0,是时钟切换成功。
   5)、可选步骤:假如打开CLK_SWCR.SWIEN中断,则会产生相应中断,并将CLK_SWCR.SWIF中断标准位置1;

   步骤1)、2)、为软件必做,3)为硬件操作,4)做为可选项,软件增加系统可靠性。

按照手册上提供的处理流程,软件需要做的也很简单:


感觉好像不是什么很严重的问题,给客户回了一封邮件。

要求客户使用STM8S固件库中的时钟自动切换函数:CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, DISABLE);




客户没过多久回电话说还是不行,与客户沟通,了解了一下详细的故障描述。

1、代码执行到CLK_ClockSwitchConfig()函数的
while (((CLK->SWCR & CLK_SWCR_SWBSY) && (DownCounter != 0)))
{
  DownCounter--;
}

if (DownCounter != 0)
{
  Swif = SUCCESS;
}
else
{
  Swif = ERROR;   //总是失败 -- 在设定的时间内时钟切换总是失败
}

现象是PC指针跑飞?

2、HSI、LSI切换正常,MCO引脚可以监视到时钟输出;

3、切换HSE的时候,虽然失败,但监视到外部晶振起振;


这可就不得解了,当时手上没有STM8/128-EVAL,答应客户第二天测试一下看看现象到底是什么原因导致的。

按现在发帖的时间应该是昨天上午,拿到一块STM8/128-EVAL开发板,按照客户的说法,做了同样的测试,确实出现了客户描述的现象,但有些内容不相同:
1、切换HSE的时候,MCO和OSCOUT均未能监视到信号;
2、Reset的时候,可以看到OSCOUT出现短暂的波形,用示波器捕捉,确实是24MHZ(这里一直没介绍,STM8S的datasheet介绍 STM8最大工作频率24MHz,3级流水线,顺带给STM8S卖个瓜),只是这个波形挺难看的,有些畸型。

    很奇怪,客户也提到不会是STM8S的固件库有问题?既然这样,那就用汇编,直接对寄存器操作,现象依旧。检查了一下硬件,跳线、供电、连线都没发现有任何问题。奇怪了,那用ST-ICE试试。接上ST-ICE,Run,一切正常。这可就更不解了。

    ST-ICE应该可以排除评估板的硬件问题,况且我和客户的两块板都出现相同的问题,没这么巧合。打电话咨询了一下ST。ST深圳的FAE解释:
    STM8S上电后,自动使用HSR/8,也就是2MHz运行,通过option byte 的EXTCLK选择使用外部晶振,MCU会在外部晶振准备好后自动切换过去。

    这么解释,看来也可以理解为option byte的时钟选项在MCU启动后时钟选择的优先级更高。Ok,如果是这样,验证简单。写了一个IO输出的函数,加上一个CLK_CCOConfig(CLK_OUTPUT_MASTER)函数,直接通过STVP烧录MCU,按要求EXTCLK选择使用外部晶振。实际测试的结果是PE0(MCO)输出2MHz时钟,PA2(OSCOUT)无时钟信号。

     现象依旧,ST 深圳的FAE答应帮忙测一下,只是说忙,不知何时答复。看来靠不住,还得自己想想办法,晕。看来找自己上海的兄弟瞎掰一下,问问上海ST的瞧瞧,有没有什么好的建议。
     
     不出一个小时,上海的哥们回话,得到的答复是,建议使用16MHz以下的晶振测试,即可。

     这样?好吧,一直没怀疑的就是晶振。为何?ST的板出厂应该会出货测试吧。  换上一个16MHz的晶振,OK,一切如期望的,正常。为了搞清楚这鬼晶振,继续测试,12MHz、10MHz、8MHz、6MHz、20MHz,把我能找到的频率都一个个插上去测试了一下,一切都正常。

一直没有太注意时钟的问题,这会将STM8S的datasheet 电气参数特征、参考手册 CLK章节仔细看了一遍。

下面的问题,希望ST能帮忙解释一下:

1、STM8S的时钟,按照手册的描述,是否Option Byte的优先级会高过上电后立刻执行自动切换时钟操作?是否有确切的参数描述,上电到切换HSE成功,总共需要花费多少时间?

2、STM8S20xx的手册,目前最新的版本    Rev 6  December 2008 
 Page53:
   


 Page 62:
 


ST给出fCPUmax参数是24MHz,在功能保证的情况下是如何可以测试晶振可以气振?
沙发
8bit_mcu| | 2009-1-8 09:24 | 只看该作者

waitstate配了么

你用24MHz时有没有配置option byte的waitstate?

默认为0,你要将其设为1,否则访问Flash会出错。

使用特权

评论回复
板凳
8bit_mcu| | 2009-1-8 09:27 | 只看该作者

option byte中好像没有让你配置选择用外部晶振的地方

上电复位后跑的是HSI/8,然后你需要根据手册上的自动/手动方式用程序将时钟切过去。应该不会自动自己切的。

使用特权

评论回复
地板
gzhwb| | 2009-1-9 11:34 | 只看该作者

waitstate的问题

把waitstate设置为1就可以了,但副作用是每个指令增加一个CPU时钟周期的执行时间。我们用在比较高速的信号处理上,低于20MHz的CPU时钟完成不了任务,且不能把waitstate设置为1。我们试过20.48MHz,常温下,不把waitstate设置为1也能正常工作。

   按STM8 datasheet里所建议:“1 wait state is required if fCPU > 16 MHz.”,所以我们的用法已经超过厂家的建议。请问厂家的技术支持,这个指标是否有余量?我们这样使用风险如何?尤其是在-40度和+80度这种极端条件下使用是否有问题?如果实在不行,我们只好再选型了。

使用特权

评论回复
5
8bit_mcu| | 2009-1-9 12:01 | 只看该作者

回楼上:有风险的

我觉得这样你平时跑跑就算了,用在产品上是有很大风险的。因为stm8的flash的速度就这么快,到底有多少余量谁也不知道,相信st肯定只会对spec以内的性能作保证。

使用特权

评论回复
6
箫笑| | 2009-11-4 09:18 | 只看该作者
还有人关注吗这个问题?
我也遇到了,在三合一的STM8S上切换没有问题,换作STM8AH的就切换不了,晶振不起振,看了LZ的**以后,特意改成8M的晶振,问题依然存在.
LSI与HSI的切换就OK.

使用特权

评论回复
7
shaxjl| | 2013-6-26 18:15 | 只看该作者
感谢楼主,waitstate 改为1,单片机能工作了。

使用特权

评论回复
8
cjhk| | 2013-6-26 20:23 | 只看该作者
学习帖子   好好学一学   不错哦   顶起来   有时间好好消化一下  

使用特权

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

本版积分规则

20

主题

42

帖子

0

粉丝