rtc校准算法_STM32实时时钟RTC日历算法

本帖最后由 shipeng1989 于 2019-5-16 08:32 编辑

最近工作上需要利用STM32的自带RTC编写日历功能。其实对于公历万年历并不是很复杂,但是由于自带RTC断电后只能做32位二进制秒计数不能更新日期信息,要从根本上解决这个问题就需要编写一个算法可以根据计数器RTC_CNT的当前值计算出当前日期。由于32位的RTC_CNT的最大计数值0xFFFFFFFF/秒,即135年左右,因此这个算法只适用于2000年~2099年。由于日历的时间跨度大短时间内很难通过测试发现bug,所以恳请大家帮忙排查一下是否存在bug并跟帖回复

编写思路是这样的:在100年范围内刚好是4年1闰,也就是每4年1个周期=366+365*3天,当前总天数days=RTC_CNT/(24*3600),年year=days/(366+365*3)*4 + days%(366+365*3)/365,月和日的算法请直接参照下列代码:

const u8 yizhou[]={"六日一二三四五"};//从六开始是因为日期的起点是2000年1月1日这一天是星期六

struct RtcReg

{

u32 days;

u8 date;

u8 month;

u8 year;

};

void TranslateYMD(struct RtcReg *RtcRegs)//在调用此函数前,RtcRegs->days需赋值当前天数值RTC_CNT/(24*3600)

