stm32延时时间不对,晶振不起振等问题分析

今天新同事给我一个板子,说他刚画的stm32延时不正确,流水灯时间不对,在简单地检查了他的主程序之后,发现只有一个延时2秒+LED的I/O输出跳变的程序循环。其中I/O的配置也是正确的,但是延时时间完全不对,似乎加长了10倍还多。

这种情况很明显,时钟有问题了。

关于时钟的问题,一般第一步就去看晶振有没有起振。打开系统文件system_stm32f10x.c,翻到793-797行,这里是系统等待晶振起振的死循环:

其中,这个死循环的跳出条件两个,一个是起振了(HSEStatus==1),另一个就是等待超时(StartUpCounter==500)。HSEStatus是自带的判断标志位,如果晶振起振了,则自动置1;StartUpCounter是一个初始值为0的计数器,当每一次循环自加1,直到等待了500次还没有起振,那我就不等了;判断晶振是否起振,可以在这里打上断点,或者把HSEStatus或StartUpCounter放到watch里查看。

比较幸运的是,这次同事的问题就是没有起振,也没有进一步去排除其他问题的必要了。反复查看他的电路原理图,发现他晶振旁路的22pf的电容忘记接地了,跳线后解决。

 

后记:如果晶振也起振了,但是起振时间过长,检查可以尝试检查复位电路的RC值是否匹配;另外对应用内部滴答时钟延时的同学,还可以去查看是否装值时超标了,比如想延时2秒,结果直接往delay_ms里写了2000,这种小错误;另外如果选用的晶振非常用8M晶振,还需要去系统文件里更改倍频系数等等操作。