YTM32的低功耗PowerDown模式及唤醒管理器WKU模块

文章目录

    • Introduction
    • 专门的唤醒源管理器WKU
      • 外部的唤醒引脚
      • 内部的触发信号
    • 进入PowerDown模式的操作流
      • 进入低功耗模式
      • 配合使用的其他模块
    • 性能指标
      • 低功耗电流
      • 唤醒时间
    • Conclusion

Introduction

YTM32的低功耗系统中有设计了多种工作模式,功耗从高到低,包括:正常工作模式(Active Mode)、休眠模式(Sleep Mode)、深度休眠模式(DeepSleep Mode)、待机模式(Standby Mode)和掉电模式(PowerDown Mode)。其中Active Mode、Sleep Mode和DeepSleep Mode是Arm处理器内核定义的通用功耗模式,分别对应着芯片系统正常工作、停用CPU时钟但不停用系统总线时钟,以及进一步停用系统总线时钟的三种情况。在有多组内部调压器(regulator)的MCU功耗管理系统中,在这三种常规的功耗模式下,在芯片内部通常仍设计使用同一个高压调压器(例如LDO25)供电,此时,在不同工作模式下,通过逐步停用芯片内部各功能区域的时钟,可以实现降低系统功耗。

YTM32在通用功耗模式之外,设计了Standby Mode,相对于Arm定义的DeepSleep Mode,StandBy Mode切换使用芯片内部的处于节能模式的低压调压器(LDO11)为部分片内模块供电,高压调压器处于不激活的节能模式,如此,可以进一步减少系统的功耗。此时,芯片内部只有能够使用低压调压器工作的模块还能存活,例如一些低速的时钟源(SIRC、SXOSC),以及可以使用这些时钟源的外设(LPTMR、SPI、I2C等)。

进一步在PowerDown模式中,彻底停用了高压调压器,仅保留处于节能模式下的低压调压器为部分模块供电,对应也停用了一些原本还可以在Standby模式下存活的外设,仅保留了少量外设,包括SIRC(选配)、SXOSC(选配)、LPTMR、RTC、ACMP等,以及将这些外设的触发事件作为唤醒源唤醒芯片系统的WKU模块。特别注意,在PowerDown模式中,Flash和大部分SRAM(除了一小块特殊保留供电的区域)都已经停电,CPU不能从Flash中读取程序,SRAM中保存的数据也已经丢失,此时,即使原地唤醒MCU,也已经不具备原地唤醒的条件。因此,相比于其他低功耗模式下唤醒从原地醒来继续接着干活,PowerDown模式唤醒后,将直接进入硬件复位流程,通过重新启动过程,重新建立程序的运行环境。

由于PowerDown模式不是原地唤醒,而是进入复位流程重新执行程序,这对开发者不是很友好,因此很多用户都尽量避免使用这种模式。但对于追求极限低功耗的应用场景,PowerDown模式极度省电的特性也能帮助开发者实现最优的低功耗方案。本文整理了使用要点,供开发者了解和利用好PowerDown模式。

另外,关于片内调压器的节能模式,在寄存器字段PCU_CTRL[FASTREC]的介绍中,提到了一些有意思的说法:

This bit controls the recovery time from Low Power Mode (LPM) to Performance Mode (FPM). At recovery from Low Power Mode all the capacitors from the secondary supplies have to re recharged. This high current demand, that might not be met by the supply driving primary domain. When selecting the fast recovery time, the curre echarging is approximately 3 times higher than for FASTREC=0.

这里是说,当芯片系统从低功耗模式中恢复时,需要为次级负载(也就是外设模块)的电容充电(对应于芯片RESET引脚和VDD引脚上的电容)。相对于常规的从低功耗模式下恢复的机制,有一种快速回复模式,如果启用了快速恢复的功能,则会(用更大的电流)加速这个充电的过程,此时在主电源域(VDD)上流过的电流是未启用快速恢复功能的将近3倍,这样的大电流对外部供电系统也提出了要求。

专门的唤醒源管理器WKU

相对于其他低功耗工作模式可以通过任何外设的中断事件唤醒,在PowerDown模式下,Arm核的中断管理器NVIC都已经停用了,不能捕获中断事件。此时,必须使用具体芯片上专门设计的唤醒管理器WKU(概念类似于NXP产品中的LLWU),搜集触发信号,进一步唤醒MCU。需要特别注意的是,WKU模块仅能在PowerDown模式模式中时钟,WKU模块是不起作用的,

