【CW32L052测评】(学习笔记2)RTC时钟初始化并显示在OLED屏上。
[复制链接]
本帖最后由 yun_an 于 2023-8-5 19:41 编辑
上次把OLED屏勉强点亮了。这次RTC时钟显示在OLED屏幕上。
说勉强主要是因为第一次玩OLED屏,对上层显示方式不够满意,但由于是硬件测评,还是分清主次。
这次遇见了一个bug,就是RTC无法调到24小时模式,即使rtc_handler.TimeStruct.H24 = RTC_HOUR24;
我甚至去查看用户手册,配置了24小时模式对应的寄存器位都毫无作用。
CW_RTC->CR0_f.H24 = 1;
不过既然没用,就这样吧,在哪里跌倒就在哪里躺下。
例程里没有RTC时钟初始化,因此只能自己去函数库里看函数摸索了,
对我现在有用的就以下几个函数:
RTC_Init(&rtc_handler);
RTC_GetTime(RTC_TimeTypeDef* RTC_TimeStruct);
void RTC_SetDate(RTC_DateTypeDef* RTC_DateStruct);
void RTC_SetTime(RTC_TimeTypeDef* RTC_TimeStruct);
void RTC_GetDate(RTC_DateTypeDef* RTC_Date);
配置完成后,rtc就可以很愉快的工作了。
有一个好评的是rtc_init函数会判断是否为第一次上电复位,其他时候都不会再配置一遍RTC值,属实很有心了。
简单附上初始化代码
void RTC_init()
{
RTC_InitTypeDef rtc_handler;
rtc_handler.RTC_ClockSource = RTC_RTCCLK_FROM_LSI;
rtc_handler.TimeStruct.Second = 0x00;
rtc_handler.TimeStruct.H24 = RTC_HOUR12;
rtc_handler.TimeStruct.AMPM = RTC_H12_PM;
rtc_handler.TimeStruct.Minute = 0x12;
rtc_handler.TimeStruct.Hour = 0x05;
rtc_handler.DateStruct.Month = 0x08;
rtc_handler.DateStruct.Year = 0x23;
rtc_handler.DateStruct.Day = 0x05;
//CW_RTC->CR0_f.H24 = 1;
//RTC_SetDate(&rtc_handler.DateStruct);
RTC_Init(&rtc_handler);
//while(1)
//{
// RTC_GetTime(&(rtc_handler.TimeStruct));
// printf("the second is %d\n\r",RTC_BCDToBin(rtc_handler.TimeStruct.Second));
// printf("the hours is %d\n\r",RTC_BCDToBin(rtc_handler.TimeStruct.Hour));
// printf("the Minute is %d\n\r",RTC_BCDToBin(rtc_handler.TimeStruct.Minute));
// printf("the AMPM is %d\n\r",RTC_BCDToBin(rtc_handler.TimeStruct.AMPM));
//}
}
最终成品为:
ps:OLED屏动态刷新,手机拍有刷新效果,人眼无法分辨。
VID_20230805_192813
|