STM32407断点检测&cubemx
背景
项目开发过程中中为保证系统的可靠稳定运行,需要在断电前储存一些数据,以便在上电时进行复检。一开始时是通过对FLASH进行反复擦写,但是这样会导致eeprom芯片寿命大大降低,因此考虑只在断电瞬间进行相关操作,实现保存断电的最后一组数据。
PVD(可编程电压检测器)
PVD(可编程电压检测器):可以使用 PVD 监视 VDD 电源,将其与 PLS[2:0] 位所选的阈值进行比较。
PWR 电源控制/状态寄存器 (PWR_CSR) 中提供了 PVDO 标志,用于指示 VDD 是大于还是小于 PVD 阈值。
通过设置 PVDE 位来使能 PVD。
该事件内部连接到 EXTI 线 16,如果通过 EXTI 寄存器使能,则可以产生中断。
当 VDD 降至 PVD 阈值以下以及/或者当 VDD 升至 PVD 阈值以上时,可以产生 PVD 输出中断,具体取决于 EXTI 线 16 上升沿/下降沿的配置。
该功能的用处之一就是可以在中断服务程序中执行紧急关闭系统的任务。
实现代码
使用于 PVD相关的开发之前,需要加入 “stm32f4xx_pwr.h” 头文件
PVD_IRQHandler()
这里利用cubemx直接添加PVD_IRQHandler中断处理函数;

中断处理代码
PWR_PVDTypeDef sConfigPVD;
static void PVD_Config(void)
{
/*##-1- Enable Power Clock #################################################*/
__HAL_RCC_PWR_CLK_ENABLE();
/*##-2- Configure the NVIC for PVD #########################################*/
HAL_NVIC_SetPriority(PVD_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(PVD_IRQn);
/* Configure the PVD Level to 3 and generate an interrupt on rising and falling
edges(PVD detection level set to 2.5V, refer to the electrical characteristics
of you device datasheet for more details) */
sConfigPVD.PVDLevel = PWR_PVDLEVEL_3;
sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
HAL_PWR_ConfigPVD(&sConfigPVD);
/* Enable the PVD Output */
HAL_PWR_EnablePVD();
}
/*中断处理函数*/
void PVD_IRQHandler(void)
{
if(__HAL_PWR_GET_FLAG( PWR_FLAG_PVDO )) /* 1为VDD小于PVD阈值,掉电情况 */
{
/* 掉电前的紧急处理 */
}
}
PVDLevel:应尽可能设置高一些,以便于尽快检测到,在完全断电之前处理完代码。
000:2.0V
001:2.1V
010:2.3V
011:2.5V
100:2.6V
101:2.7V
110:2.8V
111:2.9V
Mode:有上升沿、下降沿和边沿三种。选择边沿的时候,需要注意一下,如果是掉电检测,那就选上升沿(EXTI_Trigger_Rising)触发,如果是上电检测,则选择下降沿触发(EXTI_Trigger_Falling)。
参考资料
https://blog.csdn.net/janson_24/article/details/108137986

浙公网安备 33010602011771号