如何在stm32上确定中断源?

4

我最近在我的stm32项目中遇到了Default_Handler,并且无法确定是什么原因造成的:

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

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

我在谷歌上没有找到一个好的答案,所以我觉得我应该为其他人(或者很可能是我自己在6个月后...)记录这个解决方案。

1个回答

8

实际上,中断控制器中存在一些我们可以使用的寄存器:

NVIC registers

上述内容来自于STM32CubeIDE调试器。NVIC_IABRX包含当前活动中断的位掩码,我可以看到NVIC_IABR1有一个非零位(它是0x1000)。
每个IABR寄存器宽度为32位,因此通过一些简单的位计算,我得出中断源为32+12 = 44。现在我需要查看我的MCU(一个stm32wb55)的数据手册以确定它对应的内容。

datasheet excerpt

啊哈,原来是IPCC引起的中断!为了双重检查,我添加了一个特定中断的处理程序。

void IPCC_C1_RX_IRQHandler(void)
{

}

它被调用了!

注意:我最初只是查看了startup_stm32xxx.s文件中的中断向量,并从那里开始计数,但由于前几个中断未包含在NVIC_IABRX寄存器中,所以这并没有起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接