2767|0

1903

帖子

0

TA的资源

版主

楼主
 

atmel sam4s16c教程 之实时时钟rtc [复制链接]

按项目的要求,在原有的基础上增加了定时器功能
仔细研究Datasheet中关于rtt的部分

框图见附图
RTC是实时时钟外设,RTC有完整的时间和日期时钟附带闹钟功能,同时可设置200年的罗马教皇日历或者波斯日历。闹钟和日历寄存器可以通过32位总线访问。时间和日期的数值被编码成BCD码形式,时间可以有12小时和24小时形式显示。时间和日期可以通过32位总线对可编程的寄存器进行设置。RTC的时钟频率32768KHz。
本次实验是利用RTC(实时时钟)的秒钟中断函数,来显示当前时间,在秒钟发生变化时就产生中断,即每一秒钟都产生中断。在中断函数中,用串口发送当前时间,显示格式如小时:分钟:秒钟,月\日\年 星期。
下面来根据相关的RTC寄存器来介绍以下代码函数功能。



寄存器附图见附图
rtc_set_hour_mode(RTC, 0);
通过上图的寄存器,此函数主要是设置RTC时间是24小时形式,采用了罗马教皇日历,即我们现在公历。



/* 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是年数。不过一月和二月必须当成上年的十三月和十四月。
上式中的/都是计算机中的整除。具体的实现大家可以看程序的函数的源码。


通过下面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)
上面第一个函数是RTC中断函数。
下面是RTC中断关闭。如下程序所示。
rtc_disable_interrupt(RTC, RTC_IDR_SECDIS);
rtc_clear_status(RTC, RTC_SCCR_SECCLR);
rtc使能函数
rtc_enable_interrupt(RTC, RTC_IER_SECEN);
相关的程序部分就介绍到这里,有关程序更多详细可以看程序源码

void drv_rtc_init(void)
{
/*Initialize the time and date*/

        if (rtc_set_time(RTC, gs_ul_new_hour, gs_ul_new_minute,        gs_ul_new_second)) {
                puts("\n\r Time not set, invalid input!\r");
        }
        if (rtc_set_date(RTC, gs_ul_new_year, gs_ul_new_month,        gs_ul_new_day, gs_ul_new_week)) {
                puts("\n\r Date not set, invalid input!\r");
        }

        /* Default RTC configuration, 24-hour mode */
        rtc_set_hour_mode(RTC, 0);

        /* 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);
}

/**
* \brief Interrupt handler for the RTC. Refresh the display.
*/
void RTC_Handler(void)
{
        uint32_t ul_status = rtc_get_status(RTC);

        /* Second increment interrupt */
        if ((ul_status & RTC_SR_SEC) == RTC_SR_SEC) {
                /* Disable RTC interrupt */
                rtc_disable_interrupt(RTC, RTC_IDR_SECDIS);
                all_screen_old(0);
                //自添加代码
                rtc_clear_status(RTC, RTC_SCCR_SECCLR);

                rtc_enable_interrupt(RTC, RTC_IER_SECEN);
        }
}

框图
[url=][/url]


[url=][/url]


点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表