{

u8 i,j;u16 u16buf=RtcRegs->days;

RtcRegs->year = u16buf/(366+365*3)*4;

u16buf %= (366+365*3);//4年为一个周期,当前周期内的天数

RtcRegs->year += u16buf/365;//加上当前4年周期内的年

if (u16buf==365)RtcRegs->year--;//4年周期中的第一年为闰年366天,如果天数u16buf等于365则上一句多算了1年//年计算完成,开始月和日计算:

else if (u16buf>365)u16buf = (u16buf-1)%365;//得到当前年中的天数,如u16buf超过365则经过了1个闰年u16buf减1再对365求余

i = (RtcRegs->year&3)?0:1;//当前年份为 平年i=0/闰年i=1

RtcRegs->month = u16buf/(181+i);//1年分为两个181+i天,即以7月1日为界限,分别计算月份

RtcRegs->month = RtcRegs->month*6;

if (RtcRegs->month<12)RtcRegs->month++;

if (RtcRegs->month<7)

{

//   大于59+i即经过了2月份需补3-i天     大于120+i即经过了4月份需补1天

j = u16buf + ((u16buf<59+i)?0: (3-i))+((u16buf

RtcRegs->month += j/31;RtcRegs->date = j%31+1;

}

else if (RtcRegs->month==7)

{

u16buf -= 181+i;

//      大于92即经过了9月需补1天   大于153即经过了11月需补1天

j = u16buf + ((u16buf<92)?0:1)+((u16buf<153)?0:1);

RtcRegs->month += j/31;RtcRegs->date = j%31+1;

}

//12月份减去1-11月的天数(334+i)由于日是从1开始没有0因此需要加1即-(334+i)+1=-(333+i)

else RtcRegs->date = u16buf - (333+i);

}

void DisplayYMDW(struct RtcReg *RtcRegs)//日期显示子程序

{

Disp1Char(2,3,yizhou[RtcRegs->days%7*2]);//星期

LCD_Wdata(yizhou[RtcRegs->days%7*2+1]);//星期,由于一个汉字占用2个字节,因此星期需发送两个字节

LCD_Wdata('2');

LCD_Wdata('0');

LCD_Wdata((RtcRegs->year/10)+'0');

LCD_Wdata((RtcRegs->year%10)+'0');

LCD_Wdata('-');

LCD_Wdata((RtcRegs->month/10)+'0');

LCD_Wdata((RtcRegs->month%10)+'0');

LCD_Wdata('-');

LCD_Wdata((RtcRegs->date/10)+'0');

LCD_Wdata((RtcRegs->date%10)+'0');

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第90套)

第90套&#xff1a; 函数fun的功能是&#xff1a;统计所有小于等于n(n>2)的素数的个数&#xff0c;素数的个数作为函数值返回。 请在程序的下划线处填入正确的内容并把下划线删除&#xff0c;使程序得出正确的结果。 注意&#xff1a;源程序存放在考生文件夹下的BLANK1.C中…

智能合约从入门到精通:完整范例

简介&#xff1a;前几篇文章我们一直在讨论Solidity语言的相关语法&#xff0c;从本文开始&#xff0c;我们将介绍智能合约开发。今天我们将介绍一个完整范例。 此章节将介绍一个完整案例来帮助开发者快速了解合约的开发规范及流程。 注意&#xff1a; 在进行案例编写前&#x…

高考英语口语测试软件,练习英语口语的app有哪些

随着国际化的发展&#xff0c;英语越来越普遍。英语中口语也是很重要的成分之一。也是跟老外交流或者英语考试的重要考点之一。我们有很多方法锻炼口语。什么方法最快捷最有效方便&#xff1f;下面我们看看几款最受欢迎的英语口语练习app。练习口语的app1、口语侠一款非常实用的…

chkconfig命令会立即生效吗_UG绘制波纹管,整体变形命令你会用吗?

最近又有小伙伴问我波纹管怎么画了&#xff0c;这个以前教过大家&#xff0c;文章名字叫饮料吸管和排水管&#xff0c;看来这个名字不够专业&#xff0c;大家找不到啊&#xff0c;今天就来重新绘制一个&#xff0c;用一个新的方法&#xff0c;大家来额外学习一下&#xff0c;了…

Windows Phone 8 开发资源汇总

1) 提前下载安装包&#xff0c;离线安装https://dev.windowsphone.com/en-us/downloadsdk 2&#xff09;在线安装地址http://www.microsoft.com/en-us/download/details.aspx?id354713) 案例代码&#xff1a;Windows Phone Samples: learn through code http://code.msdn.micr…

vue中mixin 感觉很牛逼(父子组件融合成一个新组件)

vue中提供了一种混合机制--mixins&#xff0c;用来更高效的实现组件内容的复用。最开始我一度认为这个和组件好像没啥区别。。后来发现错了。下面我们来看看mixins和普通情况下引入组件有什么区别&#xff1f; 组件在引用之后相当于在父组件内开辟了一块单独的空间&#xff0c;…

C语言入门日记

参考&#xff1a;C语言入门日记 作者&#xff1a;9art0 发布时间&#xff1a;2020-08-30 16:37:46 网址&#xff1a;https://blog.csdn.net/GatoWong/article/details/108307915?spm1001.2014.3001.5501 C语言入门日记1.1.C语言搭建及system函数1.2.C语言的基础框架解释1.3.C程…

测试电视是不是4k的软件,怎么判断4K电视真假?教你快速检测的方法!

原标题&#xff1a;怎么判断4K电视真假?教你快速检测的方法!4K电视从进入市场之后一直都受到企业的力捧&#xff0c;随着电视企业对4K电视的大力度宣传和消费环境的逐渐成熟&#xff0c;越来越多的消费者开始认可4K电视&#xff0c;并在购机时表明首选4K电视。4K电视顾名思义就…

等压线上怎么画风向_战场上骑兵应该怎么拔刀?从清人佩刀为何总是刀柄向后说起...

在以前的文章《兵器谱|挂错地方死得快&#xff01;图说骑兵马刀的佩带与悬挂》&#xff0c;有读者问&#xff1a;清代的武将大多数都是刀柄朝右边&#xff0c;挂在屁股后面&#xff0c;算不算双附耳式悬挂法的一个变种呢&#xff1f;这样到底是不是真的有助于马上拔刀&#xff…

整合axis2到web项目中

1.将axis2.war发布到%TOMCAT_HOME%\webapps中&#xff0c;发布后的目录为%TOMCAT_HOME%\webapps\axis2 &#xff0c;该目录定义为%AXIS2_HOME%. 2.拷贝%AXIS2_HOME%\WEB-INF目录下所有内容到%项目App%\WEB-INF目录下。 3.修改%项目APP%\WEB-INF目录下的web.xml文件&#xff0c…

win10计算机跑分,鲁大师如何跑分_鲁大师跑分详细教程

很多小伙伴都知道鲁大师可以测试电脑的性能&#xff0c;就是大家称为的跑分&#xff0c;跑分的大小跟电脑的性能成正比&#xff0c;跑的越高性能越好。那么该如何在鲁大师里面进行跑分测试呢?其实只要打开性能测试就可以了&#xff0c;具体的教程下面一起来看看吧。鲁大师跑分…

第二十二篇 玩转数据结构——构建动态数组

1.. 数组基础数组就是把数据码成一排进行存放。Java中&#xff0c;数组的每个元素类型必须相同&#xff0c;可以都为int类型&#xff0c;string类型&#xff0c;甚至是自定义类型。数组的命名要语义化&#xff0c;例如&#xff0c;如果数组用来存放学生的成绩&#xff0c;那么命…

C语言函数日记

参考&#xff1a;C语言-函数-日记 作者&#xff1a;9art0 发布时间&#xff1a;2020-08-31 00:57:06 网址&#xff1a;https://blog.csdn.net/GatoWong/article/details/108314011?spm1001.2014.3001.5501 C语言-函数-日记2.1.函数概述一2.2.函数概述二2.3.函数无返回参数&…

python运行调出控制台_python.exe 和 pythonw.exe 的区别

(区分.py、.pyw、.pyc 文件)最近也在学习python&#xff0c;针对python中的一些问题做下记录&#xff0c;希望大家共同成长&#xff1b; Windows系统搭建好Python的环境后&#xff0c;进入Python的安装目录&#xff0c;大家会发现目录中有python.exe和pythonw.exe两个程序。 …

Vim的6种模式

Vim的6种模式|微刊 - 悦读喜欢Vim的6种模式大多数人都知道 Vim的两种模式, 正常模式和 插入模式,实际上 Vim有六种模式.- 正常模式 (Normal mode): 用户输入命令的模式- 可视化模式 (Visual mode): 可视化区块被高亮的时候- 选择模式 (Select mode): 类似可视模式 但是用用户输…

修复计算机u盘,u盘损坏怎么修复 u盘损坏修复方法

造成u盘损坏的原因有很多&#xff0c;比如我们在拔出u盘前&#xff0c;如果没有先将u盘弹出或者弹出的不彻底&#xff0c;就很可能造成u盘的损坏。u盘损坏就会导致计算机无法识别出u盘。那u盘损坏了能不能修复?如果能修复&#xff0c;那要怎么操作?下面就让我们一起来看看u盘…

.net 技术类网址

本人在工作学习中遇到的一些技术的网站&#xff0c;讲的也很详细&#xff0c;与各位共享&#xff0c;希望对您有帮助EF实体类&#xff1a; https://msdn.microsoft.com/zh-cn/library/gg696172(vvs.103).aspx数据库&#xff1a; https://docs.microsoft.com/zh-cn/sql/ssms/dow…

433M射频灯

参考&#xff1a;433M射频灯 作者&#xff1a;9art0 发布时间&#xff1a;2020-09-21 21:57:29 网址&#xff1a;https://blog.csdn.net/GatoWong/article/details/108700989?spm1001.2014.3001.5501 目录433M射频灯硬件接线1. KEIL建立工程2. 电子可编程开关继电器原理3. 上电…

2清空所有表_拉链表(二)

拉链表&#xff08;一&#xff09;拉链表&#xff08;二&#xff09;一、前言在上一节简单介绍了拉链表&#xff0c;本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表。这里以上节介绍的用户表(user) 举例二、涉及到的表1. 原始表&#xff08;user&…

出生日期范围的Sql语句_【呕心总结】python如何与mysql实现交互及常用sql语句

9 月初&#xff0c;我对 python 爬虫 燃起兴趣&#xff0c;但爬取到的数据多通道实时同步读写用文件并不方便&#xff0c;于是开始用起mysql。这篇笔记&#xff0c;我将整理近一个月的实战中最常用到的 mysql 语句&#xff0c;同时也将涉及到如何在python3中与 mysql 实现数据交…