微信公众号| strongerHuang
RTC:Real Time Clock,实时时钟。
以前做项目要用时钟,都是外挂一个时钟芯片,随着需求的增长和技术的发展,很多MCU内部都集成了RTC(实时时钟)这个模块。
本文结合e2 studio开发环境、RA8D1单片机给大家描述RTC这个模块的使用方法。
准备工作
1、下载并安装e2 studio工具
下载地址,推荐瑞萨官方的GitHub:https://github.com/renesas/fsp/releases
我们这里基于Windows环境,安装exe文件,基本根据提示信息一路next即可。这里不再详述,推荐参看文章:瑞萨RA8系列教程 | 瑞萨 RA8 开发环境搭建
2、准备RA8D1开发板
我们这里以瑞萨RA8D1单片机为例(当然,其实RA系列单片机也类似):

e2 studio配置RTC模块
本文基于e2 studio开发环境、RA8D1单片机,实现日期和时间的功能。
1、创建工程
我们会用到串口打印输出,这里基于之前分享的UART串口工程进行拓展,前面的过程请参看文章:瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置
这里说几个重要的地方,首先是UART串口时钟,需要选择SCICLK时钟:

再次,配置UART对应的信息:


还有设置,菜单:项目 -> C/C++ Project Settings:

2、配置RTC模块
为了方便大家理解,我们先以最基础的方式配置RTC,然后,间隔1秒读一次RTC并通过UART串口打印输出。
配置RTC:Pins选项下,选择RTC,配置模式

新建RTC模块:我们添加RTC模块并配置相关属性(配置常用参数,其实默认即可)。


3、添加源代码
我们这里简单添加一个RTC模块(源代码文件),如图:

bsp_rtct.c源代码:
#include "bsp_rtc.h" void RTC_Init(void) { //设置初始化日期和时间 rtc_time_t set_time = { .tm_sec = RTC_SEC_SET, //秒 .tm_min = RTC_MIN_SET, //分 .tm_hour = RTC_HOUR_SET, //小时 .tm_mday = RTC_MDAY_SET, //日(一个月中) .tm_wday = RTC_WDAY_SET, //星期 .tm_mon = RTC_MON_SET - 1 , //月份 .tm_year = RTC_YEAR_SET-1900, //年份 }; /*打开RTC*/ R_RTC_Open (g_rtc.p_ctrl, g_rtc.p_cfg); /*设置时钟源*/ R_RTC_ClockSourceSet (g_rtc.p_ctrl); /* 设置日期时间 */ R_RTC_CalendarTimeSet (g_rtc.p_ctrl, &set_time); }
bsp_rtc.h头代码:
#ifndef BSP_RTC_H #define BSP_RTC_H #include "hal_data.h" /**********日期宏定义**********/ #define RTC_YEAR_SET 2024 //年 #define RTC_MON_SET 10 //月 #define RTC_MDAY_SET 31 //日 /*换算星期*/ #define RTC_WDAY_SET (RTC_YEAR_SET-2000 \ + ((RTC_YEAR_SET-2000)/4) \ - 35 + (26*(RTC_MON_SET+1))/10 \ + RTC_MDAY_SET -1 )%7 /**********时间宏定义**********/ #define RTC_HOUR_SET 23 //时 #define RTC_MIN_SET 59 //分 #define RTC_SEC_SET 50 //秒 void RTC_Init(void); #endif
这里我们只简单的配置(初始化)了日期和时间,然后在应用程序中,间隔1秒读取并打印输出。
void hal_entry(void) { tatic rtc_time_t get_time; Debug_UART3_Init(); // SCI3 UART 调试串口初始化 RTC_Init(); //初始化RTC while(1) { R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_01, BSP_IO_LEVEL_LOW); R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); // 延时500ms R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_01, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); // 延时500ms /*获取当前时间*/ R_RTC_CalendarTimeGet (g_rtc.p_ctrl, &get_time); /*打印当前时间*/ printf("RTC:%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); } }
4、演示效果
这里通过间隔1秒主动读取RTC,并打印输出显示,最后效果:

通过以上配置其实你会发现很简单,还有一种通过RTC(1秒)中断打印输出,这样就不需要主动读取了。
方法其实很简单,配置中断:

然后在代码中增加 rtc_callback 这个中断回调函数。
void rtc_callback(rtc_callback_args_t *p_args) { static rtc_time_t get_time; switch (p_args->event) { /*若是周期中断,则打印日期时间*/ case RTC_EVENT_PERIODIC_IRQ: /*获取当前时间*/ R_RTC_CalendarTimeGet (g_rtc.p_ctrl, &get_time); /*打印当前时间*/ printf("RTC:%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; } }
实现效果一样,这样就可以不需要应用程序主动读取了。
好了,本文就分享到这里,希望对你们有所帮助。
免费样品申请
https://jsj.top/f/AgUyYV
瑞萨技术论坛
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
瑞萨中文社区
https://www.ramcu.cn/
-
实时时钟
+关注
关注
4文章
314浏览量
67065 -
瑞萨电子
+关注
关注
37文章
2929浏览量
73286 -
RTC
+关注
关注
2文章
622浏览量
68869
发布评论请先 登录
瑞萨RA8快速上手指南:Cortex-M85内核瑞萨RA8开发环境搭建 并点亮一个LED

IAR为瑞萨RA8系列MCU开发提供支持
瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置

评论