本文以KL03Z为例, 对Kinetis系列MCU的低功耗模式进行简介和综述, 介绍了Kinetis典型的时钟与电源工作模式的基本概念, 休眠与唤醒的基本方法, 以及各个模块在不同模式下的生存状况。
KL03Z MCU使用的低功耗系统同大多数Kinetis MCU相似, 具有很好的代表性。对于已经了解Kinetis系列MCU的常用基本功能,想继续掌握功耗模式管理或是正在调试低功耗问题的工程师,在逐字逐句阅读手册之前,先通过本文理清思路, 明确一些概念, 是一个不错的起点。
低功耗相关的功能模块
KL03Z手册中第七章<功耗管理>,是把功耗管理分成时钟管理和电源管理两个小节分别阐述的。
平时我们习惯用电源管理中的模式表示功耗模式,但实际上,电源管理和时钟管理是相辅相成的,二者相互配合共同完成功耗管理。管理时钟系统的模块涉及系统集成模块(SIM,在特定的情况下开关时钟)、多功能时钟发生器(MCG,产生各种原始时钟源)和杂项控制模块(MCM);管理电源系统的模块主要是电源管理控制器(PMC),以及系统模式控制器(SMC)。
时钟模式
本节是从时钟管理系统的角度,描述不同功耗模式下时钟系统的工作情况。
这里特别说明一下内核时钟(core clock)、系统时钟(system clock)和总线时钟(bus clock)、以及同步时钟模式与异步时钟模式的概念。
内核时钟和系统时钟在大多数情况下都是一个时钟,这个时钟是输入给Arm内核系统(Arm Platform)的时钟,Arm内核系统中的私有外设模块也是由这个时钟驱动, 例如大家熟知的NVIC、Systick等。
总线时钟通常是系统时钟的整数分频值,是专门给系统总线提供的时钟源, 用于连接外设模块。
总线上连接的外设模块,可以使用总线时钟驱动本模块的逻辑工作,由于总线时钟来自于系统时钟,使用此时钟源的外设模块跟系统内核的时钟同源,它们之间的数据通信不需要额外的等待同步, 被称为同步时钟模式。另外, 有时外设模块也可以选择直接从时钟生成模块输出的时钟源,被称为异步时钟模式。
一个特别需要说明的是定时器模块。定时器模块的工作需要两个时钟:一个是模块本身同总线相连部分的时钟,这部分对时钟的使用同其它模块相同,读写寄存器都使用这个时钟,它是一种同步时钟;另一个时钟用于定时器的计数,有时在文档也称之为"功能时钟(functional clock)", 它是可以使用其它的时钟即异步时钟。这两个是完全不同的时钟域, 可以使用同一个时钟源, 也可以分别使用不同的时钟源。
部分掉电模式
部分掉电模式模式(Partial Stop,PSTOPx)的设计丰富了低功耗系统的选择,PSTOP1和PSTOP2模式工作在常规的WAIT等待模式和STOP掉电模式之间。
停止提供时钟的范围按这个顺序逐渐增大:
WAIT < PSTOP2 < PSTOP1 < STOP
WAIT仅仅停掉CPU时钟,只是CPU进入休眠,ARM内核中的其余模块(例如NVIC和Systick)可以继续工作,总线上的外设完全不受 影响。
PSTOP2进一步停掉了系统时钟,ARM内核系统的时钟完全停供。时钟发生器MCG和电源管理器PMC都还在工作,总线时钟保持供应,大部分使用总线时钟驱动的外设模块可以继续工作。它相当于是WAIT模式的变种。
从PSTOP2模式退出的唤醒事件是复位,或由总线时钟驱动的外设产生的异步中断事件(此时由于系统时钟停止供应,NVIC中断管理器已经不工作了)。
PSTOP1进一步停掉总线时钟,这样大多数外设模块的时钟也被停掉了。它相当于是STOP模式的变种。但是MCG仍然继续工作,这就意味着一些能够直接选择MCG输出时钟源的外设,仍然可以在异步时钟模式下继续工作。
从PSTOP1模式退出的唤醒事件是复位,或由总线主机/从机外设模块产生的异步中断。
STOP模式停掉了全部的CPU时钟,系统时钟和总线时钟, 由于在STOP模式下PMC电源管理模块停止工作, 时钟发生器模块MCG的供电也停了, 对应MCG也不再产生时钟。这个是常规系统的最低功耗模式。但是少数使用特殊的不是来自于MCG时钟源的模块仍能够继续工作, 例如RTC, LPTMR等。
部分掉电模式在SMC的掉电控制寄存器(Stop Control Register,SMC_STOPCTRL)中配置。
纯计算模式
纯计算模式(Computing Operation,CPO)是指,CPU本身是使能工作的,并且可以读FLASH和访问SRAM,但是其它所有总线主机和总线从机均进入各自的掉电状态。此时MCU仅能通过CPU执行计算任务。计算模式也是一种工作模式(对应也有自己的功耗状态),可以通过RUN或VLPR模式进入。
芯片手册中对计算模式加了一条特别说明:不要从计算模式直接进入任何类型的STOP模式,否则系统真的就彻底休眠不能唤醒了。正确的做法应该是,先从计算模式退出到常规的工作模式,配置好需要在低功耗模式下继续工作的外设模块并使能它们,再进入STOP模式。此时CPU虽然停机,但是预先配置好的外设模块仍可以继续工作。
这里再详细介绍一点关于计算模式的技术细节。计算模式复用了STOP模式的控制逻辑,进入计算模式的方式跟进入STOP模式的方式几乎相同,停用其它外设模块的方式也与STOP模式相同,当然,原先能在STOP模式下存活的模块也能够在计算模式下存活,并保持了产生异步中断请求的能力。
在计算模式下,MCG、PMC、SRAM和FLASH的读端口(写操作被关闭了)不受影响,但是不能操作任何外设模块的寄存器。此时AIPS外设模块地址空间被关闭了,任何试图访问这个空间的操作都会引起总线访问错误。系统内核的私有外设地址空间仍然开放,一些内核中的模块,例如MCM、NVIC、IOPORT、SysTick等还能够继续工作。
这样看起来,进入计算模式后,整个MCU就变成了一个纯Arm Cortex-M内核的芯片,所有外设的功能都被屏蔽掉了。
你可能注意到了IOPORT仍可以继续工作,此时Arm内核仍可以通过IOPORT模块间接访问GPIO,但由于GPIO外设模块的时钟已经被关掉,此时读写GPIO的结果将是不可预知的,因此不推荐再进行任何GPIO操作。
与计算模式相关的寄存器是MCM模块的CPO寄存器(MCM_CPO),写MCM_CPO[CPOREQ]寄存器位为1或0,对应进入和退出计算模式。也可以配置在检测到外设模块的中断时自动退出计算模式。只有内核私有外设的中断(例如NMI和SysTick可以在不退出计算模式的情况下得到响应,还有一个例外是GPIO引脚中断,GPIO中断也是可以在计算模式内部得到响应。
当通过写MCM_CPO[CPOREQ]寄存器位为1进入计算模式时,标志位MCM_CPO[CPOACK]=1表示成功进入该模式。
当通过写MCM_CPO[CPOREQ]寄存器位为0,或者有外部中断到来,退出计算模式时, 标志位MCM_CPO[CPOACK]=0表示成功退出该模式。
当在VLPR模式(低功耗运行模式)中退出计算模式时,退出过程将会延时一段时间,直到PMC完成供电模式的转变。此时就需要软件轮询MCM_CPO[CPOACK]标志位,等待退出过程完成后,才能访问AIPS外设空间,从而避免在计算模式中访问外设寄存器而产生总线访问错误。
外设冻结模式
少数外设支持一种被称为"外设冻结(Peripheral Doze)"的模式,设计了一个寄存器位(通常位于SIM模块中,有时也会安排在外设模块内部,例如KL43的LCD_GCR[LCDDOZE]),可在低功耗模式期间自动禁用外设模块。
冻结模式在如下模式下都会起作用:
CPU处于WAIT模式。
CPU处于STOP模式,包含进入序列。也就是说,在进入STOP模式的过程中, 就已经先把外设冻结了。
CPU处于计算模式, 包含进入序列。
外设冻结模式是一种用户主动配置的功能: 在未启动外设冻结模式时,MCU进入需要停用外设模块的低功耗模式(各种类型的STOP模式)时,在硬件上需要先给总线上的所有外设模块(主机和从机)发送停机请求,当外设模块自行停机并返回停机响应之后,CPU才会自我休眠,当用户人工启用外设冻结模式后,不再需要向外设模块请求停机并等待,而是通过强制手段直接地关掉它们。当然,用户也可以配置外设冻结模式,在进入WAIT和VLPW模式下起作用。
举例来说,FLASH存储器就是一个支持冻结模式的外设模块。如果在WAIT和PSTOP模式下关闭对FLASH存储器的访问,冻结FLASH将会节约不少功耗。当然,从唤醒到开始执行FLASH中程序的时间也会稍微长一点,但如果此时执行的是存放在SRAM中程序,就不会有延时的情况存在了。
操作FLASH冻结模式的寄存器位于SIM模块的SIM_FCFG1[FLASHDOZE],这个功能模式在默认情况下是关闭的,就是说在可以配置冻结FLASH的情况下,FLASH默认是没有被冻结。
时钟门控
为了节约电能, 绝大多数模块的时钟都可以通过SIM的SCGCx寄存器关掉。这些控制寄存器位在复位后都被清零,对应的模块也被关停。在初始化任何一个外设模块之前,需要在SIM_SCGCx寄存器中启用相应模块的时钟,在停用模块之后再停止时钟供应。
关于这部分的更多描述,可以参阅系统时钟框图的说明,及SIM模块中寄存器们的具体配置选项。
以SIM_SCGC5寄存器为例,它控制GPIOA、GPIOB、LPUART0和LPTMR的时钟, 如下所示:
从控制时钟的角度看对功耗的控制,就先介绍到这里。本文的下篇将介绍从电源控制的角度实现功耗的控制。
作者:苏勇 文章出处:恩智浦MCU加油站
|