STM32HAL库--PWR低功耗实验(速记版)

news2025/1/11 6:06:36

电源控制(PWR)简介

        电源控制部分(PWR)概述了不同电源域的电源架构以及电源配置控制器。PWR 的内容比较多,我们把它们的主要特性概括为以下 3 点:
        电源系统:USB 稳压器、内核域(VCORE)、VDD 域、备份域、模拟域(VDDA)。
        电源监控:POR/PDR 监控器、BOR 监控器、PVD 监控器、AVD 监控器、VBAT 阈值、温度阈值。
        电源管理:VBAT 电池充电、工作模式、电压调节控制、低功耗模式。
        下面将分别对这 3 个特性进行简单介绍。

        电源系统:

        在电源概述框图中我们划分了 3 个区域,分别是独立的 A/D 转换器供电和参考电压、电压调节器、电池备份区域。下面分别进行简单的介绍:

        ① 后备电源

        一般是电池,接 VBAT 引脚上。VDD断电的时候后备电源继续供电维持 RTC 运转。同时 VBAT 引脚也为 RTC、SRAM 和 LSE 振荡器供电。切换到𝑉𝐵𝐴𝑇供电由复位模块中的掉电复位功能控制。

        ② 电压调节器

        嵌入式线性调压器为备份域和待机电路以外的所有数字电路供电。电压调节器输出电压约为 1.2V。此调压器需要将两个外部电容连接到专用引脚𝑉𝐶𝐴𝑃_1和𝑉𝐶𝐴𝑃_2,所有封装都配有这两个引脚。为激活或停用调压器,必须将特定引脚连接到 VSS 或 VDD。具体引脚与封装有关。
        通过软件激活时,调压器在复位后始终处于使能状态。
        根据应用模式的不同,可采用三种不同的模式工作。在运转模式下,调压器以正常功耗模式为内核、内存和外设提供 1.2V;在停止模式下,调压器以低功耗模式提供 1.2V 电源,以保存寄存器和 SRAM 的内容。在待机模式下,调压器停止供电,除了备用电路和备份域外,寄存器和SRAM 的内容全部丢失。

        ③ A/D 转换器

        为了提高转换精度,ADC 配有独立电源,可以单独滤波并屏蔽 PCB 上的噪声。ADC 电源电压从单独的 VDDA 引脚接入,VSSA 提供了独立的电源接地连接。为了确保测量低电压时具有更高的精度,用户可以在VREF 上连接到单独的 ADC 外部参考电压输入,VREF 电压介于 1.8V 到 VDDA 之间。

        电源监控:

        电源监控的部分主要关注 PVD 监控器,以及 上电复位(POR)/掉电复位(PDR)

⚫ 上电复位(POR)/掉电复位(PDR)

        一个上电复位,一个掉电复位,低于上电复位阈值 VPOR 或者低于掉电复位阈值 VPDR 的时候系统保持复位状态,否则正常运行。

⚫ 欠压复位(BOR)

        上电期间,欠压复位(BOR)将使系统保持复位状态,直到 VDD 电源电压达到指定的 VBOR 阈值。VBOR 阈值通过系统选项字节(某些寄存器的 BOR_LEV 位)进行配置。默认情况下,BOR 关闭。可选择以下可编程 VBOR阈值:

⚫ 可编程电压检测器(PVD) 

        上面介绍的 POR、PDR 以及 BOR 功能都是设置电压阈值与外部供电电压 VDD 比较,当 VDD低于设置的电压阈值时,就会直接进入复位状态,防止电压不足导致的误操作。

        下面介绍可编程电压检测器(PVD),它可以实时监视 VDD的电压,方法是将 VDD与 PWR 控制寄存器 1(PWR_CR1)中的 PLS[2:0]位所选的 VPVD 阈值进行比较。当检测到电压低于VPVD 阈值时,如果使能 EXTI16 线中断,即使能 PVD & AVD 中断(可参考表 15.1.2.1 知道EXTI16 线内部连接 PVD 中断事件),可以产生 PVD 中断,具体取决于 EXTI16 线配置为检测
上升还是下降沿,然后在复位前,在中断服务程序中执行紧急关闭系统等任务。

        电源管理

        电源管理的部分主要关注低功耗模式,在 STM32 的正常工作中,具有四种工作模式,运行睡眠停止以及待机。在上电复位后,STM32 处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种模式降低功耗。这三种低功耗模式电源消耗不同、唤醒时间不同和唤醒源不同,我们要根据自身的需要选择合适的低功耗模式。

        下面是低功耗模式汇总介绍,如下表所示。

         下面对睡眠模式、停止模式和待机模式的进入及退出方法进行介绍。

