我正在尝试在Cortex-M4上进入待机模式。正常的行为是设备大约每2分钟唤醒一次,但在我最新的FW版本中,似乎代码被“随机”卡住了。
经过调查,似乎代码通过了WFI
指令而没有进入待机状态(没有待机=>没有重置=>无限循环=> ... => 42)。
因此,经过许多不明确的规范阅读之后,我的理解是,如果有待处理的中断,WFI
可能无法进入休眠状态。
WFI
之前清除所有待处理的中断?答案 0 :(得分:3)
有三个条件导致处理器从WFI指令唤醒:
如果WFI指令执行时任何唤醒条件为真,那么它实际上是一个NOP(即你不进入睡眠状态)。
至于确保没有待处理的中断,那就是你的代码必须这样做。通常,这意味着确保满足中断源,以便它不会断言其中断请求,然后清除必要的挂起位。您可以通过读取中断挂起的寄存器来查看待处理的内容,但通常会设置中断处理程序以确保它们保持静止状态。
请注意,大多数系统必须在执行WFI之前或之后立即执行某些操作。例如,在决定使用WFI进入睡眠状态之前,通常必须进行一项测试以确定是否还有其他工作要做。然后在PRIMASK设置为1的关键部分完成该测试和WFI的执行(因此我们在上面执行选项#2)。这将确保在测试和WFI之间没有中断,并且在唤醒之后,如果有需要完成的附加操作(通常涉及时钟),则不会发生中断。唤醒后,PRIMASK被设置回0(退出临界区)并且正在进行任何挂起的中断。
ARM建议在WFI之前立即执行DSB指令,以确保在处理器进入休眠状态之前完成任何数据操作。它可能并非在所有情况下都是绝对必要的,而是为了防止情况发生变化而忽视它。