ARM32开发——(二十四)电源管理单元

news2024/12/25 9:14:10

1. 重点

  • 了解什么是电池管理单元PMU
  • 了解ARM32中的电源域
  • 了解几种省电模式

2. 主要内容

2.1 PMU

PMU全称Power Management Unit,电源管理单元。

2.2 电源域

总共有三大电源域,包括VDD / VDDA域,1.2V域和备份域。

2.2.1 VDD/VDDA域

VDD/VDDA域如下图:

提供PMU 常规电源供应以下模块的供电:

  • 看门狗
  • 主频晶振
  • 内部晶振
  • ADC和DAC
  • LDO电源转换
  • 上电复位
  • 锁相环
2.2.2 备份域

备份域如下图:

备份域提供以下供电:

  • 外部低频时钟晶振
  • RTC
  • 上电复位
  • 电源转换
2.2.3 1.2V域

1.2V域如下图所示:

这个作用域主要提供:

  • AHB高速总线的供电
  • APB外设总线的供电
  • 内存
  • Cortex-M4的供电

2.3 省电模式

总共有三个省电模式:

  • 睡眠模式
  • 深度睡眠模式
  • 待机模式
2.3.1 睡眠模式

睡眠模式时,会关闭 1.2V域中的 Cortex-M4的供电。

2.3.2 深度睡眠模式

进入深度模式时,会关闭 1.2V域中的所有供电;同时关闭VDD/VDDA域中的HXTALIRC16MPLLs

2.3.3 待机模式

进入待机模式时,会关闭1.2V域中的所有供电;同时关闭VDD/VDDA域中的LDO、IRC16M、HXTAL、PLLs

2.3.4 几种模式总结

2.4 WFI和WFE指令

在ARM架构中,WFI(Wait For Interrupt)和 WFE(Wait For Event)是用于使处理器进入低功耗状态的指令。这两个指令主要用于在空闲时暂停处理器的执行,以节省功耗。

2.4.1 WFI指令

WFI 指令使处理器进入等待中断状态。当处理器执行到 WFI 时,它会进入低功耗模式,直到有一个中断请求到达,将处理器唤醒。在等待中断期间,处理器会停止执行指令,以减少功耗。

2.4.2 WFE指令

WFE 指令与 WFI 类似,但它不仅能够等待中断,还能够等待事件。事件是由外部设备或其他处理器触发的信号。当执行到 WFE 时,处理器会进入低功耗模式,直到有中断或事件到达,将处理器唤醒。与 WFI 不同,WFE 可以等待中断或事件中的任何一个。

2.5 案例需求

  • 让LED1 每间隔一段时间闪烁(500ms)
  • 通过串口切换 省电模式

  • 为KEY2配置外部中断按键,按下时LED1自动切换开关

  • 为PA0配置外部中断按键,按下时LED1自动切换开关
2.5.1 模式初始化
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();
}
2.5.2 源码
#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 -> RCU
	rcu_periph_clock_enable(RCU_PMU);
	
	printf("sleepmode1\n");
	// sleep mode
	pmu_to_sleepmode(WFI_CMD);
	
	printf("sleepmode2\n");
}

void deepsleep_mode(){ // 深度睡眠模式
	// PMU -> RCU
	rcu_periph_clock_enable(RCU_PMU);
	
	printf("deepsleep 1\n");
	// deepsleep
	pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_ENABLE, WFI_CMD);
	
	// 把主频设置回来
	SystemInit();
	
	printf("deepsleep 2\n");
}

void standby_mode(){ // 待机模式
	
	// PMU -> RCU
	rcu_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 PB2
	rcu_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();
  }
}
2.5.3 注意

中断优先级配置为NVIC_PRIGROUP_PRE2_SUB2情况下:

  1. 串口的抢占优先级不能设置为0,否则系统无法正常睡眠,或不能正常唤醒
  2. 深度睡眠的外部中断的抢占优先级需要设置为0或1 (比串口高),否则无法正常唤醒

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

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

相关文章

2024最新最全:网络安全软件大合集(非常详细)零基础入门到精通,收藏这一篇就够了

安全建议&#xff1a;渗透类软件&#xff0c;建议先在虚拟机试运行&#xff01; VMware虚拟机 https://pan.quark.cn/s/6e439e2c15c1 下载KALI&#xff08;安装版&#xff09; https://pan.quark.cn/s/2124bdf3c732 下载KALI&#xff08;免安装版&#xff09; https://pa…

解决警告【WARNING: Ignoring invalid distribution -xxx 】

1、问题发生 出现警告【WARNING: Ignoring invalid distribution -umpy (c:\programdata\anaconda3\lib\site-packages)】 2、解决方法 进入报错文件夹 &#xff0c;删除相关文件夹 3、解决效果

【C++标准模版库】模拟实现容器适配器:stack、queue、priority_queue(优先级队列)

stack和queue 一.容器适配器1.什么是适配器 二.模拟实现stack和queue三.STL标准库中stack和queue的底层结构四.deque&#xff08;双端队列&#xff09;的简单介绍五.deque作为stack和queue的默认容器的原因六.priority_queue&#xff08;优先级队列&#xff09;的介绍和使用七.…

前端性能优化--元素类型和dom层级

