Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32超低功耗
STM32超低功耗之低功耗运行模式
发布于 2021-04-04 09:29:57 浏览:3400
订阅该版
[tocm] ### 一. 认识低功耗运行模式 低功耗运行模式,是降低了功耗的运行模式,`CPU` 依然处于运行状态,只是这个时候的频率降低了,导致运行速度变慢,但是功耗同时也下降了。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328165737118.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doajEyMzk5OQ==,size_16,color_FFFFFF,t_70) 通过上图可以得到信息: 1. 电压调节器设置为 LPR(low-power regulator) 2. CPU 处于运行状态 3. 在低功耗模式下程序在 SRAM 执行情况下,Flash 可以被断电 4. SRAM1 SRAM2 可以独立的开启或关闭 5. 除了 PLL 以外的时钟都正常开启 6. USB_FS RNG 不能使用 7. 运行模式无需唤醒 8. 功耗 94uA/MHZ 9. 调压器在 Range 1,唤醒时间 4us. 调压器在 Range 2,唤醒时间 64us. ### 二. 低功耗运行模式的进入 进入低功耗运行模式之后 PLL 时钟无法使用: ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032819195422.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doajEyMzk5OQ==,size_16,color_FFFFFF,t_70) 上图来自于 **CUBEMX** 通过上图可以知道,如果 PLL 不能使用,那么将无法完成倍频,也就是无法使 MCU 倍频到最大工作频率。所以在 PLL 无法使用的情况下,MCU 可选的时钟源,只有 `HSI`(固定频率 16MHZ) 和 `MSI`(最大48MHZ) 可用。 进入低功耗运行模式的 API :`void HAL_PWREx_EnableLowPowerRunMode(void)` 使用这个函数时,先查看 ST 官方给出的注释: ``` * @brief Enter Low-power Run mode * @note In Low-power Run mode, all I/O pins keep the same state as in Run mode. * @note When Regulator is set to PWR_LOWPOWERREGULATOR_ON, the user can optionally configure the * Flash in power-down monde in setting the RUN_PD bit in FLASH_ACR register. * Additionally, the clock frequency must be reduced below 2 MHz. * Setting RUN_PD in FLASH_ACR then appropriately reducing the clock frequency must * be done before calling HAL_PWREx_EnableLowPowerRunMode() API. * @retval None ``` 通过上面的注释可以得到以下讯息: 1. 低功耗运行模式下,所有的 **I/O** 保持了在运行模式下一样的状态,也就是说从运行模式切换到低功耗运行模式时,无需对 **I/O** 做重新配置 2. 当调压器设置为 `PWR_LOWPOWERREGULATOR_ON` 时, 且程序是在 RAM 中运行,`Flash` 可以通过配置 `FLASH_ACR` 寄存器来上 `Flash` 下电 3. 时钟频率必须降低到 2MHZ 以下 4. 在调用 HAL_PWREx_EnableLowPowerRunMode() API之前 ,必须在FLASH_ACR中设置RUN_PD,然后适当降低时钟频率 ### 三. 低功耗运行模式进入与退出的代码 可以直接调用 `void HAL_PWREx_EnableLowPowerRunMode(void)` ``` int main(void) { int time_out = 0; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); SystemClock_Decrease(); // 使用 MSI 作为时钟源,设置设置为 1MHZ HAL_PWREx_EnableLowPowerRunMode(); // 进入低功耗运行模式 /* 根据自己的实际情况增加判断退出低功耗运行模式的条件,例如外部检查按键状态*/ HAL_Delay(5000); // 低功耗模式运行一会 HAL_PWREx_DisableLowPowerRunMode(); // 推出低功耗运行模式 SystemClock_Config(); // 重新配置时钟 while (1) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13); HAL_Delay(500); } ``` 配置 `MSI` 时钟的代码 ``` void SystemClock_Decrease(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure LSE Drive Capability */ HAL_PWR_EnableBkUpAccess(); __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSICalibrationValue = 0; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } /** Configure the main internal regulator output voltage */ if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) { Error_Handler(); } /** Enable MSI Auto calibration */ HAL_RCCEx_EnableMSIPLLMode(); } ``` ### 四. 总结 1. 低功耗运行模式只是降低了 CPU 的运行速度,并没有停止 2. USB_FS RNG 不能使用 3. 使用低功耗运行模式不是使用 PLL ,时钟源选择 MSI,频率不要超过 2MHZ 4. 低功耗运行模式进入后也将导致整个时钟线上的外设速度降低,退出模式后,如果外设需要更高的速度请重新初始化
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
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部