[其他ST产品] STM32低功耗分析

[复制链接]
1636|45
 楼主| wailian1265k 发表于 2023-9-17 22:44 | 显示全部楼层
5.STM32系列处理器的低功耗模式
在复位以后,微控制器处于运行状态。当微控制器不需继续运行时,可以利用多种低功耗模式来节省功耗。STM32F1系列处理器有三种低功耗模式:

1、睡眠模式
2、停止模式
3、待机模式
 楼主| wailian1265k 发表于 2023-9-17 22:45 | 显示全部楼层
这三种低功耗模式的功能框图如下: 97055650710f9d06f5.png
 楼主| wailian1265k 发表于 2023-9-17 22:45 | 显示全部楼层
5.1.睡眠模式
当Cortex-M3遇到WFE(等待中断)或者WFI(等待事件)指令时会停止内核时钟,停止程序执行。尽管Cortex-M3内核停止工作,但是处理器中的其他外设仍在继续工作。直到某个外设产生事件或者中断时,内核将会被唤醒,退出睡眠模式,程序继续运行(程序在进入睡眠时暂停,退出睡眠时继续运行)。在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。
156746507110981097.png
 楼主| wailian1265k 发表于 2023-9-17 22:45 | 显示全部楼层
睡眠模式下核停止工作,其他外设仍在继续工作,具体情况如下:
停止:crotex-m内核。
开启:RAM存储器、FLASH存储器、数字外设(USART、TIMER、GPIO等)、待机电路、电压调节器。
睡眠模式是三种低功耗模式中最高的!睡眠模式的功耗数据如下:
22280650711215349b.png
 楼主| wailian1265k 发表于 2023-9-17 22:46 | 显示全部楼层
进入睡眠模式

通过执行WFI或WFE指令进入睡眠状态。根据Cortex-M3系统控制寄存器中的SLEEPONEXIT位的值,有两种选项可用于选择睡眠模式进入机制:
SLEEP-NOW:如果SLEEPONEXIT位被清除,当WRI或WFE被执行时,微控制器立即进入睡眠模式。
SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就立即进入睡眠模式。
 楼主| wailian1265k 发表于 2023-9-17 22:46 | 显示全部楼层
退出睡眠模式

如果执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。
如果执行WFE指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。 唤醒事件可以通过下述方式产生:
在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能,并且在Cortex-M3系统控制寄存器中使能SEVONPEND位。当MCU从WFE中唤醒后,外设的中断挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除。
配置一个外部或内部的EXIT线为事件模式。当MCU从WFE中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。
该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。
 楼主| wailian1265k 发表于 2023-9-17 22:47 | 显示全部楼层
进入睡眠模式的代码如下:
  1. void main()
  2. {
  3. Init();
  4. while(1)
  5. {
  6.     if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == 0)
  7.     {
  8.         LED = 0;
  9.         __WFI(); //*进入睡眠模式         
  10.                 LED = 1;
  11.     }
  12. }
 楼主| wailian1265k 发表于 2023-9-17 22:47 | 显示全部楼层
当外设产生事件或者中断时,内核将会被唤醒退出睡眠模式。

5.2.停止模式
停止模式是在Cortex™-M3的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。
进入停止模式时,停止内核时钟,停止程序执行。当一个中断或唤醒事件发生时,内核将被唤醒,退出停止模式,程序继续运行。
在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。
 楼主| wailian1265k 发表于 2023-9-17 22:47 | 显示全部楼层
 楼主| wailian1265k 发表于 2023-9-17 22:48 | 显示全部楼层
停止模式下核停止工作,外设也停止工作,具体情况如下:
停止:crotex-m内核、数字外设(USART、TIMER、GPIO等)、FLASH存储器
开启:RAM存储器、待机电路、电压调节器。
 楼主| wailian1265k 发表于 2023-9-17 22:48 | 显示全部楼层
停止模式是三种低功耗模式中排第二名!停止模式的功耗数据如下:

16721650711b552793.png
 楼主| wailian1265k 发表于 2023-9-17 22:48 | 显示全部楼层
关于如何进入停止模式和如何退出停止模式,详见下表:
54228650711c90a394.png
 楼主| wailian1265k 发表于 2023-9-17 22:49 | 显示全部楼层
进入停止模式的代码如下:
  1. void main()
  2. {
  3. while(1)
  4. {
  5.     if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == 0)
  6.     {
  7.         LED1 = 0;
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  9.         PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  10.         LED1 = 1;
  11.     }
  12. }
 楼主| wailian1265k 发表于 2023-9-17 22:50 | 显示全部楼层
5.3.待机模式
待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电,PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有待机电路维持供电(备份电路可以由电池供电)。在待机模式下,所有的I/O引脚处于高阻态。

 楼主| wailian1265k 发表于 2023-9-17 22:51 | 显示全部楼层
790186507125c6de89.png 14086650712641f97a.png 停止模式下除了待机电路,其他电路都停止工作,这些停止工作的电路包括:内核、数字外设、RAM存储器和FLASH存储器,除了具体情况如下:
停止:crotex-m内核、数字外设(USART、TIMER、GPIO等)、FLASH存储器、RAM存储器,电压调节器。
开启:待机电路。
 楼主| wailian1265k 发表于 2023-9-17 22:51 | 显示全部楼层
待机模式的功耗是三种低功耗模式中最低的!待机模式的功耗数据如下:
693766507127f71d17.png
 楼主| wailian1265k 发表于 2023-9-17 22:52 | 显示全部楼层
关于如何进入待机模式和如何退出待机模式,详见下表:


802816507128da48fd.png

当一个外部复位(NRST引脚)、IWDG复位、WKUP引脚上的上升沿或RTC闹钟事件的上升沿发生时,微控制器从待机模式退出。从待机唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位。从待机模式唤醒后的代码执行等同于复位后的执行。

 楼主| wailian1265k 发表于 2023-9-17 22:52 | 显示全部楼层
进入待机模式的代码如下:

  1. void main()
  2. {
  3. Init();
  4. while(1)
  5. {
  6.     if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == 0)
  7.     {
  8.         LED = 0;
  9.             RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                              
  10.             PWR_WakeUpPinCmd(ENABLE);
  11.             PWR_ClearFlag(PWR_FLAG_WU);
  12.             PWR_EnterSTANDBYMode();
  13.                 LED = 1;
  14.     }
  15. }

 楼主| wailian1265k 发表于 2023-9-17 22:52 | 显示全部楼层
6.深入研究
通过文章的前几节,可能大家已经对STM32低功耗有一定的了解,大部分的工程师也到了这个程度。在这里有以下两个问题:

1、停止模式下内核被关闭(停止工作),被唤醒后内核为什么可以继续运行程序?

2、待机模式下内核也是被关闭,为什么唤醒都不能继续运行程序?
 楼主| wailian1265k 发表于 2023-9-17 22:52 | 显示全部楼层
问题1
停止模式下内核唤醒后为什么可以继续运行程序?关于这个问题查阅STM的官方手册。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部