首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

STM32系列教程30_RTC显示实时时间

这节课我们来实现如何通过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;

最后打印显示系统时间即可。

完整视频教程如下所示:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200404A05JCA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券