一,电源管理库函数

前面的入门文章对 STM32 的超低功耗的做了使用介绍,当然在使用超低功耗的时候还会考虑 RAM 的数据会不会丢失,什么时候重写 备份寄存器,进入低功耗模式的时候要怎么保持 IO 的状态,前面一章已经对 stm32l4xx_hal_pwr.c 里面的 API 以及使用场景做了介绍,ST 还有另外一个文件教 stm32l4xx_hal_pwr_ex.c 所有带 ex 标识的库函数的意思是 Extended(扩展),所以这篇文章就是对扩展部分的说明。

二,电源管理的 API

ST 的 HAL 库做了很全面的低功耗相关的 API , 知道这些函数的作用,掌握这些函数的作用,就会对超低功耗有了进一步的认识。

  1. 获取电压的范围
    uint32_t HAL_PWREx_GetVoltageRange(void)
    他的返回值有3种:
    • PWR_REGULATOR_VOLTAGE_SCALE1
    • PWR_REGULATOR_VOLTAGE_SCALE2
    • PWR_REGULATOR_VOLTAGE_SCALE1_BOOST (有 PWR_CR5 的型号才有)

返回值对应的手册描述
在这里插入图片描述

  1. 配置主内部稳压器输出电压
    HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling)
    这个函数的传参是个 uint32_t 但实际上传参应该用宏,可以使用的宏有两个:
    • PWR_REGULATOR_VOLTAGE_SCALE1 :RANGE1, 典型输出电压 1.2V,系统频率可以到 80 MHZ
    • PWR_REGULATOR_VOLTAGE_SCALE2 :RANGE2, 典型输出电压 1.0V,系统频率可以到 26 MHZ

注意事项:
- 在使用这个 API 从 RANGE1 切换到 RANGGE2 之必须先切换系统时钟到 26 MHZ 以下
- 在使用这个 API 从 RANGE2 切换到 RANGGE1 之可以切换系统时钟到 80 MHZ 以上
- 在使用这个 API 从 RANGE2 切换到 RANGGE1 的时候会等待 VOSF 标志的清除,如果 50ms 没清掉会返回超时,注意对返回值进行判断

  1. 使能电池充电
    void HAL_PWREx_EnableBatteryCharging(uint32_t ResistorSelection)

这里的传参有两个参数可选:
- PWR_BATTERY_CHARGING_RESISTOR_5
- PWR_BATTERY_CHARGING_RESISTOR_1_5
这个两个参数是设置电池充电的阻抗,单位是 KΩ。

  1. 取消电池充电
    void HAL_PWREx_DisableBatteryCharging(void)

  2. 使能内部唤醒线
    void HAL_PWREx_EnableInternalWakeUpLine(void)
    这个在配置好唤醒引脚后需要设置

  3. 取消内部唤醒线
    void HAL_PWREx_DisableInternalWakeUpLine(void)

  4. 低功耗模式下保持 IO 的上下拉
    这些函数在进入低功耗模式之前设置,可以保证在待机模式(standby)和关机模式(shutdown)下,保持 IO 的状态

保持低功耗模式下 IO 为上拉:
HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber)

取消低功耗模式下 IO 的上拉:
HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber)

保持低功耗模式下 IO 为下拉:
HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber)

取消低功耗模式下 IO 的上拉:
HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber)

使能 IO 的配置
void HAL_PWREx_EnablePullUpPullDownConfig(void)

取消 IO 的配置
void HAL_PWREx_DisablePullUpPullDownConfig(void)

注意事项:在配置之后必须使能之后才能生效

  1. 是否保留 SRAM2 的数据
    HAL_StatusTypeDef HAL_PWREx_SetSRAM2ContentRetention(uint32_t SRAM2Size)
    这里的传参有三个参数可选:

    • PWR_NO_SRAM2_RETENTION :不保留 SRAM2 的数据,可以直接调用 void HAL_PWREx_DisableSRAM2ContentRetention(void) 来实现一样的效果
    • PWR_FULL_SRAM2_RETENTION:保留 SRAM2 的数据,可以直接调用 void HAL_PWREx_EnableSRAM2ContentRetention(void) 来实现一样的效果
    • PWR_4KBYTES_SRAM2_RETENTION :目前只看到 (STM32L4P5xx) (STM32L4Q5xx) 才有
  2. 电压检测功能(Power Voltage Monitoring)

// 使能 PVM1  VddUSB 的电压检测 1.2V
void HAL_PWREx_EnablePVM1(void)

// 取消 PVM1  VddUSB 的电压检测 1.2V
void HAL_PWREx_DisablePVM1(void)

// 使能 PVM2  VddIO2 的电压检测 0.9V
void HAL_PWREx_EnablePVM2(void)

// 取消 PVM2  VddIO2 的电压检测 0.9V
void HAL_PWREx_DisablePVM2(void)

