Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32超低功耗
STM32超低功耗入门之睡眠模式
发布于 2021-04-11 17:43:48 浏览:2245
订阅该版
[tocm] ### 一. 认识睡眠模式 查看官方手册对睡眠模式的描述: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210327204454947.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doajEyMzk5OQ==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210327205102981.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doajEyMzk5OQ==,size_16,color_FFFFFF,t_70) 通过上图可以得出结论: 1. 睡眠模式有 4 种电压调节器方案 2. 在睡眠模式下 CPU 是停止状态 3. 在睡眠模式下程序在 SRAM 执行情况下,Flash 可以被断电 4. SRAM1 SRAM2 可以独立的开启或关闭 5. 时钟都处于开启状态, 低功耗运行模式下 PLL 不能使用 6. 根据电压调节器的选择,外设全部开启或者 USB_FS RNG 不能使用 7. 所有的中断和事件都可以唤醒 8. 根据选择的电压调节器,MCU 也有 4 种功耗,功耗与运行的频率成正比关系 9. 唤醒时间 6 个时钟周期 SMPS (Switched-mode Power Supply) ### 二. 睡眠模式的进入 进入睡眠模式的方法很简单,直接调用 `void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)` 使用这个函数时,先看看 ST 的注释 ``` /** * @brief Enter Sleep or Low-power Sleep mode. * @note In Sleep/Low-power Sleep mode, all I/O pins keep the same state as in Run mode. * @param Regulator: Specifies the regulator state in Sleep/Low-power Sleep mode. * This parameter can be one of the following values: * @arg @ref PWR_MAINREGULATOR_ON Sleep mode (regulator in main mode) * @arg @ref PWR_LOWPOWERREGULATOR_ON Low-power Sleep mode (regulator in low-power mode) * @note Low-power Sleep mode is entered from Low-power Run mode. Therefore, if not yet * in Low-power Run mode before calling HAL_PWR_EnterSLEEPMode() with Regulator set * to PWR_LOWPOWERREGULATOR_ON, the user can optionally configure the * Flash in power-down monde in setting the SLEEP_PD bit in FLASH_ACR register. * Additionally, the clock frequency must be reduced below 2 MHz. * Setting SLEEP_PD in FLASH_ACR then appropriately reducing the clock frequency must * be done before calling HAL_PWR_EnterSLEEPMode() API. * @note When exiting Low-power Sleep mode, the MCU is in Low-power Run mode. To move in * Run mode, the user must resort to HAL_PWREx_DisableLowPowerRunMode() API. * @param SLEEPEntry: Specifies if Sleep mode is entered with WFI or WFE instruction. * This parameter can be one of the following values: * @arg @ref PWR_SLEEPENTRY_WFI enter Sleep or Low-power Sleep mode with WFI instruction * @arg @ref PWR_SLEEPENTRY_WFE enter Sleep or Low-power Sleep mode with WFE instruction * @note When WFI entry is used, tick interrupt have to be disabled if not desired as * the interrupt wake up source. * @retval None */ ``` 1. 这个函数时让 MCU 进入睡眠模式或者低功耗睡眠模式 2. 睡眠模式和低功耗睡眠模式,所有的 I/O 的状态都和运行模式时是一样的 3. Regulator 可以传入的参数有 `2` 个。 PWR_MAINREGULATOR_ON 调节器在主模式。PWR_LOWPOWERREGULATOR_ON 调节器在低功耗模式 4. 从低功耗运行模式切换到低功耗睡眠模式。如果设置调节器在为 LPR 之前,系统时钟要降低到 2MHZ以下 5. 当退出低功耗睡眠模式后,MCU 会进入低功耗运行模式,如果要切换到运行模式,则需要通过HAL_PWREx_DisableLowPowerRunMode() 来退出低功耗运行模式 6. 进入睡眠模式的方式。WFI 还是 WFE 7. 当使用 WFI 进入睡眠模式前,必须要关闭 `tick` 的中断,不然 `tick` 的中断会唤醒 MCU ### 三. 睡眠模式的进入代码 进入睡眠模式的代码实现 ``` int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); HAL_Delay(500); // 上电之后延时一会再进入睡眠模式,这样可以保证复位之后可以立即下载程序 HAL_SuspendTick(); // 关闭 tick 中断,防止唤醒睡眠状态的 MCU HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); HAL_ResumeTick(); while (1) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13); HAL_Delay(500); } } ``` 代码解析: 1. 进入睡眠模式后将导致调试器无法识别到 `MCU`,所以在启动的时候加了一个 `HAL_Delay(500)` ,如果没有加,则需要按住复位键点击下载,点击下载之后立即松开复位键,就可以正常的下载程序了。 2. HAL 生成的代码默认将 `systick` 的中断设置为 1KHZ.进入睡眠模式前需要关闭 tick 中断,防止唤醒睡眠状态的 MCU 3. 让 `MCU` 进入睡眠模式 `HAL_PWR_EnterSLEEPMode` 4. 唤醒 `MCU` 之后,将执行进入睡眠模式的下一个指令。所以要立刻打开 `tick` 中断 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328154722559.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doajEyMzk5OQ==,size_16,color_FFFFFF,t_70) 通过这个表可以看到,睡眠模式支持 `WFI` 和 `WFE` WFI: 立刻进入低功耗模式 WFE: 不是立刻进入低功耗模式,根据Event Register(一个单bit的寄存器,每个PE一个)的状态,有两种情况:如果Event Register为1,该指令会把它清零,然后执行完成(不会standby) 选择 `WFE` 可是使用如下代码 ``` HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFE); ``` ### 四. 总结 1. 进入睡眠模式是 `MCU` 停止,唤醒之后无需重新配置时钟 2. 睡眠模式唤醒后,无需对外设重新进入初始化 3. 睡眠模式支持 **中断唤醒** 和 **事件唤醒** 4. `USB_FS` `RNG` 不能使用
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
whj467467222
开源,分享,交流,共同进步
文章
32
回答
1222
被采纳
148
关注TA
发私信
相关文章
推荐文章
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部