1、睡眠模式

        进入睡眠模式,CPU 时钟关闭,但是其他所有的外设仍可以运行,所以任何中断或事件都可以唤醒睡眠模式。

        有两种方式进入睡眠模式 WFIWFE。这两种方式进入的睡眠模式唤醒的方法不同,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。下面我们看看睡眠模式进入及退出方法:

2、停止模式

        进入停止模式,所有的时钟都关闭,于是所有的外设也停止了工作。但是 VDD 电源是没有关闭的,所以内核的寄存器和内存信息都保留下来,等待重新开启时钟就可以从上次停止的地方继续执行程序。
        值得注意的是:当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。

3、待机模式

        待机模式可实现最低功耗。该模式是在 CM4 深睡眠模式时关闭电压调节器,整个 1.8V 供电区域被断电。PLL、HSI、和 HSE 振荡器也被断电。除备份域(RTC 寄存器、RTC 备份寄存器和备份SRAM)和待机电路中的寄存器外,SRAM 和其他寄存器内容都将丢失。不过如果我们使能了备份区域(备份 SRAM、RTC、LSE),那么待机模式下的功耗,将达到 6uA 左右。下面我们看看待机模式进入及退出方法:

PWR模块寄存器

⚫ PWR 控制寄存器 1(PWR_CR1)

PVD电压监控实验只需要用到 PWR_CR1 控制寄存器,还有就是 EXTI16 线中断。

        位[7:5] PLS 用于设置 PVD 检测的电压阀值,即前面我们介绍 PVD 的 8 个等级阀值选择。
        位 4 PVDE 位,用于使能或者禁止 PVD 检测,显然我们要使能 PVD 检测,该位置 1。
        这个寄存器还有其他的位我们没有列出来,也是跟电源相关的,如待机,掉电等,我们后面的实验再讲解这些功能,这里先跳过。

        再有就是 EXTI 中断屏蔽寄存器(EXTI_IMR)。中断屏蔽寄存器是32位,用到23位,每位控制一个EXTI线上的中断请求屏蔽还是开放。

        上升沿触发选择器(EXTI_RTSR)。上升沿触发选择器是32位,用到23位,每位控制一个EXTI线上的上升沿触发中断允许还是禁止。

        下降沿触发选择器(EXTI_FTSR)。下降沿触发选择器是32位,用到23位,每位控制一个EXTI线上的下降沿触发中断允许还是禁止。

        挂起寄存器(EXTI_PR)。挂起寄存器是32位,用到23位,每位控制一个EXTI线上的下降沿触发中断允许还是禁止。

PVD电压监控实验

        例程,开发板供电正常的话,LCD 屏会显示"PVD Voltage OK!"。当供电电压过低,则会通过 PVD中断服务函数将 LED1点亮;当供电电压正常后,会在 PVD中断服务函数将 LED1熄灭。LED0 闪烁,提示程序运行。

        可编程电压检测器 PVD 属于 STM32F429 的内部资源,只需要软件设置好即可正常工作。

        PWR 在 HAL 库中的驱动代码在 stm32f4xx_hal_pwr.c 文件(及其头文件)中。

PVD电压监测配置步骤

HAL_PWR_ConfigPVD 函数用来初始化 PWR。可以用 PWR_PVDTypeDef 初始化结构体来设置 PVD 检测级别 并指定 PVD 的 EXTI 边沿触发模式

typedef struct
{
 uint32_t PVDLevel; /* 指定 PVD 检测级别 */
 uint32_t Mode; /* 指定 PVD 的 EXTI 检测模式 */
}PWR_PVDTypeDef;
/*
1)PVDLevel:指向 PVD 检测级别,对应 PWR_CR1 寄存器的 PLS 位的设置,取值范围
PWR_PVDLEVEL_0 到 PWR_PVDLEVEL_7,共八个级别。
2)Mode:指定 PVD 的 EXTI 边沿检测模式。
*/

void HAL_PWR_ConfigPVD (PWR_PVDTypeDef *sConfigPVD);

配置步骤:

1) 调用 HAL_PWR_ConfigPVD 函数配置 PVD,包括检测电压级别、中断线触发方式等。

        其实就是 PWR_CR1 设置检测电压级别,EXTI 的 IMR、RTSR、FTSR、PR等设置PVD外部中断。

