这节课我们来实现如何通过RTC的计数器,来显示当前的系统时间。实现的思想就是通过STM32的库函数RTC_GetCounter()函数读取当前RTC的计数值,然后计算其相对于1970年1月1日0点0分0秒做了多少偏移,来得到当前的系统时间的。
实现步骤:
定义结构体rtc_tm用于表示时间信息。并用该结构体定义对象tm
structrtc_tm
{
unsigned int year;
unsigned int month;
unsigned int day;
unsigned int hour;
unsigned int minute;
unsigned int second;
};
因为一天有86400秒,则可以获得当前计数值下已经过了多少天days和多少秒hms。之后利用days计算求得年月日,用hms计算求得小时分钟秒。
hms =TimeVar % 86400;
day = TimeVar / 86400;
计算当前时间的小时,分钟,秒
tm->tm_hour = hms / 3600;
tm->tm_min = (hms % 3600) / 60;
tm->tm_sec = (hms % 3600) % 60;
计算年份,思想是根据当前已经经过的天数,从1970年开始循环不断减去当年的天数(注意要先判断当年是闰年还是非闰年)366天或者365天,直到剩余的天数不足以满足一年的天数时,退出循环,那么退出循环是的年份即现在当前的年份。
#defineleapyear(year) (((year)%4 ==0)&&((year)%100 != 0)) ||((year) %400 == 0)
#definedays_in_year(a) (leapyear(a) ? 366 : 365)
for (i = STARTOFYEAR; day >=days_in_year(i); i++) {
day -= days_in_year(i);
}
tm->tm_year = i;
确定月份的方法和确定年份的方法是一样的,不过就是要确定当年是否是闰年,并由此决定2月份是28天还是29天。
unsignedint days_in_month[13] = ;
if(leapyear(i))
days_in_month[2] = 29;
else
days_in_month[2] = 28;
for(i = 1; days >= days_in_month[i]; i++)
days -= days_in_month[i];
tm.month = i;
计算日期,需要注意当前剩余的天数days+1后才是当前的日
tm->tm_mday= day + 1;
最后打印显示系统时间即可。
完整视频教程如下所示:
领取专属 10元无门槛券
私享最新 技术干货