嵌入式调试时间戳
程序员文章站
2024-03-17 23:14:04
...
该思路是不用RTC时钟,根据Unix时间戳换算成北京时间,再用一定的格式打印出来。适用于长时间的跑代码,查找问题。代码简单,方便移植。
简要说明。
1、g_debug_time为32位变量,Unix时间戳,在中断里每一秒加一
2、初始化时调用debug_time_init,更改时间时也调用debug_time_init。该函数会将g_debug_time更新。
3、将需要打印时间的地方调用debug_date_time
4、串口设置打印时间调用set_debug_date_time。串口设置时间的格式必须是set debug time 19 11 14 14 54 30(中间一个空格)。年月日时分秒不足两位用0补全两位,如05
完整代码如下:
debug_timer.h文件
#ifndef DEBUG_TIMER_H_
#define DEBUG_TIMER_H_
#include "stdint.h"
#define SET_DEBUG_TIME "set debug time "
//依照RTC中的RTC_DateTypeDef 和 RTC_TimeTypeDef 自定义时间结构体
typedef struct
{
uint8_t Year; /*!< Specifies the RTC Date Year.
This parameter must be a number between Min_Data = 0 and Max_Data = 99 */
uint8_t Month; /*!< Specifies the RTC Date Month (in BCD format).
This parameter can be a value of @ref RTC_Month_Date_Definitions */
uint8_t Date; /*!< Specifies the RTC Date.
This parameter must be a number between Min_Data = 1 and Max_Data = 31 */
uint8_t Hours; /*!< Specifies the RTC Time Hour.
This parameter must be a number between Min_Data = 0 and Max_Data = 23 if the RTC_HourFormat_24 is selected */
uint8_t Minutes; /*!< Specifies the RTC Time Minutes.
This parameter must be a number between Min_Data = 0 and Max_Data = 59 */
uint8_t Seconds; /*!< Specifies the RTC Time Seconds.
This parameter must be a number between Min_Data = 0 and Max_Data = 59 */
} DateTimeTypeDef;
void debug_time_init(DateTimeTypeDef * ptime);
void debug_date_time(void);
void set_debug_date_time(uint8_t *buf);
extern DateTimeTypeDef current_time;
#endif
debug_timer.c文件
#include "debug_timer.h"
#include "time.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//Unix时间戳,在中断里每一秒加一
volatile uint32_t g_debug_time = 0;
//初始时间 // 年 月 日 时 分 秒
DateTimeTypeDef current_time = {19,11,14,14,39,30};
//将北京时间转换成Unix时间戳
void debug_time_init(DateTimeTypeDef * ptime)
{
struct tm stmT;
stmT.tm_year=ptime->Year+100;
stmT.tm_mon=ptime->Month-1;
stmT.tm_mday=ptime->Date;
stmT.tm_hour=ptime->Hours;
stmT.tm_min=ptime->Minutes;
stmT.tm_sec=ptime->Seconds;
g_debug_time = mktime(&stmT) - 28800; //Unix时间 = 北京时间 - 8小时
}
//根据Unix时间戳转换成北京时间,并打印
void debug_date_time(void)
{
struct tm *stmU;
time_t Count;
DateTimeTypeDef current_time = {0};
Count = g_debug_time + 28800;//Unix时间+8小时为北京时间
stmU = localtime(&Count);
current_time.Year = stmU->tm_year - 100;
current_time.Month = stmU->tm_mon + 1;
current_time.Date = stmU->tm_mday;
current_time.Hours = stmU->tm_hour;
current_time.Minutes = stmU->tm_min;
current_time.Seconds = stmU->tm_sec;
printf("20%02d-%02d-%02d %02d:%02d:%02d\r\n",current_time.Year,current_time.Month,current_time.Date,
current_time.Hours,current_time.Minutes,current_time.Seconds);
}
//
int chartoint(const char* port)
{
int tmp=0;
while(*port >= '0' && *port <= '9')
{
tmp = tmp*10+*port-'0';
port++;
}
return tmp;
}
//设置调试时间的格式为
//set debug time 19 11 14 14 54 30
//注意年月日时分秒不足两位用0补全两位如05
void set_debug_date_time(uint8_t *buf)
{
const char *p2;
DateTimeTypeDef debug_time = {0};
p2 = strstr((char*)buf,SET_DEBUG_TIME);
if (NULL == p2)
{
return ;
}
p2 += strlen(SET_DEBUG_TIME);
debug_time.Year = chartoint(p2);
p2 += 3;
debug_time.Month = chartoint(p2);
p2 += 3;
debug_time.Date = chartoint(p2);
p2 += 3;
debug_time.Hours = chartoint(p2);
p2 += 3;
debug_time.Minutes = chartoint(p2);
p2 += 3;
debug_time.Seconds = chartoint(p2);
debug_time_init(&debug_time);
debug_date_time();
}
中断里每秒将g_debug_time加一
void SysTick_Handler(void)// 1ms一次
{
static uint16_t ms1000 = 0;
if(++ms1000 >= 1000) // 1000ms 一次
{
ms1000 = 0;
g_debug_time++;
led_toggle(LED_RED);
}
}
大伙觉得实用,给小的点个赞。有问题加猿QQ(2573507779)
下一篇: Lua 编译-执行-错误
推荐阅读
-
标准时间格式与时间戳的转化
-
嵌入式调试时间戳
-
Linux命令date 日期时间和Unix时间戳互转
-
Python中时间获取、日期与时间戳的相互转换
-
将日期为年月日时分秒的时间转换成unix时间戳 并 取出该月份 打印结果
-
JAVA获取时间戳,哪个更快 博客分类: java 基础 JAVA时间戳
-
js时间戳和时间格式之间的转换 博客分类: JavaScriptweb前端技术 javascript时间戳时间格式转换
-
java时间戳和PHP(mysql)时间戳 的转换问题 博客分类: 时间戳 时间戳
-
unix时间戳相互转换 博客分类: 时间戳 unix时间戳转换
-
javascript时间戳与日期转换 博客分类: Javascript javascript时间戳