一、电源监控器
stm32芯片主要通过引脚VDD从外部获取电源,在它的内部有电源监控器,用于检测VDD的电压,以实现复位功能和紧急掉电处理,来保持系统可靠地运行。
1、上电复位(POR)与掉电复位(PDR)
当检测到VDD的电压低于阈值VPOR及VPDR时,无需外部电路辅助,STM32芯片会自动保持在复位状态,防止电压不住强行工作带来的不良后果。刚开始VDD电压低于VPOR(约1.92v)时,STM32处于上电复位状态,当电压持续上升到大于VPOR时,芯片开始正常运行。当检测到电压低于VPDR(约1.88v)阈值时,STM32处于掉电复位状态。
2、可编程电压检测器PVD
除了POR和PDR防止误操作。STM32还提供了可编程电压检测器PVD,当检测到VDD的电压低于编程的VPVD阈值时,会向内核产生一个PVD中断,以使内核在复位前进行紧急处理.该电压阈值可通过电源控制寄存器PWR_CSRd置。
3、电源系统
电源系统的主要分为备份域电路、内核电路和ADC电路3部分。
①备份域电路
STM32的LSE震荡器、RTC和备份寄存器被包含在备份域电路中。通过VBAT引脚获取供电电源。
②内核电路(也叫调压器供电电路,即1.8V区域)
为备份域和待机电路以外的所有数字电路供电。包括内核数字外设和RAM。调压器可以运行在运行模式、停止模式和待机模式。
③ADC电路
为了提高ADC的转换精度,STM32为ADC配了独立的电源接口,方便进行单独的滤波。
二、STM32的功耗模式
按功耗由高到低排序,STM32有运行、睡眠、停止、待机4种工作模式。上电复位后STM32处于运行状态,当内核不需要运行时可选择后面三种低功耗模式,以降低功率。这三种模式中,电源消耗不同,唤醒时间不同,唤醒源不同。
1.睡眠模式
仅关闭了内核,片上外设及M3外设都在运行。有两种方式进入睡眠模式,WFI和WFE,他的进入方式决定了唤醒方式。由WFI进入的由中断唤醒,执行完中断函数后继续从WFI后面运行。由WFE进入的则由事件唤醒。唤醒后直接执行WFE后的程序。
LED_Init();
Key_GPIO_Init();
LED(0);
__WFI();//进入睡眠模式
//等待KEY1按下产生中断唤醒
//唤醒后接着向下执行
LED(3);
delayms(1000);
LED(4);
delayms(1000);
LED(5);
2.停止模式
在停止模式中进一步关闭了其他时钟,故在停止模式下所有的外设也停止工作。但由于1.8V区域电源没关闭,寄存器和内存的信息还在所以停止模式结束后还是可以接着进入停止模式的地方接着向下执行代码。
LED_Init();
Key_GPIO_Init();
LED(0);
//进入停止模式
PWR_EnterSleepMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
//被唤醒后接着向下执行
//从停止模式被唤醒后使用的是HSI时钟,这里重启HSE时钟,使用PLLCLK
SYSCLK_Config_STOP();
LED(1);
delayms(500);
LED(2);
delayms(500);
LED(3);
3.待机模式
待机模式关闭了所有的时钟,故待机结束后只能重新开始运行程序。注意要进入待机模式前必须使能PWR时钟。
int main()
{
//使能电源管理的时钟,必须要使能时钟才能进入待机模式
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
while(1)
{
LED_Init();
Key_GPIO_Init();
LED(0);
LED(1);
delayms(500);
LED(2);
delayms(500);
LED(3);
delayms(500);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
{
LED(8);
delayms(500);
PWR_ClearFlag(PWR_FLAG_WU);
PWR_WakeUpPinCmd(PWR_WakeUpPin_1,ENABLE);
/*进入待机模式*/
PWR_EnterSTANDBYMode();
}
}
}
}