我在低功耗运行模式下从 RAM 运行 c 代码(因此不处理中断)。此模式由代码序列启用:

  • 跳转到 RAM
  • SIM
  • 关闭内部闪存和电源调节器,切换到低速时钟源 (LSE)
  • 使用 WFE 模式(低功耗等待模式)做一些工作
  • 打开电源调节器和闪存,恢复时钟源
  • RIM
  • 跳转到 flash

  • 所以勘误表中描述的 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 页它包含漂亮的表格:

    c - STM8 ASM 安全执行 WFE-LMLPHP

    代码执行在 3 个周期时停滞的情况有 2 种。所以我不确定我的异步唤醒事件不会在 BTJT 和 WFE 指令之间发生。

    有没有办法确保严格的逻辑顺序(检查条件> wfe > 唤醒事件)?

    最佳答案

    OP找到的解决方案:

    关于c - STM8 ASM 安全执行 WFE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36377047/

    10-11 15:38