问题描述
我最近在我的 stm32 项目中使用了 Default_Handler 并且无法弄清楚是什么封装了它:
.section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
b Infinite_Loop <--- here!
默认情况下,很多中断都映射到默认处理程序,我能弄清楚实际中断原因的唯一方法是为所有中断(60+)编写处理程序并暂停代码调试器。呸!
我在谷歌搜索中没有找到好的答案,所以我想我为其他人(或者最有可能在 6 个月内为自己记录解决方案......)
解决方法
因此,我们可以使用 NVIC(中断控制器)中的一些寄存器:
以上来自STM32CubeIDE调试器。 NVIC_IABRX 包含当前活动中断的位掩码,我可以看到 NVIC_IABR1 有一个非零位(它是 0x1000)。
每个 IABR reg 是 32 位宽,所以通过一些简单的位计数,我得出结论,中断源是 32+12 = 44。现在我需要查看我的 mcu(一个 stm32wb55)的数据表,看看对应的是什么到:
啊哈,原来是 IPCC 导致了中断!为了仔细检查,我为这个特定的中断添加了一个处理程序
void IPCC_C1_RX_IRQHandler(void)
{
}
它被调用了!
注意:我最初只是查看了 startup_stm32xxx.s 文件中的中断向量,并从该文件的开始开始计数,但由于前几个中断未包含在 NVIC_IABRX 寄存器中,因此没有成功。