2)使能 PVD 检测,配置 PVD/AVD 中断优先级,开启 PVD/AVD 中断。

        通过 HAL_PWR_EnablePVD 函数使能 PVD 检测。PWR_CR1控制寄存器设置PVD检测级别PVD电源电压检测器使能
        通过 HAL_NVIC_EnableIRQ 函数使能 PVD/AVD 中断。
        通过 HAL_NVIC_SetPriority 函数设置中断优先级。

3)编写中断服务函数

        PVA/AVD 中断服务函数为:PVD_AVD_IRQHandler。然后逻辑代码在 PVD/AVD 中断服务回调函数 HAL_PWR_PVDCallback 中编写。中断函数里面可以通过__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO) 从 CSR 寄存器读出 PVDO 标志位的值,判断电压是否低于检测级别下的电压阈值

睡眠模式实验

        WFI / WFE 指令进入睡眠模式,进入睡眠模式后,使用外部中断唤醒。进入外部中断后,EXTI_IMR1 寄存器的值会自动清零,我们需要对应的外部中断线位置 1,取消屏蔽,相当于其他中断的中断标志位进入中断后硬件自动置 1,需要手动清零。

进入睡眠模式函数 EnterSLEEPMode,其声明如下:

void HAL_PWR_EnterSLEEPMode (uint32_t Regulator, uint8_t SLEEPEntry);

⚫ 函数描述:
用于设置 CPU 进入睡眠模式。
⚫ 函数形参:
        形参 1 指定稳压器的状态。有两个选择,PWR_MAINREGULATOR_ON 表示稳压器处于正常模式,PWR_LOWPOWERREGULATOR_ON 表示稳压器处于低功耗模式。对应的是 PWR_CR 寄存器的 LPDS 位的设置。
        形参 2 指定进入睡眠模式的方式。有两个选择,PWR_SLEEPENTRY _WFI 表示使用 WFI
指令,PWR_SLEEPENTRY_WFE 表示使用 WFE 指令。

PWR睡眠模式配置步骤

1)配置外部中断作为唤醒睡眠模式的方式

2)通过 HAL_PWR_EnterSLEEPMode 进入 CPU 睡眠模式。其实就是发送 WFI 指令

3)按键触发外部中断,CPU从睡眠模式唤醒。是SCB的SCR寄存器清除SLEEPDEEP位,将cpu从睡眠模式唤醒。

停止模式和待机模式可看作深度睡眠状态

接收到 WFI/WFE 后是 睡眠还是停止由 内核寄存器的DEEPSLEEP位控制。

接收到 WFI/WFE 后是 停止还是待机由 CR寄存器 控制。

停止模式

停止模式寄存器

⚫ PWR 控制寄存器 (PWR_CR)

PWR 的 控制寄存器 CR 可以通过 PDDS 位域 选择 WFI/WFE 指令进入停止模式还是待机模式,停止模式即对 PDDS 位置 0 即可。在停止模式下,电压调节器开启还是低功耗,我们设置稳压器为低功耗模式,等待中断唤醒,所以位 LPDS 置 1。

⚫ 系统控制及状态寄存器(PWR_CSR)

        WFI 指令进入停止模式。使用外部中断唤醒。

        该寄存器在于 ARM 内核中,详细描述可查阅《Cortex-M3 权威指南》。在本实验中,我们需要把 SLEEPDEEP 位置 1,这样子后面调用 WFI 命令时,进入的就是停止模式了。在唤醒后,需要清除 SLEEPDEEP 位,进行置 0。

停止模式配置步骤

        进入停止模式函数,其声明如下:

void HAL_PWR_EnterSTOPMode (uint32_t Regulator, uint8_t STOPEntry);

⚫ 函数描述:
        用于设置 CPU 进入停止模式。
⚫ 函数形参:
        形参 1 指定稳压器在停止模式下的状态。有两个选择,PWR_MAINREGULATOR_ON 表示稳压器处于主模式,PWR_LOWPOWERREGULATOR_ON 表示稳压器处于低功耗模式。对应的是 PWR_CR 寄存器的 LPDS 位的设置。
        形参 2 指定用 WFI 还是 WFE 指令进入停止模式。有两个选择,PWR_STOPENTRY_WFI 表示使用 WFI 指令,PWR_STOPENTRY_WFE 表示使用 WFE 指令。我们选择前者,不了解这两种指令的区别,可以回看 30.1.3 小节的知识。
        函数返回值:无

停止模式配置步骤:

1)配置外部中断,作为唤醒停止模式的方式

