当前位置: 首页 > news >正文

十四、STM32-----低功耗

一、电源框图

        VDDA 供电区域,主要是 ADC 电源以及参考电压,STM32 ADC 模块配备独立的供电方
式,使用了 VDDA 引脚作为输入,使用 VSSA 引脚作为独立地连接,VREF 引脚为提供给 ADC
参考电压。
电压调节器是 STM32
的电源系统中最核心部分,连接 VDD 供电区域和 1.8 供电区域。
VDD供电来自于 VSS VDD,给 I/O 电路以及待机电路供电,电压调节器主要为备份域以及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及RAM,调节器的输出电压约为1.8V,因此由调压器供电的区域称为 1.8V 供电区域。电压调节器根据应用方式不同有三种不同的工作模式。在运行模式下,调节器以正常工作模式为内核、内存和外设提供 1.8V;在停止模式下,调节器以低功耗模式提供 1.8V 电源,以保存寄存器和 SRAM 的内容。在待机模式下,调节器停止供电,除了备用电路和备份域外,寄存器和 SRAM 的内容全部丢失。
        电池备份区域也就是后备供电区域,使用电池或者其他电源连接到 VBAT 脚上,当 VDD断电
时,可以保存备份寄存器的内容和维持 RTC 的功能。同时 VBAT 引脚也为 RTC LSE 振荡器
供电,这保证了当主要电源被切断时,RTC 能够继续工作。切换到 VBAT 供电由复位模块中的掉
电复位功能控制。

二、电源管理

电源管理的部分我们要关注低功耗模式,在 STM32 的正常工作中,具有四种工作模式,运
行、睡眠、停止以及待机。当单片机上电运行后,不需要内核继续运行,就可以选择睡眠、停止以及待机三种低功耗模式。
睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时
(SysTick)等仍在运行)。
停止模式(所有的时钟都已停止)。
待机模式(1.8V电源关闭)。
2.1、睡眠模式:

立即睡眠

在执行 WFI 或 WFE 指令时立即进入睡眠模式。

退出时睡眠

在退出优先级最低的中断服务程序后才进入睡眠模式。

进入方式

内核寄存器的SLEEPDEEP = 0 ,然后调用WFIWFE指令即可进入睡眠模式;

另外若内核寄存器的SLEEPONEXIT=0时,进入“立即睡眠”模式,SLEEPONEXIT=1时,进入“退出时睡眠”模式。

唤醒方式

如果是使用WFI指令睡眠的,则可使用任意中断唤醒;

如果是使用WFE指令睡眠的,则由事件唤醒。

睡眠时

关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。

唤醒延迟

无延迟。

唤醒后

若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。

只需要调用这个函数,选择一下进入模式,中断进入/时间进入。PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instructionPWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instructionHAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)

2.2、停止模式

调压器低功耗模式

在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗

FLASH掉电模式

在停止模式下FLASH可工作在正常模式或掉电模式,可进一步降低功耗

进入方式

内核寄存器的SLEEPDEEP =1PWR_CR寄存器中的PDDS=0,然后调用WFIWFE指令即可进入停止模式;

PWR_CR 寄存器的LPDS=0时,调压器工作在正常模式,LPDS=1时工作在低功耗模式;

唤醒方式

如果是使用WFI指令睡眠的,可使用任意EXTI线的中断唤醒;

如果是使用WFE指令睡眠的,可使用任意配置为事件模式的EXTI线事件唤醒。

停止时

内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。

唤醒延迟

基础延迟为HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间,若FLASH工作在掉电模式,还需要加上FLASH从掉电模式唤醒的时间。

用KEY0来进入停止模式,然后使用任意外部中断唤醒。uint8_t KEY0_Scan(void) {static uint8_t key_pressed = 0;         if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET) {HAL_Delay(20);                        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET && key_pressed == 0) {key_pressed = 1;               while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET);printf("按键0触发了,进入停止模式\n");  I2C_Write(0,I2C_Wbuf,  strlen((char*)I2C_Wbuf) + 1);HAL_PWR_EnterSTOPMode(1, PWR_SLEEPENTRY_WFI);return 1;  }} else {key_pressed = 0;}return 0;}退出停止模式
因为停止模式,会关闭HSE和PLL,所以在退出时,必须重新开启HSE和PLL。void CLK_Resume()
{//使能HSE__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET){}//使能PLL__HAL_RCC_PLL_ENABLE();while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET){}	//选择PLL作为系统时钟__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);while(__HAL_RCC_GET_SYSCLK_SOURCE() != 0x08 ){}
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_2) {CLK_Resume();printf("退出停止模式\n");key_pressed_flag = 1;        key_debounce_start = HAL_GetTick(); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2); }
}

现象:

2.3、待机模式

进入方式

内核寄存器的SLEEPDEEP =1PWR_CR寄存器中的PDDS=1PWR_CR寄存器中
的唤醒状态位
WUF=0,然后调用WFIWFE指令即可进入待机模式;

唤醒方式

通过WKUP引脚的上升沿,RTC闹钟、唤醒、入侵、时间戳事件或NRST引脚外部复位
IWDG复位唤醒。

待机时

内核停止,片上外设也停止;内核寄存器、内存的数据会丢失;除复位引脚、
RTC_AF1引脚及WKUP引脚,其它I/O口均工作在高阻态。

唤醒延迟

芯片复位的时间

