电源管理单元(PMU)详解:电源域、省电模式与案例实现
创作时间:
作者:
@小白创作中心
电源管理单元(PMU)详解:电源域、省电模式与案例实现
引用
CSDN
1.
https://blog.csdn.net/ic2121/article/details/144872010
电源管理单元(PMU)是嵌入式系统中重要的硬件模块,负责系统的电源管理和省电模式控制。本文将详细介绍PMU的各个电源域、省电模式以及如何通过代码实现不同模式的切换。
一、电源管理单元(PMU)概述
PMU全称Power Management Unit,电源管理单元。它主要负责系统的电源管理和省电模式控制。
1. 电源域
PMU包含三大电源域:
VDD / VDDA域
提供以下模块的供电:看门狗
主频晶振
内部晶振
ADC和DAC
LDO电源转换
上电复位
锁相环
备份域
备份域提供以下供电:外部低频时钟晶振
RTC
上电复位
电源转换
1.2V域
主要提供:AHB高速总线的供电
APB外设总线的供电
内存
Cortex-M4的供电
二、省电模式介绍
1. 省电模式分类
总共有三个省电模式:
- 睡眠模式
- 深度睡眠模式
- 待机模式
2. 各种模式的供电情况
- 睡眠模式:仅关闭Cortex-M4的供电
- 深度睡眠模式:关闭1.2V域中的所有供电;同时关闭VDD/VDDA域中的HXTAL、IRC16M、PLLs
- 待机模式:关闭1.2V域中的所有供电;同时关闭VDD/VDDA域中的LDO、IRC16M、HXTAL、PLLs
3. 模式总结
模式 | 睡眠 | 深度睡眠 | 待机 |
|---|---|---|---|
描述 | 仅关闭CPU时钟 | 关闭1.2V电源域的所有时钟;关闭IRC16M、HXTAL和PLL | 关闭1.2V电源域的供电;关闭IRC16M、HXTAL和PLL |
LDO状态 | 开启(正常功耗,正常驱动模式) | 开启(正常功耗或低功耗模式,正常驱动或低驱动模式) | 关闭 |
配置 | SLEEPDEEP=0 | SLEEPDEEP=1,STBMOD =0 | SLEEPDEEP=1,STBMOD=1,WURST=1 |
进入指令 | WFI或WFE | WFI或WFE | WFI或WFE |
唤醒 | 任何中断 | EXTI中断 | NRST引脚、WKUP引脚、FWDGT复位、RTC |
唤醒延迟 | 无 | IRC16M唤醒时间(可能包含LDO唤醒时间) | 上电序列 |
三、WFI和WFE指令
在ARM架构中,WFI(Wait For Interrupt)和WFE(Wait For Event)是用于使处理器进入低功耗状态的指令。
- WFI指令:使处理器进入等待中断状态,直到有中断请求到达。
- WFE指令:使处理器进入等待中断或事件状态,可以等待中断或事件中的任何一个。
四、案例需求
本案例实现以下功能:
- 让LED1每间隔500ms闪烁
- 通过串口切换省电模式
- 通过按键切换LED2和LED3的状态
五、模式初始化
1. 睡眠模式
static void sleep_mode() {
// 电池管理单元时钟
rcu_periph_clock_enable(RCU_PMU);
// 进入睡眠模式
pmu_to_sleepmode(WFI_CMD);
}
2. 深度睡眠模式
static void deepsleep_mode() {
// 电池管理单元时钟
rcu_periph_clock_enable(RCU_PMU);
// 进入深度睡眠模式
pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_ENABLE, WFI_CMD);
}
3. 待机模式
static void standby_mode() {
// 电池管理单元时钟
rcu_periph_clock_enable(RCU_PMU);
pmu_wakeup_pin_enable();
// 进入待机模式
pmu_to_standbymode();
}
六、完整源码
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"
// 省电模式函数定义(略)
void Usart0_on_recv(uint8_t* data, uint32_t len) {
printf("recv: %s\r\n", data);
if(data[0] == 0x00) {
printf("sleep mode \r\n");
sleep_mode();
} else if(data[0] == 0x01) {
printf("deepsleep mode \r\n");
deepsleep_mode();
SystemInit();
} else if(data[0] == 0x02) {
printf("standby mode \r\n");
standby_mode();
}
}
// EXTI配置函数定义(略)
void EXTI0_IRQHandler() {
// EXTI0中断处理(略)
}
void EXTI1_IRQHandler() {
// EXTI1中断处理(略)
}
int main(void)
{
systick_config();
Usart0_init();
EXTI0_config();
EXTI1_config();
// LED初始化(略)
while(1) {
gpio_bit_toggle(GPIOE, GPIO_PIN_3);
delay_1ms(500);
}
}
七、注意事项
- 中断优先级配置为NVIC_PRIGROUP_PRE2_SUB2情况下:
- 串口的抢占优先级不能设置为0,否则系统无法正常睡眠
- 深度睡眠的外部中断的抢占优先级必须设置为0或1,否则无法正常唤醒
八、总结
- 普通睡眠:任何中断都会唤醒。
- 深度睡眠: 唤醒中断睡眠优先级要高一些。
- 待机:会重启,不会走下面。
热门推荐
反恐部队的利器:MP7 冲锋枪
小语种翻译时需要遵循什么原则(小语种翻译)
已有多个“接班人”,为何70岁的董明珠还要再干三年?
脸部发烫是怎么回事?原因分析与应对方法
Ubuntu系统如何修改DNS
联想一体机电脑无法开机的解决方法(故障排查与应对)
长护险启动试点八年 全国超过1.8亿人参保 超260万失能人员享受待遇
白酒低度与高度的区别:从酒精含量到饮用体验的全面解析
糯小米和粘小米的功效与作用一样吗
大数据底座包括哪些
预测樱花开花,重要程度堪比“预报地震”!日本气候观察师:每家都有“独门绝技”
2025年十大高人气赛车游戏盘点:从画面到玩法全方位解析
CHRIST 冻干机真空度故障专业指导与高效服务
激励创新思维 实现企业发展
心室预激要不要治疗?医生的专业解答来了
配戴角膜塑形镜不能“一劳永逸”!爱尔眼科:一定要定期做眼检查
解析直男电影现象:角色塑造、社会文化背景全方位剖析
OD系统如何使用以提升驾驶体验?这种使用方法对车辆性能有何影响?
激光美白的优缺点分析及注意事项
我的世界加速时间指令是什么 加速时间流动指令代码
焊枪头的清洁与维护:恢复高效焊接的秘诀
美国加州山火告急,灭火飞机为何难以力挽狂澜?
道路交通事故中这20种情形承担全部责任
DAX中的RANK函数详解:语法、参数及实战示例
房间漏水是楼上的原因吗?探讨漏水原因与解决方案
个人所得税知识培训课件
等待的智慧:如何高效利用等待时间
卷尾猴:会用石块砸坚果的聪明小猴
质量问答:8D报告的原因分析怎么写?
A股11月红盘收官,下月行情是否能有更多期待?