iwdg_sample.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-09-25 misonyo first edition.
  9. */
  10. /*
  11. * 程序清单:这是一个独立看门狗设备使用例程
  12. * 例程导出了 iwdg_sample 命令到控制终端
  13. * 命令调用格式:iwdg_sample iwg
  14. * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。
  15. * 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
  16. * 然后设置空闲线程回调函数,在回调函数里会喂狗。
  17. */
  18. #include <rtthread.h>
  19. #include <rtdevice.h>
  20. #define IWDG_DEVICE_NAME "wdt" /* 看门狗设备名称 */
  21. static rt_device_t wdg_dev; /* 看门狗设备句柄 */
  22. static void idle_hook(void)
  23. {
  24. /* 在空闲线程的回调函数里喂狗 */
  25. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  26. rt_kprintf("feed the dog!\n ");
  27. }
  28. static int iwdg_sample(int argc, char *argv[])
  29. {
  30. rt_err_t ret = RT_EOK;
  31. rt_uint32_t timeout = 10; /* 溢出时间 10 秒 */
  32. char device_name[RT_NAME_MAX];
  33. /* 判断命令行参数是否给定了设备名称 */
  34. if (argc == 2)
  35. {
  36. rt_strncpy(device_name, argv[1], RT_NAME_MAX);
  37. }
  38. else
  39. {
  40. rt_strncpy(device_name, IWDG_DEVICE_NAME, RT_NAME_MAX);
  41. }
  42. /* 根据设备名称查找看门狗设备,获取设备句柄 */
  43. wdg_dev = rt_device_find(device_name);
  44. if (!wdg_dev)
  45. {
  46. rt_kprintf("find %s failed!\n", device_name);
  47. return -RT_ERROR;
  48. }
  49. /* 初始化设备 */
  50. ret = rt_device_init(wdg_dev);
  51. if (ret != RT_EOK)
  52. {
  53. rt_kprintf("initialize %s failed!\n", device_name);
  54. return -RT_ERROR;
  55. }
  56. /* 设置看门狗溢出时间 */
  57. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  58. if (ret != RT_EOK)
  59. {
  60. rt_kprintf("set %s timeout failed!\n", device_name);
  61. return -RT_ERROR;
  62. }
  63. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  64. if (ret != RT_EOK)
  65. {
  66. rt_kprintf("start %s failed!\n", device_name);
  67. return -RT_ERROR;
  68. }
  69. /* 设置空闲线程回调函数 */
  70. rt_thread_idle_sethook(idle_hook);
  71. return ret;
  72. }
  73. /* 导出到 msh 命令列表中 */
  74. MSH_CMD_EXPORT(iwdg_sample, iwdg sample);