WKU模块(Wakeup Unit)可以捕获两种事件以唤醒PowerDown模式下的MCU:

  • 唤醒引脚上的电平变化
  • MCU内部模块发出的触发信号

外部的唤醒引脚

其中,WKU监控最多32个(受限于32位的WKU_PFR寄存器的宽度)唤醒引脚(Wake-Up Pin)上的电平变化,用户可在每个独立的WKU_PCRn[WUPE]寄存器字段中,为对应的唤醒引脚单独设置唤醒的事件,为上升沿、下降沿或者任一边沿。如图x所示。

在这里插入图片描述

图x WKU_PCR寄存器中配置唤醒引脚的触发事件

当配置启用唤醒引脚捕获外部引脚上特定的边沿触发事件,就相当于是把这些外部引脚都变成了工作在PowerDown模式下的复位引脚,外部电路可以通过它们复位并唤醒MCU。

从图x中还可以看到,在WKU_PCR寄存器唤醒引脚启用滤波器,以对外部输入的信号“消抖”。如果不启用滤波器,单纯监测外部电平变化产生唤醒请求,则MCU在PowerDown模式下也可以停用SIRC和SXOSC。但如果要启用过滤器,就必须启用对应的时钟源,因为过滤器是基于某一个时钟源进行连续采样和判别,从而实现“消抖”的功能。

这里提到的唤醒引脚,是WKU模块内部的信号,但在具体芯片上,WKU的唤醒引脚都是绑定到MCU的具体引脚上的,例如,在YTM32B1ME05的手册中,就有具体列出的引脚映射关系,如图x所示。
在这里插入图片描述

图x WKU唤醒引脚同芯片引脚的绑定关系

除了WKU管辖的32个普通的唤醒引脚,WKU还专门为RESET引脚设计了配置寄存器WKU_RPCR,如图x所示。其中也包含了关于引脚上滤波器的配置字段。另外,可以选配将RESET作为WKU的唤醒源,但若启用,只能通过下降沿触发(同复位控制电平保持一致),而不像别的唤醒引脚可以灵活配置多种边沿模式。

在这里插入图片描述

图x WKU_RPCR寄存器

内部的触发信号

WKU也能够捕获到芯片内部模块主动产生的触发信号,转变成唤醒事件。当然,前提是这些模块也能够在PowerDown模式下存活并工作。这些能够在PowerDown模式下存活并且能够产生触发信号给WKU的模块,在每个具体的MCU上都是专门定制的,以YTM32B1ME05为例,在WKU_MER寄存器中,就设计了能够捕获到的内部模块的开关,如图x所示。

在这里插入图片描述

图x WKU_MER寄存器

从寄存器字段WKU_MER[WUME]中可以看到,WKU能够捕获到内部模块的触发信号有RTC_IRQRTC_Seconds_IRQLPTMR0_IRQ,以及ACMP0_IRQ。关于此处使用的IRQ信号,对应需要RTC、LPTMR及ACMP0也要启用中断的。但此时并不是说能执行这些外设模块的中断服务程序(Flash和SRAM都断电了,不能访问程序也不能访问栈),而是这些外设模块在原本设计的中断事件产生了原本要发给NVIC中断管理器的触发信号,被WKU捕获,用作了唤醒源而已。类似地,本节前文内容中提到的WKU_PCR寄存器中,也要求当使用唤醒引脚时,也要在寄存器字段WKU_PCR[WUPIE]中开启对应的中断开关,不为调用中断服务程序,仅用于产生触发信号作为唤醒源而已。

这样分析下来,中断向量表中的WKU_IRQn也只是为了在通用的NVIC框架下管理WKU模块的中断信号而已,不见得真的能用上WKU_IRQHandler,所以,有一些非常细致的开发者会关心WKU唤醒后,是先执行WKU_IRQHandler中程序还是先执行复位流程。结论是,压根不建议使用WKU_IRQHander,还是之前强调过的,PowerDown模式下,Flash和SRAM都断电了,不具备原地执行程序的条件。

进入PowerDown模式的操作流

在进入PowerDown模式之前,一定要预先配置好唤醒源。

