电源管理单元(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,否则无法正常唤醒
八、总结
- 普通睡眠:任何中断都会唤醒。
- 深度睡眠: 唤醒中断睡眠优先级要高一些。
- 待机:会重启,不会走下面。
热门推荐
机动车发动机起火应该如何处置
如何查询异地车辆的违章记录
零售区位分析:如何选择最佳商圈提升销售业绩
两位数学家宣布拉姆齐理论90年来的重大进展
香格里拉旅游攻略:必去十大景点排行榜,邂逅人间净土的梦幻之美
如何检查里程表不动的问题?这种检查对车辆维护有何实际意义?
深度学习中的batch_size:概念、作用及选择指南
《怪物猎人:荒野》Steam解压慢?一招轻松解决
酉时是几点钟?十二个时辰分别对应什么时间?古人是如何计时的?
乌骨鸡汤,独特的滋补效果和美味口感,历来受到广大食客的喜爱
果农传授:4个实用技巧教你轻松挑选出汁多果甜的好苹果
2024年上海户口的六大优势,一起来看看!
刺梨:一种来自西南山区的特色野果
从“一刀切”到“量体裁衣”,肺癌治疗进入“精准时代”
搓手能防治疾病?搓手的这些养生功效,现在知道还不算晚
慢性胃炎患者可以吃玉米吗?医生的专业建议来了
世界八大奇迹:如今只剩下四个,第7个还只剩一根柱子
比现代更多彩的恐龙时代鸟类
伤口详细5厘米算重伤还是轻伤?(如何正确判断伤口严重程度)
什么是标的物?标的物的定义、分类与法律实践应用
中日双语:人生中的励志名言
诈骗罪主动退赃的能减刑多少
博物·岁时记|以爱之名 古代情人节不止七夕
像素不争论了,动态范围成摄影新追求
网球比赛计分规则全解析
详细介绍18650锂电池平头和尖头的区别
劲酒加红牛喝了会怎样
电动车刹车选前碟后鼓好,还是选前后碟刹好?哪个更实用
《伤寒论》沿革及版本流传
朱启南:从枪坛传奇到高官丈夫,40岁后的他经历了什么?