1、野火启明6M5开箱
https://bbs.elecfans.com/jishu_2324111_1_1.html
2、基于野火启明6M5的可调频正弦波发生器
https://bbs.elecfans.com/jishu_2324831_1_1.html
3、FreeRTOS+OLED
https://bbs.elecfans.com/jishu_2325284_1_1.html
本文章对RA6M5的RTC编程进行介绍。RTC是单片机常用的日历模块,本文章介绍了RTC时间的设置、周期性中断设置和闹钟设置,并利用串口4将时间输出。
一、项目建立
本测评采用RASC生成Keil项目。本次未采用操作系统,生成的过程其他同学均已详细介绍,这里便不再重复。
二、模块设置
本次使用了RTC模块和串口模块。
1、RTC模块的设置

以此点击Stacks——New Stack——Timers——Realtime Clocks,在项目中增加RTC模块,然后再对模块进行设置。

将模块名称设置为g_rtc,时钟设置为子时钟,回调函数设置为rtc_callback,优先级设置为2.
2、串口设置

将单片机的P511设置为RXD4,P512设置为TXD4,

以此点击Stacks——New Stack——Connectivity——UART,将串口模块加入项目,然后对串口进行设置

将串口的名称设置为g_uart4,通道设置为4,波特率设置为115200,回调函数设置为uart4_callback。
通过上述设置,便将RTC模块与串口模块设置完成。点击RASC的“Generate Project Content”,便可以生成keil文件。
三、程序编写
1、RTC程序编写
(1)初始化代码
使用RASC生成代码后,需要自行将RTC模块打开进行初始化。代码如下。
fsp_err_t rtc_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_RTC_Open(&g_rtc_ctrl, &g_rtc_cfg);
if (FSP_SUCCESS != err)
{
printf("\r\nRTC module open failed.\r\nRestart the Application\r\n");
}
return err;
}
(2)设置时间
在程序运行时,需要将RTC时间进行设置,需要调用库中的R_RTC_CalendarTimeSet函数。设将当前时间设置为2022年12月31日 22:33:00,需要以下语句。
g_set_time.tm_mday=31;
g_set_time.tm_mon=12-1;
g_set_time.tm_year=2022-1900;
g_set_time.tm_hour=22;
g_set_time.tm _min=33;
g_set_time.tm_sec=0;
err = R_RTC_CalendarTimeSet(&g_rtc_ctrl, &g_set_time);
(3)周期性中断设置
err = R_RTC_PeriodicIrqRateSet(&g_rtc_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND)
在这里直接调用库函数中的语句进行设置,在这里设置为每秒钟中断一次。
(4)闹钟设置
alarm_time_set.hour_match = false
alarm_time_set.min_match = false
alarm_time_set.sec_match = true
alarm_time_set.mday_match = false
alarm_time_set.mon_match = false
alarm_time_set.year_match = false
alarm_time_set.time.tm_sec = 30
err = R_RTC_CalendarAlarmSet(&g_rtc_ctrl, &alarm_time_set)
这里设置为每当秒数达到30的时候进行中断,也可以按照该方法设置其他的中断时间。
(5)中断回调函数
void rtc_callback(rtc_callback_args_t *p_args)
{
if(RTC_EVENT_ALARM_IRQ == p_args->event)
{
g_alarm_irq_flag = SET_FLAG;
test2+=1;
}
else
{
g_periodic_irq_flag = SET_FLAG;
test+=1;
}
}
在这里使用两个变量分别为test和test2,分别对秒中断和闹钟中断进行计数,判断运行是否正确。
2、串口编程
串口编程包括串口的初始化、串口中断函数和冲定向三部分,因为其他朋友已经写的很多了,这里直接贴出代码。
void uart4_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open (&g_uart4_ctrl, &g_uart4_cfg);
assert(FSP_SUCCESS == err);
}
void uart4_callback (uart_callback_args_t * p_args)
{
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&(p_args->data), 1);
break;
}
case UART_EVENT_TX_DATA_EMPTY:
{
uart_send_complete_flag = true;
break;
}
default:
break;
}
}
int fputc(int ch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&ch, 1);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return ch;
}
3、主程序编写
void hal_entry(void)
{
uart4_init();
rtc_init();
set_rtc_periodic_rate();
set_rtc_calendar_alarm();
set_rtc_calendar_time();
while(1)
{
get_rtc_calendar_time();
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
}
}
该程序包括对RTC和串口的初始化和设置。在程序执行时,每隔1秒钟,输出当前的计时时间。
四、程序运行