在进入PowerDown模式之前,一定要预先配置好唤醒源,否则芯片睡下去之后,就叫不醒了。咳咳,好吧,直接断电重新上电(POR)或者硬复位也可以让芯片恢复到正常工作状态,等价于PowerDown模式的唤醒行为。但这种唤醒其实是人工唤醒,不是监测外部触发信号唤醒,在实际产品中是没有意义的。不会真的有人将外部唤醒信号连到RESET引脚上吧,万一程序正常运行的时候被外部的触发信号意外复位,岂不是飞来横祸。。。

配置唤醒源的操作,是可以在程序正常运行的模式下完成的。配置引脚或者配置片内外设作为唤醒源都可以。若配置片内外设作为唤醒源,例如LPTMR,需要预先将作为唤醒源的外设及依赖的时钟源、电源都配置成可以在PowerDown模式下存活的状态,如此后续系统的电源管理电源PMU切换至PowerDown模式时,不影响唤醒源继续工作。

进入低功耗模式

PowerDown模式作为低功耗模式的扩展,也遵循使用WFI指令进入休眠的操作。但进入休眠之前,还需要进行一些专门的配置,告诉PMU将要进入的低功耗模式是PowerDown模式,而不是别的低功耗模式。

在YTMicro SDK的power驱动模块中,有关于切换低功耗模式的API,POWER_SYS_SwitchToLowPowerMode(),其中展现了进入PowerDown模式前需要准备的配置工作。

static void POWER_SYS_SwitchToLowPowerMode(const power_manager_user_config_t * const configPtr)
{uint32_t systickCSR;uint32_t cmuCtrl = SCU->CMU_CTRL;/* Configure the hardware layer */switch (configPtr->powerMode){...case POWER_MANAGER_POWERDOWN:SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;PCU->CTRL &= ~(PCU_CTRL_RPMEN_MASK | PCU_CTRL_STANDBYEN_MASK);PCU->CTRL |= PCU_CTRL_RPMEN_MASK;break;...}/* Disable CMU before entering low power mode */SCU->CMU_CTRL = 0;SCU->CMUSTS = SCU->CMUSTS;/* Disable systick before entering low power mode */systickCSR = SysTick->CTRL;SysTick->CTRL = 0x00;if (configPtr->sleepOnExitValue){SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;}else{SCB->SCR &= ~(SCB_SCR_SLEEPONEXIT_Msk);}__asm("wfi\n");/* Restore systick */SysTick->CTRL = systickCSR;/* Restore CMU control register */SCU->CMU_CTRL = cmuCtrl;
}

首先,要在Arm核规范的系统控制块模块中的SCB_SCR寄存器中,启用SCB_SCR_SLEEPDEEP_Msk位,表示在Arm核看来,PowerDown模式也是同自身的DeepSleep模式处于同一个级别的低功耗模式。然后在YTM32自己的功耗管理单元PCU的寄存器PCU_CTRL中,指定目标低功耗模式时DeepSleep而不是StandBy模式。RM手册中有PCU_CTRL[PCU_CTRL_RPMEN_MASK]寄存器的描述,如图x所示。

在这里插入图片描述

图x PCU_CTRL寄存器中的STANDBYEN和RPMEN控制字段

配合使用的其他模块

在进入PowerDown模式后,整个芯片系统以一种“不正常”的工作方式运行,需要提前关闭一些监测芯片正常工作的外设模块,防止误报错,例如,监测时钟系统稳定与否的CMU(Clock Monitor Unit)模块,监测系统供电低压LVD(Low Voltage Detection)模块等。

YTM32微控制器片内集成的复位管理模块RCU(Reset Control Unit),也为唤醒复位后的程序提供了复位事件的标志位,见RCU_RSSR寄存器,用来指示本次复位可是来自于从PowerDown模式下唤醒(使用RCU_RSSR[POR_LVD]标志位)。这些标志位是Sticky的,为了确保他们能够正确地指示最近一次的复位事件,程序在每次复位判定复位原因后,都需要手动清零,为记录下次复位原因做准备。

RCU_RSSR寄存器中,还设计了一个LPACK字段,用于指示当进入低功耗模式(包括DeepSleep、StandBy和PowerDown)失败超时产生的复位事件。如图x所示。

在这里插入图片描述

图x RCU_RSSR中的寄存器字段LPACK

手册中对RCU_RSSR[LPACK]字段的机制有进一步的说明:

The low power mode entry acknowledge timeout reset is generated if the MCU fails to enter low power
mode mode within 2^24 cycles of SIRC clock.

