令人不安的 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中获取了寄存器名称,其他内核的过程应该类似。
我的系统在睡眠模式下有问题。
目前我的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中获取了寄存器名称,其他内核的过程应该类似。