瑞萨RA0单片机连载之九⸺RTC
RA0E1的RTC(Real Time Clock) 外设, 实质是一个掉电后还继续运行的定时器。RA0E1 的实时时钟(RTC)有两种计数模式:日历计数模式、二进制计数模式,可以通过寄存器的设置来切换模式。对于日历计数模式,RTC 具有从2000 年到2099 年的100年日历,并自动调整闰年的日期。对于二进制计数模式,RTC计数秒,并保留信息作为串行值。二进制计数模式可用于公历(西历)以外的日历。
本篇主要介绍如何使用RASC配置RTC,并使用RTC中断来更新时间,在OLED中显示实时时间。
1.打开RASC配置工具,新增一个stack:
2.在g_rtc属性中,配置他为g_rtc0,开启中断,并设置中断函数为rtc_callback,中断级别为Priority3
3.保存配置并重新生成代码。
4.添加drv_rtc.c/h
在drv_rtc.c中添加代码如下:
view plaincopy to clipboardprint?
1. int RTCDrvInit(void)
2. {
3. rtc_time_t SetTime = {
4. .tm_sec = 0, // 秒
5. .tm_min = 45, // 分
6. .tm_hour = 19, // 小时
7. .tm_mday = 29, // 日(一个月中)
8. .tm_wday = 3, // 星期
9. .tm_mon = 6, // 月份
10. . tm_year = 2024-1900, // 年份(如今年是
2008,则这里输入2008-1900=108)
11. };
12.
13. fsp_err_t err = g_rtc0.p_api->open(g_rtc0.p_
ctrl, g_rtc0.p_cfg);
14. assert(FSP_SUCCESS == err);
15.
16. err = g_rtc0.p_api->calendarTimeSet(g_rtc0.
p_ctrl, &SetTime);
17. assert(FSP_SUCCESS == err);
18.
19. err = g_rtc0.p_api->periodicIrqRateSet(g_rtc0.
p_ctrl, RTC_PERIODIC_IRQ_SELECT_1_
SECOND);
20. assert(FSP_SUCCESS == err);
21.
22. return true;
23. }
本函数为初始化RTC,先定义一个Settime 结构体,将需要初始化的年月日时分秒以及星期添calendarTimeSet来设置时间。
使用periodicIrqRateSet 设置一个1 秒的中断。
view plaincopy to clipboardprint?
1. void rtc_callback(rtc_callback_args_t * p_args)
2. {
3. if(RTC_EVENT_PERIODIC_IRQ == p_args-
>event)
4. {
5. /* 若是周期中断,获取日期*/
6. gRtcPeriodFlag = true;
7. g_rtc0.p_api->calendarTimeGet(g_rtc0.p_
ctrl, (rtc_time_t*)&gCurTime);
8. }
9. }
在回调函数中,更新获取时间标志,并把当前时间读取到gCurTime中。
同时我们开放一个RTCDrvGetTime函数,用于返回时间。
view plaincopy to clipboardprint?
1. int RTCDrvGetTime(rtc_time_t *time)
2. {
3. if(RTCDrvWaitPeriodInt())
4. {
5. *time = gCurTime;
6. return true;
7. }
8. return false;
9. }
1 测试
在主函数中,先初始化RTC,然后在大循环中获取时间,并更新到OLED屏上:
2 总结
瑞萨的RASC可以方便的配置外设,本实验采用面向对象的编程思想来驱动RTC,实现了1秒的中断,在回调中获取当时间,并实时更新到OLED屏上。
实验现象:
(本文来源于《EEPW》202506)
评论