完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
按项目的要求,在原有的基础上增加了定时器功能
仔细研究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("nr 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("nr 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); } } |
|
|
|
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
464 浏览 0 评论
643 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
942 浏览 0 评论
1028 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
724 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12043 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 06:22 , Processed in 0.604503 second(s), Total 66, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号