电源管理单元(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,否则无法正常唤醒
八、总结
- 普通睡眠:任何中断都会唤醒。
- 深度睡眠: 唤醒中断睡眠优先级要高一些。
- 待机:会重启,不会走下面。
热门推荐
《简爱》第18章:一场算命游戏引发的情感觉醒
《哪吒》爆红后,国漫崛起还有多远?
“长寿之乡”如皋:文化生态涵养“银发经济”
2024年1-11月南通市经济运行情况:主要指标平稳增长
微生物发酵与普洱茶的生产
儿童道路安全基本规则
合法裁员的步骤和流程是什么
前交叉韧带损伤如何预防?专业医生教你这样做!
潍坊人社:为灵活就业人员撑起“安全伞”
迈向Z级计算:Cloud4Science范式加速科学发现进程
历史高位!海南槟榔价格最高每斤可达50元以上
脚踝韧带松弛做什么动作能改善?
6个简单脚部拉伸动作,轻松缓解双脚和脚踝疼痛
消化系统常见疾病及其预防策略探究
小肠淋巴瘤做什么检查能确诊
小肠淋巴瘤的5大临床表现及诊断要点
强直性脊柱炎早期信号:如何识别并缓解腰背痛与晨僵困扰?
油耗情况怎么样?怎样降低油耗?
红枣真的能补血吗?科学解读与食用指南
红枣桂圆搭一宝,秋冬养生不烦恼!
学信网验证码查询:全面解析与使用指南
《海权论》中的海权思想主要讲了什么,又产生了什么影响?
一个眼睛感觉胀胀的是怎么回事
护眼中成药大盘点:五种常见药物的优劣与适用场景
眼睛胀痛怎么缓解
停止国际收养后,能不能从源头上杜绝弃婴?
西洋参能和红枣枸杞一起服用吗?医生这样说
换季不慌,中医有招:让你远离感冒的小指南
3C过度沉迷,颈肩腕综合症找上门!3茶饮助舒缓肩颈疼痛
吃什么增加中性粒细胞