电源管理
供电
-
主要从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)
-
备份域电路: STM32的LSE振荡器、RTC、备份寄存器这些器件被包含进备份域电路中,这部分的电路可以通过STM32的VBAT引 脚获取供电电源,在实际应用中一般会使用3V的钮扣电池对该引脚供电。
-
调压器供电电路: 在STM32的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电, 其中包括CPU内核、数字外设以及RAM,调压器的输出电压约为1.2V,因而使用调压器供电的这些电路区域被称为1.2V域。
-
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();
}
}