微信公眾號| strongerHuang
RTC:Real Time Clock,實時時鐘。
以前做項目要用時鐘,都是外掛一個時鐘芯片,隨著需求的增長和技術(shù)的發(fā)展,很多MCU內(nèi)部都集成了RTC(實時時鐘)這個模塊。
本文結(jié)合e2 studio開發(fā)環(huán)境、RA8D1單片機(jī)給大家描述RTC這個模塊的使用方法。
準(zhǔn)備工作
1、下載并安裝e2 studio工具
下載地址,推薦瑞薩官方的GitHub:https://github.com/renesas/fsp/releases
我們這里基于Windows環(huán)境,安裝exe文件,基本根據(jù)提示信息一路next即可。這里不再詳述,推薦參看文章:瑞薩RA8系列教程 | 瑞薩 RA8 開發(fā)環(huán)境搭建
2、準(zhǔn)備RA8D1開發(fā)板
我們這里以瑞薩RA8D1單片機(jī)為例(當(dāng)然,其實RA系列單片機(jī)也類似):

e2 studio配置RTC模塊
本文基于e2 studio開發(fā)環(huán)境、RA8D1單片機(jī),實現(xiàn)日期和時間的功能。
1、創(chuàng)建工程
我們會用到串口打印輸出,這里基于之前分享的UART串口工程進(jìn)行拓展,前面的過程請參看文章:瑞薩RA8系列教程 | 基于e2s實現(xiàn)RA8串口輸出配置
這里說幾個重要的地方,首先是UART串口時鐘,需要選擇SCICLK時鐘:

再次,配置UART對應(yīng)的信息:


還有設(shè)置,菜單:項目 -> C/C++ Project Settings:

2、配置RTC模塊
為了方便大家理解,我們先以最基礎(chǔ)的方式配置RTC,然后,間隔1秒讀一次RTC并通過UART串口打印輸出。
配置RTC:Pins選項下,選擇RTC,配置模式

新建RTC模塊:我們添加RTC模塊并配置相關(guān)屬性(配置常用參數(shù),其實默認(rèn)即可)。


3、添加源代碼
我們這里簡單添加一個RTC模塊(源代碼文件),如圖:

bsp_rtct.c源代碼:
#include "bsp_rtc.h" void RTC_Init(void) { //設(shè)置初始化日期和時間 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); /*設(shè)置時鐘源*/ R_RTC_ClockSourceSet (g_rtc.p_ctrl); /* 設(shè)置日期時間 */ 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
這里我們只簡單的配置(初始化)了日期和時間,然后在應(yīng)用程序中,間隔1秒讀取并打印輸出。
void hal_entry(void) { tatic rtc_time_t get_time; Debug_UART3_Init(); // SCI3 UART 調(diào)試串口初始化 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 /*獲取當(dāng)前時間*/ R_RTC_CalendarTimeGet (g_rtc.p_ctrl, &get_time); /*打印當(dāng)前時間*/ 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,并打印輸出顯示,最后效果:

通過以上配置其實你會發(fā)現(xiàn)很簡單,還有一種通過RTC(1秒)中斷打印輸出,這樣就不需要主動讀取了。
方法其實很簡單,配置中斷:

然后在代碼中增加 rtc_callback 這個中斷回調(diào)函數(shù)。
void rtc_callback(rtc_callback_args_t *p_args) { static rtc_time_t get_time; switch (p_args->event) { /*若是周期中斷,則打印日期時間*/ case RTC_EVENT_PERIODIC_IRQ: /*獲取當(dāng)前時間*/ R_RTC_CalendarTimeGet (g_rtc.p_ctrl, &get_time); /*打印當(dāng)前時間*/ 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; } }
實現(xiàn)效果一樣,這樣就可以不需要應(yīng)用程序主動讀取了。
好了,本文就分享到這里,希望對你們有所幫助。
免費樣品申請
https://jsj.top/f/AgUyYV
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
瑞薩中文社區(qū)
https://www.ramcu.cn/
-
實時時鐘
+關(guān)注
關(guān)注
4文章
314瀏覽量
67059 -
瑞薩電子
+關(guān)注
關(guān)注
37文章
2929瀏覽量
73270 -
RTC
+關(guān)注
關(guān)注
2文章
622瀏覽量
68851
發(fā)布評論請先 登錄
瑞薩RA8快速上手指南:Cortex-M85內(nèi)核瑞薩RA8開發(fā)環(huán)境搭建 并點亮一個LED

瑞薩面向電機(jī)控制應(yīng)用推出性能卓越的RA8 MCU

IAR為瑞薩RA8系列MCU開發(fā)提供支持
AMEYA360 | 皇華:瑞薩面向電機(jī)控制應(yīng)用推出性能卓越的RA8 MCU
瑞薩電子RA家族推出RA8系列高算力通用MCU

瑞薩電子全新RA8系列MCU產(chǎn)品介紹

瑞薩電子RA8E1和RA8E2 MCU新品解讀

瑞薩RA8系列教程 | 學(xué)習(xí) RA8 ??次臋n手冊

瑞薩RA8系列教程 | 基于e2s實現(xiàn)RA8串口輸出配置

瑞薩RA8系列教程 | 基于 e2 studio 創(chuàng)建RA8工程

評論