STM32超低功耗进阶之电源管理库函数(二)
一,电源管理库函数前面的入门文章对 STM32 的超低功耗的做了使用介绍,当然在使用超低功耗的时候还会考虑 RAM 的数据会不会丢失,什么时候重写 备份寄存器,进入低功耗模式的时候要怎么保持 IO 的状态,前面一章已经对 stm32l4xx_hal_pwr.c 里面的 API 以及使用场景做了介绍,ST 还有另外一个文件教 stm32l4xx_hal_pwr_ex.c 所有带 ex 标识的库函数的
一,电源管理库函数
前面的入门文章对 STM32 的超低功耗的做了使用介绍,当然在使用超低功耗的时候还会考虑 RAM 的数据会不会丢失,什么时候重写 备份寄存器,进入低功耗模式的时候要怎么保持 IO 的状态,前面一章已经对 stm32l4xx_hal_pwr.c
里面的 API 以及使用场景做了介绍,ST 还有另外一个文件教 stm32l4xx_hal_pwr_ex.c
所有带 ex
标识的库函数的意思是 Extended(扩展)
,所以这篇文章就是对扩展部分的说明。
二,电源管理的 API
ST 的 HAL 库做了很全面的低功耗相关的 API , 知道这些函数的作用,掌握这些函数的作用,就会对超低功耗有了进一步的认识。
- 获取电压的范围
uint32_t HAL_PWREx_GetVoltageRange(void)
他的返回值有3种:- PWR_REGULATOR_VOLTAGE_SCALE1
- PWR_REGULATOR_VOLTAGE_SCALE2
- PWR_REGULATOR_VOLTAGE_SCALE1_BOOST (有 PWR_CR5 的型号才有)
返回值对应的手册描述
- 配置主内部稳压器输出电压
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 没清掉会返回超时,注意对返回值进行判断
- 使能电池充电
void HAL_PWREx_EnableBatteryCharging(uint32_t ResistorSelection)
这里的传参有两个参数可选:
- PWR_BATTERY_CHARGING_RESISTOR_5
- PWR_BATTERY_CHARGING_RESISTOR_1_5
这个两个参数是设置电池充电的阻抗,单位是 KΩ。
-
取消电池充电
void HAL_PWREx_DisableBatteryCharging(void)
-
使能内部唤醒线
void HAL_PWREx_EnableInternalWakeUpLine(void)
这个在配置好唤醒引脚后需要设置 -
取消内部唤醒线
void HAL_PWREx_DisableInternalWakeUpLine(void)
-
低功耗模式下保持 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)
注意事项:在配置之后必须使能之后才能生效
-
是否保留 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) 才有
- PWR_NO_SRAM2_RETENTION :不保留 SRAM2 的数据,可以直接调用
-
电压检测功能(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()
, 用户只需在对应的中断回调函数增加自己的逻辑代码即可。
- 低功耗运行模式的进入与退出
进入低功耗运行模式
void HAL_PWREx_EnableLowPowerRunMode(void)
退出低功耗运行模式
HAL_StatusTypeDef HAL_PWREx_DisableLowPowerRunMode(void)
注意事项:
- 进入低功耗运行模式之前必须降低运行频率到 2 MHZ 以下
- 退出低功耗运行模式之前要把调压器设置到 MR ,如果设置失败会返回超时
- 停止模式的进入
STOP0 模式的进入
void HAL_PWREx_EnterSTOP0Mode(uint8_t STOPEntry)
STOP1 模式的进入
void HAL_PWREx_EnterSTOP1Mode(uint8_t STOPEntry)
STOP2 模式的进入
void HAL_PWREx_EnterSTOP2Mode(uint8_t STOPEntry)
- 进入关机模式
void HAL_PWREx_EnterSHUTDOWNMode(void)
三,总结
本文详细讲解了 stm32l4xx_hal_pwr_ex.c
的 API,这里的功能是对 stm32l4xx_hal_pwr.c
的补充,通过这个两个章节的总结,STM32_PWR 的寄存器常用的几乎都用到了,在遇到实际的低功耗场景的时候就可以见招拆招了。
更多推荐
所有评论(0)