MCU开发学习记录18* - PWR学习与实践(HAL库) - PVD监控电压、睡眠模式和停止模式 - STM32CubeMX

名词解释:

统一文章结构(数字后加*):

        第一部分: 阐述外设工作原理;第二部分:芯片参考手册对应外设的学习;第三部分:使用STM32CubeMX进行外设初始化;第四部分:添加应用代码;第五部分:附上本篇文章的工程代码的下载地址。

        本文将介绍PWR的相关概念以及STM32CubeMX生成PWR的配置函数,实现PVD监控VDD电压、睡眠模式和停止模式。

一、什么是PWR?

1.1 ​PWR简介

1.1.1 电源控制部分(PWR)介绍

1. 电源监控主要针对特定电源电压进行监督,包括:
        VDD
:主电源电压、VDDA:模拟电源电压、VBAT:备用电池电压。

2. 电源监控控制器,包括:
        
POR/PDR 监控器、BOR 监控器、PVD 监控器、AVD 监控器、VBAT 阈值、 温度阈值。

        POR/PDR (power on/down reset):上电/掉电复位
        PVD (programmable voltage detector) :监控VDD 电压
        BOR (brown out reset):欠压复位
        AVD (analog voltage detector) :监控VDDA电压
        VBAT阈值(battery voltage thresholds):监控VBAT电池电压
        温度阈值(temperature thresholds) :监控结温

3. 电源管理,包括:

        电源管理:VBAT 电池充电、工作模式、电压调节控制、低功耗模式。

1.2 PWR硬件框图

1.2.1 PWR硬件框图

        VDDA VSSA 必须分别连接到 VDD VSS

1.2.2 PWR硬件框图1 - 电池备份域

电池备份区域也就是后备供电区域,使用电池或者其他电源连接到 VBAT 脚上,当 VDD断电时,可以保存备份寄存器的内容和维持 RTC 的功能。同时 VBAT 引脚也为 RTCSRAM LSE振荡器供电,这保证了当主要电源被切断时,RTC 能够继续工作。切换到 VBAT 供电由复位模块中的掉电复位功能控制。

要使 RTC 即使在主数字电源 (VDD) 关闭后仍然工作,VBAT 引脚需为以下各模块供电:
        · RTC
        · LSE 振荡器
        · 备份 SRAM(使能低功耗备份调压器时)
        · PC13 到 PC15 I/O,以及 PI8 I/O
(如果封装有该引脚)

VBAT 电源的开关由复位模块中内置的掉电复位电路进行控制。

备份域电路的左侧有一个电源开关结构在它的上方连接了 VBAT 电源,下方连接了 VDD 主电源 (一般为 3.3V), 右侧引出到备份域电路中。当 VDD 主电源存在时,由于 VDD 电压较高,备份域 电路通过 VDD 供电,当 VDD 掉电时,备份域电路由钮扣电池通过 VBAT 供电, 保证电路能持续运行,从而可利用它保留关键数据。

1.2.3 PWR硬件框图2 - 电压调节器(VDD /1.2V 供电区域)

调压器是STM32数字电路的主要供电单元,负责为内核、数字外设、RAM等关键模块供电(备份域和待机电路除外)。固定约1.2V,因此其供电区域被称为1.2V域

此调压器需要将两个外部电容连接到专用引脚 VCAP_1 和 VCAP_2,所有封装都配有这两个引 脚。为激活或停用调压器,必须将特定引脚连接到 VSS 或 VDD。具体引脚与封装有关。

通过软件激活时,调压器在复位后始终处于使能状态。根据应用模式的不同,可采用三种不同的模式工作,即“运行模式”、“停止模式”以及“待机模式”。

        · 运行模式:1.2V 域全功率运行;
        · 停止模式:1.2V 域运行在低功耗状态,1.2V 区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及 SRAM 的内容;
        · 在待机模式下,整个 1.2V 域都断电,该区域的内核寄存器及 SRAM 内容都会丢失 (备份区域的寄存器及 SRAM 不受影响)。