// 使能 PVM3  VddA 的电压检测 1.62V
void HAL_PWREx_EnablePVM3(void)

// 取消 PVM3  VddA 的电压检测 1.62V
void HAL_PWREx_DisablePVM3(void)

// 使能 PVM4  VddA 的电压检测 2.2V
void HAL_PWREx_EnablePVM4(void)

// 取消 PVM4  VddA 的电压检测 2.2V
void HAL_PWREx_DisablePVM4(void)

配置电压检测的参数
HAL_StatusTypeDef HAL_PWREx_ConfigPVM(PWR_PVMTypeDef *sConfigPVM)
传参是一个结构体

typedef struct
{
  uint32_t PVMType;   /*!< PVMType: Specifies which voltage is monitored and against which threshold.
                           This parameter can be a value of @ref PWREx_PVM_Type

  uint32_t Mode;      /*!< Mode: Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref PWREx_PVM_Mode. */
}PWR_PVMTypeDef;

示例代码:

PWR_PVMTypeDef pwr_def;

pwr_def.PVMType = PWR_PVM_1;
pwr_def.Mode = PWR_PVM_MODE_IT_RISING;

HAL_PWREx_ConfigPVM(&pwr_def);

HAL_PWREx_EnablePVM1();

更多的配置模式可以选择

PVMType 可配置参数
#if defined(PWR_CR2_PVME1)
#define PWR_PVM_1                  PWR_CR2_PVME1  /*!< Peripheral Voltage Monitoring 1 enable: VDDUSB versus 1.2 V (applicable when USB feature is supported) */
#endif /* PWR_CR2_PVME1 */
#if defined(PWR_CR2_PVME2)
#define PWR_PVM_2                  PWR_CR2_PVME2  /*!< Peripheral Voltage Monitoring 2 enable: VDDIO2 versus 0.9 V (applicable when VDDIO2 is present on device) */
#endif /* PWR_CR2_PVME2 */
#define PWR_PVM_3                  PWR_CR2_PVME3  /*!< Peripheral Voltage Monitoring 3 enable: VDDA versus 1.62 V */
#define PWR_PVM_4                  PWR_CR2_PVME4  /*!< Peripheral Voltage Monitoring 4 enable: VDDA versus 2.2 V  */ 


Mode 可配置参数
#define PWR_PVM_MODE_NORMAL                 ((uint32_t)0x00000000)   /*!< basic mode is used */
#define PWR_PVM_MODE_IT_RISING              ((uint32_t)0x00010001)   /*!< External Interrupt Mode with Rising edge trigger detection */
#define PWR_PVM_MODE_IT_FALLING             ((uint32_t)0x00010002)   /*!< External Interrupt Mode with Falling edge trigger detection */
#define PWR_PVM_MODE_IT_RISING_FALLING      ((uint32_t)0x00010003)   /*!< External Interrupt Mode with Rising/Falling edge trigger detection */
#define PWR_PVM_MODE_EVENT_RISING           ((uint32_t)0x00020001)   /*!< Event Mode with Rising edge trigger detection */
#define PWR_PVM_MODE_EVENT_FALLING          ((uint32_t)0x00020002)   /*!< Event Mode with Falling edge trigger detection */
#define PWR_PVM_MODE_EVENT_RISING_FALLING   ((uint32_t)0x00020003)   /*!< Event Mode with Rising/Falling edge trigger detection */

配置完成之后,如果条件就会立即触发对应的中断。
中断中调用 HAL_PWR_PVD_PVM_IRQHandler(), 用户只需在对应的中断回调函数增加自己的逻辑代码即可。

  1. 低功耗运行模式的进入与退出
进入低功耗运行模式
void HAL_PWREx_EnableLowPowerRunMode(void)

退出低功耗运行模式
HAL_StatusTypeDef HAL_PWREx_DisableLowPowerRunMode(void)

注意事项:
- 进入低功耗运行模式之前必须降低运行频率到 2 MHZ 以下
- 退出低功耗运行模式之前要把调压器设置到 MR ,如果设置失败会返回超时

  1. 停止模式的进入
STOP0 模式的进入
void HAL_PWREx_EnterSTOP0Mode(uint8_t STOPEntry)

STOP1 模式的进入
void HAL_PWREx_EnterSTOP1Mode(uint8_t STOPEntry) 

STOP2 模式的进入
void HAL_PWREx_EnterSTOP2Mode(uint8_t STOPEntry)
  1. 进入关机模式
    void HAL_PWREx_EnterSHUTDOWNMode(void)

三,总结

本文详细讲解了 stm32l4xx_hal_pwr_ex.c 的 API,这里的功能是对 stm32l4xx_hal_pwr.c 的补充,通过这个两个章节的总结,STM32_PWR 的寄存器常用的几乎都用到了,在遇到实际的低功耗场景的时候就可以见招拆招了。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