iwdg_sample.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. * 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 "iwg"
  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. }
  27. static int iwdg_sample(int argc, char *argv[])
  28. {
  29. rt_err_t ret = RT_EOK;
  30. rt_uint32_t timeout = 1000; /* 溢出时间 */
  31. char device_name[RT_NAME_MAX];
  32. /* 判断命令行参数是否给定了设备名称 */
  33. if (argc == 2)
  34. {
  35. rt_strncpy(device_name, argv[1], RT_NAME_MAX);
  36. }
  37. else
  38. {
  39. rt_strncpy(device_name, IWDG_DEVICE_NAME, RT_NAME_MAX);
  40. }
  41. /* 根据设备名称查找看门狗设备,获取设备句柄 */
  42. wdg_dev = rt_device_find(device_name);
  43. if (!wdg_dev)
  44. {
  45. rt_kprintf("find %s failed!\n", 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", device_name);
  53. return RT_ERROR;
  54. }
  55. /* 设置看门狗溢出时间 */
  56. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, (void *)timeout);
  57. if (ret != RT_EOK)
  58. {
  59. rt_kprintf("set %s timeout failed!\n", device_name);
  60. return RT_ERROR;
  61. }
  62. /* 设置空闲线程回调函数 */
  63. rt_thread_idle_sethook(idle_hook);
  64. return ret;
  65. }
  66. /* 导出到 msh 命令列表中 */
  67. MSH_CMD_EXPORT(iwdg_sample, iwdg sample);