RTC(实时时钟)是嵌入式系统中的重要组件,用于提供精确的时间跟踪功能,即使在系统关机时也能保持准确。 RTC通常由一个专用的硬件模块组成,用于跟踪当前的年、月、日、时、分、秒以及星期等时间信息。在嵌入式系统中,RTC的应用非常广泛,包括记录事件的时间戳、执行定时任务、调度系统操作等等。
APM32F402R的RTC模块框图如下:
本次实验是开发板KEY1按下后,启动5s的定时alarm。
按键初始化:
- BOARD_BUTTON_Config(BUTTON_KEY1, BUTTON_MODE_EINT);
按键KEY1的ISR:
- /*!
- * [url=home.php?mod=space&uid=247401]@brief[/url] This function handles EINT1 Handler
- *
- * @param None
- *
- * @retval None
- *
- */
- void EINT1_IRQHandler(void)
- {
- Button1_Isr();
- }
ISR回调:
- void Button1_Isr(void)
- {
- if(EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE) == SET)
- {
- uint16_t time = RTC_ReadCounter();
- RTC_ConfigAlarm(time + 5);
- RTC_WaitForLastTask();
- printf("Alarm will be triggered in 5 second.\r\n");
- EINT_ClearIntFlag(KEY1_BUTTON_EINT_LINE);
- }
- }
RTC模块初始化如下:
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] RTC Configuration
- *
- * @param None
- *
- * @retval None
- */
- void RTC_Config(void)
- {
- RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);
- /* unLock RTC write protection */
- PMU_EnableBackupAccess();
- RCM_EnableLSI();
- while(RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET);
- RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);
- RCM_EnableRTCCLK();
- /* Wait for RTC clock source synchro */
- RTC_WaitForSynchro();
- RTC_WaitForLastTask();
- RTC_ConfigPrescaler(50000);
- RTC_WaitForLastTask();
- /* Configure counter 0 */
- RTC_ConfigCounter(0);
- RTC_WaitForLastTask();
- /* Enable RTC alarm interrupt */
- RTC_EnableInterrupt(RTC_INT_ALR);
- RTC_WaitForLastTask();
- NVIC_EnableIRQRequest(RTC_IRQn, 0, 0);
- }
RTC模块中断服务函数:
- /**
- * @brief RTC interrupt server
- *
- * @param None
- *
- * @retval None
- */
- void RTC_Isr(void)
- {
- if(RTC_ReadIntFlag(RTC_INT_ALR))
- {
- printf("Alarm arrives!\r\n");
- RTC_ClearIntFlag(RTC_INT_ALR);
- }
- }
实物演示:
|