TA的每日心情 | 奋斗 2023-5-10 20:09 |
---|
签到天数: 1742 天 连续签到: 1 天 [LV.Master]伴坛终老
|
STM32L496内置了RTC,完成只需为其配置一个合适的显示器即可实现计时功能。本打算为它配置一个TFT显示屏,然而耗费了大段时间也为如愿,甚是感到奇怪。因为就频率来讲L432与它同为80MHZ,在L432上能实现似乎在L496上应该也可以。此外,F769、F413等主频也都比它高,且也均能驱动,独独L496却难实现。
随后也测试了以LCD5110和OLED屏显示,L496与F767、F413等均能驱动显示。从节省GPIO口的角度出发,这里就为其配置一个IIC接口的OLED屏来实现RTC计时功能。
经实际测试,使用NUCLEO系列的Arduino接口即可直接实现连接,故使用起来十分方便。
OLED屏与L496的连接关系为:
SCLK -- PA.5 SDIN -- PA.6
为达到图示的工作效果,主要涉及的OLED函数是初始化函数、字符显示函数、数值显示函数及字符串显示函数。此外,还需对RTC显示函数加以修改,修改后的程序内容如下:
static void RTC_CalendarShow(void){ RTC_DateTypeDef sdatestructureget; RTC_TimeTypeDef stimestructureget; uint8_t p; /* Get the RTC current Time */ HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN); p=stimestructureget.Seconds; OLED_ShowNum(88,2,p,2,16); OLED_ShowChar(56,2,':',16); p=stimestructureget.Minutes; OLED_ShowNum(64,2,p,2,16); OLED_ShowChar(80,2,':',16); p=stimestructureget.Hours; OLED_ShowNum(40,2,p,2,16); p=sdatestructureget.Date; OLED_ShowNum(88,4,p,2,16); OLED_ShowChar(56,4,'-',16); p=sdatestructureget.Month; OLED_ShowNum(64,4,p,2,16); OLED_ShowChar(80,4,'-',16); p=sdatestructureget.Year; OLED_ShowNum(24,4,2000+p,4,16); OLED_ShowString(24,6,"week:",16); p=sdatestructureget.WeekDay; OLED_ShowNum(64,6,p,2,16); }对应的主函数为:
int main(void){ HAL_Init(); /* Configure the system clock to 80 MHz */ SystemClock_Config(); BSP_LED_Init(LED3); __HAL_RTC_RESET_HANDLE_STATE(&RtcHandle); RtcHandle.Instance = RTC; RtcHandle.Init.HourFormat = RTC_HOURFORMAT_12; RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV; RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV; RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE; RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if(HAL_RTC_Init(&RtcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure RTC Timestamp ############################################*/ RTC_TimeStampConfig(); OLED_Init(); OLED_Clear(); OLED_ShowString(58,0,"RTC",16); OLED_ShowString(18,2,"jinglixixi",16); OLED_ShowString(18,4,"2017.5.10",16); HAL_Delay(1000); HAL_Delay(1000); OLED_Clear(); OLED_ShowString(58,0,"RTC",16); /* Infinite loop */ while (1) { RTC_CalendarShow(); HAL_Delay(100); }} |
|