目录
概述
1 软硬件
1.1 软硬件环境信息
1.2 开发板信息
1.3 调试器信息
2 FSP配置RTC
2.1 配置参数
2.2 RTC模块介绍
3 RTC相关函数
3.1 R_RTC_Open()
3.2 R_RTC_Close()
3.3 R_RTC_ClockSourceSet()
3.4 R_RTC_CalendarTimeSet()
3.5 R_RTC_CalendarTimeGet()
4 应用案例
4.1 功能介绍
4.2 源代码文件
5 测试
5.1 测试代码介绍
5.2 测试功能
测试视频:
使用Renesas R7FA8D1BH (Cortex®-M85)控制多类i2c类型设备,实时读取数据显示在OLED 屏幕,按键实现页面切换
概述
本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)内部RTC的应用的相关内容,包括使用FSP配置RTC的参数,FSP提供的RTC相关的应用函数接口,还编写一个Demo,调用RTC的函数接口,实现时间数据的实时更新功能。
1 软硬件
1.1 软硬件环境信息
软硬件信息 | 版本信息 |
---|---|
Renesas MCU | R7FA8D1BH |
Keil | MDK ARM 5.38 |
FSP 版本 | 5.3.0 |
调试工具:N32G45XVL-STB | DAP-LINK |
1.2 开发板信息
笔者选择使用野火耀阳开发板_瑞萨RA8,该板块的主控MCU为R7FA8D1BHECBD,7FA8D1BHECBD的内核为ARM Contex-M85。
1.3 调试器信息
对于R7FA8D1BHECBD芯片,其使用的内核为Cortex®-M85 Core, ST-LINK-V2或者J-LINK-V9不支持下载和调试功能。笔者经过多次尝试,发现N32G45XVL-STB板卡上自带的DAP-LINK可以下载和调试R7FA8D1BHECBD。
下图为N32G45XVL-STB开发板实物图:
2 FSP配置RTC
2.1 配置参数
1)2)在Stacks面板上创建RTC模块
2)其他参数,选择默认值
3) 配置完成参数后,生成项目代码,在hal_data.c文件中查看和RTC相关的代码
2.2 RTC模块介绍
RTC HAL模块配置RTC模块,控制时钟、日历和闹钟功能。回调可用于响应警报和周期性中断。
主要特性:
RTC时间和日期的获取和设置。
RTC时间和日期报警的获取和设置。
RTC告警和定时事件通知。
RTC时间捕获。
RTC HAL模块支持三种不同的中断类型:
1)当匹配年、月、日、星期中的某一天、小时、分钟或秒的任意组合时产生的警报中断
2)每2、1、1/2、1/4、1/8、1/16、1/32、1/64、1/128或1/256秒产生的周期性中断。
3)当从RTC日历读取时间以获得准确的时间读数时,内部使用进位中断
3 RTC相关函数
3.1 R_RTC_Open()
函数原型:
fsp_err_t R_RTC_Open ( rtc_ctrl_t *const p_ctrl,
rtc_cfg_t const *const p_cfg
)
应用范例:
/* Open the RTC module */
err = R_RTC_Open(&g_rtc0_ctrl, &g_rtc0_cfg);
返回值:
Return values
FSP_SUCCESS Initialization was successful and RTC has started. FSP_ERR_ASSERTION Invalid p_ctrl or p_cfg pointer. FSP_ERR_ALREADY_OPEN Module is already open. FSP_ERR_INVALID_ARGUMENT Invalid time parameter field.
3.2 R_RTC_Close()
函数原型:
fsp_err_t R_RTC_Close ( rtc_ctrl_t *const p_ctrl )
返回值:
Return values
FSP_SUCCESS De-Initialization was successful and RTC driver closed. FSP_ERR_ASSERTION Invalid p_ctrl. FSP_ERR_NOT_OPEN Driver not open already for close.
3.3 R_RTC_ClockSourceSet()
函数原型:设置时钟源
fsp_err_t R_RTC_ClockSourceSet ( rtc_ctrl_t *const p_ctrl )
应用范例:
/* This condition can differ based on use case. */
if (R_SYSTEM->RSTSR0 == 1)
{
/* Set the RTC clock source. Can be skipped if "Set Source Clock in Open" property is enabled. */
R_RTC_ClockSourceSet(&g_rtc0_ctrl);
}
返回值:
Return values
FSP_SUCCESS Initialization was successful and RTC has started. FSP_ERR_ASSERTION Invalid p_ctrl or p_cfg pointer. FSP_ERR_NOT_OPEN Driver is not opened. FSP_ERR_INVALID_ARGUMENT Invalid clock source.
3.4 R_RTC_CalendarTimeSet()
函数原型: 设置时间
fsp_err_t R_RTC_CalendarTimeSet ( rtc_ctrl_t *const p_ctrl,
rtc_time_t *const p_time
)
返回值:
Return values
FSP_SUCCESS Calendar time set operation was successful. FSP_ERR_ASSERTION Invalid input argument. FSP_ERR_NOT_OPEN Driver not open already for operation. FSP_ERR_INVALID_ARGUMENT Invalid time parameter field.
3.5 R_RTC_CalendarTimeGet()
函数原型: 获取实时时间
fsp_err_t R_RTC_CalendarTimeGet ( rtc_ctrl_t *const p_ctrl,
rtc_time_t *const p_time
)
返回值:
Return values
FSP_SUCCESS Calendar time get operation was successful. FSP_ERR_ASSERTION Invalid input argument. FSP_ERR_NOT_OPEN Driver not open already for operation. FSP_ERR_IRQ_BSP_DISABLED User IRQ parameter not valid
4 应用案例
4.1 功能介绍
1) 初始化函数
代码15~23行: 初始化RTCv日期和时间
代码26~39行: 实现初始化函数功能
2)获取RTC功能函数
代码47行: 获取实时时间
代码48行:每个1s打印时间log
4.2 源代码文件
/*
FILE NAME : bsp_rtc.c
Description: RTC interface
Author : tangmingfei2013@126.com
Date : 2024/06/03
*/
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "bsp_rtc.h"
#include "hal_data.h"
#define USER_YEAR 2024
rtc_time_t set_time =
{
.tm_sec = 10,
.tm_min = 20,
.tm_hour = 21,
.tm_mday = 11,
.tm_mon = 8,
.tm_year = USER_YEAR-1900,
};
rtc_time_t get_time;
void user_rtc_Init (void)
{
fsp_err_t err = FSP_SUCCESS;
/* Open 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);
/* Set the calendar time */
R_RTC_CalendarTimeSet(&g_rtc0_ctrl, &set_time);
/* Get the calendar time */
R_RTC_CalendarTimeGet(&g_rtc0_ctrl, &get_time);
}
void user_get_rtc(void)
{
rtc_time_t *rtc_time_t;
static int sec;
rtc_time_t = &get_time;
R_RTC_CalendarTimeGet(&g_rtc0_ctrl, rtc_time_t);
if( rtc_time_t->tm_sec != sec )
{
sec = rtc_time_t->tm_sec;
printf("Current time: %04d/%02d/%02d/ %02d:%02d:%02d \n",
rtc_time_t->tm_year+1900, rtc_time_t->tm_mon, rtc_time_t->tm_mday,
rtc_time_t->tm_hour, rtc_time_t->tm_min, rtc_time_t->tm_sec);
}
}
void user_get_currentRtc( rtc_time_t* rtc_time_t)
{
R_RTC_CalendarTimeGet(&g_rtc0_ctrl, rtc_time_t);
}
5 测试
5.1 测试代码介绍
代码189行: 获取实时RTC值
代码190行:得到秒数据,当秒被改变时,读取sensor数据,实时显示在OLED上
5.2 测试功能
编译代码下载到板卡中,其执行步骤如下:
1)编译和下载代码
2)板卡中运行代码:
硬件环境:
运行结果:
实时刷新sensor的值