YTM32的电源管理与低功耗系统详解
苏勇,2023年10月
文章目录
- YTM32的电源管理与低功耗系统详解
- 缘起
- 原理与机制
- 电源管理模型的功耗模式
- 正常模式(Normal)
- 休眠模式(Sleep)
- 深度休眠模式(DeepSleep)
- 待机模式(StandBy)
- 掉电模式(PowerDown)
- RCU模块
- WKU模块
- PCU模块
- 应用要点(软件)
- 总结
- 参考文献
缘起
前几天有客户在技术交流群里问,YTM32的LE产品能不能使用任意GPIO的中断将芯片从StandBy
模式下唤醒?按照我对功耗管理架构的理解,常规的MCU低功耗模式分浅睡和深睡,浅睡可以用常规中断唤醒,从哪里睡着就可以从哪里醒来;深睡需要专门的唤醒模块(例如Kinetis的LLWU模块),醒来之后效果同硬件复位效果等同,入睡之前的记忆全无,整个断片了。为了确认YTM32的微控制器如我理解一致,我专门查阅了LE和ME的手册进行核实,顺带梳理了YTM32平台上的电源管理与低功耗管理系统的实际资源和工作机制。
原理与机制
深入到微控制器的内部模块,大多数软件开发者了解时钟系统的重要性,却对供电系统所知不多。诚然,供电系统在芯片上电后,就基本稳定下来,几乎不需要开发者进行任何额外的操作。不过,对于对供电敏感的应用场景,为了充分利用有限的电能,需要根据电路系统的需求,动态调整整个芯片的功耗模式,此时,就需要充分了解芯片的电源系统及功耗管理机制,以合理的方式进行编程。
YTM32微控制器的电源管理系统,涉及到电源控制单元(Power Control Unit,PCU)、唤醒单元(Wakeup Unit,WKU), 复位控制单元(Reset Control Unit,RCU)等专门的外设模块,以及低电压检测(Low Voltage Detection,LVD)、POR(Power On Reset)等电路单元,以及一个包含多种功耗模式的电源管理模型,控制和管理芯片内部的多个调压器(对应不同电压、不同带载能力)以及对多外设模块的供电开关。
以YTM32B1ME为例,图x展示了YTM电源管理系统的功能框图。其中VDD
是整颗芯片的输入电压源,在芯片工作的整个生命周期中,需要保持稳定的供电。VDD25
和VDD11
分别对应两个内部调压器的输出,其中VDD11
为内部的处理器内核和逻辑电路供电。PD0
(Power Domain 0)所在的供电线路是常供电的电源域,PD1
(Power Domain 1)所在的供电线路在PowerDown
模式下会被停电。像FIRC
、PLLSXOSC
、SXOSC
、SIRC
等时钟发生器,若被停电,则使用这些时钟作为时钟源的外设模块也会随之停止工作。
电源管理模型的功耗模式
YTM32微控制器的电源管理体系中,按照功耗从高向低排列,最多包括:正常模式(Normal/Active)、休眠模式(Sleep)、深度休眠模式(DeepSleep)、待机模式(StandBy)及掉电模式(PowerDown)。对于使用Arm Cortex-M0+内核的YTM32B1L
系列,精简了其中的PowerDown模式。其中,Normal、Sleep和DeepSleep都是基本的Arm架构低功耗模式,可按照常规操作方式,先对SCB_SCR
寄存器进行配置,然后通过WFI
指令进行进入Sleep或DeepSleep模式。如图x所示。
StandBy和PowerDown是YTM32在自家SoC上,进一步实现更低功耗的工作模式,还需要配合另外的PCU模块(Power Control Unit),设置复位相关的功能,才能正常工作。如图x所示。
正常模式(Normal)
几乎所有的外设模块都可以全功能正常工作(除了像WKU这种尽在掉电模式才开始工作的模块除外)。芯片内部的调压器全部以最高性能状态工作,对绝大多数的外设模块开放供电。此时,处理器可以以最高性能运行。上电复位之后进入工作的初始状态。
休眠模式(Sleep)
CPU停止工作,内核中的部分模块仍在工作(NVIC),其他外设模块都保持同Normal模式相同的工作方式。LVD(Low Voltage Detection)保护单元仍在工作,这意味着内部的高压调压器还是正常工作的。此时只是CPU暂停了,外设模块可通过NVIC(中断事件)唤醒CPU。
从Normal模式进入Sleep模式,需要配置SCB_SCR[DEEPSLEEP]=0
寄存器位,然后使用WFI
指令进入。
深度休眠模式(DeepSleep)
CPU停止工作,但内部的高压调压器仍正常工作,系统总线时钟停用,NVIC停用。所有的内存和寄存器保持状态。如果配置外设使用除了系统总线时钟之外,其他还在工作的时钟作为时钟源,就仍可继续工作。“异步时钟”(不同于总线时钟的其它独立时钟源)仍可驱动部分外设的触发捕获电路,产生中断,通过NVIC唤醒芯片至Normal模式。
从Normal模式进入DeepSleep模式,需要配置SCB_SCR[DEEPSLEEP]=1
寄存器位,然后使用WFI
指令进入。
待机模式(StandBy)
在深度休眠模式基础上,内部的高压调压器也停用了,整个芯片由低压调压器继续供电维持,维持内部的内存和寄存器保持状态。如果配置外设使用除了系统总线时钟之外,其他还在工作的时钟作为时钟源,就仍可继续工作。“异步时钟”仍可驱动部分外设的触发捕获电路,产生中断,通过NVIC唤醒芯片至Normal模式。
StandBy模式相对于DeepSleep模式,主要变化在于用低压调压器替换高压调压器为芯片系统供电。此时要特别注意,要预先停用LVD
,否则当使用低压调压器供电后,LVD可能会误判供电不足而触发缺电保护机制,复位系统等。
从Normal模式进入StandBy模式,需要配置SCB_SCR[DEEPSLEEP]=1
寄存器位,配置PCU_CTRL[STANDBYEN]=1
,然后使用WFI
指令进入。
掉电模式(PowerDown)
掉电模式是YTM32目前最低功耗的模式。除了Arm核心,大部分外设模块也被直接停电,仅有WKU、PCU和一些低速时钟源仍能保持工作。除了WKU、PCU、SCU,大部分寄存器和SRAM的数据全部丢失。NVIC也停掉了,自然不能响应外部的中断。此时只能通过WKU唤醒芯片。因为内存环境都被破坏了,唤醒后进入复位,而不是从哪睡下从哪醒。
从Normal模式进入PowerDown模式,需要配置SCB_SCR[DEEPSLEEP]=1
寄存器位,配置PCU_CTRL[RPMEN]=1
,然后使用WFI
指令进入。
在具体芯片的手册中可以查阅到各外设模块在不同低功耗模式下的工作模式,以及唤醒源。
其中:
- FF:Full Function
- RPM:Reduced Power Mode
- When DPDEN=1, Flash will enter its deep power down mode
- 部分SRAM内存的在掉电模式下仍可保存(保留少量前生的记忆),0x1FFFC000-0x1FFFFFFF retained ,0x20000000-0x20003FFF retained 。
片上外设模块的供电线路相对于部分有灵活性的时钟源来说比较固定,除却时钟源,它们的供电线路也只能在固定的电源模式下正常供电。为外设模块铺设供电线路,通常是芯片系统集成阶段的工作,每款芯片都不尽相同,用户需要查阅用户手册才能确认它们实现的情况。例如,在YTM32B1ME微控制器的手册中可以查阅到关于各外设模块能否被唤醒(保持供电)的表格,如图x所示。
RCU模块
RCU(复位控制单元,Reset Control Unit)是监测复位事件和配置RESET引脚的模块。RCU不能主动产生复位信号,因为复位信号大多是由外部的异常情况触发的,通常情况下也不希望芯片系统频繁复位(少数从低功耗或者通过SCB主动触发重新执行程序的应用除外)。RCU_RSSR
寄存器中的状态标志位,标记了最近一次导致复位的是什么事件。RCU_RPFR
寄存器是专门配置RESET引脚的,包括是否禁用RESET引脚(彻底防止芯片的RESET引脚受到外部噪声信号影响意外触发复位,电机应用中常用),在不同低功耗模式下是否继续工作,以及RESET引脚作为一个输入输出信号的方向(复位过程中是否向外送低电平信号)和输入滤波(抗噪声)等。
这里重点看下RCU能够帮助用户监测到的复位事件。图x中向用户展示了RCU_RSSR
寄存器中的全部复位事件的标志位。
标志位 | 复位事件 | 详细说明 |
---|---|---|
HVD | 高压复位 | PVD监测到VDD上的电压过高,高于芯片能够承受的供电电压范围。其中,判决高压支持门限的值,是通过生产芯片的校准过程预设的。 |
LPACK | 低功耗应答超时复位 | 当PCU模块向芯片系统发出即将进入低功耗的消息时,要求各外设模块尽快调整状态准备进入低功耗(相当于要熄灯睡觉了),每个外设模块在准备好之后,最后向PCU回发应答确认。只有当所有的外设都应答后,PCU才能开始调整供电系统(关闭一部分供电,切换一部分供电电源)。但如果有应答迟迟未到,那是不能随意切换电源的,此时,系统判定可能有一些模块可能工作异常,因此试图通过重启系统实现修复。 |
WDG | 看门狗复位 | WDG看门狗计数器超时触发的复位事件。此时可能判定原本需要定期抑制超时定时器的操作(喂狗)间隙中,因为某些不正常的执行流程耽搁了过多的时间。此时系统判定出现故障,试图通过重启系统实现修复。 |
CMU | 时钟监控复位 | CMU模块中的时钟监控器(Clock Monitor)触发的复位事件。Clock Monitor监控到芯片的时钟源不稳定了,后面的程序可能就不可靠了,直接复位,再看看时钟系统,否则就一直在复位循环中,别出来祸祸外部的电路系统了。 |
LOCKUP | ARM核死锁复位 | ARM核心自己拌住自己了??? |
DBG | 调试器复位 | 调试器发送复位命令触发的复位事件。 |
SW | 软件主动复位 | 软件通过写ARM核的SYSRESETREQ寄存器,主动触发的复位事件。这个复位事件常用于执行OTA更新固件(烧写好新程序后重新启动) |
PIN | RESET引脚复位 | 通过RESET引脚产生的复位事件。正常情况下,RESET引脚输出高电平,当外部拉低RESET引脚并保持一段时间后,触发RESET引脚复位事件,芯片执行复位。 |
POR_LVD | 上电复位 | 通过系统上电过程触发的复位事件。上电启动后,触发芯片的复位操作,芯片从头开始执行程序。上电过程包含了LVD(低电压检测)的过程,因此可使用同一个复位源。 |
注:芯片从PowerDown模式下唤醒后的复位,也算作POR_LVD复位事件中。
WKU模块
WKU(唤醒源,Wake-Up Unit)是配套PowerDown模式的一个专门的唤醒源,它在正常工作模式和普通的低功耗模式下都是停用的,只有当芯片被切入PowerDown模式,由芯片系统自动启用。但要注意,仍需要用户在正常工作模式下预先配置好WKU及唤醒后的少量处理流程(WKU也可以触发中断,WKU的中断服务程序在唤醒后立即执行,然后再执行复位流程)。
WKU实际是管理了一组特定的GPIO引脚的中断,如图x所示。
而WKU的唤醒引脚标志位寄存器WKU_PER
中标记了触发唤醒的引脚。这个寄存器的32位分别对应一个引脚,因此我猜想,这可能也是限制当前YTM32微控制器芯片最多仅能使用32个GPIO引脚作为唤醒源的一个条件。当然,这也算不上限制,如果真有需要,就再加一个WKU_PER2
寄存器好了。
WKU为管理来自于RESET引脚的唤醒信号,专门设计了寄存器WKU_RPCR
。分别对应是否使用RESET引脚唤醒PowerDown模式(是否作为唤醒源的差别仅在于是否执行那个唤醒的中断服务程序)、输入信号滤波器(抗干扰)和滤波器的时钟源。注意,此处的滤波器实际是信号检测单元,RESET引脚无论如何都是输入信号与WKU无关,但WKU从中撷取一脉信号,作为WKU的唤醒信号。如图x所示。
WKU模块除了可以使用GPIO引脚唤醒中断,还能配置捕获来自于别的能在PowerDown模式下存活的模块,例如RTC、LPTMR、ACMP等。对应可以在WKU_MER[WUME]
寄存器中启用。如图x所示。
PCU模块
PCU(电源管理单元,Power Control Unit),被冠以管理电源的名字,但在大多数情况下是一个被动监控电源的模块。芯片系统对PMC的核心单元,调压器VDD、VDD25和VDD11,都是由硬连线固定好了。至于这些硬连线是如何连接的,就需要用户在具体使用某个外设模块时,查阅本文提到的各种芯片具体相关的表格。
PCU模块中设计了一些标志位用以监控供电系统的情况PCU_SSTS
和PCU_STS
,可以启用一些中断,包括VDD电压过高PCU_INTE[HVD50IE]
、VDD25电压过高PCU_INTE[HVD25IE]
、VDD11电压过高PCU_INTE[HVD11IE]
,(PCU的绝大部分监控机制都是考虑高压警告,对低压检测LVD真是放心)。
对软件用户来说,相对常用的控制位都在PCU_CTRL
寄存器中,用于切换YTM32自家实现的两个低功耗模式。
若需要进入StandBy模式或者PowerDown模式,需要先将PCU_CTRL[STANDBYEN]
或者PCU_CTRL[RPMEN]
控制器置位,然后再送水服用,咳…咳…,再使用WFI命令启动休眠过程。
RESET引脚真是个香馍馍,RCU、WKU都有专门针对RESET设计的寄存器。
应用要点(软件)
YTMicro SDK中设计了rcu_driver
、wku_driver
、power_manager
等驱动组件,为管理YTM32微控制器的电源系统提供了API。并创建了powermode
、power_down
和power_down_ram_retention
等样例工程,演示切换功耗模式的用法。
总结
本文梳理了YTM32电源管理系统中全部5个功耗模式,以及管理供电系统的外设和相关的外设模块,详描了其中的工作机制。电源管理系统相对其他可编程的外设,灵活度较少,很多机制都是固化在硬件电路系统(模拟设计)中,对软件开发者来说,不是很容易掌控。使用电源管理系统,更偏重去了解其中的工作机制,从而让软件配合其工作。毕竟电路已经固化了,但软件是可编程的。
最后回答一开始提出的问题:
- 在低StandBy模式下,可以通过YTM32芯片的任意GPIO引脚唤醒MCU,并且唤醒后可以复原至早先休眠的地方。
- 如果在更低功耗的PowerDown模式下(YTM32B1L系列未配备,仅在YTM32B1M系列上实现),就只能通过预设的部分引脚,通过WKU模块实现唤醒功能,并且唤醒后,需要从复位开始,重新运行应用软件。
在GPIO外设模块的功能介绍中,说明GPIO能够实现在低功耗模式下的异步唤醒(没有总线时钟的驱动),用以产生中断触发、DMA触发,或是别的支持的触发信号。如图x所示。
在YTM32B1Lx手册中关于GPIO功耗模式的介绍中,说明如果支持Sleep/DeepSleep/Standby模式的情况下,可以通过GPIO中断事件(同步或者异步时钟),唤醒MCU。
但在YTM32B1Mx手册中关于GPIO的描述中,提到,如果要从PowerDown模式下唤醒,则必须通过WKU模块唤醒。(YTM32B1Lx系列为集成WKU,并且也不支持PowerDown模式):
参考文献
- YTM32B1ME0x_RM_v1.3.pdf
- YTM32B1MD1x_RM_v1.1.pdf
- YTM32B1LE0x_RM_v1.4.pdf
- Power Management for Kinetis and ColdFire+ MCUs, https://www.nxp.com/docs/en/application-note/AN4503.pdf
- Low Power Experience Sharing, https://www.nxp.com/webapp/Download?colCode=DWF14_APF_IND_LOW_POWER&location=null