如何在iMX27(ARM926)上进入DOZE和SLEEP模式?

时间:2011-12-18 23:01:54

标签: assembly embedded arm

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

进入Doze模式真的没什么用(在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。同样,您需要先配置中断,并禁用所有外设。