在CH32V103的内部设置有RTC计时器,将它与OLED屏结合,就可构成一个RTC电子时钟。 实现电子时钟的程序十分简单,其程序代码如下: - int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- Delay_Init();
- RTC_Init();
- GPIO_Toggle_INIT();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(10,0,"CH32V103",16);
- OLED_ShowString(10,2,"RTC TEST",16);
- OLED_ShowString(10,6," : :",16);
- while(1)
- {
- Delay_Ms(500);
- RTC_Get();
- OLED_ShowNum(10,6,calendar.hour,2,16);
- OLED_ShowNum(40,6,calendar.min,2,16);
- OLED_ShowNum(70,6,calendar.sec,2,16);
- }
- }
相应的RTC初始化函数为: - u8 RTC_Init(void)
- {
- u8 temp=0;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- PWR_BackupAccessCmd(ENABLE);
- if(BKP_ReadBackupRegister(BKP_DR1) != 0xA1A1)
- {
- BKP_DeInit();
- RCC_LSEConfig(RCC_LSE_ON);
- while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)
- {
- temp++;
- Delay_Ms(20);
- }
- if(temp>=255)return 1;
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
- RCC_RTCCLKCmd(ENABLE);
- RTC_WaitForLastTask();
- RTC_WaitForSynchro();
- RTC_ITConfig(RTC_IT_SEC, ENABLE);
- RTC_WaitForLastTask();
- RTC_EnterConfigMode();
- RTC_SetPrescaler(32767);
- RTC_WaitForLastTask();
- RTC_Set(2020,11,8,13,58,55); /* Setup Time */
- RTC_ExitConfigMode();
- BKP_WriteBackupRegister(BKP_DR1, 0XA1A1);
- }
- else
- {
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- PWR_WakeUpPinCmd(DISABLE);
- RTC_WaitForSynchro();
- RTC_ITConfig(RTC_IT_SEC, ENABLE);
- RTC_WaitForLastTask();
- }
- RTC_NVIC_Config();
- RTC_Get();
- return 0;
- }
经程序编译下载后,其运行效果如图所示。 RTC电子时钟
|