我在低功耗运行模式下从RAM运行c代码(所以中断没有处理)。此模式由代码序列启用:
因此,没有问题,WFE指令,描述在勘误表。这种结构的问题,可能永远是CPU在低功耗等待模式下锁定的原因:
while nbit(TIM1_SR1,CC3IF) asm("wfe");即拆卸为:
000035 720252B602 BTJT TIM1_SR1, #1, 0xB6
00003A 728F WFE事件具有概率性质,此代码不保证在执行WFE指令之后会发生这种情况:
我使用手动PM0044,在第26页,它包含了漂亮的表:

有2种情况下,代码执行停滞在3个周期。因此,我不确定我的异步唤醒事件不会发生在BTJT和WFE指令之间。
是否有办法确保严格的逻辑顺序(检查条件> wfe >唤醒事件)?
发布于 2016-04-04 07:49:06
OP找到的解决方案:
我读过几次勘误表(感谢罗斯·里奇),这是我的主要想法: 一般的解决方案是确保在WFE指令执行或重新执行周期中,通过适当的应用程序定时来确保没有中断请求或事件发生。
发布于 2016-04-04 21:26:06
如果您的锁问题是由我提到的WFE勘误表引起的,那么应该有一个比尝试实现“适当的应用程序时间”更容易的解决方案。
STMicroelectronics提供的errata的内容如下:
可能会发生两种类型的故障: 案例1: 如果将WFE指令放置在内存中32位字的两个MSB中,则在WFE执行周期或重新执行周期(从ISR处理程序返回时)发生的事件将导致不正确的代码执行。 案例2: 在WFE执行周期中发生的中断请求将导致不正确的代码执行。这对于WFE重新执行周期也是有效的,同时从ISR处理程序返回。
案例2不适用于您的情况,因为您说“中断不被处理,因为我使用低功耗运行模式”。如果在WFE指令期间不能发生中断,则只有第一种情况中描述的故障才可能导致您的锁定。
案例1只适用于WFE指令在内存中32位字内的某种对齐方式。因此,如果您能够确保WFE指令不会以这种方式出现在代码中,那么您就不会遇到此失败。如果您的汇编程序支持一个对齐指令,您可以使用它来实现这一点,如果汇编程序没有插入NOPs,则可能与标签和跳转一起使用。然而,在勘误表中,作为一种“专门的解决办法”,提供了一个更简单的解决方案:
将WFE指令替换为 下一个是WFE JRA:
这似乎是通过在WFE指令之后放置相当于2字节NOP的值来解决故障。我的猜测是,失败导致CPU没有立即执行WFE指令,而是在下一个32位世界的开始跳过两个字节到指令(如果有的话)。在跳过的空格中放置一个2字节的NOP意味着故障是否发生并不重要。
https://stackoverflow.com/questions/36377047
复制相似问题