首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打扰irq把我从睡眠模式中唤醒

打扰irq把我从睡眠模式中唤醒
EN

Stack Overflow用户
提问于 2017-11-20 15:06:29
回答 1查看 124关注 0票数 0

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

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

但有时,当无线电芯片发送数据时,我会被中断,这会唤醒我的MCU并中止数据发送。我不知道如何找到哪个irq唤醒了我,因为我的系统目前运行的任务很多,可以“随机”运行irq,但是当无线电芯片发送消息时,没有一个“随机”irq可以触发。

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

你知道一种方法来确定哪个irq在唤醒我的睡眠系统吗?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-20 16:10:46

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

代码语言:javascript
复制
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编程手册的注册名称,这一过程应类似于其他核心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47395056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档