2)调用EnterSTOPMode函数进入停止模式。其实就是配置 CR 寄存器选择深度睡眠时进入停止模式,配置 CSR 寄存器使 WFI 指令作用于停止模式。

3)按键触发外部中断唤醒停止模式

待机模式

        PWR_CR 寄存器的 CWUF 位可清除唤醒标志位。PDDS 位可控制 WFI/WFU 命令进入停止模式还是待机模式。

        PWR_CSR 寄存器的 EWUP 位用来使能 WKUP引脚的待机唤醒功能。

待机模式配置步骤

使能唤醒引脚函数,其声明如下:

void HAL_PWR_EnableWakeUpPin (uint32_t WakeUpPinPolarity);

⚫ 函数描述:
用于使能唤醒引脚。
⚫ 函数形参:
形参 1 取值范围:PWR_WAKEUP_PIN1。
⚫ 函数返回值:

⚫ 注意事项:
禁止某个唤醒引脚使用的函数如下:

void HAL_PWR_DisableWakeUpPin (uint32_t WakeUpPinPolarity);

进入待机模式函数,其声明如下:

void HAL_PWR_EnterSTANDBYMode (void);

⚫ 函数描述:
用于使 CPU 进入待机模式,进入待机模式,首先要设置 SLEEPDEEP 位,接着我们通 PWR_CR 设置 PDDS 位,使得 CPU 进入深度睡眠时进入待机模式,最后执行 WFI 指令开始进入待机模式,并等待 WK_UP 唤醒的到来。
⚫ 函数形参:

⚫ 函数返回值:

待机模式配置步骤:

1)进入 CPU 待机模式
        在进入待机模式之前我们需要做一些准备,比如:关闭 RTC 相关中断清除 RTC 相关中断标志位等一些操作,只是防止 RTC 中断唤醒。这里就不细讲,详见本例程源码。通过__HAL_PWR_CLEAR_FLAG 函数清除唤醒标志位。通过 HAL_PWR_EnableWakeUpPin 函数使能 PA0 的唤醒功能(wkup引脚)。通过 HAL_PWR_EnterSTANDBYMode 函数进入待机模式。
2)通过按下 WKUP 引脚上升沿触发唤醒待机模式
        按下 WK_UP 按键(特定唤醒源)触发唤醒待机模式。

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

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

相关文章

https基础概念

目录 1.什么是https 1.1.https概念 1.2.一些术语 2.https如何加密 2.1.使用对称加密 2.2.使用非对称加密 1.什么是https 首先,https不是http的复数形式 1.1.https概念 (1)产生背景 为什么会出现https,是因为http协议在传…

昇思25天学习打卡营第一天|快速入门

背景 华为组织了昇思25天学习营,从基础开始,提供算力支持,还是体验蛮好的。推荐大家报名参加。 学习内容 今天的内容是快速入门,很简单,当是复习基础内容了。 下载数据集》模型组网》模型训练》保存模型&#xff0c…

oracle 11g rac创建实例时发现只给一节点创建了实例 二节点没创建的处理方法

由于操作失误没有在二节点创建实例 删除数据库重新dbca建库 [oracleracdg1-1 dbs]$ dbca -silent -deleteDatabase -sourceDB rac11dg1 -sysDBAUserName sys -sysDBAPassword oracle_4U Connecting to database 4% complete 9% complete 14% complete 19% complete 23% …

electron+vue3+vite

1.创建工程 开源的electron构建脚手架:GitHub - electron-vite/electron-vite-vue: 🥳 Really simple Electron Vite Vue boilerplate. 1.使用命令创建工程(node版本在16上) npm create electron-vite 2.项目目录结构 2.安装依…

如何成为专业的 .NET 开发人员

如今,网上有大量信息,找到正确的信息并非易事。当你开始编程之旅并希望获得全面的指南时,最好寻找一个可以指导你完成整个过程的指南。 本文将帮助您制定一份路线图,告诉您什么是重要的以及什么是需要学习的. 一.一切从软件基础…

感谢我的辅导员—敬爱的罗老师

前言:快毕业了,想在毕业季感谢给予我帮助的老师,我的辅导员-罗老师是我最想感谢的大学老师。我不知道应该以什么样的方式去表达罗老师对我大学阶段的帮助,如果是直接发邮件,微信信息留言,可能在之后我和老师…

虚拟与现实的四种交互方式:复刻、增强、虚拟与混合。

经常有小伙伴搞不清楚这些概念,这次我就用极其浅显的语言和示例来说明这个问题。 "复刻现实"、"虚拟现实"、"增强现实"和"混合现实"是四种不同的技术概念,它们代表着不同的虚拟现实交互方式: 1. 复…

