ARM32开发--电源管理单元
目录
文章目录
前言
学习目标
学习内容
PMU
电源域
VDD/VDDA域
备份域
1.2V域
省电模式
睡眠模式
深度睡眠模式
待机模式
几种模式总结
WFI和WFE指令
案例需求
模式初始化
源码
总结
前言
在嵌入式系统中,有效的电池管理和低功耗模式对于延长设备电池寿命至关重要。电池管理单元(PMU)及其相关的电源域和省电模式是实现这一目标的关键组成部分。本文将深入探讨PMU的功能、ARM32中的电源域结构,以及几种常见的省电模式。此外,我们还将了解如何通过在不同省电模式之间切换来优化系统功耗,同时保持系统的响应能力和功能完整性。
学习目标
- 了解什么是电池管理单元PMU
- 了解ARM32中的电源域
- 了解几种省电模式
学习内容
PMU
PMU全称Power Management Unit,电源管理单元。
电源域
总共有三大电源域,包括VDD / VDDA域,1.2V域和备份域。
VDD/VDDA域
VDD/VDDA域如下图:
提供PMU 常规电源供应以下模块的供电:
- 看门狗
- 主频晶振
- 内部晶振
- ADC和DAC
- LDO电源转换
- 上电复位
- 锁相环
备份域
备份域如下图:
备份域提供以下供电:
- 外部低频时钟晶振
- RTC
- 上电复位
- 电源转换
1.2V域
1.2V域如下图所示:
这个作用域主要提供:
- AHB高速总线的供电
- APB外设总线的供电
- 内存
- Cortex-M4的供电
省电模式
总共有三个省电模式:
- 睡眠模式
- 深度睡眠模式
- 待机模式
睡眠模式
睡眠模式时,会关闭 1.2V域中的 Cortex-M4的供电。
深度睡眠模式
进入深度模式时,会关闭 1.2V域中的所有供电;同时关闭VDD/VDDA域中的HXTAL
IRC16M
PLLs
待机模式
进入待机模式时,会关闭1.2V域中的所有供电;同时关闭VDD/VDDA域中的LDO、IRC16M、HXTAL、PLLs;
几种模式总结
WFI和WFE指令
在ARM架构中,WFI(Wait For Interrupt)和 WFE(Wait For Event)是用于使处理器进入低功耗状态的指令。这两个指令主要用于在空闲时暂停处理器的执行,以节省功耗。
WFI指令:
WFI 指令使处理器进入等待中断状态。当处理器执行到 WFI 时,它会进入低功耗模式,直到有一个中断请求到达,将处理器唤醒。在等待中断期间,处理器会停止执行指令,以减少功耗。
WFE指令:
WFE 指令与 WFI 类似,但它不仅能够等待中断,还能够等待事件。事件是由外部设备或其他处理器触发的信号。当执行到 WFE 时,处理器会进入低功耗模式,直到有中断或事件到达,将处理器唤醒。与 WFI 不同,WFE 可以等待中断或事件中的任何一个。
案例需求
- 让LED1 每间隔一段时间闪烁(500ms)
- 通过串口切换 省电模式
- 为KEY2配置外部中断按键,按下时LED1自动切换开关
- 为PA0配置外部中断按键,按下时LED1自动切换开关
模式初始化
static void sleep_mode() {// 电池管理单元时钟rcu_periph_clock_enable(RCU_PMU);// 进入睡眠模式pmu_to_sleepmode(WFI_CMD);
}
static void deepsleep_mode() {// 电池管理单元时钟rcu_periph_clock_enable(RCU_PMU);// 进入深度睡眠模式pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_ENABLE, WFI_CMD);// 把主频设置回来SystemInit();
}
static void standby_mode() {// 电池管理单元时钟rcu_periph_clock_enable(RCU_PMU);// 清理待机模式标记pmu_flag_clear(PMU_FLAG_RESET_STANDBY);// 启用唤醒引脚pmu_wakeup_pin_enable();// 进入待机模式pmu_to_standbymode();
}
源码
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>
#include "main.h"
#include "USART0.h"
#include "EXTI.h"void EXTI_on_trig(exti_line_enum linex){if(linex == EXTI_1){printf("Key Trig\n");}
}void sleep_mode(){ // 睡眠模式// PMU -> RCUrcu_periph_clock_enable(RCU_PMU);printf("sleepmode1\n");// sleep modepmu_to_sleepmode(WFI_CMD);printf("sleepmode2\n");
}void deepsleep_mode(){ // 深度睡眠模式// PMU -> RCUrcu_periph_clock_enable(RCU_PMU);printf("deepsleep 1\n");// deepsleeppmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_ENABLE, WFI_CMD);// 把主频设置回来SystemInit();printf("deepsleep 2\n");
}void standby_mode(){ // 待机模式// PMU -> RCUrcu_periph_clock_enable(RCU_PMU);/* 清理待机模式标记 */pmu_flag_clear(PMU_FLAG_RESET_STANDBY);/* 启用唤醒按钮 enable PMU wakeup pin */pmu_wakeup_pin_enable();printf("standby 1\n");// standby待机模式pmu_to_standbymode();printf("standby 2\n");
} void USART0_on_recv(uint8_t* data, uint32_t len) {printf("recv: %s\n", data);switch(data[0]){case 0x00: // 睡眠模式sleep_mode();break;case 0x01: // 深度睡眠模式deepsleep_mode();break;case 0x02: // 待机模式standby_mode();break;default:break;}}static void GPIO_config(){// 初始化GPIO PB2rcu_periph_clock_enable(RCU_GPIOB);gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_2);
}static void delay(){uint32_t i = 50000000;while(i--){__NOP();}}int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
// systick_config();USART0_init();EXTI_init();GPIO_config();printf("Main Init\n");while(1){ // 让PB2切换亮灭gpio_bit_toggle(GPIOB, GPIO_PIN_2);// delay_ms(500);// 使用自己的睡眠函数delay();}
}
注意:
中断优先级配置为NVIC_PRIGROUP_PRE2_SUB2情况下:
- 串口的抢占优先级不能设置为0,否则系统无法正常睡眠,或不能正常唤醒
- 深度睡眠的外部中断的抢占优先级需要设置为0或1 (比串口高),否则无法正常唤醒
总结
电池管理单元(PMU)作为电源管理的核心,负责调控各种电源域,包括VDD/VDDA域、1.2V域和备份域。不同的电源域为系统的不同部分提供电源支持,保证了系统在不同工作模式下的正常运行。为了降低功耗,ARM架构中引入了几种省电模式,如睡眠模式、深度睡眠模式和待机模式,每种模式在不同场景下可以有效地降低系统的能耗。通过合理选择和配置这些省电模式,开发人员可以根据具体需求优化设备的能效和电池寿命,从而提升整体系统的性能和可靠性。
相关文章:

