PWR(电源控制)

发布时间:2026/7/16 4:19:34
PWR(电源控制) PWR简介STM32内部供电方案该图可以分为三个部分VDDA模拟供电VDD数字供电VBAT后备供电。其中VDD数字供电的右边部分是由电压调节器供电低功耗模式LPDS用来设置电压调节器注意停机和待机模式的HSI内部高速时钟和HSE外部高速时钟虽然关闭了但LSI(外部低速时钟)和LSE内部低速时钟没有关闭。模式选择三种模式的特性唤醒事件注意我们的程序默认的是HSE外部高速时钟通过PLL倍频得到72Mhz主频而退出停止模式时它并不会开启HSE和PLL而是选用HSI内部高速时钟8Mhz作为主频所以我们退出停止模式时要重新开启HSE外部高速时钟调用SystemIni函数配置睡眠模式串口模式接收接收初始化模板intmain(void){uint32_tRXData;// 睡眠调试配置保持SWD时钟在睡眠模式下运行否则STLink连不上DBGMCU-CR|DBGMCU_CR_DBG_SLEEP;Serial_Init();OLED_Init();OLED_ShowString(1,1,Num:);while(1){if(Serial_GetRXFlag()1){RXDataSerial_GetRXData();OLED_ShowHexNum(1,5,RXData,3);}OLED_ShowString(2,1,Running);Delay_ms(500);OLED_ShowString(3,1, );Delay_ms(500);}_WFI();}这里是发送一个数据进入中断然后退出睡眠模式。停止模式对射式红外传感器初始化模板intmain(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//停止模式要配置PWR寄存器所以要开启时钟。CountSensor_Init();OLED_Init();OLED_ShowString(1,1,Count:);while(1){OLED_ShowNum(1,7,CountSensor_Get(),5);OLED_ShowString(2,1,Running);Delay_ms(500);OLED_ShowString(2,1, );Delay_ms(500);//第一个参数是开启电压调节器第二个参数是选择WFI还是WFE开启停止模式这里选择WFIPWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);SystemInit();//配置时钟重新开启HSE外部高速时钟72Mhz}}这里是外部中断退出停止模式因为睡眠模式并没有用到PWR寄存器所以并不用开启但停止模式要配置寄存器所以这里开启PWR时钟。接着调用PWR_EnterSTOPMode进入停止模式里面有两个参数选择第一个选择电压调节器是打开还是处于低功耗模式低功耗模式下唤醒会有一定的延时第二个参数选择外部中断唤醒还是事件唤醒。停机模式只能由外部中断唤醒。待机模式实时时钟初始化模板intmain(void){MyRTC_Init();OLED_Init();RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启PWR时钟OLED_ShowString(1,1,CNT:);OLED_ShowString(2,1,ALR:);OLED_ShowString(3,1,ALRF:);PWR_WakeUpPinCmd(ENABLE);//因为RTC_GetCounter()只能写不能读所以要定义一个变量来查看。uint32_tAlarmRTC_GetCounter()10;RTC_SetAlarm(Alarm);//开启RTC闹钟每10秒开一次OLED_ShowNum(2,6,Alarm,10);while(1){MyRTC_ReadTime();OLED_ShowNum(1,6,RTC_GetCounter(),10);//显示秒数OLED_ShowNum(3,6,RTC_GetFlagStatus(RTC_FLAG_ALR),1);//获取RTC闹钟标志位OLED_ShowString(4,1,Running);Delay_ms(500);OLED_ShowString(4,1, );Delay_ms(500);PWR_EnterSTANDBYMode();//进入待机模式}}这里是RTC闹钟和WKUP上升沿退出待机模式。因为进入待机模式后程序会重新开始运行调用PWR_EnterSTANDBYMode()函数后该函数的后面程序都不能运行了。注意因为进入待机模式GPIO口会处于高阻态而OLED屏幕之所以还会亮是因为接入了VCC和GND所以可以亮但并不能正常工作这里可以从它每10秒才更新数据可以看出而让OLED不亮的方法可以调用OLED_Clear()函数清屏就行了。常用函数PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI); //第一个参数是开启电压调节器第二个参数是选择WFI还是WFE开启停止模式这里选择WFISystemInit(); //配置时钟重新开启HSE外部高速时钟72MhzRTC_SetAlarm( Alarm); //开启RTC闹钟每10秒开一次RTC_GetFlagStatus(RTC_FLAG_ALR) //获取RTC闹钟标志位PWR_EnterSTANDBYMode(); //进入待机模式