我的系统在睡眠模式上有问题。
目前,我的单片机正在驱动一个通过无线电定期发送消息的无线电芯片,当无线芯片发送消息时,我将单片机设置为休眠模式。
但有时,当无线电芯片发送数据时,我会被中断,这会唤醒我的MCU并中止数据发送。我不知道如何找到哪个irq唤醒了我,因为我的系统目前运行的任务很多,可以“随机”运行irq,但是当无线电芯片发送消息时,没有一个“随机”irq可以触发。
当我试图在我的睡眠模式中使用__WFI()之后中断时,调用堆栈已经用新的数据刷新了,我看不出执行的最后指令是什么。
你知道一种方法来确定哪个irq在唤醒我的睡眠系统吗?
谢谢你的帮助。
发布于 2017-11-20 16:10:46
在唤醒后立即检查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); \
})之后才能舒服地检查里面的内容。我已经从圣皮质M3编程手册的注册名称,这一过程应类似于其他核心。
https://stackoverflow.com/questions/47395056
复制相似问题