【问题标题】:How do I enter DOZE and SLEEP mode on the iMX27 (ARM926)?如何在 iMX27 (ARM926) 上进入 DOZE 和 SLEEP 模式?
【发布时间】:2011-12-18 23:01:53
【问题描述】:

在谈到 iMX27 的低功耗模式时,参考手册不一致。我想要两个函数:doze() 和 sleep(),它们配置 CPU 和时钟以正确进入这些低功耗模式,但手册中的示例似乎不起作用。我查看了 Linux 内核代码,这是一些帮助,但我想我会在这里询问是否有人已经有这些功能的任何代码(最好是 arm 程序集)。

打瞌睡: 打盹模式定义为 ARM9 执行等待中断指令,然后关闭向 MCU 提供缓冲时钟。 将系统设置为打盹模式的操作顺序如下:

  1. 启用从打盹模式唤醒所需的中断。
  2. 禁用看门狗定时器中断。
  3. 执行等待中断指令。

睡眠

睡眠模式定义为禁用所有 DPLL 时钟输出。在系统关闭 MPLL 和 SPLL 之前,必须满足一系列操作和标准。当 CSCR 寄存器中的 MPEN 位被清除以禁用 MPLL 时,将启动休眠模式序列。此操作还会自动关闭 SPLL。 将系统置于睡眠模式的顺序如下:

  1. 从总线访问中禁用 AHB 外设。
  2. 启用所需的中断以用于系统唤醒。
  3. 禁用看门狗定时器中断。
  4. 为 SD_CNT(CSCR 寄存器)设置关机倒计时所需的值。
  5. 通过清除 MPEN 位(CSCR 寄存器)禁用 MPLL。
  6. 执行等待中断指令。

谢谢

【问题讨论】:

  • 是示例代码不起作用(不太可能)还是系统中的某些东西(例如计时器)正在生成中断以便立即唤醒?您可能需要禁用任何不想引起唤醒的中断或外围设备。

标签: assembly embedded arm


【解决方案1】:

进入打盹模式确实没什么用(在 C 中用 asm ( ); 包围这段代码):

      " MCR p15, 0, r1, c7, c0, 4 \n"

将为您解决问题。您需要先设置所有必需的中断。

对于睡眠模式,这里有一些汇编

         " MOV R0,#+268435456 \n"
         " ORR R0,R0,#0x27000 \n"
         " LDR r1, [r0, #0x0] \n"
         " ORR r1, r1, #0x01000000 \n"
         " STR r1, [r0, #0x0] \n"
         " BIC r1, r1, #0x00000001 \n"
         " STR r1, [r0, #0x0] \n"
        " MCR p15, 0, r1, c7, c0, 4 \n"

其中 #+268435456 是 CSCR 寄存器的地址。此代码会将 SD_CNT 设置为 1,禁用 MPLL,然后进入 WFI。同样,您需要先配置中断,并禁用所有外围设备。

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2016-03-04
    • 2015-01-27
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多