查看: 2717|回复: 0

RTC的时间显示实验

[复制链接]
  • TA的每日心情
    奋斗
    12 小时前
  • 签到天数: 4066 天

    连续签到: 44 天

    [LV.Master]伴坛终老

    发表于 2013-1-29 23:41:38 | 显示全部楼层 |阅读模式
    分享到:
    RTC是实时时钟外设,在SAM4S_XPLAINED测试板上是低功耗外设,RTC有完整的时间和日期时钟附带闹钟功能,同时可设置200年的罗马教皇日历或者波斯日历。闹钟和日历寄存器可以通过32位总线访问。时间和日期的数值被编码成BCD码形式,时间可以有12小时和24小时形式显示。时间和日期可以通过32位总线对可编程的寄存器进行设置。RTC的时钟频率32768KHz。
    本次实验是利用RTC(实时时钟)的秒钟中断函数,来显示当前时间,在秒钟发生变化时就产生中断,即每一秒钟都产生中断。在中断函数中,用串口发送当前时间,显示格式如小时:分钟:秒钟,月\日\年 星期。
    下面来根据相关的RTC寄存器来介绍以下代码函数功能。
    1.JPG
    rtc_set_hour_mode(RTC, 0);
    通过上图的寄存器,此函数主要是设置RTC时间是24小时形式,采用了罗马教皇日历,即我们现在公历。
    2.JPG
    /* Configure RTC interrupts */
         NVIC_DisableIRQ(RTC_IRQn);
         NVIC_ClearPendingIRQ(RTC_IRQn);
         NVIC_SetPriority(RTC_IRQn, 0);
         NVIC_EnableIRQ(RTC_IRQn);
         rtc_enable_interrupt(RTC, RTC_IER_SECEN);
         此处几个函数是使能RTC中断,设置RTC在NVIC中的使能,并且设置成最高的优先级。在最后一个函数中,只是使能秒钟中断,在上图中寄存器位中还可以同时使能几个其他中断。
    /**
    * \brief Calculate week from year, month, day.
    */
    static uint32_t calculate_week(uint32_t ul_year, uint32_t ul_month,
                  uint32_t ul_day)
    此函数是通过日期来计算星期的函数,再此函数中使用了基姆拉尔森公式,公式如下:
    W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)mod7
    D是日期,m是月份,y是年数。不过一月和二月必须当成上年的十三月和十四月。
    上式中的/都是计算机中的整除。具体的实现大家可以看程序的函数的源码。
    3.JPG
    4.JPG
    /* Time string */
    static uint8_t gs_uc_rtc_time[8 + 1] =
                  { '0', '0', ':', '0', '0', ':', '0', '0', '\0' };
    /* Date string */
    static uint8_t gs_uc_date[10 + 1] =
                  { '0', '1', '/', '2', '9', '/', '2', '0', '1', '3', '\0' };
    /* Week string */
    static uint8_t gs_uc_day_names[7][4] =
                  { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
    这几个数组是程序的初始化设置的时间和日期,通过下面2个函数初始化上图的RTC Time Register和RTC Calendar Register寄存器中相应区域。
    时间设置函数
    uint32_t rtc_set_time(Rtc *p_rtc, uint32_t ul_hour, uint32_t ul_minute,       uint32_t ul_second)
    日期设置函数
    uint32_t rtc_set_date(Rtc *p_rtc, uint32_t ul_year, uint32_t ul_month,        uint32_t ul_day, uint32_t ul_week)
    具体的函数实体可以在程序找到,在此就不累述。
    void RTC_Handler(void)
    static void refresh_display(void)
    上面第一个函数是RTC中断函数,第二个函数是显示刷新函数。
    为了不使中断干扰到刷新函数显示,在显示刷新时,将RTC中断关闭。如下程序所示。
    rtc_disable_interrupt(RTC, RTC_IDR_SECDIS);
    refresh_display();
    rtc_clear_status(RTC, RTC_SCCR_SECCLR);
    rtc_enable_interrupt(RTC, RTC_IER_SECEN);
    相关的程序部分就介绍到这里,有关程序更多详细可以看程序源码,有关寄存器的更多信息,在Atmel官网提供的《SAM4S Series》有详细介绍。
    下图是通过串口调试助手显示实验结果。
    5.JPG

    rtc.rar

    3.05 MB, 下载次数: 31

    RTC的时间显示实验.pdf

    244.74 KB, 下载次数: 13

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 12:39 , Processed in 0.118138 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.