CM0休眠模式

一、特点

  • 两种休眠模式:普通休眠和深度休眠

  • 进入休眠的休眠方法:WFI 、WFE、利用退出休眠特性

  • 降低休眠时功耗的方法:

    • 停止部分或所有时钟信号
    • 降低MCU某部分时钟频率
    • 降低MCU各部分电压
    • 关掉MCU某部分电源

二、普通休眠和深度休眠模式

进人普通休眠模式还是深度休眠模式,是由SLEEPDEEP控制位决定的。该位位于系统控制块(SCB)区域中的系统控制寄存器(SCR),寄存器中还包括了 Cortex-MO处理器的低功耗特性的控制位。如果使用符合 CMSIS的设备驱动,可以用寄存器的名称“SCB->SCR”来访问系统控制寄存器
image

不同休眠模式及休眠操作的多种组合
image

三、等待事件和等待中断

WFE可以被中断请求以及事件唤醒
WFI则只能被中断请求和调试请求唤醒

3.1 WFE

  • 当使用WFE进人休眠以后,可以通过以下的中断或事件来唤醒;

    • 新挂起的中断(仅当系统控制寄存器中的SEVONPEND置位时有效)
    • 外部事件请求
    • 调试事件
  • Cortex-MO处理器内部有一个事件寄存器,并且只有一位有效。可以通过以下任何事件来置位事件寄存器:

    • 产生了需要服务的中断请求;
    • 异常进人和异常退出;
    • 不管中断是否允许,有新的挂起中断(仅当系统控制寄存器中的SEVONPEND置位时有效);
    • 发送事件(SEV)指令执行
    • 调试事件
  • 处理器唤醒后发生的多个事件会被当成一个事件

  • 处于WFE状态的处理器被事件唤醒后,寄存器就会被清零。如果在执行WFE指令时事件寄存器已经置位,则事件寄存器会被清零,WFE指令也会马上结束,并且处理器不会进人休眠。如果执行WFE指令时事件寄存器没有置位,则处理器会进人休眠,下一个事件将唤醒处理器,并且事件寄存器会保持清零状态。
    image

  • 在轮询循环中,通过WFE指令降低功耗(左边是没有加入WFE情况,右边是加入WFE指令情况)
    image

  • SCR中的SEVONPEND置位,任何挂起的中断都会产生事件并且唤醒处理器,如果执行WFE时中断已经处于挂起状态,则同一中断的新的请求不会产生事件,并且处理器也不会被唤醒

3.2 WFI

  • WFI指令唤醒:调试请求,或者比当前优先级高的中断请求
    image
  • 在WFI休眠期间,如果PRIMASK屏蔽了某中断,并且该中断的优先级大于当前优先级,那么该中断仍然可以唤醒处理器,只是在PRIMASK清除之前、处理器不会执行该中断处理。这种特性就可以关闭微控制器的某些部分(如外设总线时钟),而在唤醒后执行中断服务程序之前再打开。

为什么在 PRIMASK置位时,处理器不能执行中断服务程序却可以被唤醒?

根据这种设定,处理器可以在执行中断服务程序前进行系统管理任务(例如,恢复外设的时钟)
image

3.3 退出休眠特性(sleep-on-exit)

  • 当使能时,如果处理器从异常处理中退出时没有其他的异常等待执行,则自动进入等待中断的休眠模式。
    image
    image

  • 退出休眠特性减少了处理器的活动周期数,也降低了两次中断之间压栈和出栈过程所带来的功耗。每当完成一次中断服务程序并进入休眠后,由于下次中断请求也会导致这些寄存器的压栈,所以处理器就不必进行出栈操作

  • 退出休眠特性系统控制寄存器中的SLEEPONEXIT位控制,在中断驱动程序中对该位的置位操作一般由初始化操作的最后一步完成。否则,如果在初始化期间产生了中断则处理器可能此时就会进人休眠

四、唤醒条件

  • 当处理器利用退出休眠(sleep-on-exit)特性或者执行WFI指令休眠后,处理器会停止指令执行,当发生了中断请求(更高优先级)并且需要处理时,处理器就会被唤醒。如果处理器在异常处理中进入了休眠,并且新产生的中断的优先级与当前相等或者更低,那么处理器将不会被唤醒,并且保持在挂起状态

  • 执行WFE指令时,处理器的动作取决于事件锁存的当前状态:

    • 如果事件锁存置位,那么WFE指令完成.它将会被清零,并且处理器不会进人休眠;
    • 如果事件锁存清零,那么处理器会在事件发生前保持在休眠状态。
  • 事件可以是以下任何一个:

    • 待处理的中断请求;
    • 进人或退出中断处理;
    • 暂停调试请求;
    • 片上硬件的外部信号(设备相关)
    • SEVONPEND置位并且产生了新的挂起中断:
    • 执行了SRV(发送事件)指今
  • 处理器内的事件锁存可以保持过去发生的事件的状态,以前的事件也可以将处理器从WFE指令唤醒

  • WFE被中断请求唤醒

    • 该中断的优先级大于当前优先级
    • SEVONPEND置位且此时产生了新的挂起中断请求。利用SEVONPEND特性来从WFE休眠中唤醒处理,即使最新挂起中断的优先级跟当前的相同或者更低,在这种情况下,处理器不会进行中断处理,只会继续执行WFE之后的指令

image

五、唤醒中断控制器(WIC)

  • WIC是一个很小的中断探测逻辑,并且能够反映 NVIC的中断屏蔽功能。
  • WIC通过停止处理器的所有时钟信号来进一步降低功耗,甚至可以将处理器置于一种保持状态
  • 检测到一个中断时,WIC向微控制器中的电源管理单元(PMU)发送请求,以恢复处理器的电源和时钟信号,处理器就会被唤醒,进而处理该中断请求
  • WIC本身不包含任何的可编程寄存器,它的接口被耦合至Cortex-MO的 NVIC,这样处理器的中断屏蔽信息在休眠期间就会被自动地传送到WIC,而且WIC也只能在深度休眠期间被激活(SLEEPDEEP置位)
  • 使能 WIC深度休眠模式,需要设置电源管理单元中的控制寄存器
  • WIC使用状态保持功率门(SRPG)技术降低了Cortex—M0的待机功耗。
    image
  • 使用WIC时,Cortex-MO处理器应用了SRPG技术,可以在休眠期间关掉它的电源,从而减小微控制器的漏电流。在WIC模式深度休眠期间,WIC能够得到中断探测的结果。由于处理器的状态被保存在振荡器中,所以处理器在唤醒后基本上可以立即继续之前的操作
  • 在WIC模式深度休眠时,SysTick定时器将会停止,如果应用需要嵌人式OS并且OS还要持续工作,就需要使用其他的外设定时器来周期唤醒处理器。没有使用OS,需要WIC模式深度休眠时,使用外设定时器代替Systick定时器,产生周期性中断。
    image
posted @ 2023-07-05 19:17  登云上人间  阅读(93)  评论(0编辑  收藏  举报