我在低功耗运行模式下从 RAM 运行 c 代码(因此不处理中断)。此模式由代码序列启用:
- 跳转到内存
- SIM卡
- 关闭内部闪光灯和电源调节器,切换到低速时钟源 (LSE)
- 使用 WFE 模式(低功耗等待模式)做一些工作
- 打开电源调节器和闪光灯,恢复时钟源
- 轮缘
- 跳到闪光
因此,勘误表中描述的 WFE 指令没有问题。这种结构的问题,它可能是导致 CPU永远处于低功耗等待模式的原因:
while nbit(TIM1_SR1,CC3IF) asm("wfe");
即反汇编为:
000035 720252B602 BTJT TIM1_SR1, #1, 0xB6
00003A 728F WFE
来自定时器的事件具有概率性质,并且此代码不保证它会在 WFE 指令执行后发生:
- BTJT指令在2个周期内执行,长度为5;
- 从 RAM 执行的代码可能不连续,因为“获取”状态会在几个周期内暂停执行
我使用手册 PM0044,在第 26 页它包含漂亮的表格:
代码执行停止在 3 个周期时有 2 种情况。所以我不确定我的异步唤醒事件不会在 BTJT 和 WFE 指令之间发生。
有没有办法确保严格的逻辑顺序(检查条件 > wfe > 唤醒事件)?