APM32F402R Micro-EVB开发板配有RTC计时器的例程,通过它有助于对RTC性能及其使用的了解。
在未配置显示器件的情况下,它是通过调试用的串口来向外输出信息。
其对调试串口的配置函数为:
- void COM_Config(void)
- {
- USART_Config_T usartConfigStruct;
- usartConfigStruct.baudRate = 115200;
- usartConfigStruct.wordLength = USART_WORD_LEN_8B;
- usartConfigStruct.stopBits = USART_STOP_BIT_1;
- usartConfigStruct.parity = USART_PARITY_NONE;
- usartConfigStruct.mode = USART_MODE_TX_RX;
- usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
- BOARD_COM_Config(COM1, &usartConfigStruct);
- }
通过对该函数的分析,可了解到在使用时该如何设置串口的工作参数。
为使RTC进行工作,其配置函数为:
- void RTC_Config(void)
- {
- RCM_EnableAPB1PeriphClock(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_ConfigPrescaler(50000);
- RTC_WaitForLastTask();
- RTC_ConfigCounter(0);
- RTC_WaitForLastTask();
- RTC_EnableInterrupt(RTC_INT_SEC);
- RTC_WaitForLastTask();
- NVIC_EnableIRQRequest(RTC_IRQn, 0, 0);
- }
在RTC工作时,是通过中断处理函数来将计时值由串口发送出来。
其中断服务的函数内容为:
- void RTC_Isr(void)
- {
- if(RTC_ReadIntFlag(RTC_INT_SEC))
- {
- uint32_t time, hour, minute, second;
- time = RTC_ReadCounter();
- hour = (time / 3600) % 24;
- minute = (time / 60) % 60;
- second = time % 60;
- printf("%ldh:%ldm:%lds\r\n", hour, minute, second);
- OLED_ShowNum(0,2,hour,2,16);
- OLED_ShowNum(24,2,minute,2,16);
- OLED_ShowNum(48,2,second,2,16);
- BOARD_LED_Toggle(LED2);
- RTC_ClearIntFlag(RTC_INT_SEC);
- }
- }
其中的OLED屏显示语句是后期添加的,以取代串口的输出。
经下载测试,其输出内容如图1所示。
图1 测试结果
在添加OLED屏的显示功能后,其主程序为:
- int main(void)
- {
- BOARD_LED_Config(LED2);
- COM_Config();
- RTC_Config();
- BOARD_OLED_Config();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"APM32F402 RTC",16);
- OLED_ShowString(0,2," : :",16);
- while (1)
- {
- }
- }
经程序的下载测试,其显示效果如图2所示,说明其符合预期目标。
图2 计时效果
|