STM32电源管理
(1)3时钟模式
①睡眠模式②停止模式③待机模式
1.睡眠模式:Cortex-M3内核(理解为CPU)停止工作,CPU供电1.8V有着,周边任何执行。执行
2.停机模式:全部时钟都停止,CPU电源1.8V没断。唤醒后从原来位置运行
3.待机模式:时钟全断,CPU电源1.8V也断,唤醒后程序又一次运行
可形象參考:
CPU:皇上
CPU电源1.8V:皇后
外设:将军
那么:
1.睡眠模式:仅仅有皇上睡觉
2.停机模式:皇上,将军睡觉
3.待机模式:皇上,皇后。将军全睡觉了
(原则:皇后不睡觉,程序可被保留,唤醒后从原来位置运行)
(二)程序简单介绍(库函数)
1.睡眠模式
while(1) { /* wait interrupt */ LED1( ON ); Delay(0xFFFFF); LED1( OFF ); LED2( ON ); Delay(0xFFFFF); LED2( OFF ); LED3( ON ); Delay(0xFFFFF); LED3( OFF ); __WFI(); }
__WFI(); 进入睡眠模式,随意中断唤醒。唤醒后不用再配置时钟
2.停止模式
①/*由于要使用其外设时钟等。故需用到pwr*/
#include "stm32f10x_pwr.h"
②/*使能电源管理单元的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
③进入停止模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
④唤醒:外部中断
由于将军睡了,(及外设时钟关了,因此须要又一次配置)唤醒后须要又一次启动HSE
SYSCLKConfig_STOP();
void SYSCLKConfig_STOP(void) { ErrorStatus HSEStartUpStatus; /* 使能 HSE */ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE准备就绪*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 使能 PLL */ RCC_PLLCmd(ENABLE); /* 等待 PLL 准备就绪 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* 选择PLL作为系统时钟源*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*等待PLL被选择为系统时钟源 */ while(RCC_GetSYSCLKSource() != 0x08) { } } }
3.待机模式
①/*由于要使用其外设时钟等,故需用到pwr*/
#include "stm32f10x_pwr.h"
②/*使能电源管理单元的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
③进入待机模式
/*使能WKUP引脚的唤醒功能,WKUP是第二功能。不用配置它的输出模式(不是太懂)*/ PWR_WakeUpPinCmd (ENABLE); /*进入待机模式*/ PWR_EnterSTANDBYMode();
④唤醒,复位唤醒。PA0上升沿唤醒
⑤检測是复位唤醒还是PA0上升沿唤醒
if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET) { printf("\r\n PA0上升沿唤醒\r\n"); } else printf("\r\n 其它\r\n");
由于待机唤醒程序从头运行,故不用多加配置时钟的函数了
狂人用脑子
版权声明:本文博主原创文章。博客,未经同意不得转载。