这两天遇到客户提出的一个问题,讲的是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,在功能保证的情况下是如何可以测试晶振可以气振? |