低功耗模式表格一览电压调节器Voltage Regulator就是单片机内部的“变压器”或“降压器1. 它是干嘛的单片机外部插的电源通常是 3.3V 或 5V也就是表格里的 VDD​但是芯片内部的 CPU 核心和 SRAM运行内存非常娇贵不能直接用这么高的电压它们需要一个稳定的低电压通常是 1.8V 左右才能安全工作。电压调节器的作用就是把外部的高压转换成内部核心需要的 1.8V 低压。2. 结合低功耗模式看它的作用①睡眠模式Sleep调压器“开”调压器开”就是给1.8V核心电路CPU、SRAM、寄存器等持续供电让它们处于“待命”状态。②停机模式Stop调压器“偷懒”了。它不再努力维持极其精准的电压而是降低工作频率减少自身的能量消耗。输出的电流能力变弱了电压的精度稍微差了一点点。③待机模式Standby彻底断电。程序实例1睡眠模式串口接收数据触发中断唤醒CPU其余时间CPU睡眠外设不受影响#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Serial.h uint8_t RxData; //定义用于接收串口数据的变量 int main(void) { OLED_Init(); //OLED初始化 OLED_ShowString(1, 1, RxData:); //显示静态字符串 Serial_Init(); //串口初始化 while (1) { if (Serial_GetRxFlag() 1) //检查串口接收数据的标志位 { RxData Serial_GetRxData(); //获取串口接收的数据 Serial_SendByte(RxData); //串口将收到的数据回传回去用于测试 OLED_ShowHexNum(1, 8, RxData, 2); //显示串口接收的数据 } OLED_ShowString(2, 1, Running); //OLED闪烁Running指示当前主循环正在运行 Delay_ms(100); OLED_ShowString(2, 1, ); Delay_ms(100); __WFI(); //执行WFI指令CPU睡眠并等待中断唤醒 } }2停止模式外部中断才能唤醒睡眠模式是任何一种中断均可唤醒#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include CountSensor.h int main(void) { /*模块初始化*/ OLED_Init(); // OLED初始化 CountSensor_Init(); // 计数传感器初始化 /*开启时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 开启PWR的时钟 // 停止模式和待机模式一定要记得开启未开启时MCU 不会进入 Stop 模式或者进入了某种不可预知的状态比如卡死 /*显示静态字符串*/ OLED_ShowString(1, 1, Count:); while (1) { OLED_ShowNum(1, 7, CountSensor_Get(), 5); // OLED不断刷新显示CountSensor_Get的返回值 OLED_ShowString(2, 1, Running); // OLED闪烁Running指示当前主循环正在运行 Delay_ms(100); OLED_ShowString(2, 1, ); Delay_ms(100); PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); // PWR_Regulator_ON表示调压器保持全速运转PWR_STOPEntry_WFI一旦有中断发生MCU 会立刻醒来接着跑。 SystemInit(); // 唤醒后要重新配置时钟至外部高速HSI } }3待机模式唤醒方式1闹钟#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include MyRTC.h int main(void) { /*模块初始化*/ OLED_Init(); //OLED初始化 MyRTC_Init(); //RTC初始化 /*开启时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟 //停止模式和待机模式一定要记得开启 /*显示静态字符串*/ OLED_ShowString(1, 1, CNT :); OLED_ShowString(2, 1, ALR :); OLED_ShowString(3, 1, ALRF:); /*设定闹钟*/ uint32_t Alarm RTC_GetCounter() 10; //闹钟为唤醒后当前时间的后10s RTC_SetAlarm(Alarm); //写入闹钟值到RTC的ALR寄存器 OLED_ShowNum(2, 6, Alarm, 10); //显示闹钟值 while (1) { OLED_ShowNum(1, 6, RTC_GetCounter(), 10); //显示32位的秒计数器 OLED_ShowNum(3, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1); //显示闹钟标志位 OLED_ShowString(4, 1, Running); //OLED闪烁Running指示当前主循环正在运行 Delay_ms(100); OLED_ShowString(4, 1, ); Delay_ms(100); OLED_ShowString(4, 9, STANDBY); //OLED闪烁STANDBY指示即将进入待机模式 Delay_ms(1000); OLED_ShowString(4, 9, ); Delay_ms(100); OLED_Clear(); //OLED清屏模拟关闭外部所有的耗电设备以达到极度省电 PWR_EnterSTANDBYMode(); //STM32进入停止模式并等待指定的唤醒事件WKUP上升沿或RTC闹钟 /*待机模式唤醒后程序会重头开始运行*/ } }唤醒方式2wake_up引脚#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include MyRTC.h int main(void) { /*模块初始化*/ OLED_Init(); // OLED初始化 MyRTC_Init(); // RTC初始化 /*开启时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 开启PWR的时钟 // 停止模式和待机模式一定要记得开启 /*显示静态字符串*/ OLED_ShowString(1, 1, CNT :); OLED_ShowString(2, 1, ALR :); OLED_ShowString(3, 1, ALRF:); /*使能WKUP引脚*/ PWR_WakeUpPinCmd(ENABLE); // 使能位于PA0的WKUP引脚WKUP引脚上升沿唤醒待机模式 /*设定闹钟*/ uint32_t Alarm RTC_GetCounter() 10; // 闹钟为唤醒后当前时间的后10s RTC_SetAlarm(Alarm); // 写入闹钟值到RTC的ALR寄存器 OLED_ShowNum(2, 6, Alarm, 10); // 显示闹钟值 while (1) { OLED_ShowNum(1, 6, RTC_GetCounter(), 10); // 显示32位的秒计数器 OLED_ShowNum(3, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1); // 显示闹钟标志位 OLED_ShowString(4, 1, Running); // OLED闪烁Running指示当前主循环正在运行 Delay_ms(100); OLED_ShowString(4, 1, ); Delay_ms(100); OLED_ShowString(4, 9, STANDBY); // OLED闪烁STANDBY指示即将进入待机模式 Delay_ms(1000); OLED_ShowString(4, 9, ); Delay_ms(100); OLED_Clear(); // OLED清屏模拟关闭外部所有的耗电设备以达到极度省电 PWR_EnterSTANDBYMode(); // STM32进入停止模式并等待指定的唤醒事件WKUP上升沿或RTC闹钟 /*待机模式唤醒后程序会重头开始运行*/ } }唤醒方式3复位唤醒方式4看门狗4注意事项/*开启时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 开启PWR的时钟 // 停止模式和待机模式一定要记得开启因为 Sleep 模式不需要动 PWR 外设的寄存器它是内核Cortex-M3自己就能搞定的“小憩”而 Stop 模式和待机模式需要动“电源总闸”PWR 外设所以必须给总闸通电开时钟。停机模式和待机模式的控制不是内核控制者是STM32 的 PWR 硬件模块。你需要操作PWR-CR寄存器来设置调压器模式ON 还是 LowPower。你还需要操作RCC复位和时钟控制相关的寄存器来关闭高速晶振。这些操作都是针对 STM32 芯片特有的外设不是内核自带的指令。所以必须开启 PWR 的时钟否则你写不进PWR-CR。