展示相同布局&#xff0c;使用控制变量法&#xff0c;对比性能差距 1. 结论&#xff1a;用块级元素模拟行内元素时&#xff0c;会有性能浪费&#xff0c;所以能用行内元素的&#xff0c;就不要使用块元素(能用span就不用div) 2. 结论&#xff1a;行内元素模拟块级元素时&…

rk3588_dp调试

配置流程&#xff1a; 开启usbusb需要绑定dpdp绑定vp 查看rk3588内部寄存器可知 需要在USB3.0控制器中打开DP0 在设备树中需要在usb3dp端口。 usbc0: fusb3024e { ......ports {port1 { reg <1>; …

SpringBoot配置MybatisPlus

文章目录 介绍特性工作流程图添加依赖Spring Boot2Spring Boot3 配置定义Mapper接口并继承BaseMapperServer 接口自定义 Service 接口继承 IServie 接口自定义 Service 实现类&#xff0c;实现自定义接口并继承 ServiceImpl 添加Config类 介绍 MyBatis-Plus 是一个 MyBatis 的…

uniapp钱包支付、与设置密码页面

设置密码页面 <template><view class="paymentCodeBox"><!-- 自定义键盘 -->

计算机毕业设计推荐-基于python的电子图书馆数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的电子图书馆数据…

95.WEB渗透测试-信息收集-Google语法(9)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;94.WEB渗透测试-信息收集-Google语法&#xff08;8&#xff09; • site &#xff1a; x…

nacos集群部署和VIP部署

1. 准备工作 nacos版本2.2.1 nginx版本1.24.0 2. nacos集群部署 2.1 下载nacos版本后&#xff0c;解压&#xff0c;然后复制三份nacos 2.2 分别修改三个nacos文件下config目录下的application.properties文件&#xff0c;三个nacos的端口修改为8846,8848,8850。 2.3 修改c…

C++解决:【基础】高精度整数除法

描述 求a/b的结果。 已知a&#xff0c;b为10^8范围内的非负整数&#xff0c;求a/b保留前n位小数商的结果。 输入描述 a b n 输出描述 一行数字 用例输入 1 97 61 50 用例输出1 1.59016393442622950819672131147540983606557377049180来源 高精度算法 AC code 方案一…

IGCSE计算机 cs0478 内容介绍

作者&#xff1a; 大爽老师&#xff0c;国际教育编程老师&#xff0c;熟悉AP/IG/ALevel, 擅长Python和Java 剑桥IGCSE计算机课程&#xff08;IGCSE Computer Science&#xff09;课程代码为0478&#xff0c;是为对计算机科学基础感兴趣的学生设计的课程。该课程为学生提供了计算…

WHAT - 最常用的 base64 数据编码方式(含 Blob 和 ArrayBuffer)

目录 一、介绍1. Base64 的工作原理Base64 字符集Base64 编码基本原理Base64 编码具体解释 2. Base64 的编码示例3. Base64 的应用3.1 在 URL 中嵌入数据3.2 电子邮件附件3.3 数据传输3.4 存储与缓存总结 4. 在 JavaScript 中使用 Base64编码解码使用 Buffer (Node.js) 一、介绍…

基于Python的重庆市气象数据分析可视化—计算机毕业设计源码24928

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对气象数据等问题&#xff0c;对气象信息进行…

大数据-112 Flink DataStreamAPI 程序输入源 DataSource 基于文件、集合、Kafka连接器

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

利用 Web 浏览器构建 Java Media Player

如果您需要在 Java 桌面应用程序中嵌入媒体播放器&#xff0c;有几种方法可供选择&#xff1a; 您可以使用 JavaFX Media API 来实现所有必需的媒体播放器功能。虽然稍显过时但仍然可用的 Java Media Framework 也可以作为一种解决方案。您可以集成像 VLCJ 这样的第三方 Java …

统计机器学习基础知识

一、统计机器学习定义 统计机器学习&#xff08;Statistical Machine Learning&#xff09;又称为统计学习&#xff08;Statistical Learning&#xff09;&#xff0c;是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科&#xff0c;是概率论、统…

ET6框架(十)通讯消息编写

文章目录 一、消息在的定义&#xff1a;二、客户端消息的发送&#xff1a;三、服务器消息的处理&#xff1a;四、查看结果 一、消息在的定义&#xff1a; ET消息主要分为两类&#xff0c;一个种是普通消息&#xff0c;一种时通过Gate网关转发的消息叫Local消息 这里我们编写客…

【突发事件】Runway删库了,文章结尾有解决方法

最近&#xff0c;Runway 悄悄地从 Hugging Face 平台上删除了自己的代码库&#xff0c;其中包括备受瞩目的 Stable Diffusion v1.5 项目&#xff0c;这在科技界引起了轩然大波。 Runway 的行为不仅没有留下任何痕迹&#xff0c;也没有通知 Hugging Face 或任何社区成员。 更令人…

QEMU - user network

Documentation/Networking - QEMUQEMU/KVM中的网络虚拟化--Part2 User Networking | Xiaoye Zhengs blog (zxxyy.github.io)QEMU Network — ARM SoC Device Assignment Notes documentation (cwshu.github.io)slirp / libslirp GitLabGitHub - virtualsquare/libvdeslirp: li…