立即注册
查看: 969|回复: 0

[转载] 兆易创新GD系列硬件RTC实例分享

已绑定手机
发表于 2021-7-22 16:28:49 | 显示全部楼层 |阅读模式 来自 广东省深圳市
实时时钟RTC在嵌入式系统中常被用为时钟日历,用来记录设备的日期。很多年前的芯片都是不带RTC的,需要外接一个RTC芯片,用来记录日期。常见的RTC芯片有DS1302DS1307PCF8485等。随着科技的进度,很多芯片都自带RTC实时时钟的功能,不再需要外接时钟芯片,大大节省了成本,今天就给大家介绍一下国产GD系列RTC时钟芯片的用法。

常见的时钟芯片:
1.jpg
RTC的时钟源
1) HATAL时钟除以128(外部高速晶体振荡器时钟)
2) LXTAL振荡电路时钟(外部低速晶体振荡器时钟)
3) IRC40K振荡电路时钟(芯片内部40K RC振荡器时钟)
2.jpg
通过RTCSCR寄存器,可以选择RTC的时钟。我们一般选择LXTAL时钟作为它的时钟,主要有两点原因:
1) LXTAL时钟由Vbat供电,就算主芯片断电,Vbat有电,日期就不会错;
2) 外部接一个32.758K的晶振,振荡一下,刚好是1S时间;日期就会非常精确;
根据GD提供下面三行函数,即可选择时钟,并得到精确1S
rcu_osci_on(RCU_LXTAL);                        // 使能LXTAL时钟
rcu_osci_stab_wait(RCU_LXTAL);        // 等待LXTAL时钟起振
rtc_prescaler_set(32767);                // 设置RTC的周期=32.768KHz/(32767+1)=1Hz=1S
RTC初始化
RTC只需要在第一次上电后对它进行配置,配置好以后就不用再配置了,否则会把RTC的寄存器清零,这样时间就不对了。那么我们如何知道RTC是否已经配置过了呢,这就需要用到GD提供的备份寄存器BKP了,BKP提供了40个寄存器用来备份。我们可以首先给其中的一个寄存器写值为0xA5A5;后来每次上电都判断下一下这个寄存器的值是否为A5A5;如果是,表示配置过了不需要再配置;如果不是,说明没有被配置过,需要重新配置。如下:
bkp_data_write(BKP_DATA_0,0xA5A5);
BKP的值会在VCC和Vbat两个电源都掉电的时候被清零,这时候就需要去重新配置RTC时钟了,如下:
3.jpg

日期计算
上面的时钟配置工作完成以后,接下来就是日期和时间的换算了,这个就比较简单了,我们通过读写RTC_CNTH,RTC_CNTL寄存器来读取时间。
rtc_counter_set(uint32 cnt)                // 设置日期的秒
rtc_counter_get(uint32 cnt)                // 读取日期的秒
读取或设置的值都是以S为单位,需要把S换做日期。
举个例子,比如我们把系统的初始时间设置为2021年1月1日 0时0分0秒,对应RTC寄存器的值也为0,过了一段时间后,RTC的值变为84608,那表示的日期就是2021年1月10日 0时0分8秒;设置日期也是,通过设置的日期,减掉初始时间,再把中间的年月日时分秒折算成S;再写入RTC的寄存器即可。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表