YTM32的电源管理与低功耗系统详解

YTM32的电源管理与低功耗系统详解

苏勇,2023年10月

缘起

前几天有客户在技术交流群里问,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)等电路单元,以及一个包含多种功耗模式的电源管理模型,控制和管理芯片内部的多个调压器(对应不同电压、不同带载能力)以及对多外设模块的供电开关。

在这里插入图片描述

图x YTM32B1ME的电源管理系统

以YTM32B1ME为例,图x展示了YTM电源管理系统的功能框图。其中VDD是整颗芯片的输入电压源,在芯片工作的整个生命周期中,需要保持稳定的供电。VDD25VDD11分别对应两个内部调压器的输出,其中VDD11为内部的处理器内核和逻辑电路供电。PD0(Power Domain 0)所在的供电线路是常供电的电源域,PD1(Power Domain 1)所在的供电线路在PowerDown模式下会被停电。像FIRCPLLSXOSCSXOSCSIRC等时钟发生器,若被停电,则使用这些时钟作为时钟源的外设模块也会随之停止工作。

电源管理模型的功耗模式

YTM32微控制器的电源管理体系中,按照功耗从高向低排列,最多包括:正常模式(Normal/Active)、休眠模式(Sleep)、深度休眠模式(DeepSleep)、待机模式(StandBy)及掉电模式(PowerDown)。对于使用Arm Cortex-M0+内核的YTM32B1L系列,精简了其中的PowerDown模式。其中,Normal、Sleep和DeepSleep都是基本的Arm架构低功耗模式,可按照常规操作方式,先对SCB_SCR寄存器进行配置,然后通过WFI指令进行进入Sleep或DeepSleep模式。如图x所示。

在这里插入图片描述

图x Arm内核的SCB_SCR寄存器

StandBy和PowerDown是YTM32在自家SoC上,进一步实现更低功耗的工作模式,还需要配合另外的PCU模块(Power Control Unit),设置复位相关的功能,才能正常工作。如图x所示。

在这里插入图片描述

