装饰公司 网站模板,网站管理强化阵地建设,电商系统服务口碑好,网站建设维护学什么科目一、什么是低功耗#xff1f; 低功耗是指通过优化设计和采用特定的技术手段#xff0c;降低电子设备在运行过程中消耗的能量#xff0c;从而延长电池寿命、提高性能和减少发热。低功耗设计主要从芯片设计和系统设计两个方面进行#xff0c;旨在减少所有器件的功率损耗 低功耗是指通过优化设计和采用特定的技术手段降低电子设备在运行过程中消耗的能量从而延长电池寿命、提高性能和减少发热。低功耗设计主要从芯片设计和系统设计两个方面进行旨在减少所有器件的功率损耗从而降低总体功耗。 低功耗_百度百科 STM32的低功耗low power mode特性是其嵌入式处理器系列的一个重要优势特别适用于需要长时间 运行且功耗敏感的应用场景如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的功耗要求非常苛刻如某些传感器信息采集设备仅靠小型的电池提供电源要求工作长达数年之久且期间不需要任何维护由于智慧穿戴设备的小型化要求电池体积不能太大导致容量也比较小所以也很有必要从控制功耗入手提高设备的续行时间。
二、STM32电源系统结构 三、低功耗模式介绍
STM32具有运行、睡眠、停止和待机四种工作模式。
上电后默认是在运行模式当内核不需要继续运行时可以选择后面三种低功耗模式。 3.1 睡眠模式sleep mode 在睡眠模式下CPU停止工作但所有外设如ADC、通信接口等仍然运行时钟继续运转。这适用于需要暂时关闭CPU但外围设备需要继续工作的场景。
模式特点
对系统影响小但是节能效果最差。在睡眠模式下所有的I/O引脚都保持它们在运行模式时的状态。
进入条件
当系统控制寄存器中的SLEEPDEEP位被清除通常为0并且SLEEPONEXIT位根据需求设置时如果设置为1则在最低优先级中断处理程序退出时进入Sleep模式如果为0则执行WFI或WFE时立即进入。执行WFIWait For Interrupt或WFEWait For Event指令来进入。
唤醒条件
任意一个中断都能将系统从Sleep模式唤醒。如果执行WFE指令进入Sleep模式则一旦发生唤醒事件时MCU将唤醒。
3.2 停机模式stop mode 在停机模式下CPU和核心外围设备的时钟会停止但部分唤醒源如外部中断和某些定时器仍然运行。这适用于需要长时间等待外部事件唤醒的应用如等待用户输入或外部信号。Stop模式实现了非常低的功耗同时保留了SRAM和寄存器的内容。
模式特点
节能效果好程序不会复位。但恢复时间较长比如震荡器需要重新起震等。在停机模式下所有的I/O引脚都保持它们在运行模式时的状态。退出停止模式HSI RC振荡器被选为系统时钟
进入条件
需要将SLEEPDEEP位设置为1以进入深度睡眠模式然后通过设置电源控制/状态寄存器PWR_CSR中的PDDS位为0来选择进入Stop模式。根据需求设置LPDS位LPDS 0表示在深睡眠模式下电压调节器保持开启状态LPDS 1表示在深睡眠模式下电压调节器进入低功耗模式。。执行WFIWait For Interrupt或WFEWait For Event指令来进入。在进入Stop模式之前通常需要关闭不必要的外设时钟并保存需要保留的状态信息。
唤醒条件
Stop模式可以通过外部中断如按键中断、USART接收中断等唤醒。RTC闹钟事件、USB唤醒、以太网ETH唤醒等也可以作为唤醒源但这些通常需要通过外部中断来触发。 3.3 待机模式standby mode 在该模式下CPU、外围设备和时钟都被关闭只保留唤醒逻辑和备份寄存器。这适用于不需要保留RAM内容且可以从复位状态恢复的设备常见于需要极低功耗且稀疏唤醒的应用。Standby模式是STM32中功耗最低的模式之一。
模式特点
节能效果最好但程序会复位只有少数条件唤醒。在Standby模式下大部分IO引脚处于高阻态只有复位引脚、TAMPER引脚如果配置为防侵入或校准输出和WKUP引脚可用作唤醒源。
进入条件
Standby模式进入前需要清除电源控制/状态寄存器PWR_CSR中的WUF位以确保没有未处理的唤醒标志。将SLEEPDEEP位设置为1以进入深度睡眠模式并设置PDDS位为1来选择进入Standby模式。执行WFI或WFE指令进入Standby模式。
唤醒条件
Standby模式可以通过WKUP引脚的上升沿唤醒。RTC闹钟事件也可以作为唤醒源。独立看门狗IWDG复位和NRST引脚上的外部复位也可以唤醒STM32但这通常用于系统复位而非低功耗唤醒。
图片展示如下 四、寄存器及库函数介绍
关于低功耗模式都集中在电源控制模块下 4.1 电源控制寄存器(PWR_CR) 4.2 电源控制/状态寄存器(PWR_CSR) 4.3 系统控制寄存器SCB_SCR System control register (SCB_SCR) 4.4 库函数 //使能电源时钟关闭电压调节器 __HAL_RCC_PWR_CLK_ENABLE(); //使能WKUP引脚唤醒功能 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //清除唤醒标记否则会持续唤醒无法进入待机模式 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); 五、低功耗实验
实验目的 1. 按下按键 2 进入低功耗模式睡眠、停机、待机 2. 按下按键 1 退出低功耗模式 3. 正常模式下 LED1 闪烁 4.进入停机模式 LED2 长亮退出停机模式则 LED2 熄灭 我们需要有一种方式触发之后可以同时对三种低功耗模式进行唤醒通过如下图可知 睡眠模式对任一中断都可以唤醒停机模式对任一外部中断可以唤醒待机模式对WKUP引脚产生上升沿可以唤醒。这里可以对WKUP引脚产生上升沿之后设置中断处理函数即可产生中断并且WKUP引脚产生 的中断是一种外部中断。 复制项目文件19-串口打印功能 重命名为57-低功耗 打开项目
加载文件 5.1 睡眠模式
在lpwr.c函数中 //睡眠模式 void lpwr_enter_sleep(void) { HAL_SuspendTick();//使用WFI必须关闭滴答定时器中断否则会把整个程序唤醒 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); } 在主函数中 uint8_t i0; while(1) { if(key_scan() 2) { lpwr_enter_sleep(); } if(i%20 0) led1_Toggle(); i; delay_ms(10); } 测试睡眠模式时会出现什么现象
烧录代码之后led1以200ms的频率疯狂闪烁此时摁下按键2就会进入睡眠模式led1可能会瞬间保持当前状态进入睡眠模式可能是亮灯也可能是灭灯状态然后摁下按键1WKUP引脚产生上升沿就会通过中断退出睡眠模式这时led1再次以200ms的状态疯狂闪烁。
在lpwr.c文件中HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);函数查看库文件发现 翻译是
电压调节器在睡眠模式下是不使用电压调节器的但是为了保持一致这里要使用这个参数。
当使用WFI入口时如果不希望滴答定时器中断唤醒源则必须取消勾选滴答中断。
5.2 停机模式
在lpwr.c函数中 void lpwr_enter_stop(void) { //关闭滴答定时器 HAL_SuspendTick(); //点亮led2使其知道进入了停机模式 led2_ON(); //直接进入停机模式 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //熄灭led2使其知道退出了停机模式 led2_OFF(); } 在主函数中 uint8_t i0; while(1) { if(key_scan() 2) { lpwr_enter_stop(); } if(i%20 0) led1_Toggle(); i; delay_ms(10); } 测试停机模式会出现什么现象 烧录上面代码会发现led1以200ms的速度疯狂闪烁此时摁下按键2led1会立刻以当前状态进入停机模式可能是亮灯也可能是灭灯状态并且led1常亮当摁下按键1时led1从常亮状态变成熄灭状态led2会从以200ms的闪烁的状态变成慢速度闪烁。
为什么led2会从以200ms的闪烁的状态变成慢速度闪烁为什么不是原速度闪烁 因为停机模式第三条退出停止模式HSI RC振荡器被选为系统时钟。在原来振荡器是以系统时钟的频率进行震荡72MHZ当进入停止模式之后再退出一次停止模式振荡器会选择HSI RC8MHZ所以led2灯闪烁的状态会下降如果需要变回原来的频率需要在退出停止模式之后再次配置系统时钟为振荡器。代码如下 5.3 待机模式
在lpwr.c函数中 //待机模式 void lpwr_enter_standby(void) { //使能电源时钟关闭电压调节器 __HAL_RCC_PWR_CLK_ENABLE(); //使能WKUP引脚唤醒功能 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //清除唤醒标记否则会持续唤醒无法进入待机模式 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //进入待机模式 HAL_PWR_EnterSTANDBYMode(); //测试看看代码会不会运行到下面 led2_ON(); } 在主函数中 while(1) { if(key_scan() 2) { lpwr_enter_standby(); } if(i%20 0) led1_Toggle(); i; delay_ms(10); } 测试待机模式时会出现什么现象 烧录代码之后led1会以200ms的频率疯狂闪烁当摁下按键2时led1会立刻以当前状态进入待机模式可能是亮灯也可能是灭灯状态然后摁下按键1之后led1再次以200ms的频率疯狂闪烁并且在此期间led2没有亮。
led2为什么没有亮 退出一次待机模式之后代码会从主函数重新执行而不是继续执行所以led2没有亮。