令人不安的 irq 将我从睡眠模式中唤醒

Disturbing irq waking me up from sleep mode

我的系统在睡眠模式下有问题。

目前我的MCU正在驱动一个无线电芯片,它通过无线电定期发送消息,当无线电芯片发送消息时,我将MCU设置为睡眠模式。

但有时我会在无线电芯片发送数据时收到中断,这会唤醒我的 MCU 并中止数据发送。 我不知道如何找到哪个 irq 正在唤醒我,因为我的系统目前 运行 很多任务可以 运行 irq "randomly" 但是 none "random" irq 应该在无线电芯片发送消息时触发。

当我尝试在睡眠模式下使用 __WFI() 后中断时,调用堆栈已经用新数据刷新,我看不到最后执行的指令是什么。

你知道确定哪个 irq 正在唤醒休眠系统的方法吗?

感谢您的帮助。

唤醒后立即检查 NVIC->ISPR[x]SCB->ICSR 寄存器。如果您不能在处理程序运行之前中断,请将 __WFI() 替换为此宏(如果您不使用 gcc,则替换为等效的东西)

uint32_t ispr0, ispr1, ispr2, icsr;
#define __WFI() ({ \
    uint32_t primask = __get_PRIMASK(); \
    __disable_irq(); \
    asm volatile("wfi");    \
    ispr0 = NVIC->ISPR[0];  \
    ispr1 = NVIC->ISPR[1];  \
    ispr2 = NVIC->ISPR[2];  \
    icsr = SCB->ICSR;       \
    __set_PRIMASK(primask); \
})

以便之后能够舒适地检查内容。我从ST Cortex-M3 Programming Manual中获取了寄存器名称,其他内核的过程应该类似。