C标准时间函数库头文件:
数据结构:- 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);
- }
复制代码
|