细心的读者会注意到,这里有个低功耗模式的应答和超时的概念。我试着演绎一下应答和超时的工作机制。当软件配置PCU进入低功耗模式后,PCU不是立刻粗暴地停用调压器,直接断开各外设模块的时钟供给,而是先给各外设模块发出断电的请求,各外设模块收到请求后,自行以安全的执行序列进入安全状态,准备休眠,并给PCU回复应答,可以断电了。PCU在收到所有外设模块的断电应答确认后,开始停用调压器,整个系统可以平稳切换至低功耗模式。但是,若因为某些原因(例如外设模块内部的状态机意外地执行到某个死锁的状态,或者任务负载过重来不及调度),导致外设模块在收到断电请求后,来不及在一个预留的事件段内切换到安全状态,更别说再回发断电应答了,那PCU不会那么智能地选择帮助外部模块诊断(各种稀奇古怪的)回复超时的原因,而是选择直接断电。此时的外设,像极了被宿管阿姨熄灯时,没准备好上床睡觉的各位同学。这种情况下断电,外设可能会被定格在不确定的情况下,产生额外的漏电,导致整个系统未能达到预期的低功耗性能指标。

RCU_RSSR[LPACK]标志位就反馈了这样的一种情况,当重新唤醒复位后,交由软件判定,并对上个休眠周期中未能成功进入低功耗的原因进行诊断。

SCU模块中,配置SIRC时钟源的寄存器位SCU_SIRC_CTRL[SIRC_PD_ EN],可以选配在PowerDown模式下,SIRC是否可以继续存活。配置SXOSC(低速晶振,32.768kHz)时钟源的寄存器位SCU_SXOSC_CTRL[SXOSC_PD_ EN],可以选配在PowerDown模式下,SXOSC是否可以继续存活。

性能指标

在DataSheet文档中,可以查阅到YTM32微控制器在PowerDown及其他低功耗模式下的性能指标,包括低功耗下的极限静态电流,以及唤醒时间等等。

低功耗电流

在这里插入图片描述

图x DS手册中关于PowerDown模式下静态功耗的指标

唤醒时间

在这里插入图片描述

图x PowerDown模式恢复到正常运行模式的时间长度

Conclusion

PowerDown模式可以实现最低的功耗模式,在超低功耗模式下,通过WKU管理的多种唤醒源,通过复位(而不是原地)唤醒微控制器芯片。

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

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

相关文章

Android AIDL 创建的DEMO

使用AIDL创建一个demo 主要参考文件, 以及其他地址 Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 绑定服务概览 | Android 开发者 | Android Developers Android 接口定义语言 (AIDL) Android 接口定义语言 (AIDL) 与您可能使用…

史诗级长文--决策树

决策树 决策树(decision tree)是一种基本的分类与回归方法。 举个通俗易懂的例子,如下图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形成代表终止模块(terminating block),表示已经得出结论,…

C练习——肇事卡车车牌号

题目: 一辆卡车违反交通规则,撞人后逃跑。现场有3人目击事件,但没有记住车牌号,只记住了车号的一些特征。 甲说:“牌照前两位数字是相同的”,乙说:“牌照的后两位数字是相同的,但与…

pinia的独立维护,统一导出及持久化

目录 1.说明及示例 2.注意 1.说明及示例 在src下创建store文件夹,在store文件夹下创建index.js文件,内容如下: import { createPinia } from "pinia"; // pinia的持久化 import piniaPluginPersistedstate from "pinia-pl…

odoo17 | 视图字段验证约束

前言 前一章介绍了向模型添加一些业务逻辑的能力。现在我们可以将按钮链接到业务代码,但是我们如何防止用户输入错误的数据呢?例如,在我们的房地产模块中,没有什么可以阻止用户设置负预期价格。 Odoo提供了两种方法来设置自动验证的不变量…

【gRPC学习】使用go学习gRPC

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 RPC是远程调用,而google实现了grpc比较方便地实现了远程调用,gRPC是一个现代的开源远程过程调用(RPC)框架 概念介绍 在gRPC中,客户端应用程序可以直接调用另一台计算机上的服务器应用程序上的方法&#…

认识加密和解密

加密技术源远流长,自从古代有了信息的传递和存储,就有了加密技术的运用。此后,很长一段时间里,加密及解密技术在军事、政治、外交、金融等特殊领域里被普遍采用,并经过长时间的研究和发展,形成了比较完备的…

element plus 表格组件怎样在表格中显示图片

