本帖最后由 werasd 于 2022-5-25 15:09 编辑
HT32F52352芯片内部配有RTC实时时钟电路,它包括APB接口、一个32-bit向上计数器、一个控制寄存器、一个预分频器、一个比较寄存器和一个状态寄存器。 通过RTC与OLED屏相配合,就可快速地构建一个电子时钟,其计时效果如图1和图2所示所示。 图1 RTC计时效果
图2 串口输出效果 要使RTC实现电子时钟的功能,必须对ht32f5xxxx_01_it.c中的原中断处理函数加以修改。 原中断函数是一个空函数,其内容为: void RTC_IRQHandler(void) { } 该函数修改后的内容为: - void RTC_IRQHandler(void)
- {
- extern vu32 gwTimeDisplay;
- u8 bFlags;
- bFlags = RTC_GetFlagStatus();
- if (bFlags & RTC_FLAG_CSEC)
- {
- gwTimeDisplay = 1;
- }
- }
RTC配置函数: - void RTC_Configuration(void)
- {
- PWRCU_DeInit();
- #if (EXAMPLE_NO_LSE == 0) && (LIBCFG_LSE == 1)
- RTC_LSESMConfig(RTC_LSESM_FAST);
- RTC_LSECmd(ENABLE);
- while (CKCU_GetClockReadyStatus(CKCU_FLAG_LSERDY) == RESET);
- RTC_ClockSourceConfig(RTC_SRC_LSE);
- #else
- RTC_ClockSourceConfig(RTC_SRC_LSI);
- #endif
- RTC_IntConfig(RTC_INT_CSEC, ENABLE);
- RTC_SetPrescaler(RTC_RPRE_32768);
- }
另外,此外还需要为RTC设置一个初始的计时值。由于开发板上并没有配置相应的用户键,在未进行扩展的情况下,只好由函数Time_Regulate(void)直接进行设置。 相应的函数内容为: - u32 Time_Regulate(void)
- {
- u32 Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;
- printf("\r\n==============Time Settings=====================================");
- Tmp_HH = 23;
- Tmp_MM = 59;
- Tmp_SS = 52;
- return((Tmp_HH * 3600 + Tmp_MM * 60 + Tmp_SS));
- }
此外,为了显示计时值所使用的函数为: - void Time_Display(u32 wTimeVar)
- {
- u32 THH = 0, TMM = 0, TSS = 0;
- wTimeVar %= 86400;
- THH = wTimeVar/3600;
- TMM = (wTimeVar % 3600)/60;
- TSS = (wTimeVar % 3600)% 60;
- OLED_ShowNum(20,6,THH,2,16);
- OLED_ShowNum(44,6,TMM,2,16);
- OLED_ShowNum(68,6,TSS,2,16);
- }
完成电子时钟功能的主程序为: - int main(void)
- {
- {
- CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
- CKCUClock.Bit.BKP = 1;
- CKCU_PeripClockConfig(CKCUClock, ENABLE);
- }
- #if (!LIBCFG_NO_PWRCU_TEST_REG)
- if (PWRCU_CheckReadyAccessed() != PWRCU_OK)
- {
- while (1);
- }
- #endif
- HT32F_DVB_LEDInit(HT_LED1);
- RETARGET_Configuration();
- NVIC_EnableIRQ(RTC_IRQn);
- RTC_Configuration();
- printf("\r\n RTC configured....");
- TimeReg = Time_Regulate();
- RTC_Cmd(ENABLE);
- oled_GPIO_Configuration();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(20,0,"OLED & RTC",16);
- OLED_ShowString(20,2,"HT32F52352",16);
- OLED_ShowString(20,6," : :",16);
- while (1)
- {
- if (gwTimeDisplay == 1)
- {
- Time_Display(RTC_GetCounter() + TimeReg);
- gwTimeDisplay = 0;
- HT32F_DVB_LEDToggle(HT_LED1);
- }
- }
- }
因此可见,RTC的使用还是比较方便的。为了便于时间的调整,可外接一个按键模块来辅助时间参数的设置。
|