自家MCU芯片(M0,M3,M4)进行 ESD实验,偶然发现失效状态下有时会发生按键复位和WDT全部失效的问题。
测试环境是这样的:简单的一个GPIO Tog小程序,使用PLL_72M(HSI作为PLL时钟)作为系统时钟,复位时LED1闪一下,复位后LED2持续闪烁,然后在GPIO依次接触耦合放电,这样可以观察程序是不是一直在跑,有没有发生复位。结果打出死机问题(LED常亮或常灭)时,芯片WDT失效,NRST复位也失效,断电重启后程序才恢复运行。
首先怀疑死锁(Hardfault)的情况,在Hardfault中断函数里增加一个GPIO Tog,再次进行实验,果然,LED2常亮或常灭时,Hardfault中断里的这个Tog持续运行,对应的LED持续闪烁,WDT和按键复位均不能跳出这个中断。
继续增加程序,将LSI通过MCO引脚打出,再次进行实验,复现LED2常亮/常灭的情况,同样的,Hardfault中断里的这个Tog持续运行,WDT和按键复位均不能跳出这个中断,此时用示波器观察MCO的波形,LSI运行正常。
继续增加程序,在Hardfault中断函数里继续增加一个喂狗程序,同样的ESD电压操作环境下,不再出现死机不能恢复的现象,即使触发了常亮/常灭,一段时间(默认看门狗时间是4s)后会被WDT复位,LED2 Tog继续运行。
使用STM32F103,STM32F407进行对比实验。可以复现同样的死机现象,在Hardfault中断函数里增加一个看门狗初始化和喂狗程序,不再出现死机不能恢复的现象。
ST的电气规格中有特别注明: