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);
}
}
实物演示:
|