官方给的&#xff1a; <el-table-column label"Thumbnail" width"180"><template #default"scope"><div style"display: flex; align-items: center"><el-image :preview-src-list"srcList"/><…

一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要&#xff1a;本文介绍变量和函数的基本知识 在前面一篇中了解了变量&#xff0c;接着就来了解一下函数。函数是程序中的一个关键概念&#xff0c;它可以简化程序的编写&#xff0c;使代码更加模块化、可复用&#xff0c;提高程序的可读性。其实在之前已经多次遇到函数了&am…

Arduion Modbus通讯示例

实现了Arduion和Qt上位机利用Modbus协议采集DHT11数据&#xff0c;以及开关LED灯 软件界面&#xff1a; 实物界面&#xff1a; arduion下位机代码&#xff1a; #include <ModbusRtu.h> #include <DHT.h>#define DHTPIN 2 // DHT11连接到Arduino的数字引…

使用C#发送邮箱验证码

使用C#发送邮箱验证码 在很多应用程序中&#xff0c;我们需要使用邮箱来进行用户身份验证。其中一种常见的方式是通过发送验证码到用户的邮箱&#xff0c;然后要求用户输入该验证码进行验证。本文将介绍如何使用 C# 发送邮箱验证码。 声明 验证码登录没有用任何的工具&#…

学习尚硅谷Vue的TodoList案例下半部分总结

今天学习尚硅谷Vue的TodoList案例四到八节的内容&#xff0c;主要实现的功能有勾选、删除、底部统计、底部交互这几部分。先说勾选&#xff0c;想要获取到用户是否勾选&#xff0c;就要给checkbox多选框注册鼠标点击事件&#xff0c;这里的思路是用户虽然是获取到了是否勾选但还…

项目框架构建之3:Nuget服务器的搭建

本文是“项目框架构建”系列之3&#xff0c;本文介绍一下Nuget服务器的搭建&#xff0c;这是一项简单的工作&#xff0c;您或许早已会了。 1.打开vs2022创建Asp.net Web应用程序 框架选择.net framework4.8&#xff0c;因为nuget服务器只支持.net framework。 2.选择空项目和保…

C++ 学习系列 -- tuple 原理

一 可变参数模板 variadic template 前面的章节 C 学习系列 -- 模板 template-CSDN博客 我们介绍了 c 中的模板概念&#xff0c;本章则在其基础上介绍了新的概念 可变参数模板 variadic template &#xff0c;顾名思义&#xff0c;可变参数模板意思为模板参数的类型与数量是变…

微信小程序封装vant 下拉框select 单选组件

先上效果图&#xff1a; 主要是用vant 小程序组件封装的&#xff1a;vant 小程序ui网址&#xff1a;vant-weapp 主要代码如下: 先封装子组件&#xff1a; select-popup 放在 components 文件夹里面 select-popup.wxml: <!--pages/select-popup/select-popup.wxml--> &…

爆肝整理,企业级性能测试-性能方案设计详细总结(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试策略 1&a…

【小沐学C++】C++ 实现鼠标键盘钩子HOOK

文章目录 1、简介2、相关函数2.1 SetWindowsHookEx2.2 UnhookWindowsHookEx2.3 CallNextHookEx 3、相关结构体3.1 KBDLLHOOKSTRUCT3.2 MSLLHOOKSTRUCT 4、挂钩过程5、代码测试5.1 代码1 结语 1、简介 https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks 挂…

Java学习笔记(十)——异常

一、异常的概念 二、异常体系图&#xff08;重要&#xff09; 三、常见的异常 &#xff08;一&#xff09;常见的运行时异常 1、NullPointerException空指针异常 2、ArithmeticException数学运算异常 3、ArrayIndexOutOfBoundsException数组下标越界异常 4、ClassCastEx…

CSS 压重按钮 效果

<template><view class="cont"><div class="container"><div class="pane"><!-- 选项1 --><label class="label" @click="handleOptionClick(0)":style="{ color: selectedOption ==…

约数个数和约数之和算法总结

知识概览 约数个数 由算数基本定理 可得对于N的任何一个约数d&#xff0c;有 因为N的每一个约数和~的一种选法是一一对应的&#xff0c;根据乘法原理可得&#xff0c; 一个数的约数个数为 约数之和 一个数的约数之和公式为 多项式乘积的每一项为 正好对应的是一个数的每一个约…