闲来无事,学习STM32电源管理相关知识,怕以后忘记,记录相关笔记在此
前提:STM32有运行,睡眠,停止,待机状态,其中睡眠,停止,待机状态均可以降低功耗
既然是笔记,就抓重点,我喜欢问答方式得思维方式。
初看时,提出4个疑问。
1.芯片可以在哪个电压范围运行?
2.睡眠,停止,待机三个状态得区别
3.三种方式得代码如何编写?
1.在刚开始电压低于 VPOR 时 (约 1.92V),STM32 保持在上电复位状态 (POR,Power On Reset),当 VDD 电压持续上升至大于 VPOR 时,芯片开始正常运行,而在芯片正常运行的时候,当检测到 VDD 电压下降至低于 VPDR 阈值 (约 1.88V),会进入掉电复位状态 (PDR,Power Down Reset)。2
2.三个模式得具体差别如下,重点在睡眠和停止状态,待机状态相当于设备已经关机了,不做过多介绍。睡眠:只关闭了内核时钟,但是外设时钟没有关闭,唤醒后可以马上控制外设如灯开,灯关。停止模式:外设时钟已经关闭,唤醒时需要重新开启外设时钟,等待外设时钟就绪才能重新控制开关灯
3.1 进入睡眠模式(代码如下)
while(1)
{
printf("\r\n 进入睡眠模式,按 KEY1 或 KEY2 按键可唤醒\r\n");
// 使用红灯指示,进入睡眠状态
LED_RED;
// 进入睡眠模式
__WFI(); //WFI 指令进入睡眠,也可以使用事件指令进入睡眠__WFE();
// 等待中断唤醒 K1 或 K2 按键中断
/*** 被唤醒,亮蓝灯指示 ***/
LED_BLUE;
Delay(0x1FFFFF);
printf("\r\n 已退出睡眠模式\r\n");
}
3.2进入停止模式,调用标准库函数,关键在于后续唤醒,需要唤醒外部时钟以及外设时钟
//进入停止模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
//重新唤醒外部时钟
static void SYSCLKConfig_STOP(void)
{
/* 使能 HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待 HSE 准备就绪 */
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
/* 使能 PLL */
RCC_PLLCmd(ENABLE);
/* 等待 PLL 准备就绪 */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择 PLL 作为系统时钟源 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待 PLL 被选择为系统时钟源 */
while (RCC_GetSYSCLKSource() != 0x08);
}
3.3进入待机模式,进入待机模式相当于关机,因此唤醒方式只有上电唤醒或引脚唤醒,相当于要么电源重新开关,要么控制待机得引脚有电了就解除待机状态,反之进入待机有以下步骤。
/* 使能电源管理单元的时钟 , 必须要使能时钟才能进入待机模式 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);
/* 清除 WU 状态位 */
PWR_ClearFlag (PWR_FLAG_WU);
/* 使能 WKUP 引脚的唤醒功能 ,使能 PA0*/
PWR_WakeUpPinCmd (ENABLE);
/* 进入待机模式 */
PWR_EnterSTANDBYMode();