设计单片机日志系统

发布者:晴天7777最新更新时间:2016-12-18 来源: eefocus关键字:单片机  日志系统 手机看文章 扫描二维码
随时随地手机看文章

环境:

主机:WIN10

开发环境:MDK5.12

MCU:STM32F407


说明:

为单片机设计了一套简单的日志系统,通过日志系统提供的接口可以查看设备状态,并进行一些基本的调试。

日志系统通过串口输出,所以单片机需要准备一个串口供日志系统使用。注意串口发送不能用DMA发送(避免在在中断中打印日志造成的中断竞争),接收可以用DMA接收。


功能:

  • 打开/关闭各个模块的调试输出

  • 输入动作指令,让设备进行一些动作

  • 打印系统运行日志

指令:

  • H:帮助

  • O:调试输出全开

  • O1:打开1号模块,打开其他模块指令类似

  • F:调试输出全关

  • F1:关闭1号模块

  • I:输出系统日志

  • C:清除系统日志

  • A1:执行1号动作,执行其他动作指令类似

源代码:

log.h:


  1. /** 

  2. * Copyright (c), 2015-2025 

  3. * @file log.h 

  4. * @brief 日志模块主文件 

  5. * @author jdh 

  6. * @date 2015/5/7 

  7. * @update 2015/6/19 

  8. * @update 2015/6/23 

  9. * @update 2015/6/30 

  10. * @update 2015/7/8 

  11. * @update 2015/7/13 

  12. * @update 2015/8/12 

  13. * @update 2015/8/18 

  14. * @update 2016/5/17 

  15. * @update 2016/6/30 

  16. * @update 2016/7/22 

  17. * @update 2016/8/11 

  18. * @update 2016/8/24 

  19. * @update 2016/9/2 

  20. * @update 2016/9/5 

  21. * @update 2016/9/7 

  22. * @update 2016/9/9 

  23. */  

  24.   

  25. #ifndef _LOG_H_  

  26. #define _LOG_H_  

  27.   

  28. /********************************************************************* 

  29. *                           头文件 

  30. **********************************************************************/  

  31.   

  32. #include "world.h"  

  33. #include "console.h"  

  34.   

  35. /********************************************************************* 

  36. *                           宏定义 

  37. **********************************************************************/  

  38.   

  39. /** 

  40. * @brief 日志模块数量 

  41. */  

  42. #define NUM_LOG                 5  

  43.   

  44. /** 

  45. * @brief 模块编号 

  46. */  

  47.   

  48. #define LOG_TEST                0  

  49. #define LOG_CLOCK               1  

  50. #define LOG_DW1000              2  

  51. #define LOG_DW1000_STATUS       3  

  52. #define LOG_DEAL_BUS            4  

  53.   

  54. /********************************************************************* 

  55. *                           数据结构 

  56. **********************************************************************/  

  57.   

  58. /** 

  59. * @brief 日志 

  60. */  

  61.   

  62. struct _Log  

  63. {  

  64.     //公有日志  

  65.     //收到移动点数据次数  

  66.     uint32_t num_rf_rx;  

  67.     //发送超时被删除点数  

  68.     uint32_t num_time_out_delete;  

  69.     //RF发送次数  

  70.     uint32_t num_rf_tx;  

  71.     //RF校时或分配事件次数  

  72.     uint32_t num_rf_time;  

  73.     //RF随机信道发送次数  

  74.     uint32_t num_rf_random_tx;  

  75.     //复位次数  

  76.     uint32_t num_reset;  

  77.     //运行时间,分度为0.5s  

  78.     uint32_t time_run;  

  79.     //收到同步脉冲计数  

  80.     uint32_t num_sync_pulse;  

  81.     //收到422轮询/事件帧次数  

  82.     uint32_t num_bus_poll;  

  83.     //收到422事务命令次数  

  84.     uint32_t num_bus_down_cmd;  

  85.     //收到422事务命令中事件个数  

  86.     uint32_t num_bus_down_cmd_dot;  

  87.     //收到有效的422帧次数  

  88.     uint32_t num_valid_bus;  

  89.     //收到无效的422帧次数  

  90.     uint32_t num_invalid_bus;  

  91.     //接收时间错误  

  92.     uint32_t num_time_error;  

  93.       

  94.     //私有日志  

  95.     //dw1000芯片错误次数  

  96.     uint32_t num_dw1000_error[NUM_DW1000];  

  97.     //接收时间错误  

  98.     uint32_t num_dw1000_time_error[NUM_DW1000];  

  99.     //轮询超时被删除点数  

  100.     uint32_t num_poll_time_out_delete;  

  101.     //接收超时复位  

  102.     uint32_t num_dw1000_time_out_reset[NUM_DW1000];  

  103.     //dw1000芯片状态错误次数  

  104.     uint32_t num_dw1000_status_error[NUM_DW1000];  

  105. };  

  106.   

  107. /********************************************************************* 

  108. *                           函数 

  109. **********************************************************************/  

  110.   

  111. /** 

  112. * @brief 模块加载 

  113. */  

  114.   

  115. void log_load(void);  

  116.   

  117. /** 

  118. * @brief 读取日志 

  119. * @retval 日志 

  120. */  

  121.   

  122. struct _Log log_read(void);  

  123.   

  124. /** 

  125. * @brief 清除日志 

  126. */  

  127.   

  128. void log_clear(void);  

  129.   

  130. /** 

  131. * @brief 收到移动点数据次数 

  132. */  

  133.   

  134. void log_write_num_rf_rx(void);  

  135.   

  136. /** 

  137. * @brief 发送超时被删除点数 

  138. */  

  139.   

  140. void log_write_num_time_out_delete(void);  

  141.   

  142. /** 

  143. * @brief RF发送次数 

  144. */  

  145.   

  146. void log_write_num_rf_tx(void);  

  147.   

  148. /** 

  149. * @brief RF校时或分配事件次数 

  150. */  

  151.   

  152. void log_write_num_rf_time(void);  

  153.   

  154. /** 

  155. * @brief RF随机信道发送次数 

  156. */  

  157.   

  158. void log_write_num_rf_random_tx(void);  

  159.   

  160. /** 

  161. * @brief 复位次数 

  162. */  

  163.   

  164. void log_write_num_reset(void);  

  165.   

  166. /** 

  167. * @brief 运行时间 

  168. * @param add_time:增加的时间.单位:0.5s 

  169. */  

  170.   

  171. void log_write_time_run(uint32_t add_time);  

  172.   

  173. /** 

  174. * @brief 收到同步脉冲计数 

  175. */  

  176.   

  177. void log_write_num_sync_pulse(void);  

  178.   

  179. /** 

  180. * @brief 收到422轮询/事件帧次数 

  181. */  

  182.   

  183. void log_write_num_bus_poll(void);  

  184.   

  185. /** 

  186. * @brief 收到422事务命令次数 

  187. */  

  188.   

  189. void log_write_num_bus_down_cmd(void);  

  190.   

  191. /** 

  192. * @brief 收到422事务命令中事件个数 

  193. */  

  194.   

  195. void log_write_num_bus_down_cmd_dot(void);  

  196.   

  197. /** 

  198. * @brief 收到有效的422帧次数 

  199. */  

  200.   

  201. void log_write_num_valid_bus(void);  

  202.   

  203. /** 

  204. * @brief 收到无效的422帧次数 

  205. */  

  206.   

  207. void log_write_num_invalid_bus(void);  

  208.   

  209. /** 

  210. * @brief 收到时间错误 

  211. */  

  212.   

  213. void log_write_num_time_error(void);  

  214.   

  215. /** 

  216. * @brief dw1000芯片错误次数 

  217. * @param index:模块序号,从0开始 

  218. */  

  219.   

  220. void log_write_num_dw1000_error(uint8_t index);  

  221.   

  222. /** 

  223. * @brief dw1000芯片接收时间错误次数 

  224. * @param index:模块序号,从0开始 

  225. */  

  226.   

  227. void log_write_num_dw1000_time_error(uint8_t index);  

  228.   

  229. /** 

  230. * @brief 轮询超时被删除点数 

  231. */  

  232.   

  233. void log_write_num_poll_time_out_delete(void);  

  234.   

  235. /** 

  236. * @brief dw1000芯片接收超时复位次数 

  237. * @param index:模块序号,从0开始 

  238. */  

  239.   

  240. void log_write_num_dw1000_time_out_reset(uint8_t index);  

  241.   

  242. /** 

  243. * @brief dw1000芯片状态错误次数 

  244. * @param index:模块序号,从0开始 

  245. */  

  246.   

  247. void log_write_num_dw1000_status_error(uint8_t index);  

  248.   

  249. /** 

  250. * @brief 控制台打印 

  251. * @param index:模块编号 

  252. * @param info:打印的信息 

  253. */  

  254.   

  255. void log_print(uint8_t index,char *info);  

  256.   

  257. /** 

  258. * @brief 控制台强制打印 

  259. * @param info:打印的信息 

  260. */  

  261.   

  262. void log_print_force(char *info);  

  263.   

  264. /** 

  265. * @brief 接收处理 

  266. * @param rx:接收数据 

  267. */  

  268.   

  269. void log_deal_rx(struct _Console_Rx rx);  

  270.   

  271. #endif  