图x 进入StandBy模式的使能开关
正常模式(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指令进入。

在具体芯片的手册中可以查阅到各外设模块在不同低功耗模式下的工作模式,以及唤醒源。

在这里插入图片描述

图x 各外设在不同功耗模式下的工作状态(部分)

其中:

  • 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所示。

在这里插入图片描述

图x 各外设在不同功耗模式下的唤醒源(部分)

RCU模块

RCU(复位控制单元,Reset Control Unit)是监测复位事件和配置RESET引脚的模块。RCU不能主动产生复位信号,因为复位信号大多是由外部的异常情况触发的,通常情况下也不希望芯片系统频繁复位(少数从低功耗或者通过SCB主动触发重新执行程序的应用除外)。RCU_RSSR寄存器中的状态标志位,标记了最近一次导致复位的是什么事件。RCU_RPFR寄存器是专门配置RESET引脚的,包括是否禁用RESET引脚(彻底防止芯片的RESET引脚受到外部噪声信号影响意外触发复位,电机应用中常用),在不同低功耗模式下是否继续工作,以及RESET引脚作为一个输入输出信号的方向(复位过程中是否向外送低电平信号)和输入滤波(抗噪声)等。

这里重点看下RCU能够帮助用户监测到的复位事件。图x中向用户展示了RCU_RSSR寄存器中的全部复位事件的标志位。

在这里插入图片描述

图x RCU_RSSR寄存器
标志位复位事件详细说明
HVD高压复位PVD监测到VDD上的电压过高,高于芯片能够承受的供电电压范围。其中,判决高压支持门限的值,是通过生产芯片的校准过程预设的。
LPACK低功耗应答超时复位当PCU模块向芯片系统发出即将进入低功耗的消息时,要求各外设模块尽快调整状态准备进入低功耗(相当于要熄灯睡觉了),每个外设模块在准备好之后,最后向PCU回发应答确认。只有当所有的外设都应答后,PCU才能开始调整供电系统(关闭一部分供电,切换一部分供电电源)。但如果有应答迟迟未到,那是不能随意切换电源的,此时,系统判定可能有一些模块可能工作异常,因此试图通过重启系统实现修复。
WDG看门狗复位WDG看门狗计数器超时触发的复位事件。此时可能判定原本需要定期抑制超时定时器的操作(喂狗)间隙中,因为某些不正常的执行流程耽搁了过多的时间。此时系统判定出现故障,试图通过重启系统实现修复。
CMU时钟监控复位CMU模块中的时钟监控器(Clock Monitor)触发的复位事件。Clock Monitor监控到芯片的时钟源不稳定了,后面的程序可能就不可靠了,直接复位,再看看时钟系统,否则就一直在复位循环中,别出来祸祸外部的电路系统了。
LOCKUPARM核死锁复位ARM核心自己拌住自己了???
DBG调试器复位调试器发送复位命令触发的复位事件。
SW软件主动复位软件通过写ARM核的SYSRESETREQ寄存器,主动触发的复位事件。这个复位事件常用于执行OTA更新固件(烧写好新程序后重新启动)
PINRESET引脚复位通过RESET引脚产生的复位事件。正常情况下,RESET引脚输出高电平,当外部拉低RESET引脚并保持一段时间后,触发RESET引脚复位事件,芯片执行复位。
POR_LVD上电复位通过系统上电过程触发的复位事件。上电启动后,触发芯片的复位操作,芯片从头开始执行程序。上电过程包含了LVD(低电压检测)的过程,因此可使用同一个复位源。

注:芯片从PowerDown模式下唤醒后的复位,也算作POR_LVD复位事件中。

WKU模块

WKU(唤醒源,Wake-Up Unit)是配套PowerDown模式的一个专门的唤醒源,它在正常工作模式和普通的低功耗模式下都是停用的,只有当芯片被切入PowerDown模式,由芯片系统自动启用。但要注意,仍需要用户在正常工作模式下预先配置好WKU及唤醒后的少量处理流程(WKU也可以触发中断,WKU的中断服务程序在唤醒后立即执行,然后再执行复位流程)。

WKU实际是管理了一组特定的GPIO引脚的中断,如图x所示。
在这里插入图片描述

图x YTM32B1ME05微控制器上的WKU信号
因此,若要确保这些引脚在PowerDown模式下还能继续保持对外部信号变化的感应能力,就需要确保在PowerDown模式下,这些引脚的GPIO控制时钟源仍能工作。此时肯定不能使用总线时钟或者PLL之类的,可以选用SIRC或者SXOSC这种耗电较低的时钟源。

在这里插入图片描述

图x WKU的唤醒引脚控制寄存器PCR

而WKU的唤醒引脚标志位寄存器WKU_PER中标记了触发唤醒的引脚。这个寄存器的32位分别对应一个引脚,因此我猜想,这可能也是限制当前YTM32微控制器芯片最多仅能使用32个GPIO引脚作为唤醒源的一个条件。当然,这也算不上限制,如果真有需要,就再加一个WKU_PER2寄存器好了。

WKU为管理来自于RESET引脚的唤醒信号,专门设计了寄存器WKU_RPCR。分别对应是否使用RESET引脚唤醒PowerDown模式(是否作为唤醒源的差别仅在于是否执行那个唤醒的中断服务程序)、输入信号滤波器(抗干扰)和滤波器的时钟源。注意,此处的滤波器实际是信号检测单元,RESET引脚无论如何都是输入信号与WKU无关,但WKU从中撷取一脉信号,作为WKU的唤醒信号。如图x所示。

在这里插入图片描述

图x WKU的复位引脚控制寄存器RPCR

WKU模块除了可以使用GPIO引脚唤醒中断,还能配置捕获来自于别的能在PowerDown模式下存活的模块,例如RTC、LPTMR、ACMP等。对应可以在WKU_MER[WUME]寄存器中启用。如图x所示。

在这里插入图片描述

图x WKU可以捕获来自其它PowerDown模式外设的唤醒触发信号

PCU模块

PCU(电源管理单元,Power Control Unit),被冠以管理电源的名字,但在大多数情况下是一个被动监控电源的模块。芯片系统对PMC的核心单元,调压器VDD、VDD25和VDD11,都是由硬连线固定好了。至于这些硬连线是如何连接的,就需要用户在具体使用某个外设模块时,查阅本文提到的各种芯片具体相关的表格。

PCU模块中设计了一些标志位用以监控供电系统的情况PCU_SSTSPCU_STS,可以启用一些中断,包括VDD电压过高PCU_INTE[HVD50IE]、VDD25电压过高PCU_INTE[HVD25IE]、VDD11电压过高PCU_INTE[HVD11IE],(PCU的绝大部分监控机制都是考虑高压警告,对低压检测LVD真是放心)。

对软件用户来说,相对常用的控制位都在PCU_CTRL寄存器中,用于切换YTM32自家实现的两个低功耗模式。

在这里插入图片描述

图x PCU的控制寄存器PCU_CTRL

若需要进入StandBy模式或者PowerDown模式,需要先将PCU_CTRL[STANDBYEN]或者PCU_CTRL[RPMEN]控制器置位,然后再送水服用,咳…咳…,再使用WFI命令启动休眠过程。

RESET引脚真是个香馍馍,RCU、WKU都有专门针对RESET设计的寄存器。

应用要点(软件)

YTMicro SDK中设计了rcu_driverwku_driverpower_manager等驱动组件,为管理YTM32微控制器的电源系统提供了API。并创建了powermodepower_downpower_down_ram_retention等样例工程,演示切换功耗模式的用法。

总结

本文梳理了YTM32电源管理系统中全部5个功耗模式,以及管理供电系统的外设和相关的外设模块,详描了其中的工作机制。电源管理系统相对其他可编程的外设,灵活度较少,很多机制都是固化在硬件电路系统(模拟设计)中,对软件开发者来说,不是很容易掌控。使用电源管理系统,更偏重去了解其中的工作机制,从而让软件配合其工作。毕竟电路已经固化了,但软件是可编程的。

最后回答一开始提出的问题:

  • 在低StandBy模式下,可以通过YTM32芯片的任意GPIO引脚唤醒MCU,并且唤醒后可以复原至早先休眠的地方。
  • 如果在更低功耗的PowerDown模式下(YTM32B1L系列未配备,仅在YTM32B1M系列上实现),就只能通过预设的部分引脚,通过WKU模块实现唤醒功能,并且唤醒后,需要从复位开始,重新运行应用软件。

在GPIO外设模块的功能介绍中,说明GPIO能够实现在低功耗模式下的异步唤醒(没有总线时钟的驱动),用以产生中断触发、DMA触发,或是别的支持的触发信号。如图x所示。

在这里插入图片描述

图x GPIO特性中关于低功耗和唤醒的相关介绍

在YTM32B1Lx手册中关于GPIO功耗模式的介绍中,说明如果支持Sleep/DeepSleep/Standby模式的情况下,可以通过GPIO中断事件(同步或者异步时钟),唤醒MCU。

在这里插入图片描述

图x GPIO模块从Sleep/DeepSleep/Standby模式唤醒

但在YTM32B1Mx手册中关于GPIO的描述中,提到,如果要从PowerDown模式下唤醒,则必须通过WKU模块唤醒。(YTM32B1Lx系列为集成WKU,并且也不支持PowerDown模式):

在这里插入图片描述

图x GPIO模块从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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值