唤醒后

相当于芯片复位,在程序表现为从头开始执行代码。

代码:
GPIO.C 
//下述代码实现了,按键1进入待机模式,并且用中断0进行唤醒,唤醒后相当于重新上电。
uint8_t  key_pressed_flag = 0;   
uint32_t key_debounce_start = 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  //将PA0配置为中断模式
{if(GPIO_Pin == GPIO_PIN_0){HAL_ResumeTick();   //恢复systick中断,否则不能使用HAL_Delayprintf("退出待机模式\n");key_pressed_flag = 1;        key_debounce_start = HAL_GetTick(); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); }
}void KEYUP_Scan(void) 
{
if (key_pressed_flag == 1) {if (HAL_GetTick() - key_debounce_start > 20) {if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {if (HAL_GetTick() - key_debounce_start > 1000) {break; }}										printf("按键2触发!LED状态已翻转\n");										                   }key_pressed_flag = 0; }						
}
}
uint8_t KEY1_Scan(void) {static uint8_t key_pressed = 0;         if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET) {HAL_Delay(20);                        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET && key_pressed == 0) {key_pressed = 1;               while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET);printf("按键1触发了,进入待机模式\n");  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);  //使能唤醒引脚__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTANDBYMode();      //进入到待机模式return 1;  }} else {          key_pressed = 0;}return 0;
}void Key_Process(void)
{KEY1_Scan();KEYUP_Scan();
}
现象:
按完按键1之后,相当于复位,程序从头执行代码。


文章转载自:

http://xGdNEHOg.mmcLj.cn
http://aSJynV8d.mmcLj.cn
http://LtQmnYDj.mmcLj.cn
http://KY82STFc.mmcLj.cn
http://mDgb9yZC.mmcLj.cn
http://YZ3eAoL1.mmcLj.cn
http://ThRuc2aV.mmcLj.cn
http://UE63QHN7.mmcLj.cn
http://TCYDx5mg.mmcLj.cn
http://5aRKvXhL.mmcLj.cn
http://JHYa9yQZ.mmcLj.cn
http://PiP3emu5.mmcLj.cn
http://gS43E8QH.mmcLj.cn
http://Xejg9Hsg.mmcLj.cn
http://7LNTOCTQ.mmcLj.cn
http://oiFhO6tY.mmcLj.cn
http://eEYSlO5U.mmcLj.cn
http://ANHgrzZB.mmcLj.cn
http://GVIyAKFZ.mmcLj.cn
http://uhk0Wfqo.mmcLj.cn
http://GauC7y80.mmcLj.cn
http://xQG9HWbl.mmcLj.cn
http://64yRH7g6.mmcLj.cn
http://DS9O8yUu.mmcLj.cn
http://yV9hpBa0.mmcLj.cn
http://S8kATpjI.mmcLj.cn
http://M2zPunfB.mmcLj.cn
http://JdLqthfI.mmcLj.cn
http://3LKv8uKo.mmcLj.cn
http://7IyG0kep.mmcLj.cn
http://www.dtcms.com/a/366498.html

相关文章:

  • Jenkins调用ansible部署lnmp
  • 快鹭云业财一体化系统技术解析:低代码+AI如何破解数据孤岛难题
  • 微信小程序校园助手程序(源码+文档)
  • 搭建商城系统安全防护体系的核心要点与实施策略
  • Java 方法:从定义调用到重载,入门到面试全攻略
  • 基于腾讯云MCP广场服务Firecrawl MCP网络采集服务构建自动化竞品监测工作日志
  • ICCV-2025 | 清华动以知景导航框架!MTU3D:连接视觉定位与探索,实现高效多样的具身导航
  • 论文解读 | Franka 机器人沉浸式远程操作:高斯溅射 VR 赋能的遥操框架研发与应用
  • Linux-xargs-seq-tr-uniq-sort
  • C# FileInfo 类深度解析文件时间属性
  • 强化学习DQN解决Cart_Pole问题
  • Cursor 辅助开发:快速搭建 Flask + Vue 全栈 Demo 的实战记录
  • 【Spring Cloud Alibaba】Sentinel(一)
  • Java开发中的依赖环境管理
  • Ubuntu 使用 Samba 共享文件夹
  • HCIA备考:常见路由协议及特点
  • 【LeetCode热题100道笔记】缺失的第一个正数
  • List<?>和List<Object>区别
  • 【开题答辩全过程】以 基于微信小程序的宠物领养系统为例,包含答辩的问题和答案
  • 近期算法学习记录
  • UE4调试UAT时为何断点不了BuildCookRun的部分代码
  • MySQL 时间函数全解析:从 NOW() 到 UTC_TIMESTAMP() 的深度实践与选择策略
  • vscode launch.json 中使用 cmake tools 扩展的命令获取可执行文件目标文件名
  • Selenium 页面加载超时pageLoadTimeout与 iframe加载关系解析
  • 对话Michael Truell:23岁创立Cursor,与Github Copilot竞争
  • < 自用文 OS 有关 > (续)发现正在被攻击 后的自救 Fail2ban + IPset + UFW 工作流程详解
  • Elasticsearch面试精讲 Day 7:全文搜索与相关性评分
  • 大数据开发/工程核心目标
  • Redis 客户端与服务器:银行的 “客户服务系统” 全流程
  • 在Ubuntu系统中为MySQL创建root用户和密码