0%

stm32实现标准库<time.h>的时间函数使用

C标准时间函数库头文件:

1
#include <time.h>

数据结构:

1
2
3
4
5
6
7
8
9
10
11
struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推 */
int tm_year; /* 自 1900 年起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};

由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:

1
2
3
4
5
6
7
8
9
10
11
12
volatile uint32_t time_dat = 0;

void HAL_IncTick(void)
{
static uint32_t ticks = 0;
uwTick += uwTickFreq;
ticks = (ticks + 1) % 1000;
if(!ticks)
{
time_dat++;
}
}

然后重新实现time()函数:

1
2
3
4
5
6
7
8
time_t time (time_t *_timer)
{
if(_timer != NULL)
{
time_dat = *_timer;
}
return time_dat;
}

示例使用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
time_t tim;
struct tm *ts;
struct tm ctime;

// 转为秒数
ctime.tm_year = 2021 - 1900;
ctime.tm_mon = 12 - 1;
ctime.tm_mday = 30;
ctime.tm_hour = 10;
ctime.tm_min = 24;
ctime.tm_sec = 51;
tim = mktime(&ctime);

// 设置时间
time(&tim);

// 获取秒数
tim = time(NULL);

// 转为本地时间
ts = localtime(&tim);

// 打印
printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
ts->tm_year + 1900,
ts->tm_mon + 1,
ts->tm_mday,
ts->tm_hour,
ts->tm_min,
ts->tm_sec);

while (1)
{
// 获取秒数
tim = time(NULL);

// 转为本地时间
ts = localtime(&tim);

// 打印
printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
ts->tm_year + 1900,
ts->tm_mon + 1,
ts->tm_mday,
ts->tm_hour,
ts->tm_min,
ts->tm_sec);
HAL_Delay(1000);
}

————————————————
版权声明:本文为CSDN博主「觉皇嵌入式」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq153471503/article/details/122231112