瑞萨单片机开发教程[三十一] RTC 时钟实验 📅 2026/8/5 11:55:12 开发板官网https://www.edevkit.com/本系列教程目录- 瑞萨单片机开发教程[一] e2-studio DAP LINK开发环境搭建- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建- 瑞萨单片机开发教程[三] 新建RASC工程- 瑞萨单片机开发教程[四] GPIO输出——led实验- 瑞萨单片机开发教程[五] GPIO输入——按键key实验- 瑞萨单片机开发教程[六] ICU外部中断实验- 瑞萨单片机开发教程[七] SCI UART串口通信实验- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验- 瑞萨单片机开发教程[九] ADC 电压采集实验RTC 时钟实验本章目标了解 RA6M5 处理器的 RTC 模块学会使用 RASC 配置 RTC 模块使用 API 读写数据。硬件设计略参见配套硬件原理图软件设计新建工程复制一份“07 SCI_UART_Recv_send”修改文件夹名“31 RTC”双击打开EBF_RA6M5.uvprojx工程通过 Keil 的新建文件新建rtc.c和rtc.h保存到工程目录下的 src 文件夹中。FSP 配置Keil 界面选择 “Tools”→“RA Smart Configurator” 打开 RASC 界面。在 “Pins” 添加 RTC 设备。添加 RTC Stack 模块。配置 RTC Stack 参数。Parameter Checking参数检查如果设置为 Enabled 则会检查 RTC 设置的日历时间是否合法并通过年月日自动计算星期。Set Source Clock in Open若设置为 Enabled则在函数R_RTC_Open中初始化时钟源若设置为 Disabled必须调用R_RTC_ClockSourceSet来设置 RTC 时钟源。Name模块名字可以根据个人需要取名。Clock Source设置时钟源可以选择 LOCO 和 Sub-Clock。Frequency Comparison Value(LOCO)使用 LOCO 作为时钟源时的分频值取值范围是 7-511默认为 255则此时输出给日历计数器/二进制计数器的时钟脉冲为LOCO/(2551) 32768/256 128HzAutomatic Adjustment Mode自动校正模式用于校正 Sub-Clock 震荡过快或过慢引起的误差例如芯片老化环境温度过低或过高默认为 Enable。Automatic Adjustment Period自动校正的时间可选择 10 秒、1 分钟或 NONEAdjustment Type(Plus-Minus)自动校正类型可以选择 None、Addition 或 Subtraction。选择 Addition 则是在每次自动校正的时候在分频器中加上 Error Adjustment Value。选择 Subtraction 则是在每次自动校正的时候在分频器中减去 Error Adjustment Value。Error Adjustment Value在触发自动校正时候分频器减去或增加的值。CallbackRTC 中断回调函数的名称根据读者需求进行设置即可。Alarm Interrupt Priority选择闹钟中断的优先级如果选择 Disabled 则不使能闹钟中断。Period Interrupt Priority选择周期性中断的优先级如果选择 Disabled 则不使能周期性中断。Carry Interrupt Priority选择进位中断的优先级。RTCOUT输出引脚选择可输出 1Hz 或 64Hz 的方波无法在待机模式下使用。RTCICn输入捕获引脚选择。配置完成之后可以按下快捷键 “Ctrl S” 保存最后点击 “Generate Project Content” 按钮让软件自动生成配置代码即可。程序设计初始化 RTC 模块设置时钟时间为当前时间设置时钟中断时间为 1s在中断回调中获取当前时间并打印到串口。打开 RTC 设备fsp_err_t R_RTC_Open(rtc_ctrl_t * const p_ctrl, rtc_cfg_t const * const p_cfg);时钟源设置fsp_err_t R_RTC_ClockSourceSet(rtc_ctrl_t * const p_ctrl);时间设置fsp_err_t R_RTC_CalendarTimeSet(rtc_ctrl_t * const p_ctrl, rtc_time_t * const p_time);时间读取fsp_err_t R_RTC_CalendarTimeGet(rtc_ctrl_t * const p_ctrl, rtc_time_t * const p_time);设置中断时间fsp_err_t R_RTC_PeriodicIrqRateSet(rtc_ctrl_t * const p_ctrl, rtc_periodic_irq_select_t const rate);程序编写rtc.h头文件定义初始化。#ifndef BSP_RTC_H #define BSP_RTC_H #include hal_data.h void rtc_Init(void); #endifrtc.c中初始化设置时间中断函数打印时间。#include rtc.h #include led.h rtc_time_t get_time; void rtc_Init(void) { //初始化时设定的时间 rtc_time_t set_time { .tm_year 2026-1900, //年 .tm_mon 1 - 1, //月 .tm_wday 2, //星期 .tm_mday 27, //日 .tm_hour 11, //时 .tm_min 15, //分 .tm_sec 25, //秒 }; //打开RTC模块 R_RTC_Open (g_rtc0.p_ctrl, g_rtc0.p_cfg); //时钟源设置如果在FSP Configuration设置Set Source Clock in Open为enabled那这一步可以被跳过 R_RTC_ClockSourceSet (g_rtc0.p_ctrl); //设置当前时间 R_RTC_CalendarTimeSet (g_rtc0.p_ctrl, set_time); //设置周期中断的周期为1秒 R_RTC_PeriodicIrqRateSet (g_rtc0_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND); } void rtc_callback(rtc_callback_args_t *p_args) { switch (p_args-event) { case RTC_EVENT_PERIODIC_IRQ: LED1_TOGGLE(); //获取当前时间 R_RTC_CalendarTimeGet(g_rtc0_ctrl, get_time); printf(\r\n%d-%d-%d-%d:%d:%d\r\n, get_time.tm_year 1900, get_time.tm_mon 1, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec); break; default: break; } }在hal_entry.c文件中添加头文件rtc.h初始化 RTC。void hal_entry(void) { /* TODO: add your own code here */ led_Init(); // LED 初始化 uart0_Init(); rtc_Init(); printf(start rtc test\r\n); while(1) { R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒 //扫描uart接收 uart_scan_rx(); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif }下载验证连接下载器将程序编译并下载到开发板之后按下复位按键来复位开发板程序启动初始化完。可以看到每秒打印时间。