1.2.4 PWR硬件框图3 - 独立的 A/D 转换器供电和参考电压(VDDA 供电区域)

为了提高转换精度,ADC 配有独立电源,可以单独滤波并屏蔽 PCB 上的噪声。

        · ADC 电源电压从单独的 VDDA 引脚输入。
        · VSSA 引脚提供了独立的电源接地连接。

为了确保测量低电压时具有更高的精度,用户可以在 VREF 上连接单独的 ADC 外部参考电压 输入。VREF 电压介于 1.8 V VDDA 之间。

1.3 电源监控

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

上电时,当 VDD 低于指定 VPOR 阈值时,系统无需外部复位电路便会保持复位模式。一旦VDD 电源电压高于 VPOR 阈值,系统便会退出复位状态,芯片正常工作。掉电时,当 VDD低于指定 VPDR阈值时,系统就会保持复位模式。

        · 上电时,当VDD < VPOR阈值时,系统无需外部复位电路便会保持复位状态。
        · 当VDD > VPOR阈值时,系统便退出复位状态,正常工作。
        · 掉电时,当VDD < VPDR阈值时,系统就会保持复位状态。

        

1.3.2 欠压复位 (BOR)

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

        

        

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

        可编程电压检测器(PVD),它可以实时监视 VDD 的电压,PWR 电源控制/状态寄存器 (PWR_CSR) 中提供了 PVDO 标志,用于指示 VDD 是大于还是小于 PVD 阈值。该事件内部连接到 EXTI 线 16,如果通过 EXTI 寄存器使能,则可以产生中断。当 VDD 降至 PVD 阈值以下以及/或者当 VDD 升至 PVD 阈值以上时,可以产生 PVD 输出中断,具体取决于 EXTI 线 16 上升沿/下降沿的配置。该功能的用处之一就是可以在中断服务程序中执行紧急关闭系统的任务

        

1.4 低功耗模式

默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,CPU 通过HCLK 提供时钟,并执行程序代码。系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳平衡

器件有三个低功耗模式:

        · 睡眠模式(Cortex™-M4F 内核停止,外设保持运行)
        · 停止模式(所有时钟都停止)
        · 待机模式(1.2 V 域断电)

此外,可通过下列方法之一降低运行模式的功耗:

        · 降低系统时钟速度
        · 不使用 APBx 和 AHBx
外设时,将对应的外设时钟关闭

        

引用正点原子PPT内容:

1.4.1 低功耗模式 - 睡眠模式

引用正点原子PPT内容:

        进入睡眠模式,CPU 时钟关闭,但是其他所有的外设仍可以运行,所以任何中断或事件都可以唤醒睡眠模式。有两种方式进入睡眠模式,这两种方式进入的睡眠模式唤醒的方法不同,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。

1.4.2 低功耗模式 - 停止模式

引用正点原子PPT内容:

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

1.4.3 低功耗模式 - 待机模式

引用正点原子PPT内容:

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


二、基于HAL库实现PWR实验

2.1 PWR实验 - PVD电压监控实验

        使用 PVD 监控 STM32 芯片的 VDD 引脚,当监测到供电电压低于阈值时会产生 PVD 中 断,系统进入中断服务函数进入紧急处理过程。

2.1.0 PVD实验相关寄存器

来源于正点原子开发手册:

2.1.1 PVD电压监控配置步骤

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

2)使能 PVD 检测,配置 PVD/AVD 中断优先级,开启 PVD 中断
        通过 HAL_PWR_EnablePVD 函数使能 PVD 检测。
        通过 HAL_NVIC_EnableIRQ 函数使能 PVD 中断。
        通过 HAL_NVIC_SetPriority 函数设置中断优先级。

