本帖最后由 jinglixixi 于 2024-11-9 09:42 编辑
RTC是一个独立的定时器,拥有一个连续计数的计数器,可以在相应的软件配置下提供时钟日历的功能。通过修改计数器的值,可以重新设置系统当前的时间和日期。 RTC的功能包括计时和提供当前的时间和日期。它包含两个32位的寄存器,分别用于存储秒、分钟、小时(12或24小时制)、星期几、日期、月份和年份。RTC还可以自动补偿月份的天数,并提供二进制格式的亚秒值。RTC在通过主板电池供电的情况下,即使开发板断电也能独立运行。 在嵌入式系统中,RTC主要用于提供准确的时间。
RTC的内部结构框图如图1所示: 图1 结构框图
对RTC初始化的函数为: static void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
// if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2)
sTime.Hours = 0x23;
sTime.Minutes = 0x58;
sTime.Seconds = 0x0;
sTime.SubSeconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
// HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
sDate.Month = RTC_MONTH_NOVEMBER;
sDate.Date = 0x2;
sDate.Year = 0x24;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
__HAL_RCC_CLEAR_RESET_FLAGS();
}
在LCD屏显示功能的配合下,其获取并显示时间的函数为: static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
{
RTC_DateTypeDef sdatestructureget;
RTC_TimeTypeDef stimestructureget;
HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
LCD_ShowNum(20,30,stimestructureget.Hours,2,YELLOW);
LCD_ShowNum(44,30,stimestructureget.Minutes,2,YELLOW);
LCD_ShowNum(68,30,stimestructureget.Seconds,2,YELLOW);
}
实现电子时钟计时功能的主程序为: int main(void)
{
HAL_Init();
BSP_LED_Init(LD1);
BSP_LED_Init(LD3);
BSP_LED_Init(LD2);
SystemClock_Config();
PeriphCommonClock_Config();
MX_GPIO_Init();
MX_RTC_Init();
BSP_LED_On(LD1);
RTCStatus = 1;
LCD_GPIO();
Lcd_Init();
LCD_Clear(RED);
LCD_ShowString(10,10,"STM32WB09KE",YELLOW);
LCD_ShowString(10,30,"jinglixixi",YELLOW);
HAL_Delay(2000);
LCD_Clear(RED);
LCD_ShowChar(36,30,':',1,YELLOW);
LCD_ShowChar(60,30,':',1,YELLOW);
while (1)
{
RTC_CalendarShow(aShowTime, aShowDate);
HAL_Delay(500);
}
}
经程序的编译与下载,其显示效果如图2所示。 图2 连接与显示
图3 显示效果
|