简短的答案:被触发的不是 WWDG 中断,而是 HardFault 之类的异常,只不过由于默认情况下他们都用默认中断,所以你的 IDE 选了一个「看起来合理」的值。
最近在编写 SkyLab. 发现了一些有趣的事情:系统不能正常初始化。在启动后中断运行,IDE 会提示单片机在 WWDG_Handler
里空转——在目前我还没有初始化窗口看门狗,所以这个中断的触发完全没有理由。
但是在查看 xPSR
寄存器的时候,发现 IT
的值为 3
, 而这恰好是 HardFault
异常的编号——这意味着实际的中断是 HardFault
而非 WWDG
.
进一步打断点排查,发现连 SystemInit
都没有完成。这意味着在非常早期的初始化阶段,就已经出现了严重错误。但是无论是初始化顺序、时钟的实际配置值都没有问题。
抱着试一试的心态,我将原先拆成三个子函数的初始化函数合并成了一个函数(考虑到官方库也是这样做的)。重新烧写后就成功进入了内核。
不知道为什么,即使在堆栈已经初始化的情况下,仍然不能在初始化代码中使用子过程。在调试过程中,也会发现有时调用栈内填满了子函数。这或许是一个 quirk, 或许是某些位置没有正确初始化导致的(如 __libc_init_array
尚未被调用)。
这个 Bug 影响的文章已经修复。
正在加载评论……