3)编写中断服务函数
        PVD 中断服务函数为 PVD_IRQHandler,当发生中断的时候,程序就会执行中断服务函数。 HAL 库有专门的 PVD 中断处理函数,我们只需要在 PVD 中断服务函数里面调用HAL_PWR_PVD_IRQHandler() 函 数 , 然后逻辑代码在PVD中断服务回调函数HAL_PWR_PVDCallback 中编写

2.1.2 PVD外设初始化代码

//PVD 初始化代码
void PVD_init(uint32_t pls)
{

    /* Configure the PVD Level to 3 and generate an interrupt on rising and falling
   edges(PVD detection level set to 2.5V, refer to the electrical characteristics
   of you device datasheet for more details) */
    PWR_PVDTypeDef sConfigPVD = {0};
    sConfigPVD.PVDLevel = pls;
    sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
    HAL_PWR_ConfigPVD(&sConfigPVD);

    /*##-1- Enable Power Clock #################################################*/
    __HAL_RCC_PWR_CLK_ENABLE();

    /*##-2- Configure the NVIC for PVD #########################################*/
    HAL_NVIC_SetPriority(PVD_IRQn, 3, 3);
    HAL_NVIC_EnableIRQ(PVD_IRQn);

    /* Enable the PVD Output */
    HAL_PWR_EnablePVD();
}

//PVD 中断服务函数及其回调函数
/**
 * @brief       PVD中断服务函数
 * @param       无
 * @retval      无
 */
void PVD_IRQHandler(void)
{
    HAL_PWR_PVD_IRQHandler();
}

/**
 * @brief       PVD/AVD中断服务回调函数
 * @param       无
 * @retval      无
 */
void HAL_PWR_PVDCallback(void)
{
    if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO))   /* 电压比PLS所选电压还低 */
    {
        lcd_show_string(30, 30, 17*16, 16, 16, "PVD Low Voltage!", RED); /* LCD显示电压低 */
    }
    else
    {
        lcd_show_string(30, 30, 17*16, 16, 16, "PVD Voltage OK! ", BLUE);/* LCD显示电压正常 */
    }
}

2.1.3 PVD实验效果

        

2.2 PWR实验 - 睡眠模式

(1) 初始化用于唤醒的中断按键; (使能EXTI_0 中断)

(2) 进入睡眠状态;

void pwr_enter_sleep(void)
{
    //屏蔽其他非唤醒中断
    HAL_NVIC_DisableIRQ(RTC_WKUP_IRQn); 
    HAL_SuspendTick();  /* 暂停滴答时钟,防止通过滴答时钟中断唤醒 */
    
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* 执行WFI指令, 进入待机模式 */

    //使能其他非唤醒中断
    HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn); 
    HAL_ResumeTick();  /* 恢复滴答时钟 */
}

(3) 使用按键中断唤醒芯片;(按键触发EXTI_0 中断,唤醒MCU)

2.3 PWR实验 - 停止模式

2.3.1 唤醒后配置HSE时钟

系统从停止模式被唤醒时,是使用 HSI 作为系统时钟的,在 STM32F407 中, HSI 时钟一般为16MHz,与我们常用的 168MHz 相关太远,它会影响各种外设的工作频率。所以在系统从停止模式唤醒后,若希望各种外设恢复正常的工作状态,就要恢复停止模式前使用的系统时钟

2.3.2 停止模式配置模式

1)配置唤醒停止模式的方式

        这里我们用外部中断的方式唤醒停止模式,所以这里需要配置一个外部中断功能,我们用 WK_UP 按键作为中断触发源,接下来就是配置 PA0(连接按键 WK_UP)。

2)进入 CPU 停止模式

        通过 HAL_PWR_EnterSTOPMode 函数进入停止模式。

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

        通过按下 WK_UP 按键触发外部中断唤醒停止模式。

