main.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. // Mtor_Control_CM(mct_Foreward, 1500);
  54. // Mtor_Control_ZP(mct_Foreward , 0); // 开始工作前给翻版复位
  55. // Mtor_Control_CM(mct_Reversal, 1500);
  56. // 读FLASH配置文件,未配置则设置默认配置
  57. Check_ParamConfig();
  58. // Recode_e_code(e_reboot , 0);
  59. // 是否触发固件更新
  60. if (device_status.update_flag == 0)
  61. {
  62. // 开机自检
  63. if (device_status.version_type != vt_ROBOT)
  64. {
  65. HardWare_Check(0);
  66. }
  67. // 工作状态置位线程
  68. if (device_status.dtype != dt_BZY && device_status.version_type != vt_ROBOT)
  69. {
  70. Workstatus_check();
  71. }
  72. /********************/
  73. // 工作流程
  74. if (device_status.version_type != vt_ROBOT)
  75. {
  76. Work_Loop_Task();
  77. }
  78. /*******************/
  79. }
  80. // 看门狗初始化
  81. wdt_init();
  82. // 打印内存占用
  83. memtrace();
  84. }
  85. /*初始化看门狗*/
  86. static int wdt_init(void)
  87. {
  88. rt_err_t ret = RT_EOK;
  89. rt_uint32_t timeout = 10; /*溢出时间,秒*/
  90. /* 根据设备名称查找看门狗设备,获取设备句柄 */
  91. wdg_dev = rt_device_find(WDT_DEVICE_NAME);
  92. if (!wdg_dev)
  93. {
  94. LOG_E("find %s failed!", WDT_DEVICE_NAME);
  95. return RT_ERROR;
  96. }
  97. /* 设置看门狗溢出时间 */
  98. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  99. if (ret != RT_EOK)
  100. {
  101. LOG_E("set %s timeout failed!", WDT_DEVICE_NAME);
  102. return RT_ERROR;
  103. }
  104. /* 启动看门狗 */
  105. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  106. if (ret != RT_EOK)
  107. {
  108. LOG_E("start %s failed!", WDT_DEVICE_NAME);
  109. return -RT_ERROR;
  110. }
  111. /* 设置空闲线程回调函数 */
  112. rt_thread_idle_sethook(idle_hook);
  113. return ret;
  114. }
  115. /*空闲钩子函数*/
  116. static void idle_hook(void)
  117. {
  118. // #if 1
  119. // #if Color_EN == 0
  120. // time_t now;
  121. // time(&now);
  122. // static struct tm alarm_new;
  123. // alarm_new = *localtime(&now);
  124. // if ((alarm_new.tm_hour) == 8 && (alarm_new.tm_min == 20) && (alarm_new.tm_sec == 0))
  125. // {
  126. // #if ROBOT_EN == 0
  127. // rt_hw_cpu_reset();
  128. // #endif
  129. // }
  130. // #endif
  131. // #endif
  132. // // else {
  133. // // rt_kprintf("%d:%d:%d\n",alarm_new.tm_hour,alarm_new.tm_min,alarm_new.tm_sec);
  134. // // }
  135. // /* 在空闲线程的回调函数里喂狗 */
  136. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  137. led_tog(1);
  138. // rt_kprintf("feed the dog!\n ");
  139. }
  140. /*
  141. 1 INIT_BOARD_EXPORT(fn) 非常早期的初始化,此时调度器还未启动
  142. 2 INIT_PREV_EXPORT(fn) 主要是用于纯软件的初始化、没有太多依赖的函数
  143. 3 INIT_DEVICE_EXPORT(fn) 外设驱动初始化相关,比如网卡设备
  144. 4 INIT_COMPONENT_EXPORT(fn) 组件初始化,比如文件系统或者 LWIP
  145. 5 INIT_ENV_EXPORT(fn) 系统环境初始化,比如挂载文件系统
  146. 6 INIT_APP_EXPORT(fn) 应用初始化,比如 GUI 应用
  147. */
  148. // uint8_t log_en_inr = 10; // 打印log的速度 数值越小 打印越频繁
  149. // static int8_t log_en_cnt = -1;
  150. uint8_t CheckLogTime(int16_t *log_en_cnt, int16_t log_en_inr);
  151. /**
  152. * @brief 用于确认打印log的时机
  153. *
  154. * @param log_en_cnt 计数使用
  155. * @param log_en_inr 频率(与数值成正比)
  156. * @return uint8_t 1-开启 0-关闭
  157. */
  158. uint8_t CheckLogTime(int16_t *log_en_cnt, int16_t log_en_inr)
  159. {
  160. uint8_t res = 0;
  161. if ((*log_en_cnt == log_en_inr - 1) || (*log_en_cnt == -1))
  162. {
  163. if (*log_en_cnt == -1)
  164. {
  165. *log_en_cnt = 1;
  166. }
  167. else
  168. {
  169. *log_en_cnt = 0;
  170. }
  171. res = 1;
  172. }
  173. else
  174. {
  175. *log_en_cnt += 1;
  176. }
  177. // rt_kprintf("log_en_cnt - log_en_inr %d / %d %d\n" , *log_en_cnt , log_en_inr , res);
  178. if (log_en_cnt > log_en_inr || log_en_inr < -1)
  179. return res;
  180. return res;
  181. }