如何确定 stm32 上的中断源?

问题描述

我最近在我的 stm32 项目中使用了 Default_Handler 并且无法弄清楚是什么封装了它:

  .section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
    b   Infinite_Loop <--- here!

认情况下,很多中断都映射到认处理程序,我能弄清楚实际中断原因的唯一方法是为所有中断(60+)编写处理程序并暂停代码调试器。呸!

我在谷歌搜索中没有找到好的答案,所以我想我为其他人(或者最有可能在 6 个月内为自己记录解决方案......)

解决方法

因此,我们可以使用 NVIC(中断控制器)中的一些寄存器:

NVIC registers

以上来自STM32CubeIDE调试器。 NVIC_IABRX 包含当前活动中断的位掩码,我可以看到 NVIC_IABR1 有一个非零位(它是 0x1000)。

每个 IABR reg 是 32 位宽,所以通过一些简单的位计数,我得出结论,中断源是 32+12 = 44。现在我需要查看我的 mcu(一个 stm32wb55)的数据表,看看对应的是什么到:

datasheet excerpt

啊哈,原来是 IPCC 导致了中断!为了仔细检查,我为这个特定的中断添加了一个处理程序

void IPCC_C1_RX_IRQHandler(void)
{

}

它被调用了!

注意:我最初只是查看了 startup_stm32xxx.s 文件中的中断向量,并从该文件的开始开始计数,但由于前几个中断未包含在 NVIC_IABRX 寄存器中,因此没有成功。