2.4 PWR实验 - 待机模式(有问题)

 1)进入 CPU 待机模式

        在进入待机模式之前我们需要做一些准备:涉及到操作 PWR 寄存器的内容,所以首先先进行 PWR 时钟的初始化,调用__HAL_RCC_PWR_CLK_ENABLE 函数实现。

        通过 HAL_PWR_EnableWakeUpPin 函数使能 WKUP 的唤醒功能。
        通过__HAL_PWR_CLEAR_FLAG 函数清除唤醒标记,详看源码。
        通过 HAL_PWR_EnterSTANDBYMode 函数进入待机模式。

2)通过 WKUP 引脚上升沿触发唤醒睡眠模式

        通过按下 WK_UP 按键,使用待机模式中的 WKUP 引脚上升沿的唤醒信号,而不是普通的外部中断,唤醒待机模式。  

三、本文的工程文件下载链接

工程Github下载链接:https://github.com/chipdynkid/MCU-DL-STM32
(国内)工程Gitcode下载链接https://gitcode.com/chipdynkid/MCU-DL-STM32

### STM32 HAL实现低功耗模式 为了使STM32进入低功耗模式开发者可以利用HAL中的特定API来配置管理不同类型的低功耗状态。常见的低功耗模式包括睡眠(Sleep)停止(Stop)以及待机(Standby)[^1]。 #### 配置低功耗模式前的准备 在设置任何一种低功耗模式之前,必须先完成基本的系统初始化工作,确保所有外设处于适当的工作条件之下。此过程涉及调用`HAL_Init()`函数来进行全局变量初始化,并通过RCC模块设定系统的时钟频率等参数。 ```c // 初始化HAL并配置系统时钟 HAL_Init(); SystemClock_Config(); // 用户自定义函数用于配置系统时钟 ``` #### 进入Sleep模式 当CPU暂停执行而其他硬件资源保持活动状态时,则进入了Sleep模式。可以通过下面的方式让MCU进入该模式: ```c // 准备进入SLEEP模式 __HAL_RCC_PWR_CLK_ENABLE(); /* 使能PWR控制器 */ HAL_PWREx_EnableLowPowerRunMode(); /* 启用低功耗运行模式 */ /* 请求进入SLEEP模式 */ HAL_SuspendTick(); /* 停止SysTick计数器 */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0); /* 关闭不需要使用的GPIO端口 */ HAL_sleep_mode_entry(); /* 调用底层驱动程序进入sleep mode */ ``` 需要注意的是,在实际应用中应当根据具体需求调整上述代码片段内的细节部分,比如关闭哪些具体的I/O接口或是是否要禁用中断服务例程(ISRs),以此达到最佳节能效果。 #### 使用Stop Mode减少能耗 对于更深层次的能量节省来说,可以选择使用Stop Mode。在此状态下除了保留RAM数据之外几乎所有的内部电路都会被断电。恢复操作可通过外部中断唤醒信号触发。 ```c // 设置STOP模式下的电源管理RTC配置 __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWREx_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); while (1){ __WFI(); /* 等待事件发生以退出stop模式 */ } ``` 这段代码展示了如何切换至Stop Mode并通过等待指令(`__WFI`)使得微控制器停留在这种省电的状态直到有外部中断请求将其激活为止。 #### Standby Mode的应用场景 最后介绍的是最深级别的休眠方式——Standby Mode。它不仅会切断大部分供电路径而且还会清除SRAM内容仅保存寄存器里的少量信息以便快速重启。因此适用于长时间无动作期间最大限度降低消耗的情况。 ```c // 切换到STANDBY模式 __HAL_RCC_PWR_CLK_ENABLE(); /* 清除唤醒标志位 */ __HAL_PVD_EXTI_CLEAR_FLAG(); /* 开启WKUP按键作为唤醒源 */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_HIGH); HAL_PWR_EnterSTANDBYMode(); /* 不再返回 */ ``` 以上就是基于STM32 HAL实现三种主要低功耗模式的方法概述及其对应的简单示例代码。每种模式都有其适用范围,请依据实际情况合理选用合适的策略来优化产品的电池寿命或其他性能指标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值