ARM32开发--电源管理单元
知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 PMU 电源域 VDD/VDDA域 备份域 1.2V域 省电模式 睡眠模式 深度睡眠模式 待机模式 几种模式总结 WFI和WFE指令 案例需求 模式初始化 源码 总结 前言 在嵌入式系统中,有效的电池管…...

Android Studio项目升级报错:Namespace not specified
原项目升级AGP到8.0时报错: Namespace not specified. Specify a namespace in the modules build file: C:\Users\Administrator\Desktop\MyJetpack\app\build.gradle. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about…...
渗透测试nginx增加400,500报错页面
nginx增加400,500报错页面 在Nginx中增加自定义的400和500错误页面,你需要编辑Nginx配置文件,通常这个文件位于 /etc/nginx/nginx.conf 或者 /etc/nginx/conf.d/default.conf,或者在 /usr/local/nginx/conf/nginx.conf (如果你是…...

OpenCV读取和显示和保存图像
# 导入 OpenCV import cv2 as cv # 读取图像 image cv.imread(F:\\mytupian\\xihuduanqiao.jpg) # 创建窗口 #显示图像后,允许用户随意调整窗口大小 cv.namedWindow(image, cv.WINDOW_NORMAL) # 显示图像 cv.imshow(image, image)# 将图像保存到文件 success cv…...

【面经总结】Java集合 - Map
Map 概述 Map 架构 HashMap 要点 以 散列(哈希表) 方式存储键值对,访问速度快没有顺序性允许使用空值和空键有两个影响其性能的参数:初始容量和负载因子。 初始容量:哈希表创建时的容量负载因子:其容量自动扩容之前被允许的最大…...
CompletableFuture方法介绍及代码示例
CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程。它实现了 Future 接口,并提供了非常强大的功能来处理异步操作。下面是 CompletableFuture 的一些关键内部方法及其详细解释。 基础方法 1. supplyAsync 和 runAsync: - supplyA…...

基于springboot的宠物商城网站
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的宠物商城网站,java项目…...
DM存储ontap系统修改管理IP
存储已配置完成在使用,修改管理ip不会影响生产 旧管理IP新管理IP192.0.2.1/24192.0.10.1/24192.0.2.2/24192.0.10.2/24192.0.2.3/24192.0.10.3/24 旧网关:192.0.2.254 新网关:192.0.10.254 查看现有的管理IP信息 cluster1::> network …...
Web前端商业素材:挖掘价值,释放创意的无限可能
Web前端商业素材:挖掘价值,释放创意的无限可能 在数字化时代,Web前端作为用户与互联网世界交互的桥梁,其重要性不言而喻。而商业素材,作为Web前端设计的重要组成部分,更是承载着品牌形象、传递商业信息的重…...

LeetCode206-反转链表
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …...

5000天后的世界
为何可以预见未来 1993年,在互联网的黎明时代,凯文凯利创办了《连线》杂志。他曾经采访过以比尔盖茨、史蒂夫乔布斯、杰夫贝佐斯为代表的一众风云创业家。《连线》杂志是全球发行的世界著名杂志,一直致力于报道科学技术带来的经济、社会变革…...

Photoshop中颜色与色调的调整
Photoshop中颜色与色调的调整 Photoshop中的颜色模式RGB模式灰度模式位图模式索引模式CMYK模式Lab模式 Photoshop中的颜色/色调调整命令颜色/色调调整命令的分类亮度/对比度调整命令色阶命令曲线命令曝光度命令自然饱和度命令色相/饱和度命令色彩平衡命令照片滤镜调整命令通道混…...
【退役之重学Java】终结篇,暂别 Java !
一、为什么退役后要重学 Java 应该说还是对技术抱有热情的,而 Java 是大学时期的主修方向,所以退役的半年之后选择重学 Java,至于此前半年的经历,有机会再给大家讲述吧。 二、重学 Java 的经历 在三月的尾巴,开始重…...
查找——顺序查找和折半查找
查找 关于顺序查找和折半查找,可点击此处进入旧金山大学提供的动画演示网站。 顺序查找 顺序查找又称线性查找。它对于顺序表和链表都是适用的。对于顺序表,可通过数组下标递增来顺序扫描每个元素;对于链表,则通过指针next来…...

Bio-Info每日一题:Rosalind-07-Mendel‘s First Law(孟德尔第一定律 python实现)
🎉 进入生物信息学的世界,与Rosalind一起探索吧!🧬 Rosalind是一个在线平台,专为学习和实践生物信息学而设计。该平台提供了一系列循序渐进的编程挑战,帮助用户从基础到高级掌握生物信息学知识。无论你是初…...

C++ 47 之 函数调用运算符重载
#include <iostream> #include <string> using namespace std;class MyPrint{ public:// 重载小括号() 重载谁operator后就紧跟谁的符号void operator()(string txt){cout << txt << endl;} };class MyAdd{ public:int operator()(int a, int b){retur…...

[Qt的学习日常]--常用控件1
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、什么是控…...

模型实战(23)之 yolov10 使用总结及训练自己的数据集
yolov10 使用总结及训练自己的数据集 0. yolov10 原理分析 此处参考:https://blog.csdn.net/CVHub/article/details/139204248论文:https://arxiv.org/pdf/2405.14458源码:https://github.com/THU-MIG/yolov10 论文原理分析: 创新: 双标签分配策略 众所周知,标签分配策略…...

AIRNet模型使用与代码分析(All-In-One Image Restoration Network)
AIRNet提出了一种较为简易的pipeline,以单一网络结构应对多种任务需求(不同类型,不同程度)。但在效果上看,ALL-In-One是不如One-By-One的,且本文方法的亮点是batch内选择patch进行对比学习。在与sota对比上…...

欧洲杯“球迷狂欢趴”开启,容声带来“健康养鲜”新理念
6月15日,容声冰箱在深圳举行了异彩纷呈的“欧洲杯养鲜补给站 球迷狂欢趴”系列活动。 容声国内营销总经理韩栋现场发布“以品质领先 为健康养鲜”的主题内容,强调容声将以健康养鲜技术产品的升级迭代,满足用户品质生活需求。 作为有着41年发…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...