全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 控制/MCU >

瑞萨RA8D1单片机RTC模块实现方法

时间:2025-04-16 14:08

人气:

作者:admin

标签: 时钟芯  RTC  实时时钟  瑞萨 

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

来源:strongerHuang

RTC:Real Time Clock,实时时钟

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

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

准备工作

1下载并安装e2studio工具

下载地址,推荐瑞萨官方的GitHub:

GitHub

https://github.com/renesas/fsp/releases

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

5089bb0e-19b0-11f0-9310-92fbcf53809c.png

e2 studio配置RTC模块

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

1创建工程

我们会用到串口打印输出,这里基于之前分享的UART串口工程进行拓展。这里说几个重要的地方,首先是UART串口时钟,需要选择SCICLK时钟:

50afaf1c-19b0-11f0-9310-92fbcf53809c.png

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

50cec0d2-19b0-11f0-9310-92fbcf53809c.png

50e9de30-19b0-11f0-9310-92fbcf53809c.png

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

511260bc-19b0-11f0-9310-92fbcf53809c.png

2配置RTC模块

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

配置RTC:Pins选项下,选择RTC,配置模式。

5128309a-19b0-11f0-9310-92fbcf53809c.png

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

513acc6e-19b0-11f0-9310-92fbcf53809c.png

515f4012-19b0-11f0-9310-92fbcf53809c.png

3添加源代码

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

519fa09e-19b0-11f0-9310-92fbcf53809c.png

bsp_rtct.c源代码:

#include"bsp_rtc.h"


voidRTC_Init(void)
{
 //设置初始化日期和时间
 rtc_time_tset_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头代码:
#ifndefBSP_RTC_H
#defineBSP_RTC_H


#include"hal_data.h"


/**********日期宏定义**********/
#defineRTC_YEAR_SET 2024   //年
#defineRTC_MON_SET 10     //月
#defineRTC_MDAY_SET 31     //日
/*换算星期*/
#defineRTC_WDAY_SET (RTC_YEAR_SET-2000 
         + ((RTC_YEAR_SET-2000)/4) 
         - 35 + (26*(RTC_MON_SET+1))/10 
         + RTC_MDAY_SET -1 )%7


/**********时间宏定义**********/
#defineRTC_HOUR_SET 23     //时
#defineRTC_MIN_SET 59     //分
#defineRTC_SEC_SET 50     //秒


voidRTC_Init(void);


#endif
这里我们只简单的配置(初始化)了日期和时间,然后在应用程序中,间隔1秒读取并打印输出。
voidhal_entry(void)
{
 staticrtc_time_tget_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
", 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,并打印输出显示,最后效果:

51b4eb70-19b0-11f0-9310-92fbcf53809c.png

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

方法其实很简单,配置中断:

51c731c2-19b0-11f0-9310-92fbcf53809c.png

然后在代码中增加 rtc_callback 这个中断回调函数。

voidrtc_callback(rtc_callback_args_t*p_args)
{
  staticrtc_time_tget_time;


  switch(p_args->event)
   {
    /*若是周期中断,则打印日期时间*/
    caseRTC_EVENT_PERIODIC_IRQ:


     /*获取当前时间*/
     R_RTC_CalendarTimeGet(g_rtc.p_ctrl, &get_time);


     /*打印当前时间*/
     printf("RTC:%d-%d-%d-%d:%d:%d
", 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;
   }
}

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

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

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信