查看原文
其他

一个关于STM32F072芯片USART唤醒的话题

Miler 茶话MCU 2022-09-11

一个关于STM32F072芯片USART唤醒的话题

整理:MilerShao


近日某工程师电话我说他在使用STM32F072芯片开发产品,发现USART2中断无法从将芯片从STOP模式唤醒。他说也是折腾几天了,翻来覆去都查不出问题所在,怀疑芯片是否真具有该功能。因为之前有其它客户用到该功能,我告知确实可行,建议他再耐心检查

一天后我们再次网络联络,告知仍然无法实现USART唤醒STOP状态。我查看其相关程序代码,代码是基于STM32F0系列传统固件库编写的。将客户代码结合32f0系列的技术参考手册来看了两遍并未发现什么明显问题。

因为STM32F0系列官方固件库里有相关例程项目,打开官方例程代码和参考手册比对时,有个地方引起了我的注意。那就是USART是时钟源问题。


我注意到ST官方例程里在配置USART的唤醒功能时,有条关于USART时钟源的配置代码,而客户代码里却没有相应代码。从参考手册相关描述来看,只有USART时钟源选为HSI或LSE时才具备将芯片从STOP模式唤醒的功能。问题很可能出在这里,让客户在USART的配置函数里加上如下语句后再测试,结果一切正常了。

/* Configure the HSI as USART clock */

RCC_USARTCLKConfig(RCC_USART2CLK_HSI);

显然,问题正是出在这个USART2的时钟的配置上。下图是STM32F072芯片的RCC时钟树。可以看出,USART可以有四个时钟源。即PCLK/SYSCLK/HSI/LSE.


现在客户代码里没有对USART2的时钟源做明确配置,只是做了时钟的使能配置。不难理解MCU硬件使用了默认值,那默认时钟源是哪一个呢?


从相关寄存器位可以得知,USART2的默认时钟源是PCLK,既不是HSI也不是LSE。难怪客户死活没法利用USART中断将STOP模式下的STM32F072唤醒了。

可能很多人用过STM32F1系列芯片,相比之下,STM32F0系列在时钟这块跟F1存在诸多不一样的地方,使用时要注意。


ST官方针对各系列的MCU都有较为完善参考固件库,针对各外设的应用多有例程供使用者学习参考和使用。那些参考库代码整体上讲都有很高的参考和使用价值。尤其各工程项目里的有关配置流程值得借鉴使用。

我这里顺便多聊几句。如果你对官方例程项目里的部分代码不确定是否有用或是否需要时建议不要轻易舍弃不用,先留着,哪怕注释在那儿也好,至少是个提醒。最好借助于参考手册和实验弄明白怎么回事。经常有人在并不了解部分代码功能的前提下,直接弃掉不用而给自己带来不必要的麻烦。

比方前面谈到的32F072 USART2唤醒STOP模式的问题,参考例程里其实就有相关USART时钟源配置代码,而客户工程师在自己代码里却不假思索地直接拿掉了。

记得前不久有位工程师利用STM32F3系列的AD功能,诉说AD取得的结果总是不准,总是找不到原因。跟着他一起看了硬件线路再看他的软件配置代码,结果发现有关AD校准相关代码根本就没有。问他为什么不参考官方例程代码来写,他说觉得相关代码没用就拿掉了。

我还依稀记得几年前有个北方工程师用STM32F1系列开发产品,项目开发前期芯片工主频较低,各个功能都好好的,后来发现将系统时钟调高到72M时出现很多奇怪的问题,把时钟调低到一定数值又运行正常。跟他一起问来问去,结果发现有关与指令预取及FLASH访问等待周期的配置代码被抹掉了【那是基于早期的固件库代码】。

还有,官方库代码里的有些代码配置流程也不是乱来的,其先后顺序可能影响最后的结果。还有就不多说了,抛砖引玉,算是对同仁的一些提醒。愿各位在开发过程中少点折腾之苦,多些顺畅。

********************************************************************其它相关ST MCU应用话题,可以点击文字上方“ST MCU 信息交流”或扫描下方微信公众号加以关注,查看历史消息来选择阅读。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存