如何给小语种视频生成字幕

目前我们常看的有视频有中、英、日、韩这四种语言,如果我们想给其他的不常用的语言生成字幕怎么办?今天教大家如何给其他语言生成视频字幕文件 打开智游剪辑(zyjj.cc)搜索字幕生成,选择多语种那个就可以了 然后上传我们…

密码学及其应用 —— Java中的安全性

1. 简介 Java是一种广泛使用的编程语言,特别是在企业级解决方案中,比如使用J2EE、JavaBeans等技术。在Web开发领域,Java也有其应用,如客户端的applet和服务器端的Servlets/JSP。 1.1 Java的特点 面向对象:Java是一种面…

Keil 5编译出现misc.c(90): error: no member named ‘IP‘ in ‘NVIC_Type‘

no member named ‘IP’ in ‘NVIC_Type’ 我们在使用Keil 5编译器的AC6进行代码编译的使用,出现如下的错误; 当前的环境 编译器版本 Keil uVision5,V5.31.0.0; CMSIS-Core 版本V6…1.0; 采用GD32F407VK主芯片&…

[吃瓜教程]南瓜书第3章对数几率回归

第三章 对数几率回归 3.1 算法原理 对数几率回归(Logistic Regression)是一种统计方法,主要用于二分类问题。它通过拟合一个对数几率函数(logit function),即对数几率(log-odds)与…

微信小程序传统开发登录和云开发登录的区别

1. 传统开发登录流程 1. 用户端调用wx.login从微信服务器获取code; 2. 用户端用wx.request将获取的code传递给后端服务器; 3. 后端服务器将拿到的code传给微信服务器,换取openid和session_key; 4. 后端服务器将获取到的信息返回给用户端&#xff1b…

添加阈值滞后以实现平滑的欠压/过压锁定

电阻分压器将高压衰减到低压电路可以承受的水平,而不会过驱动或损坏。在电源路径控制电路中,电阻分压器有助于设置电源欠压和过压锁定阈值。这种电源电压鉴定电路存在于汽车系统、电池供电的便携式仪器以及数据处理和通信板中。 欠压锁定 (UVLO) 可防止…

Talking Web

1. curl 1.1 http curl http://127.0.0.1:80 向目标主机端口发送http请求 1.2 httphead curl -H “Host: 18ed3df584cd48328b5839443aa7b42b” http://127.0.0.1:80 1.3 httppath curl http://127.0.0.1:80/853c64cd218f80d0a59665666fb2ab80 1.4 URL编码路径 &#xff0…

论文 | WebGPT: Browser-assisted question-answering with human feedback

什么是WebGPT? WebGPT是对GPT-3微调后得出的模型,它可以像人类一样在线搜索问题的答案,并添加引用来源,更加准确地回答开放式问题。 在回答问题时,WebGPT可以通过浏览器进行搜索,在不同链接中寻找相关答案&#xff…

第5讲:建立自己的C函数库,js调用自己写的C/C++函数,并包含依赖C/C++第三方静态库。

在javascript中,Array有很多内置的功能,比如Array.map,Array.filter,Array.find等等,能用内置的功能就用内置的功能,最好不要自己实现一套,因为底层调用的可能压根就不是js语言本身,…

windows 安装 Kubernetes(k8s)

windows 安装 docker 详情见: https://blog.csdn.net/sinat_32502451/article/details/133026301 minikube Minikube 是一种轻量级的Kubernetes 实现,可在本地计算机上创建VM 并部署仅包含一个节点的简单集群。 下载地址:https://github.…

SSM 美食食谱分享推荐系统【附源码】

SSM 美食食谱分享推荐系统 本科毕业论文(设计)学术诚信声明 本人郑重声明:所呈交的毕业论文(设计),是本人在导师的指导下,独立进行 研究工作所取得的成果。除文中已经注明引用的内容外&#xf…

嵌入式应用开发ADC学习笔记(立创STMF4开发板)

目录 #ADC #ADC学习相关涉及概念介绍 #ADC相关概念介绍 #软件实现 #常用结构体配置介绍 #常用函数介绍 #软件编写,完成效果。 #ADC #ADC学习相关涉及概念介绍 数字信号(Digital Signal):数字信号用最为常见的二进制数来表示的信号&#x…

k8s部署mongodb副本集

1.什么mongodb? MongoDB 是一个基于分布式文件存储的数据库,由 C 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富&#xff…