[APM32F4] 【APM32F402R Micro-EVB】-5-RTC Alarm体验

[复制链接]
 楼主| 南来之风 发表于 2025-7-27 14:18 | 显示全部楼层 |阅读模式
RTC(实时时钟)是嵌入式系统中的重要组件,用于提供精确的时间跟踪功能,即使在系统关机时也能保持准确。 RTC通常由一个专用的硬件模块组成,用于跟踪当前的年、月、日、时、分、秒以及星期等时间信息。在嵌入式系统中,RTC的应用非常广泛,包括记录事件的时间戳、执行定时任务、调度系统操作等等。

APM32F402R的RTC模块框图如下:
550256885c33cbe307.png

本次实验是开发板KEY1按下后,启动5s的定时alarm。

按键初始化:
  1. BOARD_BUTTON_Config(BUTTON_KEY1, BUTTON_MODE_EINT);

按键KEY1的ISR:
  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]     This function handles EINT1 Handler
  3. *
  4. * @param     None
  5. *
  6. * @retval    None
  7. *
  8. */
  9. void EINT1_IRQHandler(void)
  10. {
  11.     Button1_Isr();
  12. }

ISR回调:
  1. void Button1_Isr(void)
  2. {
  3.     if(EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE) == SET)
  4.     {
  5.         uint16_t time = RTC_ReadCounter();
  6.         RTC_ConfigAlarm(time + 5);
  7.         RTC_WaitForLastTask();

  8.         printf("Alarm will be triggered in 5 second.\r\n");
  9.         EINT_ClearIntFlag(KEY1_BUTTON_EINT_LINE);
  10.     }
  11. }

RTC模块初始化如下:
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]   RTC Configuration
  3. *
  4. * @param   None
  5. *
  6. * @retval  None
  7. */
  8. void RTC_Config(void)
  9. {
  10.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);

  11.     /* unLock RTC write protection */
  12.     PMU_EnableBackupAccess();
  13.     RCM_EnableLSI();
  14.     while(RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET);
  15.     RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);
  16.     RCM_EnableRTCCLK();

  17.     /* Wait for RTC clock source synchro */
  18.     RTC_WaitForSynchro();
  19.     RTC_WaitForLastTask();

  20.     RTC_ConfigPrescaler(50000);
  21.     RTC_WaitForLastTask();

  22.     /* Configure counter 0 */
  23.     RTC_ConfigCounter(0);
  24.     RTC_WaitForLastTask();

  25.     /* Enable RTC alarm interrupt */
  26.     RTC_EnableInterrupt(RTC_INT_ALR);
  27.     RTC_WaitForLastTask();

  28.     NVIC_EnableIRQRequest(RTC_IRQn, 0, 0);
  29. }

RTC模块中断服务函数:
  1. /**
  2. * @brief   RTC interrupt server
  3. *
  4. * @param   None
  5. *
  6. * @retval  None
  7. */
  8. void RTC_Isr(void)
  9. {
  10.     if(RTC_ReadIntFlag(RTC_INT_ALR))
  11.     {
  12.         printf("Alarm arrives!\r\n");
  13.         RTC_ClearIntFlag(RTC_INT_ALR);
  14.     }
  15. }

实物演示:
query.gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

290

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部