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

电源控制(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.mzph.cn/news/860298.shtml

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

相关文章

3. ansible playbook剧本

ansible playbook剧本 一、ansible playbook1、介绍2、YAML语法的注意事项3、playbook的结构4、playbook的使用流程4.1 编写剧本4.2 执行剧本 一、ansible playbook 1、介绍 便于功能的重用 本质上是文本文件,xxxx.yml, xxxx.yaml 遵循YAML语法 2、YAML语法的注意…

StarRocks 存算分离成本优化最佳实践

序言 StarRocks 存算分离借助对象存储来实现计算和存储能力分离,而存算分离版本 StarRocks 一般来说有以下三方面成本: 计算成本,也即机器使用成本,尤其是运行在公有云上时存储成本,该部分与对象存储上存储的数据量相…

GLM4-9B-chat模型微调

文本记录GLM4-9B-Chat模型进行LoRA微调的过程。 一、环境: 操作系统: Ubuntu 22.04CUDA: 12.1GPU: 3090 x 2 创建conda环境: conda create -n glm4 python3.10.14 conda activate glm4cd /home/data/chatglm4-finetune 二、数据准备 运行d…

探索SoMeLVLM:面向社交媒体处理的大型视觉语言模型

SoMeLVLM: A Large Vision Language Model for Social Media Processing 论文地址: https://arxiv.org/abs/2402.13022https://arxiv.org/abs/2402.13022发表在ACL 2024 1.概述 在线社交媒体平台涌现出海量的文本与视觉内容,深刻揭示了人们如何交流、互动以及自我表达。随着通…

论文辅导 | 基于贝叶斯优化LSTM的锂电池健康状态评估方法

辅导文章 模型描述 在传统的 LSTM 神经网络中,超参数的取值对模型性能有很大影响,但人工调参很难得到最优解。 因此,本文加入了 BO 来迭代出最优超参数。 在利用LSTM 神经网络评估锂电池 SoH 的基础上,通过 BO来提高评估的精确度。 预测效果

ubuntu卸载python3,重装python2.7

卸载py3 Linux(Ubuntu)环境下安装卸载Python3(避免踩坑)_ubuntu卸载python-CSDN博客https://blog.csdn.net/BLee_0123/article/details/136075374 安装py2.7 Ubuntu上重装Python2(强烈建议在不删除数据情况下&#…

LLC开关电源开发:如何使用信号发生器与示波器设计环路

如何使用信号发生器与示波器设计环路 一、主回路二、小信号注入三、LLC 数字环路计算书一、主回路 如下图所示为系统整体架构,包括 LLC 主功率线路,采集线路、RC 滤波线路,DSP 运算。DSP 通过采集由差分运放转化而来的输出电压量(一阶 RC 滤除线路杂波),经数字环路产生特…

北方访问延迟低云主机选购指南:弹性云济南互通线路的优势

在选择云主机时,访问延迟是一个不可忽视的关键因素,特别是对于北方地区的企业来说,选择一款访问延迟低的云主机更是至关重要。快快网络弹性云济南互通线路凭借其独特的优势,成为了北方企业上云的理想选择。 一、弹性云济南互通线…

apk反编译修改教程系列-----去除apk软件更新方法步骤列举 记录八种最常见的去除方法

在前面几期博文中 有说明去除apk软件更新的步骤方法。我们在对应软件反编译去除更新中要灵活运用。区别对待。同一个软件可以有不同的去除更新方法可以适用。今天的教程对于软件更新去除列举几种经常使用的修改步骤。 通过基础课程可以了解 1-----软件反编译更新去除的几种常…

Java中Callable的应用

在Java中,Callable接口是一种用于并发编程的接口,它与Runnable类似,但有一些重要的区别和优势。Callable接口提供了一种在多线程环境下执行任务并返回结果的方法。以下是一些Callable接口的常见应用场景和使用示例: Callable vs.…

【脚本工具库】随机删除数据 - 图像和标签对应(附源码)

在处理数据集时,我们有时需要随机删除一定数量的图像及其对应的标签文件,以达到平衡数据集或进行其他数据处理的目的。手动删除这些文件不仅耗时,而且容易出错。为了解决这个问题,我们可以编写一个Python脚本,使用os和…

Kubernetes网络性能测试

Kubernetes 网络性能测试 基于已经搭建的Kubernetes环境,来测试其网络性能。 1. 测试准备 1.1 测试环境 测试环境为VMware Workstation虚拟机搭建的一套K8S环境,版本为1.19,网络插件使用flannel。 hostnameip备注k8s-master192.168.0.51…

Streamlit搭建聊天UI

使用Streamlit搭建聊天UI是一个快速而有效的方法,用于构建数据科学和机器学习项目的交互式界面。以下是一个基于参考文章提供的信息,关于如何使用Streamlit搭建聊天UI的详细步骤和要点: 1. 导入必要的库 首先,你需要导入Streamlit库以及任何你计划使用的语言模型库(如Op…

北邮《计算机网络》蒋老师思考题及答案-传输层

蒋yj老师yyds! 答案自制,仅供参考,欢迎质疑讨论 问题一览 传输层思考题P2P和E2E的区别使用socket的c/s模式通信,流控如何反映到编程模型三次握手解决什么问题举一个两次握手失败的例子为什么链路层是两次握手而非三次?…

在整合spring boot+layui中解决Could not parse as expression: “的问题

首先查看报错信息,这里提示我们78行有问题 这里是[[]] 这个内联表达式出了问题,在当前所在的script标签中加入th:inlinenone,然后重启项目,成功解决!

2>/dev/null 怎么理解

2>/dev/null 是一个重定向操作符,用于将命令执行过程中产生的错误输出(标准错误流)重定向到 /dev/null,从而忽略这些错误信息。 具体来说,Linux 系统中的文件描述符有以下几种: 0:标准输入…

RabbitMQ使用交换机进行消息转发

使用交换机进行转发到队列 第一步:创建队列 第二步:创建交换机 第三步:交换机绑定队列 第四步:修改消息生产者发送业务 第五步:修改消息接收者业务代码 RabbitListener(queues "fanout.queue1")public vo…

人工智能与大数据:新时代的技术融合与未来展望

引言 在信息化和数字化迅猛发展的今天,人工智能(AI)和大数据(Big Data)已成为推动社会变革和技术进步的两大支柱。随着互联网的普及、计算能力的提升以及数据获取手段的多样化,AI和大数据技术的应用愈发广泛…

守护公共安全,从可燃气体报警器检验周期开始:国家法规的解读

在现代社会,安全始终是首要考虑的问题。随着工业化、城市化的快速发展,各种潜在的安全隐患也逐渐浮现,尤其是可燃气体泄漏所带来的火灾和爆炸风险。 为了确保公众和企业的生命财产安全,可燃气体报警器作为一种重要的安全监测设备…

达梦(DM8)数据库备份与还原(逻辑备份)二

一、达梦数据库的逻辑备份分四种级别的导出(dexp)与导入(dimp)的备份 第一种是:数据库级:导出或导入数据库中所有的对象。主要参数是:FULL 第二种是:用户级别:导出或导…