漫谈LiteOS之开发板-RTC实时时钟(基于GD32450i-EVAL)

举报
星辰27 发表于 2019/11/06 17:22:25 2019/11/06
【摘要】 主要介绍RTC实时时钟的简介、特性以及RTC架构,之后以一个基于GD32450i-EVAL开发板的实验来介绍包括RTC实时时钟的初始化、以及实验效果,希望对你有所帮助。

5 RTC时钟

1 简介

RTCReal_Time Clock)实时时钟,可以像时钟一样输出实际时间的电子设备,一般是集成电路,也称时钟芯片,其核心为晶振(晶体谐振器),分为内部晶振和外部晶振,晶振频率为215次方32768Hz,即分频15次为1Hz,晶振为分频计数器提供精确的与低功耗的实基信号来产生秒、分、时、日等信息。

该模块拥有一组连续计数的计数器,具有提供包含日期和时间的日历功能,除了亚秒以二进制码显示,其余皆以BCD码显示,修改计数器的值可以重新设置系统当前时间和日期。

特性

1)由于晶振频率受温度影响,因此需要进行补偿,RTC可以通过软件设置实现夏令时补偿。

2)低功耗,RTC可以工作在省电模式下,并通过软件配置来智能唤醒。唤醒后或系统复位后,RTC的设置和时间维持不变。

3)参考时钟检测功能:可通过外接更高精度的低频时钟源来提高精度

4)数字校准功能:通过调整最小时间单位来进行日历校准。

5)通过移位功能进行亚秒级调整。

6)提供到2099年内的日历功能。

7)记录事件时间的时间戳功能。

8)可编程的日历和两个位域可屏蔽的闹钟。

9)可屏蔽的中断源:闹钟01;时间戳检测;侵入检测;自动唤醒事件。

102032位通用别分寄存器,可以在省电模式下保存数据,当有外部事件侵入时,备份寄存器将会复位。

3 RTC结构

RTC结构框图可知RTC主要组成包括以下几部分:

1)闹钟事件/中断和侵入事件/中断。

232位备份寄存器。

316位自动递减计数器

主要用于周期性产生唤醒标志,该功能通过WTEN1来使能,可以工作在省电模式。

43个时钟源。

5)两种数字粗校准方法

数字粗校准和数字平滑校准。注意两种方法不可以同时使用。前者以异步预分频器输出为源,增加或减少ck_apre周期,后者通过调整校准周期内RTC时钟脉冲个数方式来校准RTC频率

64种可选的RTC输入功能和4种可选的RTC输出功能。

72个预分频

一个7位异步预分频,主要用于降低功耗;一个15位同步预分频。同时使用的时候,建议异步分频器的值尽可能大。

8)影子寄存器。

APB总线访问RTC日历寄存器RTC_DATERTC_TIMERTC_SS时,BPSHAD=0时(默认为0),APB总线访问影子寄存器。每两个RTC时钟影子寄存器值会更新为真实日历寄存器的值。同时RSYNF位也会再次置位。在Deep-sleepStandby模式时,影子寄存器不会更新。退出这两种模式,软件必须清除RSYNF位。如果想要在BPSHAD=0时读取日历寄存器的值,需等待RSYNF1。当系统复位时将复位影子寄存器。

9)各类寄存器

RTC真实日历寄存器、RTC控制寄存器、RTC预分频寄存器、RCT唤醒定时器寄存器、RTC粗校准寄存器、RTC侵入寄存器等等。


1573026068796441.png

图1 GD32450i-EVAL的RTC架构图

4 RTC程序初始化

static void rtc_pre_config(void)

{

    /* enable access to RTC registers in backup domain */

    rcu_periph_clock_enable(RCU_PMU); //使能PMU时钟

    pmu_backup_write_enable();

//PMU_CTL寄存器BKPWEN位被清零,因此写RTC寄存器需要先写该位

    #if defined (RTC_CLOCK_SOURCE_IRC32K)   

          rcu_osci_on(RCU_IRC32K);

          rcu_osci_stab_wait(RCU_IRC32K);

          rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);

          prescaler_s = 0x13F;

          prescaler_a = 0x63;

    #elif defined (RTC_CLOCK_SOURCE_LXTAL)

          rcu_osci_on(RCU_LXTAL);//打开晶振并选择晶振类型

          rcu_osci_stab_wait(RCU_LXTAL);.//晶振准备就绪

          rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);//配置RTC时钟源

   prescaler_s = 0xFF;

          prescaler_a = 0x7F;

    #else

    #error RTC clock source should be defined.

    #endif /* RTC_CLOCK_SOURCE_IRC32K */

    rcu_periph_clock_enable(RCU_RTC); //启用RTC时钟

    rtc_register_sync_wait();

           //等待直到RTC_TIMERTC_DATE寄存器与APB时钟同步,并且影子寄存器被更新

}

5 运行结果

RTC相关配置只需要额外附加串口打印函数即可,硬件部分连接与前面串口系列一致。当程序运行时候,串口软件显示默认时间,每次按下wakeup按键的时候,会重新设置时间,并显示到串口,具体结果如图2所示。

1573031107291348.png

图2 串口时间显示

其中的系统时间可以修改具体如下图所示,在中断回调函数中修改系统时间即可实现对上述显示时间的修改。具体如图3所示。

1573031146751206.png

图3 中断回调函数时间修改

修改上述程序后,再次下载到开发板,可见系统显示时间如下图所示。

1573031174420168.png

图4 修改后时间显示

主文博客链接:https://bbs.huaweicloud.com/blogs/124244



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。