在使用SLCDC配置好段码LCD屏之后,则么能不用来显示个时间呢
下面展示下配置RTC的流程


时钟源要选择外部低俗时钟,就是图中的Sub-clock
Frequency Comparision Value(LOCO):时钟源分频,外部低速晶振是32.768khz,故这里分频选择256-1,即32768/256 = 128Hz
Automatic Adjustment Mode:自动校准模式,用于校正Sub-Clock震荡过快或过慢引起的误差,这里选择使能
Automatic Adjustment Period:自动校正的时间,这里选择10秒
Callback:中断回调函数,还配置了闹钟中断和周期型中断优先级

RTC时间结构体,用于配置时间或者读取时间
实验代码,使用串口发送时间,并在段码LCD屏上显示
rtc_time_t time_set =
{
.tm_year = 2025 - 1900,
.tm_mday = 13,
.tm_wday = 5,
.tm_mon = 6 - 1,
.tm_hour = 11,
.tm_min = 48,
.tm_sec = 0,
};
rtc_time_t time_get;
void hal_entry(void)
{
fsp_err_t err;
err = SysTick_Init();
assert(FSP_SUCCESS == err);
err = g_slcdc0.p_api->open(g_slcdc0.p_ctrl,g_slcdc0.p_cfg);
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS);
err = g_slcdc0.p_api->start(g_slcdc0.p_ctrl);
assert(FSP_SUCCESS == err);
err = g_uart9.p_api->open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
err = g_rtc0.p_api->open(g_rtc0.p_ctrl,g_rtc0.p_cfg);
assert(FSP_SUCCESS == err);
err = g_rtc0.p_api->calendarTimeSet(g_rtc0.p_ctrl,&time_set);
assert(FSP_SUCCESS == err);
err = g_rtc0.p_api->periodicIrqRateSet(g_rtc0.p_ctrl,RTC_PERIODIC_IRQ_SELECT_1_SECOND);
assert(FSP_SUCCESS == err);
while(1)
{
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
void rtc_callback(rtc_callback_args_t *p_args)
{
if(p_args->event == RTC_EVENT_PERIODIC_IRQ)
{
g_rtc0.p_api->calendarTimeGet(g_rtc0.p_ctrl,&time_get);
printf ("%d年%d月%d日%d:%d:%d\r\n", time_get.tm_year + 1900,
time_get.tm_mon + 1, time_get.tm_mday,
time_get.tm_hour, time_get.tm_min, time_get.tm_sec);
LCD_ShowTime(&time_get);
}
}
LCD显示时间代码
void LCD_ShowTime(rtc_time_t * const p_time)
{
LCD_ShowSingleNum(1,(uint8_t)p_time->tm_hour/10,0);
LCD_ShowSingleNum(2,(uint8_t)p_time->tm_hour%10,1);
LCD_ShowSingleNum(3,(uint8_t)p_time->tm_min/10,0);
LCD_ShowSingleNum(4,(uint8_t)p_time->tm_min%10,1);
LCD_ShowSingleNum(5,(uint8_t)p_time->tm_sec/10,0);
LCD_ShowSingleNum(6,(uint8_t)p_time->tm_sec%10,0);
}