stm32如何判断中断源?

Guz*_*Guz 4 stm32 interrupt-handling

我最近在 stm32 项目中使用了 Default_Handler,但无法弄清楚它的外壳是什么:

  .section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
    b   Infinite_Loop <--- here!
Run Code Online (Sandbox Code Playgroud)

默认情况下,许多中断被映射到默认处理程序,我可以找出实际中断原因的唯一方法是为所有中断(60+)编写处理程序并暂停调试器中的代码。呸!

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

Guz*_*Guz 8

所以,事实证明 NVIC(中断控制器)中有一些我们可以使用的寄存器:

NVIC寄存器

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

每个 IABR 寄存器都是 32 位宽,因此通过一些简单的位计数,我得出结论,中断源是 32+12 = 44。现在我需要查看我的 MCU(stm32wb55)的数据表,看看它对应的是什么:

数据表摘录

啊哈,所以是 IPCC 造成了中断!为了仔细检查,我为这个特定的中断添加了一个处理程序

void IPCC_C1_RX_IRQHandler(void)
{

}
Run Code Online (Sandbox Code Playgroud)

它被调用了!

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