本帖最后由 gdygn007 于 2023-12-19 22:16 编辑
一、概述
最近在做基于APM32F072RBT7的汽车项目,前几天客户反馈有个样机无法正常运行,寄回来排查后,原来是外部的8MHz晶振坏了,失效模式是晶振断路。硬件同事说换个好点的晶振,但这种是治标不治本(因为出现这个情况后,要和客户解释原因和给出解决方法),还好客户允许样机有故障状态(相当Limp home),但出现故障时要把这个状态上报到车身控制器。
二、解决方案
1、翻了好多帖子和手册说明,在用户手册有个CSS时钟安全系统,但该方式对外部晶振短路导致MCU无法正常运行的情况有效,我们的样机是晶振断路的失效模式,所以还得找其它的解决方案。
2、经过多次测试和验证,晶振断开时,时钟初始化HSE_STARTUP_TIMEOUT会超时和RCM->CTRL1_B.HSERDY**一直不置位,我们打算从这里进行判断和处理。
3、根据RCM->CTRL1_B.HSERDY**写了个简单的自定义时钟配置
4、调用RCM_EnableCSS()开启CSS时钟安全系统后。当外部晶振短路时,会进入NMI中断,并且自动切换到内部时钟,因为默认是8MHz,所以需要在NMI中断重新配置系统时钟为原来的48MHz。
5、为了更加保险,再把看门狗打开,喂狗超时可以稍微设置长些(1S左右),并且要在自定义时钟配置前面打开看门狗,这样可以有效避免自定义的时钟配置异常和运行过程中外部晶振出现断路的状况时,看门狗能复位系统,整个系统的顺序如下(使用APM的GPIO例程最为示例)。
三、总结
首先,通过CSS时钟安全系统可以检测到外部晶振短路的情况;然后,通过RCM->CTRL1_B.HSERDY**标志位可以检测到外部晶振在上电时开路或短路情况;最后,通过外部看门狗可以解决到外部晶振在运行过程中开路情况,本思路基本可以全部覆盖外部晶振的失效模式,另外,小编发现除了072系列之外,像A103、A407系列也可以通过这种方式实现系统的时钟安全机制。
|