基于RASC的keil电子时钟制作(瑞萨RA)(7)----配置RTC时钟及显示时间

概述本文将详细讲解如何借助e2studio来对瑞萨微控制器进行实时时钟(rtc)的设置和配置,以便实现日历功能和一秒钟产生的中断,从而通过串口输出实时数据。
实时时钟(rtc)模块是一种时间管理外设,主要用于记录和控制日期和时间。与常见的微控制器(mcu)中的定时器不同,rtc时钟提供了两种计时方式:日期模式和计时模式。rtc时钟的常用功能包括设置时间、设定闹钟、配置周期性中断以及启动或停止操作。
通过使用e2studio工具,我们可以轻松地对瑞萨微控制器进行rtc配置,从而实现高精度的时间和日期管理。在本文中,我们将重点讨论如何设置rtc时钟日历和产生一秒钟的中断,使得串口能够实时打印数据。
硬件准备首先需要准备一个开发板,这里我准备的是芯片型号r7fa2e1a72dfl的开发板:
视频教程https://www.bilibili.com/video/bv1av41157au/
rtc配置点击stacks->new stack->timers -> realtime clock(r_rtc)。
rtc属性配置
其中loco为内部低速时钟,需要准确定时还是需要外部低速晶振sub-clock。
设定时间在启动rtc后,需要为其设定当前时间。您可以使用r_rtc_calendartimeset(&g_rtc0_ctrl, &set_time)函数来实现这一目标。具体的时间参数可以通过修改set_time变量来调整。
//rtc变量/* rtc_time_t is an alias for the c standard time.h struct 'tm' */rtc_time_t set_time ={ .tm_sec = 50, /* 秒,范围从 0 到 59 */ .tm_min = 59, /* 分,范围从 0 到 59 */ .tm_hour = 23, /* 小时,范围从 0 到 23*/ .tm_mday = 29, /* 一月中的第几天,范围从 0 到 30*/ .tm_mon = 11, /* 月份,范围从 0 到 11*/ .tm_year = 123, /* 自 1900 起的年数,2023为123*/ .tm_wday = 6, /* 一周中的第几天,范围从 0 到 6*/// .tm_yday=0, /* 一年中的第几天,范围从 0 到 365*/// .tm_isdst=0; /* 夏令时*/};
设定周期性中断如果您想要使用rtc实现固定延迟中断,可以通过r_rtc_periodicirqrateset(rtc_ctrl_t *const p_ctrl, rtc_periodic_irq_select_t const rate)函数来实现。例如,要设置1秒的周期性中断,您可以使用如下代码:
r_rtc_periodicirqrateset(&g_rtc0_ctrl, rtc_periodic_irq_select_1_second);
每次周期性中断产生时,系统将触发回调函数的事件rtc_event_periodic_irq。
设定日历闹钟时间在启动rtc后,您可以设置日历闹钟时间。通过使用r_rtc_calendaralarmset(&g_rtc0_ctrl, &set_alarm_time)函数,可以设定闹钟时间。具体的时间参数可以通过修改set_alarm_time变量来调整。具体设置方法如下。
在这个示例中,我们仅设置了sec_match为1,因此每隔一分钟,当秒数达到5秒时,闹钟都会触发。如果要实现每天只响铃一次的功能,需要同时将min_match和hour_match设置为1。
//rtc闹钟变量rtc_alarm_time_t set_alarm_time={ .time.tm_sec = 55, /* 秒,范围从 0 到 59 */ .time.tm_min = 59, /* 分,范围从 0 到 59 */ .time.tm_hour = 23, /* 小时,范围从 0 到 23*/ .time.tm_mday = 29, /* 一月中的第几天,范围从 1 到 31*/ .time.tm_mon = 11, /* 月份,范围从 0 到 11*/ .time.tm_year = 123, /* 自 1900 起的年数,2023为123*/ .time.tm_wday = 6, /* 一周中的第几天,范围从 0 到 6*/ .sec_match = 1,//每次秒到达设置的进行报警 .min_match = 0, .hour_match = 0, .mday_match = 0, .mon_match = 0, .year_match = 0, .dayofweek_match = 0, };
回调函数可以触发进入回调函数的事件如下所示,rtc_event_periodic_irq为设置的实时性事件,例如1s一次,rtc_event_alarm_irq为闹钟事件。
//rtc回调函数volatile bool rtc_flag = 0;//rtc延时1s标志位volatile bool rtc_alarm_flag = 0;//rtc闹钟/* callback function */void rtc_callback(rtc_callback_args_t *p_args){ /* todo: add your own code here */ if(p_args- >event == rtc_event_periodic_irq) rtc_flag=1; else if(p_args- >event == rtc_event_alarm_irq) rtc_alarm_flag=1;}
同时在主程序中开启rtc已经设置时间和闹钟。
/**********************rtc开启***************************************/ /* initialize the rtc module*/ err = r_rtc_open(&g_rtc0_ctrl, &g_rtc0_cfg); /* handle any errors. this function should be defined by the user. */ assert(fsp_success == err); /* set the rtc clock source. can be skipped if set source clock in open property is enabled. */ r_rtc_clocksourceset(&g_rtc0_ctrl); /* r_rtc_calendartimeset must be called at least once to start the rtc */ r_rtc_calendartimeset(&g_rtc0_ctrl, &set_time); /* set the periodic interrupt rate to 1 second */ r_rtc_periodicirqrateset(&g_rtc0_ctrl, rtc_periodic_irq_select_1_second); r_rtc_calendaralarmset(&g_rtc0_ctrl, &set_alarm_time); uint8_t rtc_second= 0; //秒 uint8_t rtc_minute =0; //分 uint8_t rtc_hour =0; //时 uint8_t rtc_day =0; //日 uint8_t rtc_month =0; //月 uint16_t rtc_year =0; //年 uint8_t rtc_week =0; //周 rtc_time_t get_time;
同时在主函数的while循环中添加打印和中断处理,以及当前时间显示。
if(rtc_flag) { r_rtc_calendartimeget(&g_rtc0_ctrl, &get_time);//获取rtc计数时间 rtc_flag=0; rtc_second=get_time.tm_sec;//秒 rtc_minute=get_time.tm_min;//分 rtc_hour=get_time.tm_hour;//时 rtc_day=get_time.tm_mday;//日 rtc_month=get_time.tm_mon;//月 rtc_year=get_time.tm_year; //年 rtc_week=get_time.tm_wday;//周 printf( %d y %d m %d d %d h %d m %d s %d wn,rtc_year+1900,rtc_month,rtc_day,rtc_hour,rtc_minute,rtc_second,rtc_week); //时间显示 num1=rtc_hour/10; num2=rtc_hour%10; num3=rtc_minute/10; num4=rtc_minute%10; } if(rtc_alarm_flag) { rtc_alarm_flag=0; printf(/************************alarm clock********************************/n); } r_bsp_softwaredelay(10u, bsp_delay_units_milliseconds);
为了快速启动,关闭数码管测试。
演示效果设置每过1s打印一次当前时间,设置过1分钟,在10秒时候闹铃。
更换日期显示。
数码管显示日期可以在主程序里面添加显示,让数码管显示日期。
num1=rtc_hour/10; num2=rtc_hour%10; num3=rtc_minute/10; num4=rtc_minute%10;


新型光源LED用于博物馆领域可以有效的减轻展品受损营造艺术氛围
5V/12V/24V转0-1000V线性可调控制电源模块
五步走 拥有专属无敌购物车!
三菱FX系列PLC置位与复位指令的用法
视+AR与中国联通达成合作 携手推动5G与AI融合创新
基于RASC的keil电子时钟制作(瑞萨RA)(7)----配置RTC时钟及显示时间
新能源补贴加速退坡,动力电池行业竞争“换血”加剧
果蔬农残检测仪的产品特点是怎样的
京东方将独家供应华为Mate Xs柔性折叠屏 屏占比将会有更大提升
意大利进口微生物快速检测仪的特点介绍
流量计量表的自恢复保护电路的原理及设计
无线网信号变弱 大多是路由器摆放位置不对
电表、工控案例
智能硬件投资人眼中好项目的七大特征
腾讯医疗人工智能不断探索 推动医学解决盲点
高压放大器在多波长干涉相位同步解调方法研究中的应用
DC电源模块有哪些常见的故障和维修方法?
关于接地的有关概念介绍
一加6评测 毫无短板真旗舰
智慧医疗行业的关键是要解决应用落地