STM32 低功耗-停止模式

STM32 停止模式


文章目录

  • [STM32 停止模式](#STM32 停止模式)
  • [第1章 低功耗模式简介](#第1章 低功耗模式简介)
  • [第2章 停止模式简介](#第2章 停止模式简介)
    • [2.1 进入停止模式](#2.1 进入停止模式)
    • [2.1 退出停止模式](#2.1 退出停止模式)
  • [第3章 停止模式程序部分](#第3章 停止模式程序部分)
  • 总结

第1章 低功耗模式简介

在 STM32 的正常工作中,具有四种工作模式:运行、睡眠、停止以及待机模式。

在系统或电源复位以后,微控制器处于运行状态,当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗。这些低功耗模式电源消耗不同、唤醒时间不同和唤醒源不同。

例如等待某个外部事件时,用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,所以需要根据自身的需要选定一个最佳的低功耗模式。

STM32F1有三种低功耗模式:

1、 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)。

2、 停止模式(所有的时钟都已停止)。

3、 待机模式(1.8V电源关闭)。

各种低功耗模式的对比如下表:

说明:

WFI和WFE都是系统指令,WFI是表示中断,WFE表示事件。

第2章 停止模式简介

在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。

停止模式是在Cortex™-M3的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,所有外设停止工作。由于VDD电源没有关闭,所以SRAM和寄存器内容被保留下来。等待重新开启时钟就可以从上次停止的地方继续执行程序。

2.1 进入停止模式

在停止模式下,通过设置电源控制寄存器(PWR_CR)的LPDS位使内部调节器进入低功耗模式,能够降低更多的功耗。

如果正在进行闪存编程,直到对内存访问完成,系统才进入停止模式。

如果正在进行对APB的访问,直到对APB访问完成,系统才进入停止模式。可以通过对独立的控制位进行编程,可选择以下功能:

1、 独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。详见17.3节。

2、 实时时钟(RTC):通过备份域控制寄存器 (RCC_BDCR)的RTCEN位来设置。

3、 内部RC振荡器(LSI RC):通过控制/状态寄存器 (RCC_CSR)的LSION位来设置。

4、 外部32.768kHz振荡器(LSE):通过备份域控制寄存器 (RCC_BDCR)的LSEON位设置。在停止模式下,如果在进入该模式前ADC和DAC没有被关闭,那么这些外设仍然消耗电流。通过设置寄存器ADC_CR2的ADON位和寄存器DAC_CR的ENx位为0可关闭这2个外设。

2.1 退出停止模式

当一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟。此时,需要手动配置系统时钟为HSE和滴答定时器的时钟源为8分频,否则系统执行的时钟就不正确,即会导致和进入停止模式前的时钟不同步了

当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。

如何进入和退出停止模式,细节参考如下表:

第3章 停止模式程序部分

示例代码如下:

c 复制代码
main.c

while(1)
{
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0)
    {
        LED1 = 0;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
        SetSysClock();/* 退出后重新设置系统时钟 */
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
        LED1 = 1;
    }
}
c 复制代码
SetSysClock()函数
该函数在system_stm32f10x.c文件中,由于这个函数被定义为static了,所以main里面无法直接被调用。
因此,需要重新拷贝这个函数到自己的c文件里面,名字可以改也可以默认,和系统的静态函数使用不冲突的。
**特别提醒:不建议去修改系统里面的系统代码,如果稍有不慎就会导致系统执行出错,所以才需要自定义函数来实现。**

中断唤醒代码部分(略)

和前面退出睡眠模式的代码一样,可以移步到睡眠模式文章参考即可。


总结

停止模式在睡眠模式基础上更加节省功耗,其它的基本差不多。

编程时需要注意以下几点

1、退出停止模式后需要重新配置系统时钟为外部高速时钟和滴答定时器时钟分频等。

2、不建议为了实现某种功能而去修改系统里面提供的接口代码,如果稍有不慎就会导致系统执行出错。

3、进入睡眠模式可选PWR_Regulator_ON和PWR_Regulator_LowPower模式,虽然两者都可以进入,但如果要达到更低功耗,则需要选后者的模式。

4、进入低功耗的停止模式后,是不能下载代码的,需要退出该模式后才可以正常烧录代码,否则提示出错

睡眠模式文章

相关推荐
BT-BOX1 小时前
STM32仿真proteus位带操作和keil增加头文件C文件
c语言·stm32·proteus
@晓凡4 小时前
STM32编程遇到的问题随笔【一】
stm32·单片机·嵌入式硬件
虾球xz4 小时前
游戏引擎学习第11天
stm32·学习·游戏引擎
DevinLGT5 小时前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件
小A1596 小时前
STM32完全学习——系统时钟设置
stm32·嵌入式硬件·学习
CoderBob6 小时前
【EmbeddedGUI】脏矩阵设计说明
c语言·单片机
陌夏微秋7 小时前
51单片机基础02 动态数码管显示-并串转换
arm开发·单片机·嵌入式硬件·51单片机·硬件工程·信息与通信·信号处理
面包板扎7 小时前
51单片机应用开发---LCD1602显示应用
单片机·嵌入式硬件·51单片机
面包板扎8 小时前
51单片机应用开发(进阶)---定时器应用(电子时钟)
单片机
好想有猫猫8 小时前
【51单片机】LCD1602液晶显示屏
c语言·单片机·嵌入式硬件·51单片机·1024程序员节