无外部高速时钟时HSE_RDY被意外置位问题

描述

前言

问题由客户提出,用户发现在STM32F103器件上。用户在产品中使能了IWDG,在使用过程中发现当MCU被复位后,有时程序跑不下去;跟踪代码发现程序死在轮询PLL_RDY处。用户反馈说用的就是ST库中的范例代码,怀疑STM32F103有设计问题 。

调研

排查硬件供电无问题,用示波器测量NRST发现复位信号正常,用STM32CubeMX生成最小系统代码(时钟配置+IWDG)反复验证,未发现此问题,开始怀疑用户代码。

客户声称开发是基于ST提供的SPL库中自带的demo,使用SPL中的范例代码加上IWDG复位,确实可以复现此问题:通过调试器跟踪代码发现问题发生时HSE_RDY位被异常置位(用户平台无外挂高速时钟源)。

通过分析代码,发现SPL库【标准外设固件库】在配置时钟时先会直接使能HSE,并对HSE_RDY位进行检测。在复位MCU若干次后HSE_RDY可能位会被置位,从而导致时钟配置程序按照基于HSE的状态来进行接下来的配置。而SPL中的demo是跑在STM32F1评估板上,而评估板外带高速时钟源,故没有此问题。

结论

在MCU复位后,HSE_ON虽默认无效,但反复对其进行使能操作会导致MCU内部的噪声积累,造成时钟检测电路误判,并从寄存器反映出来。

- 对STM32F103来说,一旦HSE_RDY被置位,只要不断电,无论怎样复位MCU,HSE_RDY都不会被清除(即使失能HSE_ON) 。

- 对STM32F030单片机进行类似操作,也会发现同样问题。不同之处在于在HSE_RDY被置位后复位MCU,HSE_RDY位会被清除,但是一旦HSE_ON被置位,HSE_RDY同样可能会出现被置位问题 。

处理

由于用户不使用外部HSE,即并不需要对是否有外接高速晶振进行判断,故修改用户代码不再使能HSE。反复测试后问题不复现 。

建议

1 、要了解HSE_RDY位是用来检测是否有外部时钟存在的必要条件,而非充分条件。

2、使用STM32时,尽量按照实际设计对软件做出相应修改,切勿图省事而带来问题。

 

 

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分