123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * @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 <rtdbg.h>
- 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);
|