log.c:


  1. /** 

  2. * Copyright (c), 2015-2025 

  3. * @file log.c 

  4. * @brief 日志模块主文件 

  5. * @author jdh 

  6. * @email jdh821@163.com 

  7. * @date 2015/5/7 

  8. * @update 2015/6/19 

  9. * @update 2015/6/30 

  10. * @update 2015/7/8 

  11. * @update 2015/7/13 

  12. * @update 2015/7/15 

  13. * @update 2015/8/12 

  14. * @update 2015/8/13 

  15. * @update 2015/11/11 

  16. * @update 2016/5/17 

  17. * @update 2016/6/30 

  18. * @update 2016/7/22 

  19. * @update 2016/8/11 

  20. * @update 2016/8/18 

  21. * @update 2016/8/22 

  22. * @update 2016/8/24 

  23. * @update 2016/9/2 

  24. * @update 2016/9/5 

  25. * @update 2016/9/7 

  26. * @update 2016/9/9 

  27. * @update 2016/9/12 

  28. */  

  29.   

  30. /********************************************************************* 

  31. *                           头文件 

  32. **********************************************************************/  

  33.   

  34. #include "log.h"  

  35. #include "protocol_bus.h"  

  36. #include "protocol_uwb.h"  

  37. #include "para_manage.h"  

  38.   

  39. /********************************************************************* 

  40. *                           静态变量 

  41. **********************************************************************/  

  42.   

  43. /** 

  44. * @brief 运行日志 

  45. */  

  46.   

  47. static struct _Log Log __attribute__((section("NO_INIT"),zero_init));  

  48.   

  49. /** 

  50. * @brief 日志过滤标志数组,0:未过滤,1:过滤 

  51. */  

  52.   

  53. static uint8_t Filter[NUM_LOG] = {1, 1, 1, 1, 1};  

  54.   

  55. /** 

  56. * @brief 暂停输出标志,0:未暂停输出,1:暂停输出 

  57. */  

  58.   

  59. static uint8_t Flag_Pause = 0;  

  60.   

  61. /********************************************************************* 

  62. *                           静态函数 

  63. **********************************************************************/  

  64.   

  65. /** 

  66. * @brief 帮助界面 

  67. */  

  68.   

  69. static void help(void);  

  70.   

  71. /** 

  72. * @brief 输出本地日志 

  73. */  

  74.   

  75. static void print_log(void);  

  76.   

  77. /** 

  78. * @brief 处理动作 

  79. * @param index:动作编号 

  80. */  

  81.   

  82. static void deal_action(uint8_t index);  

  83.   

  84. /********************************************************************* 

  85. *                           函数 

  86. **********************************************************************/  

  87.   

  88. /** 

  89. * @brief 模块加载 

  90. */  

  91.   

  92. void log_load(void)  

  93. {  

  94.     //检查是否上电  

  95.     if (RCC_GetFlagStatus(RCC_FLAG_PORRST) == SET)  

  96.     {  

  97.         //清除标志位  

  98.         RCC_ClearFlag();  

  99.         //清除日志  

  100.         memset(&Log, 0, sizeof(Log));  

  101.     }  

  102.     else  

  103.     {  

  104.         //日志:复位次数  

  105.         Log.num_reset++;  

  106.     }  

  107. }  

  108.   

  109. /** 

  110. * @brief 清除日志 

  111. */  

  112.   

  113. void log_clear(void)  

  114. {  

  115.     memset(&Log, 0, sizeof(Log));  

  116. }  

  117.   

  118. /** 

  119. * @brief 读取日志 

  120. * @retval 日志 

  121. */  

  122.   

  123. struct _Log log_read(void)  

  124. {     

  125.     return Log;  

  126. }  

  127.   

  128. /** 

  129. * @brief 收到移动点数据次数 

  130. */  

  131.   

  132. void log_write_num_rf_rx(void)  

  133. {  

  134.     Log.num_rf_rx++;  

  135. }  

  136.   

  137. /** 

  138. * @brief 发送超时被删除点数 

  139. */  

  140.   

  141. void log_write_num_time_out_delete(void)  

  142. {  

  143.     Log.num_time_out_delete++;  

  144. }  

  145.   

  146. /** 

  147. * @brief RF发送次数 

  148. */  

  149.   

  150. void log_write_num_rf_tx(void)  

  151. {  

  152.     Log.num_rf_tx++;  

  153. }  

  154.   

  155. /** 

  156. * @brief RF校时或分配事件次数 

  157. */  

  158.   

  159. void log_write_num_rf_time(void)  

  160. {  

  161.     Log.num_rf_time++;  

  162. }  

  163.   

  164. /** 

  165. * @brief RF随机信道发送次数 

  166. */  

  167.   

  168. void log_write_num_rf_random_tx(void)  

  169. {  

  170.     Log.num_rf_random_tx++;  

  171. }  

  172.   

  173. /** 

  174. * @brief 复位次数 

  175. */  

  176.   

  177. void log_write_num_reset(void)  

  178. {  

  179.     Log.num_reset++;  

  180. }  

  181.   

  182. /** 

  183. * @brief 运行时间 

  184. * @param add_time:增加的时间.单位:0.5s 

  185. */  

  186.   

  187. void log_write_time_run(uint32_t add_time)  

  188. {  

  189.     Log.time_run += add_time;  

  190. }  

  191.   

  192. /** 

  193. * @brief 收到同步脉冲计数 

  194. */  

  195.   

  196. void log_write_num_sync_pulse(void)  

  197. {  

  198.     Log.num_sync_pulse++;  

  199. }  

  200.   

  201. /** 

  202. * @brief 收到422轮询/事件帧次数 

  203. */  

  204.   

  205. void log_write_num_bus_poll(void)  

  206. {  

  207.     Log.num_bus_poll++;  

  208. }  

  209.   

  210. /** 

  211. * @brief 收到422事务命令次数 

  212. */  

  213.   

  214. void log_write_num_bus_down_cmd(void)  

  215. {  

  216.     Log.num_bus_down_cmd++;  

  217. }  

  218.   

  219. /** 

  220. * @brief 收到422事务命令中事件个数 

  221. */  

  222.   

  223. void log_write_num_bus_down_cmd_dot(void)  

  224. {  

  225.     Log.num_bus_down_cmd_dot++;  

  226. }  

  227.   

  228. /** 

  229. * @brief 收到有效的422帧次数 

  230. */  

  231.   

  232. void log_write_num_valid_bus(void)  

  233. {  

  234.     Log.num_valid_bus++;  

  235. }  

  236.   

  237. /** 

  238. * @brief 收到无效的422帧次数 

  239. */  

  240.   

  241. void log_write_num_invalid_bus(void)  

  242. {  

  243.     Log.num_invalid_bus++;  

  244. }  

  245.   

  246. /** 

  247. * @brief 收到时间错误 

  248. */  

  249.   

  250. void log_write_num_time_error(void)  

  251. {  

  252.     Log.num_time_error++;  

  253. }  

  254.   

  255. /** 

  256. * @brief dw1000芯片错误次数 

  257. * @param index:模块序号,从0开始 

  258. */  

  259.   

  260. void log_write_num_dw1000_error(uint8_t index)  

  261. {  

  262.     Log.num_dw1000_error[index]++;  

  263. }  

  264.   

  265. /** 

  266. * @brief dw1000芯片接收时间错误次数 

  267. * @param index:模块序号,从0开始 

  268. */  

  269.   

  270. void log_write_num_dw1000_time_error(uint8_t index)  

  271. {  

  272.     Log.num_dw1000_time_error[index]++;  

  273. }  

  274.   

  275. /** 

  276. * @brief 轮询超时被删除点数 

  277. */  

  278.   

  279. void log_write_num_poll_time_out_delete(void)  

  280. {  

  281.     Log.num_poll_time_out_delete++;  

  282. }  

  283.   

  284. /** 

  285. * @brief dw1000芯片接收超时复位次数 

  286. * @param index:模块序号,从0开始 

  287. */  

  288.   

  289. void log_write_num_dw1000_time_out_reset(uint8_t index)  

  290. {  

  291.     Log.num_dw1000_time_out_reset[index]++;  

  292. }  

  293.   

  294. /** 

  295. * @brief dw1000芯片状态错误次数 

  296. * @param index:模块序号,从0开始 

  297. */  

  298.   

  299. void log_write_num_dw1000_status_error(uint8_t index)  

  300. {  

  301.     Log.num_dw1000_status_error[index]++;  

  302. }  

  303.   

  304. /** 

  305. * @brief 控制台打印 

  306. * @param index:模块编号 

  307. * @param info:打印的信息 

  308. */  

  309.   

  310. void log_print(uint8_t index,char *info)  

  311. {  

  312.     T_Time time;  

  313.     char log_out[256] = {0};  

  314.       

  315.     //判断是否是暂停输出  

  316.     if (Flag_Pause)  

  317.     {  

  318.         return;  

  319.     }  

  320.       

  321.     //判断是否被过滤输出  

  322.     if (Filter[index])  

  323.     {  

  324.         return;  

  325.     }  

  326.       

  327.     time = get_time();  

  328.     sprintf(log_out,"%05d:%03d:%03d %s\r\n",time.s,time.ms,time.us,info);  

  329.     console_tx((uint8_t *)log_out,strlen(log_out));  

  330. }  

  331.   

  332. /** 

  333. * @brief 控制台强制打印 

  334. * @param info:打印的信息 

  335. */  

  336.   

  337. void log_print_force(char *info)  

  338. {  

  339.     T_Time time;  

  340.     char log_out[256] = {0};  

  341.       

  342.     time = get_time();  

  343.     sprintf(log_out,"%05d:%03d:%03d %s\r\n",time.s,time.ms,time.us,info);  

  344.     console_tx((uint8_t *)log_out,strlen(log_out));  

  345. }  

  346.   

  347. /** 

  348. * @brief 接收处理 

  349. * @param rx:接收数据 

  350. */  

  351.   

  352. void log_deal_rx(struct _Console_Rx rx)  

  353. {  

  354.     uint8_t i = 0;  

  355.     int num = 0;  

  356.     char str_temp[5] = {0};  

  357.       

  358.     //判断是否是输出本地日志  

  359.     if (rx.len == 1 && rx.buf[0] == 'I')  

  360.     {  

  361.         print_log();  

  362.         return;  

  363.     }  

  364.       

  365.     //判断是否是输出本地日志  

  366.     if (rx.len == 1 && rx.buf[0] == 'C')  

  367.     {  

  368.         log_clear();  

  369.         return;  

  370.     }  

  371.       

  372.     //判断是否是暂停输出  

  373.     if (rx.len == 1 && rx.buf[0] == 'P')  

  374.     {  

  375.         Flag_Pause = 1;  

  376.         return;  

  377.     }  

  378.       

  379.     //判断是否是打开输出  

  380.     if (rx.len == 1 && rx.buf[0] == 'S')  

  381.     {  

  382.         Flag_Pause = 0;  

  383.         return;  

  384.     }  

  385.       

  386.     //判断是否是帮助  

  387.     if (rx.len == 1 && rx.buf[0] == 'H')  

  388.     {  

  389.         help();  

  390.         return;  

  391.     }  

  392.       

  393.     //判断是否是过滤规则  

  394.     if (rx.len <= 3 && rx.buf[0] == 'F')  

  395.     {     

  396.         if (rx.len == 1)  

  397.         {  

  398.             //全部过滤  

  399.             for (i = 0;i < NUM_LOG;i++)  

  400.             {  

  401.                 Filter[i] = 1;  

  402.             }  

  403.             return;  

  404.         }  

  405.           

  406.         memset(str_temp,sizeof(str_temp),0);  

  407.         memcpy(str_temp,rx.buf,rx.len);  

  408.         sscanf(str_temp,"F%d",&num);  

  409.         Filter[num] = 1;  

  410.         return;  

  411.     }  

  412.       

  413.     //判断是否是打开模块  

  414.     if (rx.len <= 3 && rx.buf[0] == 'O')  

  415.     {     

  416.         if (rx.len == 1)  

  417.         {  

  418.             //清除过滤规则  

  419.             for (i = 0;i < NUM_LOG;i++)  

  420.             {  

  421.                 Filter[i] = 0;  

  422.             }  

  423.             return;  

  424.         }  

  425.           

  426.         memset(str_temp,sizeof(str_temp),0);  

  427.         memcpy(str_temp,rx.buf,rx.len);  

  428.         sscanf(str_temp,"O%d",&num);  

  429.         Filter[num] = 0;  

  430.         return;  

  431.     }  

  432.       

  433.     //判断是否是打开模块  

  434.     if (rx.len > 1 && rx.len <= 3 && rx.buf[0] == 'A')  

  435.     {     

  436.         memset(str_temp,sizeof(str_temp),0);  

  437.         memcpy(str_temp,rx.buf,rx.len);  

  438.         sscanf(str_temp,"A%d",&num);  

  439.         deal_action(num);  

  440.         return;  

  441.     }  

  442. }  

  443.   

  444. /** 

  445. * @brief 帮助界面 

  446. */  

  447.   

  448. static void help(void)  

  449. {  

  450.     char log_out[100] = {0};  

  451.       

  452.     strcpy(log_out,"*******************************************\r\n");  

  453.     console_tx((uint8_t *)log_out,strlen(log_out));  

  454.     strcpy(log_out,"             UWB基站日志帮助界面            \r\n");  

  455.     console_tx((uint8_t *)log_out,strlen(log_out));  

  456.     sprintf(log_out,"硬件版本:%d 软件版本:%d\r\n",VERSION_HARD,VERSION_SOFT);  

  457.     console_tx((uint8_t *)log_out,strlen(log_out));  

  458.     sprintf(log_out,"总线通信协议版本:%s\r\n",VERSION_NAME_BUS);  

  459.     console_tx((uint8_t *)log_out,strlen(log_out));  

  460.     sprintf(log_out,"空口通信协议版本:%s\r\n",VERSION_NAME_UWB);  

  461.     console_tx((uint8_t *)log_out,strlen(log_out));  

  462.     sprintf(log_out,"CSSN:0x%06x ID:0x%04x\r\n",para_manage_read_cssn(), para_manage_read_id());  

  463.     console_tx((uint8_t *)log_out,strlen(log_out));  

  464.     strcpy(log_out,"快捷键I(INFO)输出本地日志\r\n");  

  465.     console_tx((uint8_t *)log_out,strlen(log_out));  

  466.     strcpy(log_out,"快捷键C(CLEAR)清除本地日志\r\n");  

  467.     console_tx((uint8_t *)log_out,strlen(log_out));  

  468.     strcpy(log_out,"快捷键P(PAUSE)暂停输出\r\n");  

  469.     console_tx((uint8_t *)log_out,strlen(log_out));  

  470.     strcpy(log_out,"快捷键S(START)开始输出\r\n");  

  471.     console_tx((uint8_t *)log_out,strlen(log_out));  

  472.     strcpy(log_out,"快捷键A(ACTION)动作\r\n");  

  473.     console_tx((uint8_t *)log_out,strlen(log_out));  

  474.     strcpy(log_out,"A1:读取1号dw1000状态寄存器\r\n");  

  475.     console_tx((uint8_t *)log_out,strlen(log_out));  

  476.     strcpy(log_out,"A2:清除1号dw1000状态寄存器\r\n");  

  477.     console_tx((uint8_t *)log_out,strlen(log_out));  

  478.     strcpy(log_out,"A3:打开1号dw1000接收\r\n");  

  479.     console_tx((uint8_t *)log_out,strlen(log_out));  

  480.     strcpy(log_out,"快捷键H(HELP)打开帮助\r\n");  

  481.     console_tx((uint8_t *)log_out,strlen(log_out));  

  482.     strcpy(log_out,"快捷键F(FILTER)过滤输出\r\n");  

  483.     console_tx((uint8_t *)log_out,strlen(log_out));  

  484.     strcpy(log_out,"例:过滤1号模块:F1\r\n");  

  485.     console_tx((uint8_t *)log_out,strlen(log_out));  

  486.     strcpy(log_out,"例:全部过滤:F\r\n");  

  487.     console_tx((uint8_t *)log_out,strlen(log_out));  

  488.     strcpy(log_out,"快捷键O(OPEN)打开模块\r\n");  

  489.     console_tx((uint8_t *)log_out,strlen(log_out));  

  490.     strcpy(log_out,"例:打开1号模块:O1\r\n");  

  491.     console_tx((uint8_t *)log_out,strlen(log_out));  

  492.     strcpy(log_out,"例:全部打开:O\r\n");  

  493.     console_tx((uint8_t *)log_out,strlen(log_out));  

  494.     strcpy(log_out,"包含的模块:\r\n");  

  495.     console_tx((uint8_t *)log_out,strlen(log_out));  

  496.     sprintf(log_out,"TEST:%d 过滤:%d \r\n",LOG_TEST,Filter[LOG_TEST]);  

  497.     console_tx((uint8_t *)log_out,strlen(log_out));  

  498.     sprintf(log_out,"CLOCK:%d 过滤:%d \r\n",LOG_CLOCK,Filter[LOG_CLOCK]);  

  499.     console_tx((uint8_t *)log_out,strlen(log_out));  

  500.     sprintf(log_out,"DW1000:%d 过滤:%d \r\n",LOG_DW1000,Filter[LOG_DW1000]);  

  501.     console_tx((uint8_t *)log_out,strlen(log_out));  

  502.     sprintf(log_out,"DW1000_STATUS:%d 过滤:%d \r\n",LOG_DW1000_STATUS,Filter[LOG_DW1000_STATUS]);  

  503.     console_tx((uint8_t *)log_out,strlen(log_out));  

  504.     sprintf(log_out,"DW1000_DEAL_BUS:%d 过滤:%d \r\n",LOG_DEAL_BUS,Filter[LOG_DEAL_BUS]);  

  505.     console_tx((uint8_t *)log_out,strlen(log_out));  

  506.     strcpy(log_out,"*******************************************\r\n");  

  507.     console_tx((uint8_t *)log_out,strlen(log_out));  

  508. }  

  509.   

  510. /** 

  511. * @brief 输出本地日志 

  512. */  

  513.   

  514. static void print_log(void)  

  515. {  

  516.     char log_out[100] = {0};  

  517.     uint8_t i = 0;  

  518.       

  519.     strcpy(log_out,"本地日志输出:\r\n");  

  520.     console_tx((uint8_t *)log_out,strlen(log_out));  

  521.     sprintf(log_out,"收到移动点数据次数:%d\r\n", Log.num_rf_rx);  

  522.     console_tx((uint8_t *)log_out,strlen(log_out));  

  523.     sprintf(log_out,"发送超时被删除点数:%d\r\n", Log.num_time_out_delete);  

  524.     console_tx((uint8_t *)log_out,strlen(log_out));  

  525.     sprintf(log_out,"RF发送次数:%d\r\n", Log.num_rf_tx);  

  526.     console_tx((uint8_t *)log_out,strlen(log_out));  

  527.     sprintf(log_out,"RF校时或分配事件次数:%d\r\n", Log.num_rf_time);  

  528.     console_tx((uint8_t *)log_out,strlen(log_out));  

  529.     sprintf(log_out,"RF随机信道发送次数:%d\r\n", Log.num_rf_random_tx);  

  530.     console_tx((uint8_t *)log_out,strlen(log_out));  

  531.     sprintf(log_out,"复位次数:%d\r\n", Log.num_reset);  

  532.     console_tx((uint8_t *)log_out,strlen(log_out));  

  533.     sprintf(log_out,"运行时间:%d\r\n", Log.time_run);  

  534.     console_tx((uint8_t *)log_out,strlen(log_out));  

  535.     sprintf(log_out,"收到同步脉冲计数:%d\r\n", Log.num_sync_pulse);  

  536.     console_tx((uint8_t *)log_out,strlen(log_out));  

  537.     sprintf(log_out,"收到422轮询/事件帧次数:%d\r\n", Log.num_bus_poll);  

  538.     console_tx((uint8_t *)log_out,strlen(log_out));  

  539.     sprintf(log_out,"收到422事务命令次数:%d\r\n", Log.num_bus_down_cmd);  

  540.     console_tx((uint8_t *)log_out,strlen(log_out));  

  541.     sprintf(log_out,"收到422事务命令中事件个数:%d\r\n", Log.num_bus_down_cmd_dot);  

  542.     console_tx((uint8_t *)log_out,strlen(log_out));  

  543.     sprintf(log_out,"收到有效的422帧次数:%d\r\n", Log.num_valid_bus);  

  544.     console_tx((uint8_t *)log_out,strlen(log_out));  

  545.     sprintf(log_out,"收到无效的422帧次数:%d\r\n", Log.num_invalid_bus);  

  546.     console_tx((uint8_t *)log_out,strlen(log_out));  

  547.     sprintf(log_out,"校时时间错误次数:%d\r\n", Log.num_time_error);  

  548.     console_tx((uint8_t *)log_out,strlen(log_out));  

  549.     for (i = 0; i < NUM_DW1000; i++)  

  550.     {  

  551.         sprintf(log_out,"%d号dw1000模块错误次数:%d\r\n", i, Log.num_dw1000_error[i]);  

  552.         console_tx((uint8_t *)log_out,strlen(log_out));  

  553.     }  

  554.     for (i = 0; i < NUM_DW1000; i++)  

  555.     {  

  556.         sprintf(log_out,"%d号dw1000模块时间错误次数:%d\r\n", i, Log.num_dw1000_time_error[i]);  

  557.         console_tx((uint8_t *)log_out,strlen(log_out));  

  558.     }  

  559.     sprintf(log_out,"轮询超时被删除点数:%d\r\n", Log.num_poll_time_out_delete);  

  560.     console_tx((uint8_t *)log_out,strlen(log_out));  

  561.     for (i = 0; i < NUM_DW1000; i++)  

  562.     {  

  563.         sprintf(log_out,"%d号dw1000模块接收时间超时复位次数:%d\r\n", i, Log.num_dw1000_time_out_reset[i]);  

  564.         console_tx((uint8_t *)log_out,strlen(log_out));  

  565.     }  

  566.     for (i = 0; i < NUM_DW1000; i++)  

  567.     {  

  568.         sprintf(log_out,"%d号dw1000模块状态错误次数:%d\r\n", i, Log.num_dw1000_status_error[i]);  

  569.         console_tx((uint8_t *)log_out,strlen(log_out));  

  570.     }  

  571. }  

  572.   

  573. /** 

  574. * @brief 处理动作 

  575. * @param index:动作编号 

  576. */  

  577.   

  578. static void deal_action(uint8_t index)  

  579. {  

  580.     uint32_t status = 0;  

  581.     char log_out[100] = {0};  

  582.       

  583.     switch (index)  

  584.     {  

  585.         //读取1号dw1000状态寄存器  

  586.         case 1:  

  587.         {  

  588.             status = dwt_read32bitreg(0, SYS_STATUS_ID);  

  589.             sprintf(log_out,"1号dw1000状态:0x%08x\r\n", status);  

  590.             console_tx((uint8_t *)log_out,strlen(log_out));  

  591.             break;  

  592.         }  

  593.         //清除1号dw1000状态寄存器  

  594.         case 2:  

  595.         {  

  596.             status = dwt_read32bitreg(0, SYS_STATUS_ID);  

  597.             dwt_write32bitreg(0, SYS_STATUS_ID, status);  

  598.             break;  

  599.         }  

  600.         //打开1号dw1000接收  

  601.         case 3:  

  602.         {  

  603.             dwt_rxenable(0, 0);  

  604.             break;  

  605.         }  

  606.     }  

  607. }  




