stm32平台为例的软件模拟时间,代替RTC调试
我们在开发项目的时候,如果用到RTC,如果真正等待RTC到达指定的时间,那调试时间就太长了。
比如每隔半个小时,存储一次数据,如果要观察10次存储的效果,那么就要等待5h,难道我们真等待5h,读取RTC数据不成?
这里借助软件,虚拟产生逐渐变化的时间,加速整个开发流程。
示例
#include <stdio.h>
#include <time.h>
/**
* @brief 增加指定秒数到给定的起始日期并打印结果
*
* @param start_date 起始日期
* @param increment_seconds 增加的秒数
*/
void generate_dates(struct tm start_date, int increment_seconds) {
// 增加时间
start_date.tm_sec += increment_seconds;
// 规范时间
mktime(&start_date);
// 打印结果
printf("Updated date and time: %04d-%02d-%02d %02d:%02d:%02d\n",
start_date.tm_year + 1900,
start_date.tm_mon + 1,
start_date.tm_mday,
start_date.tm_hour,
start_date.tm_min,
start_date.tm_sec);
}
int main() {
// 初始化时间
struct tm start_date = {0};
start_date.tm_year = 2023 - 1900; // 年份从1900开始算
start_date.tm_mon = 6 - 1; // 月份从0开始算
start_date.tm_mday = 10;
start_date.tm_hour = 8;
start_date.tm_min = 30;
start_date.tm_sec = 0;
int increment_seconds = 3600; // 每次增加一小时
generate_dates(start_date, increment_seconds);
return 0;
}
如果嫌弃每次增加秒数太麻烦,也可以设置分钟和小时的增加
void generate_dates(struct tm start_date, int increment_hours) {
// 增加时间
start_date.tm_hour += increment_hours;
// 规范时间
mktime(&start_date);
}
}
和
void generate_dates(struct tm start_date, int increment_mins) {
// 增加时间
start_date.tm_min += increment_mins;
// 规范时间
mktime(&start_date);
}
}
详细解释
struct tm
struct tm
是一个结构体,用于表示时间信息。它定义在标准库头文件<time.h>
中,包含了以下成员:
int tm_sec
:秒数,范围是0到60(包含闰秒)。int tm_min
:分钟数,范围是0到59。int tm_hour
:小时数,范围是0到23。int tm_mday
:月份中的第几天,范围是1到31。int tm_mon
:月份,范围是0到11(0代表1月,11代表12月)。int tm_year
:自1900年以来的年份,比如2024年要用2024-1900
表示。int tm_wday
:星期几,范围是0到6(0代表星期日)。int tm_yday
:一年中的第几天,范围是0到365。int tm_isdst
:是否为夏令时,正值表示夏令时,0表示非夏令时,负值表示信息不可用。
mktime
mktime
是一个标准库函数,用于将struct tm
结构转换为time_t
类型的日历时间(根据当前的本地时间设置规范化tm
结构。如果时间信息不合理(比如,秒数为负值或超出范围),mktime
会自动进行调整。
求取时间差
项目开发中,经常会用到求取两个时间点的时间差,对于这一点,借助struct tm
和它自带的函数实现,是十分方便的。在自己的结构体定义时,就可以用struct tm
来作为时间子结构。
#include <stdio.h>
#include <time.h>
int main() {
struct tm timeinfo1 = {0};
struct tm timeinfo2 = {0};
// 初始化第一个时间变量:2023年7月10日08:30:00
timeinfo1.tm_year = 2023 - 1900;
timeinfo1.tm_mon = 6;
timeinfo1.tm_mday = 10;
timeinfo1.tm_hour = 8;
timeinfo1.tm_min = 30;
timeinfo1.tm_sec = 0;
// 初始化第二个时间变量:2024年1月1日12:00:00
timeinfo2.tm_year = 2024 - 1900;
timeinfo2.tm_mon = 0;
timeinfo2.tm_mday = 1;
timeinfo2.tm_hour = 12;
timeinfo2.tm_min = 0;
timeinfo2.tm_sec = 0;
// 将tm结构转换为time_t类型
time_t time1 = mktime(&timeinfo1);
time_t time2 = mktime(&timeinfo2);
// 计算时间间隔
double seconds_difference = difftime(time2, time1);
double days_difference = seconds_difference / (60 * 60 * 24);
printf("Difference in seconds: %.f\n", seconds_difference);
printf("Difference in days: %.f\n", days_difference);
return 0;
}
其他
- 看过这篇全部的内容,你会发现,这个功能吧,依附于time.h,这是c的库,也就是说只要支持c语言就可以使用。所以这个功能不限于stm32平台,比如FPGA的PS端也可以用。
- 你可能会想如何调用这个功能,才可以更加真实的反应现实情况。我这里提供一个思路,这个功能可以跟定时器结合在一起,让定时器每1s钟,调用函数来更新时间。
- 要我说写的这篇文章价值在哪里呢?在于推广,这个
struct tm
功能,初学者知道的不多。