本帖最后由 jinglixixi 于 2023-2-16 11:59 编辑
APM32F107所提供RTC与通常有一定的区别,只是一个秒计时器,并没有提供时分秒的寄存器及机制处理,为此在使用RTC时,只好借助于这个秒计时器在配上相应的变量和机制处理机制来实现电子时钟功能。 要实现下图所示的计时效果,需设置3个变量来存储时分秒的值。 uint8_thh=8,mm=30, ss=0;
电子时钟计时效果
实现显示效果的主程序为: 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的秒计时功能实现了电子时钟的计时效果,相对来讲还是比较简便的。
|