test_wdt.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-12-30 CDT first version
  9. */
  10. /*
  11. * 程序清单:这是 WDT 设备使用例程
  12. * 例程导出了 wdt_sample 命令到控制终端。
  13. * 命令调用格式:wdt_sample set_timeout x
  14. * 命令解释:x 对应的是超时时间,以实际计算的接近值为准
  15. * 终端先打印N次设置的超时,然后依次递减等待N秒后复位系统(N等于设置的超时秒数)
  16. */
  17. #include <rtthread.h>
  18. #include <rtdevice.h>
  19. #include <stdlib.h>
  20. #ifdef BSP_USING_WDT_TMR
  21. #if defined(BSP_USING_WDT)
  22. #define WDT_DEVICE_NAME "wdt"
  23. #elif defined(BSP_USING_SWDT)
  24. #define WDT_DEVICE_NAME "swdt"
  25. #endif
  26. static rt_device_t wdg_dev;
  27. static rt_uint32_t valid_timeout = 0;
  28. static rt_uint32_t wdt_cnt = 0;
  29. static void idle_hook(void)
  30. {
  31. if (wdt_cnt < valid_timeout)
  32. {
  33. /* Feed watch dog */
  34. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  35. }
  36. }
  37. static void _wdt_cmd_print_usage(void)
  38. {
  39. rt_kprintf("wdt_sample [option]\n");
  40. rt_kprintf(" set_timeout: set wdt timeout(S)\n");
  41. rt_kprintf(" e.g. MSH >wdt_sample set_timeout 10\n");
  42. }
  43. static int wdt_sample(int argc, char *argv[])
  44. {
  45. rt_err_t ret = RT_EOK;
  46. rt_uint32_t timeleft;
  47. rt_uint32_t timeout = atoi(argv[2]);
  48. if (argc != 3)
  49. {
  50. _wdt_cmd_print_usage();
  51. return -RT_ERROR;
  52. }
  53. if (!rt_strcmp("set_timeout", argv[1]))
  54. {
  55. wdg_dev = rt_device_find(WDT_DEVICE_NAME);
  56. if (!wdg_dev)
  57. {
  58. rt_kprintf("find %s failed!\n", WDT_DEVICE_NAME);
  59. return -RT_ERROR;
  60. }
  61. ret = rt_device_init(wdg_dev);
  62. if (ret != RT_EOK)
  63. {
  64. rt_kprintf("init %s failed!\n", WDT_DEVICE_NAME);
  65. return -RT_ERROR;
  66. }
  67. /* Set timeout (Unit:S) */
  68. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  69. if (ret != RT_EOK)
  70. {
  71. rt_kprintf("set %s timeout failed!\n", WDT_DEVICE_NAME);
  72. return -RT_ERROR;
  73. }
  74. /* Get the time when it real effective */
  75. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_GET_TIMEOUT, &valid_timeout);
  76. if (ret != RT_EOK)
  77. {
  78. rt_kprintf("start %s failed!\n", WDT_DEVICE_NAME);
  79. return -RT_ERROR;
  80. }
  81. rt_kprintf("valid_timeout = %d S\n", valid_timeout);
  82. /* Start WDT */
  83. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  84. if (ret != RT_EOK)
  85. {
  86. rt_kprintf("start %s failed!\n", WDT_DEVICE_NAME);
  87. return -RT_ERROR;
  88. }
  89. rt_thread_idle_sethook(idle_hook);
  90. for (;;)
  91. {
  92. rt_thread_mdelay(1000);
  93. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_GET_TIMELEFT, &timeleft);
  94. rt_kprintf("timeleft = %d S\n", timeleft);
  95. wdt_cnt++;
  96. }
  97. }
  98. else
  99. {
  100. _wdt_cmd_print_usage();
  101. return -RT_ERROR;
  102. }
  103. return ret;
  104. }
  105. MSH_CMD_EXPORT(wdt_sample, wdt_sample [option]);
  106. #endif