STM32CubeMX | STM32利用HAL库实现标准库的时间函数使用


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

#include <time.h>

数据结构:

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中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:

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()函数:

time_t time (time_t *_timer)
{
if(_timer != NULL)
{
time_dat = *_timer;
}
return time_dat;
}

示例使用代码:

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);
}