无外部高速时钟时HSE_RDY 被意外置位 前言* J3 ~* ^+ P' A' f7 Y2 i3 V 问题由客户提出,用户发现在STM32F103 器件上。用户在产品中使能了IWDG,在使用过程中发现当MCU被复位后,有时程序跑不下去;跟踪代码发现程序死在轮询PLL_RDY 处。用户反馈说用的就是ST库中的范例代码,怀疑STM32F103 有设计问题2 w( l1 {6 a, y* P* O 调研! K: Z4 [) N* p9 q) c 排查硬件供电无问题,用示波器测量NRST 发现复位信号正常,用STM32CubeMX 生成最小系统代码(时钟配置+IWDG)反复验证,未发现此问题,开始怀疑用户代码。; P* z% O ~4 s 客户声称开发是基于ST 提供的SPL 库中自带的demo,使用SPL 中的范例代码加上IWDG 复位,确实可以复现此问题:通过调试器跟踪代码发现问题发生时HSE_RDY 位被异常置位(用户平台无外挂高速时钟源)4 a- G) u& h6 x5 q ! j9 Y9 F1 S5 }1 u t1 b 通过分析代码,发现SPL 库在设置时钟时会直接使能HSE,在复位若干次后HSE_RDY 位会被置位,从而导致程序(HSEStatus)按照HSE 来进行接下来的时钟配置。而SPL 中的demo 是跑在STM32F1 评估板上,而评估板自带高速时钟源,故没有此问题。# P- r% W' N% D0 F2 O. D æ å¤é¨é«éæ¶éæ¶HSE_RDY 被æå¤ç½®ä½ 1.PNG (91.21 KB, 下载次数: 0) 下载附件 [url=]保存到相册[/url] 2017-6-23 10:37 上传 # n9 S5 b6 D/ f5 k7 w" s6 w结论1 _$ o" T, f$ N' m% W/ n 在MCU 复位后HSE_ON 默认是无效,反复对其进行使能操作会导致MCU 内部的噪声积累,造成时钟检测电路误判,并由寄存器反映出来。% `3 G( x7 e3 v6 }8 \4 \0 N- A - 对STM32F103 来说,一旦HSE_RDY 被置位,只要不断电,无论如何复位HSE_RDY 都不会- [- }/ c- A: i6 m% o: @" t0 p- s 被清除(即使失能HSE_ON), T7 c5 ` ~# h4 p - 对STM32F030单片机进行类似操作,也会发现同样问题,不同之处在于在HSE_RDY被置位后复位MCU,HSE_RDY位会被清除,但是一旦HSE_ON被置位,HSE_RDY同样会被置位) `! R* h; }2 `2 F9 d H4 L 5 J5 d5 V2 ^; w3 G8 u 处理 由于用户并不需要对是否有外接高速晶振进行判断,修改用户代码不要使能HSE,反复测试后问题不复现% y' U1 ^5 o5 m/ [; J9 p) d" I6 _ ( w2 O6 @( H$ ^ r9 E" [ 建议1 N$ S; ^& E: r. |! r% S; Q7 Q 1 要了解HSE_RDY位是用来检测是否有外部时钟存在的必要条件,而非充分条件 2在使用STM32时,一定要按照硬件设计对软件做出修改,切勿图省事而造成问题 / F. s" I9 S2 O1 b6 K 6 h5 z$ ], t' Z C8 h9 T 文档下载0 p K' F9 _. D7 |$ y9 n( V 更多实战经验! f0 D+ k2 R0 V- B |
好资料也要抢沙发。 |
换句话说就是,资料看的不认真!!! |