2026 / 07 / 22
瑞萨RA8系列教程 | RA8基于e2s实现RTC实时时钟功能

RTC:Real Time Clock,实时时钟。


以前做项目要用时钟,都是外挂一个时钟芯片,随着需求的增长和技术的发展,很多MCU内部都集成了RTC(实时时钟)这个模块。

本文结合e
2 studio开发环境、RA8D1单片机给大家描述RTC这个模块的使用方法。

准备工作

1 下载并安装e2 studio工具

下载地址,推荐瑞萨官方的GitHub:https://github.com/renesas/fsp/releases


我们这里以瑞萨RA8D1单片机为例(当然,其实RA系列单片机也类似):

e2 studio配置RTC模块

本文基于e2 studio开发环境、RA8D1单片机,实现日期和时间的功能。


1 创建工程

我们会用到串口打印输出,这里基于之前分享的UART串口工程进行拓展。这里说几个重要的地方,首先是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)
{
    static 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;
      }
}

实现效果一样,这样就可以不需要应用程序主动读取了。

本文就分享到这里,希望对你们有所帮助。

文件下载
隐私条款

一、接受条款 使用者(也称"您")在访问或使用本网站及其服务时,即已经表示同意并不加修改地接受本《用户协议》、本网站的《隐私声明》、《法律声明》以及其关或相链接的网页和网站的条件和条款的规定。我们强烈建议:在您阅读和接受本《用户协议》时,也应阅读并接受本《用户协议》中所提到《隐私声明》、《法律声明》及其相关或相链接网页或网站所包含的资料,因为《隐私声明》、《法律声明》及其它相关网页或网站可能包含对您适用的进一步规定。(请注意:点击划有底线的词句即可链接到上述《隐私声明》、《法律声明》及其它相关或相链接的网页和网站。

 

二、使用者的资格要求 在本网站中"使用者"指的是浏览、阅读、使用本网站信息或服务的任何个人或组织。本网站的服务仅适用于根据相关法律的规定具有签订有约束力的合同的个人或组织并仅由其使用。本网站的服务不向18周岁以下的个人使用者提供,也不向临时被本网站中止或取消使用者资格的使用者提供。如果使用者不符合本条规定,请停止使用本网站或本网站的服务。

样品
申请

应用
资源

微信