pvd.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * @Description: PVD监控系统初始化,不开启中断,PVD级别5,阈值为2.8V,VDD电压低于2.8V时产生PVD标志
  3. 在线程中每隔50ms判断一次标志,若为1,清标志,持续400ms为1,则延迟2s,重启芯片
  4. * @version:
  5. * @Author: Joe
  6. * @Date: 2021-11-13 13:23:14
  7. * @LastEditTime: 2021-11-13 18:30:31
  8. */
  9. #include "pvd.h"
  10. #include "iocfg.h"
  11. #define DBG_TAG "pvd"
  12. #define DBG_LVL DBG_INFO
  13. #include <rtdbg.h>
  14. static rt_thread_t pvd_thread = RT_NULL;
  15. static uint16_t PWR_FLAG = 0;
  16. #define LED_RUN_PIN GET_PIN(B, 9)
  17. #define ledrun_off() rt_pin_write(LED_RUN_PIN, PIN_HIGH);
  18. #define ledrun_on() rt_pin_write(LED_RUN_PIN, PIN_LOW);
  19. /**
  20. * @brief This function handles the PVD Output interrupt request.
  21. * @param None
  22. * @retval None
  23. */
  24. void PVD_IRQHandler(void)
  25. {
  26. HAL_PWR_PVD_IRQHandler();
  27. }
  28. void HAL_PWR_PVDCallback(void)
  29. {
  30. PWR_FLAG = 1;
  31. }
  32. /**
  33. * @brief 配置PVD.
  34. * @param None
  35. * @retval None
  36. */
  37. static void PVD_Config(void)
  38. {
  39. PWR_PVDTypeDef sConfigPVD;
  40. /*使能 PWR 时钟 */
  41. __PWR_CLK_ENABLE();
  42. /* 配置 PVD 中断 */
  43. /*中断设置,抢占优先级0,子优先级为0*/
  44. HAL_NVIC_SetPriority(PVD_IRQn, 0 ,0);
  45. HAL_NVIC_EnableIRQ(PVD_IRQn);
  46. /* 配置PVD级别3 (具体数据
  47. 可查询数据手册获知) 具体级别根据自己的
  48. 实际应用要求配置*/
  49. sConfigPVD.PVDLevel = PWR_PVDLEVEL_3; //2.4V
  50. sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
  51. HAL_PWR_ConfigPVD(&sConfigPVD);
  52. /* 使能PVD输出 */
  53. HAL_PWR_EnablePVD();
  54. }
  55. static void pvd_thread_entry(void* parameter)
  56. {
  57. PVD_Config();
  58. while(1)
  59. {
  60. if(PWR_FLAG)
  61. {
  62. PWR_FLAG = 0;
  63. LOG_E("mcu power low,2.5s later reboot");
  64. rt_thread_mdelay(2500);
  65. rt_hw_cpu_reset();
  66. }
  67. rt_thread_mdelay(50);
  68. }
  69. }
  70. /****************************************
  71. * pvd_init
  72. *函数功能 : 配置初始化
  73. *参数描述 : 无
  74. *返回值 : 无
  75. ****************************************/
  76. int pvd_init(void)
  77. {
  78. pvd_thread =
  79. rt_thread_create( "pvd_thread",
  80. pvd_thread_entry,
  81. RT_NULL,
  82. 4096,
  83. 28,
  84. 20);
  85. if (pvd_thread != RT_NULL)
  86. {
  87. rt_thread_startup(pvd_thread);
  88. LOG_I(" pvd_thread create..");
  89. }
  90. return RT_EOK;
  91. }
  92. INIT_APP_EXPORT(pvd_init);