- int main(void)
- {
- APM_MINI_LEDInit(LED2);
- RTC_Config();
- APM_MINI_OLEDInit();
- OLED_Init();
- OLED_line();
- OLED_ShowString(20,0,"APM32F107",16);
- OLED_ShowString(20,2," 8:30:00",16);
- OLED_ShowString(20,4,"jinglixixi",16);
- while(1)
- {
- if(ss==60)
- {
- ss=0;
- mm=mm+1;
- if(mm==60)
- {
- hh=(hh+1)%60;
- }
- }
- OLED_ShowNum(20,2,hh,2,16);
- OLED_ShowNum(44,2,mm,2,16);
- OLED_ShowNum(68,2,ss,2,16);
- Delay_us(100000);
- }
- }
对RTC的配置函数为:
- voidRTC_Config(void)
- {
- RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)RCM_APB1_PERIPH_PMU);
- PMU_EnableBackupAccess();
- RCM_EnableLSI();
- while(RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET);
- RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);
- RCM_EnableRTCCLK();
- RTC_WaitForSynchro();
- RTC_WaitForLastTask();
- RTC_EnableInterrupt(RTC_INT_SEC);
- RTC_WaitForLastTask();
- RTC_ConfigPrescaler(32767);
- RTC_WaitForLastTask();
- NVIC_EnableIRQRequest(RTC_IRQn, 0, 0);
- }
对于秒计时处理是由RTC的中断处理来完成的,其内容为:
- extern uint32_t ss;
- voidRTC_IRQHandler(void)
- {
- if (RTC_ReadIntFlag(RTC_INT_SEC) != RESET)
- {
- RTC_ClearIntFlag(RTC_INT_SEC);
- APM_MINI_LEDToggle(LED2);
- ss=ss+1;
- RTC_WaitForLastTask();
- }
- }
为辅助主程序的时间显示,所配置的数值显示函数为:
- voidOLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
- {
- uint8_tt,temp;
- uint8_tenshow=0;
- for(t=0;t<len;t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
- continue;
- }
- elseenshow=1;
- }
- OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
- }
- }
这样就利用RTC的秒计时功能实现了电子时钟的计时效果,相对来讲还是比较简便的。