watchdog.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include <bms.h>
  4. #include <hardware.h>
  5. #define LOG_TAG "WDT"
  6. #define LOG_LVL LOG_LVL_INFO
  7. #include <ulog.h>
  8. #define IWDG_DEVICE_NAME "wdt" /* 看门狗设备名称 */
  9. static rt_device_t wdg_dev = RT_NULL; /* 看门狗设备句柄 */
  10. static rt_thread_t wdg_thread = RT_NULL;
  11. void watchdog_idle_hook(void)
  12. {
  13. if(wdg_dev)
  14. {
  15. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  16. }
  17. }
  18. rt_uint32_t A,B;
  19. static void wdg_thread_entry(void* parameter)
  20. {
  21. uint16_t rsoc; //剩余容量百分比
  22. while(1)
  23. {
  24. if(wdg_dev)
  25. {
  26. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  27. // LOG_I("w");
  28. }
  29. rsoc = get_bat_rsoc();
  30. if(rsoc>=95)
  31. {
  32. BTY_AUTO_OFF;
  33. }
  34. // LOG_I("time:%d",rt_tick_get());
  35. rt_thread_delay(1000);
  36. }
  37. }
  38. static int iwdg_init(void)
  39. {
  40. rt_err_t ret = RT_EOK;
  41. rt_uint32_t timeout = 5; /* s,溢出时间 */
  42. wdg_dev = rt_device_find(IWDG_DEVICE_NAME);
  43. if (!wdg_dev)
  44. {
  45. rt_kprintf("find %s failed!\n", IWDG_DEVICE_NAME);
  46. return -RT_ERROR;
  47. }
  48. /* 初始化设备 */
  49. ret = rt_device_init(wdg_dev);
  50. if (ret != RT_EOK)
  51. {
  52. rt_kprintf("initialize %s failed!\n", IWDG_DEVICE_NAME);
  53. return -RT_ERROR;
  54. }
  55. /* 设置看门狗溢出时间 */
  56. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  57. if (ret != RT_EOK)
  58. {
  59. rt_kprintf("set %s timeout failed!\n", IWDG_DEVICE_NAME);
  60. return -RT_ERROR;
  61. }
  62. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, NULL);
  63. /* 设置空闲线程回调函数 */
  64. rt_thread_idle_sethook(watchdog_idle_hook);
  65. LOG_I("set watchdog %s timeout: %us", IWDG_DEVICE_NAME, timeout);
  66. wdg_thread =
  67. rt_thread_create( "wdg_thread",
  68. wdg_thread_entry,
  69. RT_NULL,
  70. 4096,
  71. 29,
  72. 20);
  73. if (wdg_thread != RT_NULL)
  74. {
  75. rt_thread_startup(wdg_thread);
  76. LOG_I(" wdg_thread create..");
  77. }
  78. return ret;
  79. }
  80. INIT_APP_EXPORT(iwdg_init);