关键字:单片机  日志系统 引用地址:设计单片机日志系统

上一篇:STM32硬件调试详解
下一篇:为OLED屏增加GUI支持1:OLED驱动

推荐阅读最新更新时间:2024-03-16 15:26

基于MSP430单片机的家用烟雾报警器的设计
0 引言 近年来,全球每年发生火灾600~700万起,其中住宅火灾约占80%以上。根据2003-2006年期间的一份统计报告《美国家庭火灾烟雾报警器》发现:每1000场报道的火灾中,如果有烟雾报警器和湿式喷头存在,火灾导致的死亡率就能降低84%。国外对家庭火灾报警系统的安装早已开始推广并实行,并有许多国家以相应的法律法规严格规定执行。而我国现行的《建筑设计防火规范》(GB 50016-2006)未对住宅部分安装火灾自动报警系统有所规定。通过调研发现,现有烟雾探测器容易失效、连接断开或电池损坏,缺少电池欠压检测,存在误报警的情况,工作极不稳定。因此,本文设计了一款功耗低、可靠性高、实时性强的家用烟雾报警器。 1 系统总体设计方案
[单片机]
基于MSP430<font color='red'>单片机</font>的家用烟雾报警器的设计
单片机典型论文竞赛题精华集锦二
单片机论文二 多路数据采集系统   一、设计任务   设计一个八路数据采集系统,系统原理框图如下:      主控器能对50米以外的各路数据,通过串行传输线(实验中用1米线代替)进行采集的显示和显示。具体设计任务是:   (1)现场模拟信号产生器。   (2)八路数据采集器。   (3)主控器。   二、设计要求   1.基本要求   (1)现场模拟信号产生器:自制一正弦波信号发生器,利用可变电阻改变振荡频率,使频率在200Hz~2kHz范围变化,再经频率电压变换后输出相应1~5V直流电压(200Hz对应1V,2kHz对应5V)。   (2)八路数据采集器:数据采集器第1路输入自制1~5V直流电压,第2~7路
[模拟电子]
<font color='red'>单片机</font>典型论文竞赛题精华集锦二
安森美扩展蓝牙低功耗微控制器(MCU)系列到汽车无线应用
安森美扩展蓝牙低功耗微控制器(MCU)系列到汽车无线应用 NCV-RSL15结合行业最低功耗以及最新安全加密技术,用于车辆接入、胎压监测等 2023 年 3 月15 日—领先于智能电源和智能感知技术的安森美 推出采用蓝牙低功耗联接的超低功耗车规级无线微控制器。随着传感器数量和车载通信的增加,汽车制造商越来越倾向于使用无线连接技术,以减少布线成本和重量,NCV-RSL15是其理想选择 。另一方面,传感器部署数量上升可能会导致网络攻击次数随之增加,加剧安全问题。使用这款新型微控制器可解决这类安全隐患。 虽然胎压监测系统(TMS)和其他感知应用中的传感器和一般功能清单不断增长,但功耗预算却没有增加。同时,现在有些应用要求
[汽车电子]
安森美扩展蓝牙低功耗<font color='red'>微控制器</font>(<font color='red'>MCU</font>)系列到汽车无线应用
助力工业机器人伺服控制 瑞萨电子发布RX72T系列MCU
32位RX72T系列MCU获得CoreMark®基准5V MCU评测最高成绩 为伺服电机带来专用硬件加速器及先进的控制功 能 全球领先的半导体解决方案供应商瑞萨电子株式会社(TSE:6723)宣布推出32位电机控制微控制器(MCU)RX72T系列产品,配备专用硬件加速器IP,以执行机器人和其它工业设备中电机控制所需的复杂、高速运算。RX72T系列产品提供卓越性能,在EEMBC®基准(注1)评测中获得1160 CoreMark 的高分——这是在200 MHz下运行的5V MCU的最高水平。 瑞萨电子工业自动化事业部副总裁 傅田明表示,“RX72T系列产品为我们针对工业机器人和电机控制而优化的丰富MCU产品线带来了领先的性
[物联网]
助力工业机器人伺服控制 瑞萨电子发布RX72T系列<font color='red'>MCU</font>
89C52单片机与双口RAM如何实现数据通信
1 引言 数字信号处理器(DSP)是一种适合于实现各种数字信号处理运算的微处理器,具有下列主要结构特点:(1)采用改进型哈佛(Harvard)结构,具有独立的程序总线和数据总线,可同时访问指令和数据空间,允许实际在程序存储器和数据存储器之间进行传输;(2)支持流水线处理,处理器对每条指令的操作分为取指、译码、执行等几个阶段,在某一时刻同时对若干条指令进行不同阶段的处理;(3)片内含有专门的硬件乘法器,使乘法可以在单周期内完成;(4)特殊的指令结构和寻址方式,满足数字信号处理FFT、卷积等运算要求;(5)快速的指令周期,能够在每秒钟内处理数以千万次乃至数亿次定点或浮点运算;(6)大多设置了单独的DMA总线及其控制器,可以在基本不影响
[单片机]
89C52<font color='red'>单片机</font>与双口RAM如何实现数据通信
基于单片机的温湿度检测系统
摘 要:设计一种计算机教室温度、湿度检测系统,用于控制机房的温、湿度。整个系统采用STC89C51微处理器作为主控系统,硬件电路主要包括51单片机、DHT11温湿度传感器、显示器模块、警报器以及控制设备等5部分。通过给定的温湿度的上下限值并由1602 LCD显示器显示,传感器测量的信号由LCD显示出来,LCD显示实时的温、湿度值。当温、湿度超过限定值时,蜂鸣器鸣叫报警。 1 整体方案结构 1.1 总体设计方案及其论证 本设计要实现的功能是:实时显示当前环境的温、湿度,允许用户设定温、湿度的上下限值,当环境温湿度超过或低于限定值时,系统会以蜂鸣器鸣叫的方式进行报警,并且使控温设备启动。待室内达到正常范围时,蜂鸣器停止鸣叫,
[单片机]
基于<font color='red'>单片机</font>的温湿度检测<font color='red'>系统</font>
八位微控制器有哪些可以节约代码空间的代码优化技巧?
本文将介绍一些优化技术,帮助设计人员节约多达 10% 的代码空间,从而让容量有限的程序存储器支持更多新特性和补丁。 良好的操作方法 许多程序员在 32 位处理器上学习编写软件,如 Intel 的 Pentium 处理器或某种 ARM 平台。不过,嵌入式领域的软件编写需要不同的思路。在 32 位 CPU 上,存储比特位的最佳方法通常是使用 32 位变量。对 8 位处理器而言,最好的办法就是采用单字节。像增强型 8051s 等某些处理器可能提供特殊的 1 位变量。 嵌入式处理器通常会超出标准的哈佛架构将存储器分散到不同的存储器空间中,有的相互重叠,有的又是相互分离。例如,8051 中常见的存储器空间包括 CODE、XDATA、DA
[单片机]
八位<font color='red'>微控制器</font>有哪些可以节约代码空间的代码优化技巧?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved