无外部高速时钟时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时,尽量按照实际设计对软件做出相应修改,切勿图省事而带来问题。
===========================
往期话题链接: