跳到主要内容

31 RTC 时钟实验

在这里插入图片描述

开发板官网https://www.edevkit.com/)

本系列教程目录:


RTC 时钟实验

本章目标:

  • 了解 RA6M5 处理器的 RTC 模块
  • 学会使用 RASC 配置 RTC 模块,使用 API 读写数据。

硬件设计(略,参见配套硬件原理图)

软件设计

新建工程

复制一份“07 SCI_UART_Recv_send”修改文件夹名“31 RTC”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 rtc.crtc.h 保存到工程目录下的 src 文件夹中。

FSP 配置

Keil 界面选择 “Tools”→“RA Smart Configurator” 打开 RASC 界面。

在 “Pins” 添加 RTC 设备。

插图01

添加 RTC Stack 模块。

插图02

配置 RTC Stack 参数。

插图03

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/(255+1) = 32768/256 = 128Hz
Automatic Adjustment Mode自动校正模式,用于校正 Sub-Clock 震荡过快或过慢引起的误差
(例如芯片老化,环境温度过低或过高),默认为 Enable。
Automatic Adjustment Period自动校正的时间,可选择 10 秒、1 分钟或 NONE
Adjustment 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,在中断回调中获取当前时间并打印到串口。

  1. 打开 RTC 设备
fsp_err_t R_RTC_Open(rtc_ctrl_t * const p_ctrl,
rtc_cfg_t const * const p_cfg);
  1. 时钟源设置
fsp_err_t R_RTC_ClockSourceSet(rtc_ctrl_t * const p_ctrl);
  1. 时间设置
fsp_err_t R_RTC_CalendarTimeSet(rtc_ctrl_t * const p_ctrl,
rtc_time_t * const p_time);
  1. 时间读取
fsp_err_t R_RTC_CalendarTimeGet(rtc_ctrl_t * const p_ctrl,
rtc_time_t * const p_time);
  1. 设置中断时间
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);

#endif

rtc.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
}

下载验证

连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完。

可以看到每秒打印时间。

插图04