PVD 与 BOR 欠压保护

← 返回 Cortex-M4内核原理 | ← 主页

芯片供电电压下降时的两级硬件防线:先 PVD 软件抢救,再 BOR 硬件复位。


两级防线

VDD 下降
  │
  ├─ 低于 PVD 阈值(可编程)──▶ PVDO 置位 ──▶ PVD 中断 ──▶ 软件抢救(存 Flash)
  │
  └─ 低于 BOR 阈值(硬件)────▶ 硬件电路直接复位 ──▶ 防止程序跑飞/误写
阶段阈值谁介入能做什么
PVD可编程(软件设)软件(中断)进中断写代码:把重要数据存 Flash
BOR硬件固定(选项字节配)硬件电路直接复位,不经过软件

PVD(可编程电压检测)

PVD(Programmable Voltage Detector)属于 STM32 的 PWR 电源控制模块,实时监控 VDD:

说明
阈值可编程,PWRCR 的 PLS[2:0] 位选档(约 2.2V~2.9V,具体看型号)
标志VDD < 阈值时 PWRCSR 的 PVDO 置 1
中断挂到 EXTI 线 16,配置后下降沿触发中断
用途电压还没低到崩溃,留出时间窗口给软件「抢救数据」

BOR(欠压复位)

BOR(Brown-Out Reset)是纯硬件防线,阈值比 PVD 更低:

说明
阈值硬件固定,选项字节 BOR_LEV 配档
动作VDD < 阈值 → 硬件直接触发复位(电压恢复前保持复位)
作用电压低到 CPU 可能跑飞、Flash 误写时,强制复位,防止程序乱跑

一句话分工:PVD 给软件「临死前存数据」的机会,BOR 兜底保证不会带病运行。


HAL 使用(PVD 保存数据)

// 配置 PVD 阈值 + 使能中断
PWR_PVDTypeDef pvd;
pvd.PVDLevel = PWR_PVDLEVEL_5;              // 选阈值档位(如 2.5V)
pvd.Mode     = PWR_PVD_MODE_IT_FALLING;     // 电压跌破阈值时中断
HAL_PWR_ConfigPVD(&pvd);
HAL_PWR_EnablePVD();
 
HAL_NVIC_SetPriority(PVD_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(PVD_IRQn);
 
// PVD 中断:抓紧存重要数据到 Flash
void PVD_IRQHandler(void)
{
    HAL_PWR_PVD_IRQHandler();
}
 
void HAL_PWR_PVDCallback(void)
{
    Save_Important_Data_To_Flash();   // 把关键变量写进 Flash 备用区
}

Flash 写需要时间且耗电,PVD 阈值比 BOR 高,就是为了给这一步留出电压下降的时间窗。