main.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-09-09 RT-Thread first version
  9. */
  10. #include <rtthread.h>
  11. #include <board.h>
  12. #include <rtdevice.h>
  13. #include "beep.h"
  14. #include "hmi.h"
  15. #include <control.h>
  16. #include "dtu_uart2.h"
  17. #include "sht30_collect.h"
  18. #include "sound.h"
  19. #include <ledblink.h>
  20. #include "test.h"
  21. #define DBG_ENABLE
  22. #define DBG_COLOR
  23. #define DBG_TAG "main"
  24. #define DBG_LEVEL DBG_LOG
  25. #include <rtdbg.h> //must after of DBG_LVL, DBG_TAG or other options
  26. #define WDT_DEVICE_NAME "wdt" /* 看门狗设备名称 */
  27. /********************************************************************/
  28. rt_device_t wdg_dev; /* 看门狗设备句柄 */
  29. Device_Status_typedef device_status;
  30. /*****************LED thread*****************************************/
  31. /*栈空间地址对齐*/
  32. ALIGN(RT_ALIGN_SIZE)
  33. /********************************************************************/
  34. // 外部函数声明,消除警告信息
  35. int memtrace();
  36. /********************************************************************/
  37. static int wdt_init(void);
  38. static void idle_hook(void);
  39. /********************************************************************/
  40. int main(void)
  41. {
  42. CompileTime; // 读取固件的编译时间
  43. /* 初始化设备 */
  44. rt_device_init(wdg_dev);
  45. led_add_device(LED0_PIN);
  46. led_set_level(1, 0);
  47. LOG_W("System Clock information:");
  48. LOG_I("SYSCLK_Frequency = %d", HAL_RCC_GetSysClockFreq());
  49. LOG_I("HCLK_Frequency = %d", HAL_RCC_GetHCLKFreq());
  50. LOG_I("PCLK1_Frequency = %d", HAL_RCC_GetPCLK1Freq());
  51. LOG_I("PCLK2_Frequency = %d", HAL_RCC_GetPCLK2Freq());
  52. Beep_Tip(100);
  53. // 读FLASH配置文件,未配置则设置默认配置
  54. Check_ParamConfig();
  55. // Recode_e_code(e_reboot , 0);
  56. // 是否触发固件更新
  57. if (device_status.update_flag == 0)
  58. {
  59. // 开机自检
  60. if (device_status.version_type != vt_ROBOT)
  61. {
  62. HardWare_Check(0);
  63. }
  64. // 工作状态置位线程
  65. if (device_status.dtype != dt_BZY && device_status.version_type != vt_ROBOT)
  66. {
  67. Workstatus_check();
  68. }
  69. /********************/
  70. // 工作流程
  71. if (device_status.version_type != vt_ROBOT)
  72. {
  73. Work_Loop_Task();
  74. }
  75. /*******************/
  76. }
  77. // 看门狗初始化
  78. wdt_init();
  79. // 打印内存占用
  80. memtrace();
  81. }
  82. /*初始化看门狗*/
  83. static int wdt_init(void)
  84. {
  85. rt_err_t ret = RT_EOK;
  86. rt_uint32_t timeout = 10; /*溢出时间,秒*/
  87. /* 根据设备名称查找看门狗设备,获取设备句柄 */
  88. wdg_dev = rt_device_find(WDT_DEVICE_NAME);
  89. if (!wdg_dev)
  90. {
  91. LOG_E("find %s failed!", WDT_DEVICE_NAME);
  92. return RT_ERROR;
  93. }
  94. /* 设置看门狗溢出时间 */
  95. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  96. if (ret != RT_EOK)
  97. {
  98. LOG_E("set %s timeout failed!", WDT_DEVICE_NAME);
  99. return RT_ERROR;
  100. }
  101. /* 启动看门狗 */
  102. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  103. if (ret != RT_EOK)
  104. {
  105. LOG_E("start %s failed!", WDT_DEVICE_NAME);
  106. return -RT_ERROR;
  107. }
  108. /* 设置空闲线程回调函数 */
  109. rt_thread_idle_sethook(idle_hook);
  110. return ret;
  111. }
  112. /*空闲钩子函数*/
  113. static void idle_hook(void)
  114. {
  115. // #if 1
  116. // #if Color_EN == 0
  117. // time_t now;
  118. // time(&now);
  119. // static struct tm alarm_new;
  120. // alarm_new = *localtime(&now);
  121. // if ((alarm_new.tm_hour) == 8 && (alarm_new.tm_min == 20) && (alarm_new.tm_sec == 0))
  122. // {
  123. // #if ROBOT_EN == 0
  124. // rt_hw_cpu_reset();
  125. // #endif
  126. // }
  127. // #endif
  128. // #endif
  129. // // else {
  130. // // rt_kprintf("%d:%d:%d\n",alarm_new.tm_hour,alarm_new.tm_min,alarm_new.tm_sec);
  131. // // }
  132. // /* 在空闲线程的回调函数里喂狗 */
  133. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  134. led_tog(1);
  135. // rt_kprintf("feed the dog!\n ");
  136. }
  137. /*
  138. 1 INIT_BOARD_EXPORT(fn) 非常早期的初始化,此时调度器还未启动
  139. 2 INIT_PREV_EXPORT(fn) 主要是用于纯软件的初始化、没有太多依赖的函数
  140. 3 INIT_DEVICE_EXPORT(fn) 外设驱动初始化相关,比如网卡设备
  141. 4 INIT_COMPONENT_EXPORT(fn) 组件初始化,比如文件系统或者 LWIP
  142. 5 INIT_ENV_EXPORT(fn) 系统环境初始化,比如挂载文件系统
  143. 6 INIT_APP_EXPORT(fn) 应用初始化,比如 GUI 应用
  144. */
  145. // uint8_t log_en_inr = 10; // 打印log的速度 数值越小 打印越频繁
  146. // static int8_t log_en_cnt = -1;
  147. uint8_t CheckLogTime(int16_t *log_en_cnt, int16_t log_en_inr);
  148. /**
  149. * @brief 用于确认打印log的时机
  150. *
  151. * @param log_en_cnt 计数使用
  152. * @param log_en_inr 频率(与数值成正比)
  153. * @return uint8_t 1-开启 0-关闭
  154. */
  155. uint8_t CheckLogTime(int16_t *log_en_cnt, int16_t log_en_inr)
  156. {
  157. uint8_t res = 0;
  158. if ((*log_en_cnt == log_en_inr - 1) || (*log_en_cnt == -1))
  159. {
  160. if (*log_en_cnt == -1)
  161. {
  162. *log_en_cnt = 1;
  163. }
  164. else
  165. {
  166. *log_en_cnt = 0;
  167. }
  168. res = 1;
  169. }
  170. else
  171. {
  172. *log_en_cnt += 1;
  173. }
  174. // rt_kprintf("log_en_cnt - log_en_inr %d / %d %d\n" , *log_en_cnt , log_en_inr , res);
  175. if (log_en_cnt > log_en_inr || log_en_inr < -1)
  176. return res;
  177. return res;
  178. }