设计单片机日志系统
扫描二维码
随时随地手机看文章
环境:
主机:WIN10
开发环境:MDK5.12
MCU:STM32F407
说明:
为单片机设计了一套简单的日志系统,通过日志系统提供的接口可以查看设备状态,并进行一些基本的调试。
日志系统通过串口输出,所以单片机需要准备一个串口供日志系统使用。注意串口发送不能用DMA发送(避免在在中断中打印日志造成的中断竞争),接收可以用DMA接收。
功能:
打开/关闭各个模块的调试输出
输入动作指令,让设备进行一些动作
打印系统运行日志
指令:
H:帮助
O:调试输出全开
O1:打开1号模块,打开其他模块指令类似
F:调试输出全关
F1:关闭1号模块
I:输出系统日志
C:清除系统日志
A1:执行1号动作,执行其他动作指令类似
源代码:
log.h:
/**
*Copyright(c),2015-2025
*@filelog.h
*@brief日志模块主文件
*@authorjdh
*@date2015/5/7
*@update2015/6/19
*@update2015/6/23
*@update2015/6/30
*@update2015/7/8
*@update2015/7/13
*@update2015/8/12
*@update2015/8/18
*@update2016/5/17
*@update2016/6/30
*@update2016/7/22
*@update2016/8/11
*@update2016/8/24
*@update2016/9/2
*@update2016/9/5
*@update2016/9/7
*@update2016/9/9
*/
#ifndef_LOG_H_
#define_LOG_H_
/*********************************************************************
*头文件
**********************************************************************/
#include"world.h"
#include"console.h"
/*********************************************************************
*宏定义
**********************************************************************/
/**
*@brief日志模块数量
*/
#defineNUM_LOG5
/**
*@brief模块编号
*/
#defineLOG_TEST0
#defineLOG_CLOCK1
#defineLOG_DW10002
#defineLOG_DW1000_STATUS3
#defineLOG_DEAL_BUS4
/*********************************************************************
*数据结构
**********************************************************************/
/**
*@brief日志
*/
struct_Log
{
//公有日志
//收到移动点数据次数
uint32_tnum_rf_rx;
//发送超时被删除点数
uint32_tnum_time_out_delete;
//RF发送次数
uint32_tnum_rf_tx;
//RF校时或分配事件次数
uint32_tnum_rf_time;
//RF随机信道发送次数
uint32_tnum_rf_random_tx;
//复位次数
uint32_tnum_reset;
//运行时间,分度为0.5s
uint32_ttime_run;
//收到同步脉冲计数
uint32_tnum_sync_pulse;
//收到422轮询/事件帧次数
uint32_tnum_bus_poll;
//收到422事务命令次数
uint32_tnum_bus_down_cmd;
//收到422事务命令中事件个数
uint32_tnum_bus_down_cmd_dot;
//收到有效的422帧次数
uint32_tnum_valid_bus;
//收到无效的422帧次数
uint32_tnum_invalid_bus;
//接收时间错误
uint32_tnum_time_error;
//私有日志
//dw1000芯片错误次数
uint32_tnum_dw1000_error[NUM_DW1000];
//接收时间错误
uint32_tnum_dw1000_time_error[NUM_DW1000];
//轮询超时被删除点数
uint32_tnum_poll_time_out_delete;
//接收超时复位
uint32_tnum_dw1000_time_out_reset[NUM_DW1000];
//dw1000芯片状态错误次数
uint32_tnum_dw1000_status_error[NUM_DW1000];
};
/*********************************************************************
*函数
**********************************************************************/
/**
*@brief模块加载
*/
voidlog_load(void);
/**
*@brief读取日志
*@retval日志
*/
struct_Loglog_read(void);
/**
*@brief清除日志
*/
voidlog_clear(void);
/**
*@brief收到移动点数据次数
*/
voidlog_write_num_rf_rx(void);
/**
*@brief发送超时被删除点数
*/
voidlog_write_num_time_out_delete(void);
/**
*@briefRF发送次数
*/
voidlog_write_num_rf_tx(void);
/**
*@briefRF校时或分配事件次数
*/
voidlog_write_num_rf_time(void);
/**
*@briefRF随机信道发送次数
*/
voidlog_write_num_rf_random_tx(void);
/**
*@brief复位次数
*/
voidlog_write_num_reset(void);
/**
*@brief运行时间
*@paramadd_time:增加的时间.单位:0.5s
*/
voidlog_write_time_run(uint32_tadd_time);
/**
*@brief收到同步脉冲计数
*/
voidlog_write_num_sync_pulse(void);
/**
*@brief收到422轮询/事件帧次数
*/
voidlog_write_num_bus_poll(void);
/**
*@brief收到422事务命令次数
*/
voidlog_write_num_bus_down_cmd(void);
/**
*@brief收到422事务命令中事件个数
*/
voidlog_write_num_bus_down_cmd_dot(void);
/**
*@brief收到有效的422帧次数
*/
voidlog_write_num_valid_bus(void);
/**
*@brief收到无效的422帧次数
*/
voidlog_write_num_invalid_bus(void);
/**
*@brief收到时间错误
*/
voidlog_write_num_time_error(void);
/**
*@briefdw1000芯片错误次数
*@paramindex:模块序号,从0开始
*/
voidlog_write_num_dw1000_error(uint8_tindex);
/**
*@briefdw1000芯片接收时间错误次数
*@paramindex:模块序号,从0开始
*/
voidlog_write_num_dw1000_time_error(uint8_tindex);
/**
*@brief轮询超时被删除点数
*/
voidlog_write_num_poll_time_out_delete(void);
/**
* @brief dw100