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

  • 12/02 12:10

微信公众号 | 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){    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:%drn", 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:%drn", 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;      }}

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

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

人工客服
(售后/吐槽/合作/交友)

相关资讯

  1. 1.
  2. 2.
  3. 3.
  4. 4.
  5. 5.
  6. 6.
  7. 7.
  8. 8.
  9. 9.
  10. 10.
  11. 11.
  12. 12.
  13. 13.
  14. 14.
  15. 15.
  16. 16.
  17. 17.
  18. 18.
  19. 19.
  20. 20.
查看全部20条内容