电源管理

← 低功耗知识地图 | ← 主页


供电

  1. 主要从VDD供电,芯片内部有电源监控器,检测VDD电压,以实现掉电紧急处理功能 → 见 PVD与BOR(掉电两级防线) VCC: Ccircuit,接入电路的电压 VDD: Ddevice,器件内部的工作电压 VSS: Sseries,公共连接,指的是公共接地端电压 VBAT: 当使用电池或其他电源连接到VBAT上,VDD断点,保存备份寄存器,维持RTC寄存器 VDDA,VSSA:Aanalog,模拟电路部分的电源,主要为ADC模块以及其他的模拟电路部分(复位,PLL等)供电,VDDA一般就是VDD VREF+,- REF==reference,表示外部参考电压,如果有VREF-必然连接VSSA,VREF+(2.4~VDDA)

  2. 备份域电路: STM32的LSE振荡器、RTC、备份寄存器这些器件被包含进备份域电路中,这部分的电路可以通过STM32的VBAT引 脚获取供电电源,在实际应用中一般会使用3V的钮扣电池对该引脚供电。

  3. 调压器供电电路: 在STM32的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电, 其中包括CPU内核、数字外设以及RAM,调压器的输出电压约为1.2V,因而使用调压器供电的这些电路区域被称为1.2V域。

  4. ADC电源及参考电压:

    为了提高转换精度,STM32的ADC配有独立的电源接口,方便进行单独的滤波。ADC的工作电源使用VDDA引脚输 入,使用VSSA作为独立的地连接,VREF引脚则为ADC提供测量使用的参考电压。

低功耗模式

SLEEP(睡眠模式)

特性说明
进入方式SLEEPDEEP=0,执行 WFI/WFE 指令即可
内核数据保持cpu停止,外设还可以工作,保留内核寄存器,内部ram
Sleep-on-exit=0 立即睡眠;=1 中断返回时睡眠
唤醒方式任意中断:WFI 任意事件:WFE
对 1.2V 域时钟影响CPU 时钟关闭,不影响其他时钟或模拟时钟源
电压调节器开
唤醒后中断唤醒:执行中断 → 执行 WFI 之后的程序 事件唤醒:执行 WFE 后续程序
唤醒延迟无
// 进入Sleep模式
void Enter_Sleep_Mode(void) {
    HAL_SuspendTick();   // 挂起Systick(可选)
    printf("go into Sleep\r\n");
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    printf("exit from Sleep\r\n");
    HAL_ResumeTick();    // 恢复Systick
}
 
void main()
{
    while(1)
    {
        printf("go into Sleep in 3s\r\n");
        printf("go into Sleep in 2s\r\n");
        printf("go into Sleep in 1s\r\n");
        //Enter_Sleep_Mode();
    }
  
}

STOP(停止模式)

字段说明
进入方式SLEEPDEEP=1,PDDS=0,执行 WFI/WFE,LPDS=0为普通调压器,LPDS=1为低功耗调节器
内核数据保持内核,外设停止,保持内核寄存器与内存数据
唤醒方式设置SLEEPDEEP=0  +  任意中断:WFI 任意事件:WFE
对 1.2V 域时钟影响所有1.2域关
电压调节器PWR_CR控制主调节器或低功耗调节器
唤醒后中断唤醒:执行中断 → 执行 WFI 之后的程序 事件唤醒:执行 WFE 后续程序(默认使用HSI时钟)
唤醒延迟基于HSI振荡器启动时间,若为低功耗调压器还需转换时间
// 配置低功耗调压器
void Enter_Stop_Mode(void) {
    HAL_SuspendTick();
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    HAL_ResumeTick();
    SystemClock_Config();  // Stop唤醒后需重新配置系统时钟
}
 
void main()
{
    while(1)
    {
        printf("go into Sleep in 3s\r\n");
        printf("go into Sleep in 2s\r\n");
        printf("go into Sleep in 1s\r\n");
        //Enter_Stop_Mode();
    }
  
}

Standby(待机模式)

字段说明
进入方式SLEEPDEEP=1,PDDS=1,WUF=0,执行WFI/WFE进入
内核数据保持内核和外设完全停止,内存丢失,仅WKUP/RTC_AF1/复位引脚/IWDG生效
唤醒方式WKUP引I脚上升沿、RTC闹钟/唤醒/入侵/时间戳事件、NRST、IWDG
对 1.2V 域时钟影响所有1.2域关
电压调节器关
唤醒后芯片复位,程序从头开始执行
唤醒延迟芯片复位时间
 
void Enter_Standby_Mode(void) {
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); 
    HAL_PWR_EnterSTANDBYMode();
}
 
void main()
{
    if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB))
    {
        printf("from Standby !\r\n");
  
        HAL_Delay(1000);
  
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
    }
    else
    {
        printf("normal startup\r\n");
    }
 
    while(1)
    {
        printf("go into Sleep in 3s\r\n");
        printf("go into Sleep in 2s\r\n");
        printf("go into Sleep in 1s\r\n");
        Enter_Standby_Mode();
    }
}