drv_iwg.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2017-11-08 ZYH the first version
  9. */
  10. #include <rtthread.h>
  11. #include "board.h"
  12. #include <rtdevice.h>
  13. #include <rthw.h>
  14. #ifdef RT_USING_WDT
  15. IWDG_HandleTypeDef hiwdg;
  16. static rt_err_t drv_init(rt_watchdog_t *wdt)
  17. {
  18. hiwdg.Instance = IWDG;
  19. hiwdg.Init.Prescaler = IWDG_PRESCALER_16;//1s
  20. hiwdg.Init.Reload = 4095;
  21. if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  22. {
  23. while (1)
  24. {
  25. }
  26. }
  27. return RT_EOK;
  28. }
  29. static rt_err_t drv_control(rt_watchdog_t *wdt, int cmd, void *arg)
  30. {
  31. switch (cmd)
  32. {
  33. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  34. hiwdg.Init.Reload = (rt_uint32_t)arg;
  35. if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  36. {
  37. return RT_ERROR;
  38. }
  39. break;
  40. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  41. HAL_IWDG_Refresh(&hiwdg);
  42. break;
  43. default:
  44. return RT_ERROR;
  45. }
  46. return RT_EOK;
  47. }
  48. static struct rt_watchdog_ops _ops =
  49. {
  50. drv_init,
  51. drv_control
  52. };
  53. static rt_watchdog_t _iwg =
  54. {
  55. .ops = &_ops
  56. };
  57. int rt_iwg_init(void)
  58. {
  59. return rt_hw_watchdog_register(&_iwg, "iwg", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL);
  60. }
  61. INIT_BOARD_EXPORT(rt_iwg_init);
  62. #endif