本帖最后由 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的使用还是比较方便的。为了便于时间的调整,可外接一个按键模块来辅助时间参数的设置。
|