WWDG 中断在未配置的情况下被触发 | STM32 排错

/ 0评 / 0

简短的答案:被触发的不是 WWDG 中断,而是 HardFault 之类的异常,只不过由于默认情况下他们都用默认中断,所以你的 IDE 选了一个「看起来合理」的值。

最近在编写 SkyLab. 发现了一些有趣的事情:系统不能正常初始化。在启动后中断运行,IDE 会提示单片机在 WWDG_Handler 里空转——在目前我还没有初始化窗口看门狗,所以这个中断的触发完全没有理由。

但是在查看 xPSR 寄存器的时候,发现 IT 的值为 3, 而这恰好是 HardFault 异常的编号——这意味着实际的中断是 HardFault 而非 WWDG.

进一步打断点排查,发现连 SystemInit 都没有完成。这意味着在非常早期的初始化阶段,就已经出现了严重错误。但是无论是初始化顺序、时钟的实际配置值都没有问题。

抱着试一试的心态,我将原先拆成三个子函数的初始化函数合并成了一个函数(考虑到官方库也是这样做的)。重新烧写后就成功进入了内核。

不知道为什么,即使在堆栈已经初始化的情况下,仍然不能在初始化代码中使用子过程。在调试过程中,也会发现有时调用栈内填满了子函数。这或许是一个 quirk, 或许是某些位置没有正确初始化导致的(如 __libc_init_array 尚未被调用)。


这个 Bug 影响的文章已经修复。

发表评论

电子邮件地址不会被公开。 必填项已用*标注