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

2024-08-31 08:20

本文主要是介绍ARM32开发——(二十四)电源管理单元,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 -> 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();}
}
2.5.3 注意

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

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

这篇关于ARM32开发——(二十四)电源管理单元的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123372

相关文章

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis