再上一篇:12.5 当处理器被锁定(Lockup)时
上一篇:第13章
主页
下一篇:13.3 多处理机通信
再下一篇:13.4 自复位控制
文章列表

13.2 电源管理

《Cortex-M3 权威指南》,嵌入式处理器开发教程。

不同于以往的处理器,CM3 对电源管理的重视,已经上升到处理器内核的水平上。它提供了若 两种睡眠模式。在睡眠时,可以停止系统时钟,但可以让 FCLK继续走,以允许处理器能被 SysTick 异常唤醒。这两种睡眠模式依次为:
睡眠:由 CM3处理器的 SLEEPING信号指示
深度睡眠:由 CM3处理器的 SLEEPDEEP信号指示 为了判定当前使用的是哪一种睡眠模式,以及其它睡眠时的上下文,需要检视在 NVIC 的系统
控制寄存器,如表 13.1 所示。要注意,CM3 的这两条信号线是给芯片设计者看的,需要芯片设计 者配合它们作一系列的处理,因此不同的芯片,响应这两种睡眠模式的方式也是不同的。粗线条的 实现可能把它们两个等同处理也说不定。
表 13.1 系统控制寄存器(地址:0xE000_ED10)




通过执行 WFI/WFE 指令,请求 CM3 进入睡眠模式,它们在 CM3 中的地位就类似于某些处理器 的”sleep/slp”指令。WFI表示 Wait-For-Interrupt,而 WFE表示 Wait-For-Event。那么什么 可以算是 event呢?新来的中断、早先被悬起的中断,或者是通过 RXEV信号表示的一个外部事件 信号脉冲,都属于 event。在处理内部,对事件有一个锁存器,因此过去发生的事件可以用来唤醒 将来才执行到的 WFE。流程如图 13.2所示。

图 13.2 进入睡眠模式的序列 当处理器进入睡眠模式时,单片机作如何反应,还取决于芯片的设计。最典型的作法就是把一
些外设的时钟停掉以降低功耗。当然,芯片还可以做得更有力,切断一部分功能模块的电源,甚至 切断整个芯片的电源并且停止所有的时钟。这是把事情做绝了,只能通过复位来唤醒。为此,芯片 厂商可以在单片机上提供一个引脚,并根据它的电平变化来产生此复位信号。另外,芯片厂商还可 以在设计时加入少量的 SRAM作为后备存储区,该区电力供应不被切断(如 STM32),以供应用程序 在轮回前,先把今生离别之际的一些重要上下文存入,待到来世再报恩。

WFI/WFE除了进入睡眠的序列不同外,它们的唤醒行为也有所不同。

当从 WFI唤醒时,要根据异常系统的游戏规则来决定是否唤醒。只有当该中断的优先级比当前 优先级要高(如果是在服务例程中使用 WFI),并且比 BASEPRI 掩蔽的高时,才唤醒处理器并执行 ISR。但如果 PRIMASK置位,则依然唤醒处理器,然而 ISR却不执行了。

WFE则有点区别,不管优先级和掩蔽情况如何,只要SETONPEND置位,它就会不错过任何一个 事件,在发生事件时一定把处理器唤醒。至于是否执行 ISR,则与 WFI的规则相同。

CM3处理器唤醒的具体规则如表 13.2A和表 13.2B所示。但要注意:这是假设中断的优先级比 当前优先级要高的(即没有在异常服务例程中使用 WFI/WFE,谁在这里用谁想不开)。

表 13.2AWFI的唤醒行为(带“+”的表示执行此动作)

中断优先级

唤醒

执行 ISR

PRIMASK=0,且 BASEPRI不能掩蔽

PRIMASK=0,且 BASEPRI能够掩蔽

+

+

PRIMASK=1,且 BASEPRI不能掩蔽

PRIMASK=1,且 BASEPRI能够掩蔽

+

表 13.2BWFE的唤醒行为(带“+”的表示执行此动作)

中断优先级

唤醒

执行 ISR

PRIMASK=0,SEVONPEND=0,且 BASEPRI 不能

掩蔽

PRIMASK=0,SEVONPEND=0,且 BASEPRI 能够 掩蔽

+

+

PRIMASK=0,SEVONPEND=1,且 BASEPRI 不能

掩蔽

PRIMASK=0,SEVONPEND=1,且 BASEPRI 能够 掩蔽

+

+

+

PRIMASK=1,SEVONPEND=0,且 BASEPRI 不能

掩蔽

PRIMASK=1,SEVONPEND=0,且 BASEPRI 能够 掩蔽

+

PRIMASK=1,SEVONPEND=1,且 BASEPRI 不能

掩蔽

PRIMASK=1,SEVONPEND=1,且 BASEPRI 能够 掩蔽

+

+

译者小结:

1. 只有 PRIMASK=0时,才执行 ISR

2. 对于 WFE,只要 SEVONPEND=1,则不管何时发生了什么中断,都一定会唤醒处理器

3. 不管 PRIMASK为何值,只要优先级高到 BASEPRI不能掩蔽,就将唤醒处理器

4. 当 PRIMASK=0时,它不会对唤醒产生影响

CM3还有一个“自动睡眠”的机制:SleepOnExit——它可以被编程为从中断服务例程返回后 立即睡眠。这样一来,处理器的所有工作就只是响应中断了,其它时间都在睡眠。在真实的应用程 序里,通常只有在程序很简单的电池供电设备中,才会用此功能。如欲使用此特性,需要把系统控 制寄存器中的 SLEEPONEXIT位置位。如图 13.3所示。


图 13.3 SleepOnExit 功能演示