/* * @Description: PVD监控系统初始化,不开启中断,PVD级别5,阈值为2.8V,VDD电压低于2.8V时产生PVD标志 在线程中每隔50ms判断一次标志,若为1,清标志,持续400ms为1,则延迟2s,重启芯片 * @version: * @Author: Joe * @Date: 2021-11-13 13:23:14 * @LastEditTime: 2021-11-13 18:30:31 */ #include "pvd.h" #include "iocfg.h" #define DBG_TAG "pvd" #define DBG_LVL DBG_INFO #include static rt_thread_t pvd_thread = RT_NULL; static uint16_t PWR_FLAG = 0; #define LED_RUN_PIN GET_PIN(B, 9) #define ledrun_off() rt_pin_write(LED_RUN_PIN, PIN_HIGH); #define ledrun_on() rt_pin_write(LED_RUN_PIN, PIN_LOW); /** * @brief This function handles the PVD Output interrupt request. * @param None * @retval None */ void PVD_IRQHandler(void) { HAL_PWR_PVD_IRQHandler(); } void HAL_PWR_PVDCallback(void) { PWR_FLAG = 1; } /** * @brief 配置PVD. * @param None * @retval None */ static void PVD_Config(void) { PWR_PVDTypeDef sConfigPVD; /*使能 PWR 时钟 */ __PWR_CLK_ENABLE(); /* 配置 PVD 中断 */ /*中断设置,抢占优先级0,子优先级为0*/ HAL_NVIC_SetPriority(PVD_IRQn, 0 ,0); HAL_NVIC_EnableIRQ(PVD_IRQn); /* 配置PVD级别3 (具体数据 可查询数据手册获知) 具体级别根据自己的 实际应用要求配置*/ sConfigPVD.PVDLevel = PWR_PVDLEVEL_3; //2.4V sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING; HAL_PWR_ConfigPVD(&sConfigPVD); /* 使能PVD输出 */ HAL_PWR_EnablePVD(); } static void pvd_thread_entry(void* parameter) { PVD_Config(); while(1) { if(PWR_FLAG) { PWR_FLAG = 0; LOG_E("mcu power low,2.5s later reboot"); rt_thread_mdelay(2500); rt_hw_cpu_reset(); } rt_thread_mdelay(50); } } /**************************************** * pvd_init *函数功能 : 配置初始化 *参数描述 : 无 *返回值 : 无 ****************************************/ int pvd_init(void) { pvd_thread = rt_thread_create( "pvd_thread", pvd_thread_entry, RT_NULL, 4096, 28, 20); if (pvd_thread != RT_NULL) { rt_thread_startup(pvd_thread); LOG_I(" pvd_thread create.."); } return RT_EOK; } INIT_APP_EXPORT(pvd_init);