Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM电源管理
STM32超低功耗
STM32超低功耗进阶之电源管理库函数(二)
发布于 2021-05-29 21:48:04 浏览:2618
订阅该版
[tocm] ## 一,电源管理库函数 前面的入门文章对 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 的型号才有) 返回值对应的手册描述 ![screenshot_20210424160431699.png](https://oss-club.rt-thread.org/uploads/20231104/9f1724942acde13db9dd29bf7c66f94e.png) ### 2. 配置主内部稳压器输出电压 `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 没清掉会返回超时,注意对返回值进行判断 ### 3. 使能电池充电 `void HAL_PWREx_EnableBatteryCharging(uint32_t ResistorSelection)` 这里的传参有两个参数可选: - PWR_BATTERY_CHARGING_RESISTOR_5 - PWR_BATTERY_CHARGING_RESISTOR_1_5 这个两个参数是设置电池充电的阻抗,单位是 KΩ。 ### 4. 取消电池充电 `void HAL_PWREx_DisableBatteryCharging(void)` ### 5. 使能内部唤醒线 `void HAL_PWREx_EnableInternalWakeUpLine(void)` 这个在配置好唤醒引脚后需要设置 ### 6. 取消内部唤醒线 `void HAL_PWREx_DisableInternalWakeUpLine(void)` ### 7. 低功耗模式下保持 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)` #### 注意事项: 在配置之后必须使能之后才能生效 ### 8. 是否保留 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) 才有 ### 9. 电压检测功能(Power Voltage Monitoring) ```c // 使能 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)` 传参是一个结构体 ```c 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; ``` 示例代码: ```c 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(); ``` 更多的配置模式可以选择 ```c //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()`, 用户只需在对应的中断回调函数增加自己的逻辑代码即可。 ### 10. 低功耗运行模式的进入与退出 进入低功耗运行模式 `void HAL_PWREx_EnableLowPowerRunMode(void)` 退出低功耗运行模式 `HAL_StatusTypeDef HAL_PWREx_DisableLowPowerRunMode(void)` 注意事项: - 进入低功耗运行模式之前必须降低运行频率到 2 MHZ 以下 - 退出低功耗运行模式之前要把调压器设置到 MR ,如果设置失败会返回超时 ### 11. 停止模式的进入 ```c STOP0 模式的进入 void HAL_PWREx_EnterSTOP0Mode(uint8_t STOPEntry) STOP1 模式的进入 void HAL_PWREx_EnterSTOP1Mode(uint8_t STOPEntry) STOP2 模式的进入 void HAL_PWREx_EnterSTOP2Mode(uint8_t STOPEntry) ``` ### 12. 进入关机模式 `void HAL_PWREx_EnterSHUTDOWNMode(void)` ### 三,总结 本文详细讲解了 `stm32l4xx_hal_pwr_ex.c` 的 API,这里的功能是对 `stm32l4xx_hal_pwr.c` 的补充,通过这个两个章节的总结,STM32_PWR 的寄存器常用的几乎都用到了,在遇到实际的低功耗场景的时候就可以见招拆招了。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
whj467467222
开源,分享,交流,共同进步
文章
32
回答
1222
被采纳
148
关注TA
发私信
相关文章
1
STM32F103的低功耗
2
最近用rtthread系统下AD采样并低功耗,中断响应不及时
3
rt-thread低功耗休眠应用问题请教
4
关于RTT对低功耗的支持
5
RT-Thread怎么休眠实现低功耗。
6
RT-Thread V3.0支持的低功耗,OS会自行进入吗?
7
关于RTThread3.0低功耗休眠模式
8
RTT3.0的bsp包中哪些MCU自带低功耗定时器?
9
关于低功耗上次说针对L4出个BSP的,怎么迟迟不见呀
10
低功耗问题。
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部