來源:strongerHuang
以前做項目要用時鐘,都是外掛一個時鐘芯片,隨著需求的增長和技術的發展,很多MCU內部都集成了RTC(實時時鐘)這個模塊。
本文結合e2 studio開發環境、RA8D1單片機給大家描述RTC這個模塊的使用方法。
準備工作
1下載并安裝e2studio工具
下載地址,推薦瑞薩官方的GitHub:
GitHub
https://github.com/renesas/fsp/releases
我們這里以瑞薩RA8D1單片機為例(當然,其實RA系列單片機也類似):
e2 studio配置RTC模塊
本文基于e2studio開發環境、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" 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,并打印輸出顯示,最后效果:
通過以上配置其實你會發現很簡單,還有一種通過RTC(1秒)中斷打印輸出,這樣就不需要主動讀取了。
方法其實很簡單,配置中斷:
然后在代碼中增加 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; } }
實現效果一樣,這樣就可以不需要應用程序主動讀取了。
本文就分享到這里,希望對你們有所幫助。
-
單片機
+關注
關注
6065文章
44934瀏覽量
647582 -
實時時鐘
+關注
關注
4文章
305瀏覽量
66867 -
瑞薩
+關注
關注
36文章
22372瀏覽量
87800 -
時鐘芯片
+關注
關注
2文章
265瀏覽量
40629 -
RTC
+關注
關注
2文章
612瀏覽量
68382
原文標題:瑞薩RA8系列教程 | RA8基于e2s實現RTC實時時鐘功能
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
瑞薩RA8D1 CEU介紹與使用說明

評論