其实软件层面的过压欠压保护,就是ADC功能中的模拟看门狗
    image.png
    所以在配置ADC的参数时,打开指定的功能就可以了

    1. /** 配置ADC看门狗
    2. */
    3. ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
    4. AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    5. AnalogWDGConfig.HighThreshold = VBUS_HEX_MAX;
    6. AnalogWDGConfig.LowThreshold = VBUS_HEX_MIN;
    7. AnalogWDGConfig.Channel = VBUS_ADC_CHANNEL;
    8. AnalogWDGConfig.ITMode = ENABLE;
    9. if (HAL_ADC_AnalogWDGConfig(&ADC_Handle, &AnalogWDGConfig) != HAL_OK)
    10. {
    11. while(1);
    12. }

    配置好了 ADC 模拟看门狗的溢出上下限,使能中断,就可以使用 ADC 模拟看门狗外设对电路电压进行异常检测了。当电路异常时,看门狗会触发中断回调,我们通过编写中断回调函数就可以对异常进行一定处理。

    1. /**
    2. * @brief 在非阻塞模式模拟看门狗回调
    3. * @param hadc: ADC 句柄.
    4. * @retval 无
    5. */
    6. void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
    7. {
    8. flag_num++; // 电源电压超过阈值电压
    9. if (vbus_adc_mean > VBUS_HEX_MIN && vbus_adc_mean < VBUS_HEX_MAX)
    10. flag_num = 0;
    11. if (flag_num > ADC_NUM_MAX) // 电源电压超过阈值电压10次
    12. {
    13. set_bldcm_disable();
    14. flag_num = 0;
    15. LED1_ON;
    16. printf("电源电压超过限制!请检查原因,复位开发板在试!\r\n");
    17. while(1);
    18. }
    19. }