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

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

在这里插入图片描述

图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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/147466.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型之十五-预训练和监督微调中文LLama-2

这篇博客是继《大语言模型之十二 SentencePiece扩充LLama2中文词汇》、《大语言模型之十三 LLama2中文推理》和《大语言模型之十四-PEFT的LoRA》 前面博客演示了中文词汇的扩充以及给予LoRA方法的预训练模型参数合并,并没有给出LoRA模型参数是如何训练得出的。 本篇…

WebSocket实战之六心跳重连机制

一、前言 WebSocket应用部署到生产环境,我们除了会碰到因为经过代理服务器无法连接的问题(注:该问题可以通过搭建WSS来解决,具体配置请看 WebSocket实战之四WSS配置 ),另外一个问题就是外网环境不稳定经常…

基本的五大排序算法

目录: 一,直接插入算法 二,希尔排序算法 三,选择排序 四,堆排序 五,冒泡排序算法 简介: 排序算法目前是我们最常用的算法之一,据研究表明,目前排序占用计算机CPU的时…

Linux环境下gdb调试方法与演示

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境&#xff1…

OpenCV 14(角点特征Harris和Shi-Tomasi)

一、角点 角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在三维场景重建运动估计,目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路…

BP神经网络的MATLAB实现(含源代码)

BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一 具体数学推导以及原理在本文不做详细介绍,本文将使用MATLAB进行B…

106.从中序与后序遍历序列构造二叉树

力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树: class Solution { public:Tr…

c++-vector

文章目录 前言一、vector介绍二、vector使用1、构造函数2、vector 元素访问3、vector iterator 的使用4、vector 空间增长问题5、vector 增删查改6、理解vector<vector< int >>7、电话号码的字母组合练习题 三、模拟实现vector1、查看STL库源码中怎样实现的vector2…

【Java 进阶篇】JDBC查询操作详解

在数据库编程中&#xff0c;查询是一项非常常见且重要的操作。JDBC&#xff08;Java Database Connectivity&#xff09;提供了丰富的API来执行各种类型的查询操作。本篇博客将详细介绍如何使用JDBC进行查询操作&#xff0c;包括连接数据库、创建查询语句、执行查询、处理结果集…

ElasticSearch第四讲:ES详解:ElasticSearch和Kibana安装

ElasticSearch第四讲&#xff1a;ES详解&#xff1a;ElasticSearch和Kibana安装 本文是ElasticSearch第四讲&#xff1a;ElasticSearch和Kibana安装&#xff0c;主要介绍ElasticSearch和Kibana的安装。了解完ElasticSearch基础和Elastic Stack生态后&#xff0c;我们便可以开始…

关于算法复杂度的几张表

算法在改进今天的计算机与古代的计算机的区别 去除冗余 数据点 算法复杂度 傅里叶变换

ASUS (k013) ME176CX不进入系统恢复出厂设置的方法

k013 me176cx ASUS k013 ME176CX不进入系统恢复出厂设置的方法 当忘记系统密码或系统异常导致无法进入系统时&#xff0c;可以按以下步骤尝试不进入系统恢复出厂设置来解决。 注意&#xff1a;执行恢复出厂设置前&#xff0c;请先将资料备份至外接设备&#xff0c;否则资料都…

基于MFC和OpenCV实现人脸识别

基于MFC和OpenCV实现人脸识别 文章目录 基于MFC和OpenCV实现人脸识别1. 项目说明1. 创建项目2. 启动窗口3. 登录窗口-添加窗口、从启动窗口跳转4. 启动窗口-美化按钮5. 登录窗口-美化按钮、雪花视频6. 注册窗口-美化按钮、雪花视频、从启动窗口跳转7. 注册窗口-开启摄像头8. 注…

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG&#xff1a;dbms failed to start 二、CQL语法2.1 CQL语法创建节点查询节点创建关系查询关系2.2 习题 习题答案 序 知识图谱&#xff0c;是一种实体间的信息与关系知识的网状结构&#xff0c;借用图论中点与边的概念…

自动驾驶中的感知模型:实现安全与智能驾驶的关键

自动驾驶中的感知模型&#xff1a;实现安全与智能驾驶的关键 文章目录 引言感知模型的作用感知模型的技术安全与挑战结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;全新的PnC培训…

力扣练习——链表在线OJ

目录 提示&#xff1a; 一、移除链表元素 题目&#xff1a; 解答&#xff1a; 二、反转链表 题目&#xff1a; 解答&#xff1a; 三、找到链表的中间结点 题目&#xff1a; 解答&#xff1a; 四、合并两个有序链表&#xff08;经典&#xff09; 题目&#xff1a; 解…

opencv实现目标跟踪及视频转存

创建跟踪器 def createTypeTracker(trackerType): 读取视频第一帧&#xff0c;选择跟踪的目标 读第一帧。 ok, frame video.read() 选择边界框 bbox cv2.selectROI(frame, False) 初始化跟踪器 tracker_type ‘MIL’ tracker createTypeTracker(tracker_type) 用第一…

SpringBoot的全局异常拦截

在 Spring Boot 中&#xff0c;可以通过使用 ControllerAdvice 注解和 ExceptionHandler 注解来实现全局异常拦截。 RestControllerAdvice RestControllerAdvice 是 Spring Framework 提供的注解&#xff0c;用于定义全局异常处理类&#xff0c;并且结合 ExceptionHandler 注…

Rabbitmq安装-docker版

1.简介 2.安装消息队列 下载地址https://www.rabbitmq.com/download.html 使用docker方式安装 需要先下载docker&#xff0c;参考文章https://blog.csdn.net/weixin_43917045/article/details/104747341?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22arti…

基于matlab创作简易表白代码

一、程序 以下是一个基于MATLAB的简单表白代码&#xff1a; % 表白代码 clc; % 清除命令行窗口 clear; % 清除所有变量 close all; % 关闭所有图形窗口 % 输入被表白者的名字 name input(请输入被表白者的名字&#xff1a;, s); % 显示表白信息 fprintf(\n); fprintf(亲爱的…