[APM32F4] APM32F402进休眠RTC唤醒配置

[复制链接]
 楼主| Alden 发表于 2025-6-3 17:14 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2025-6-3 17:17 编辑

#申请原创# #技术资源#
在前面测试了APM32F402进入stop和standby模式后通过按键进行唤醒,但有时候希望芯片可以周期性唤醒,进行喂狗或者其他操作再休眠。
就在前面测试的基础上增加了RTC闹钟的唤醒。
130b7bd3af84e2d5791eb67f39e2c78.png
要注意RTC闹钟要配置到外部17线中断上。
以下是RTC的初始化:
  1. void RTC_Config(void)
  2. {
  3.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);
  4.     EINT_Config_T EINT_ConfigStruct = {0U};
  5.     /* unLock RTC write protection */
  6.     PMU_EnableBackupAccess();
  7.     RCM_EnableLSI();
  8.     while(RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET);
  9.     RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);
  10.     RCM_EnableRTCCLK();

  11.     /* Wait for RTC clock source synchro */
  12.     RTC_WaitForSynchro();
  13.     RTC_WaitForLastTask();

  14.     RTC_ConfigPrescaler(40000);
  15.     RTC_WaitForLastTask();

  16.     /* Configure counter 0 */
  17.     RTC_ConfigCounter(0);
  18.     RTC_WaitForLastTask();

  19.     /* Enable RTC alarm interrupt */
  20.     RTC_EnableInterrupt(RTC_INT_ALR);
  21.     RTC_WaitForLastTask();
  22.   
  23.                                 
  24.     NVIC_EnableIRQRequest(RTC_Alarm_IRQn, 0, 0);
  25.                 EINT_ClearIntFlag(EINT_LINE_17);
  26.                 EINT_ConfigStruct.line =EINT_LINE_17;
  27.                 EINT_ConfigStruct.mode = EINT_MODE_INTERRUPT;
  28.                 EINT_ConfigStruct.trigger = EINT_TRIGGER_FALLING;
  29.                 EINT_ConfigStruct.lineCmd = ENABLE;
  30.                 EINT_Config(&EINT_ConfigStruct);
  31.                
  32. }
RTC的中断中只用清除标志位和做一些判断.
  1. void RTC_Isr(void)
  2. {
  3.     if (EINT_ReadIntFlag(EINT_LINE_17) != RESET)
  4.     {

  5.                                 rtcwkup_flag=1;
  6.                           EINT_ClearIntFlag(EINT_LINE_17);
  7.         RTC_ClearIntFlag(RTC_INT_ALR);
  8.                         
  9.                         
  10.     }
  11. }
进休眠之前要配置RTC唤醒的时间要几秒:
  1. //RTC定时闹钟时间设置以及开启
  2. void RTC_Set_Alarm_Time(uint32_t AlarmValue)
  3. {
  4.   if(AlarmValue == 0)
  5.   {
  6.      return;
  7.   }
  8.                           EINT_ClearIntFlag(EINT_LINE_17);
  9.         RTC_ClearIntFlag(RTC_INT_ALR);

  10.         RTC_ConfigAlarm(RTC_ReadCounter() + AlarmValue);
  11.         RTC_WaitForLastTask();
  12. }


可以通过定义的标志位判断是什么唤醒源唤醒的:
  1. int stop_flag=0;
  2. int rtcwkup_flag=0;
  3. int keywkup_flag=0;
  4. int main(void)
  5. {
  6.     RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR));

  7.     BOARD_LED_Config(LED2);
  8.     BOARD_LED_Config(LED3);
  9.                 RTC_Config();
  10.     Usart_Init();
  11.           printf("run start\r\n");
  12.     /* KEY1 \ KEY2 Set */
  13.     BOARD_BUTTON_Config(BUTTON_KEY1, BUTTON_MODE_EINT);
  14.     BOARD_BUTTON_Config(BUTTON_KEY2, BUTTON_MODE_EINT);

  15.     /* NVIC Priority Set */
  16.     NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_1);
  17.     NVIC_EnableIRQRequest(EINT0_IRQn, 0, 1);
  18.     NVIC_EnableIRQRequest(EINT1_IRQn, 1, 1);

  19.     BOARD_LED_On(LED2);
  20.     BOARD_LED_Off(LED3);

  21. //     Delay(0x7FFFFF);//上电进入休眠测试功耗
  22. //                 stop_flag=1;//上电进入休眠测试功耗
  23.     printf("Press KEY1 to Enter STOP Mode\r\n");
  24.     while (1)
  25.     {

  26.                           Delay(0x7FFFFF);
  27.         BOARD_LED_Toggle(LED2);
  28.                         if(stop_flag==1)
  29.                         {
  30.                                 printf("\r\nIN STOP mode\r\n");
  31.                                 stop_flag=0;
  32.                                 GPIO_ALL_init();
  33.                                 RTC_Set_Alarm_Time(5);

  34.                                 PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFI);//测试stop开启
  35. //                                PMU_EnableWakeUpPin();//测试standby开启
  36. //                                PMU_EnterSTANDBYMode();//测试standby开启
  37.                                 SystemInit();
  38.                                 Usart_Init();
  39.                                 BOARD_LED_Config(LED2);

  40.                                                 printf("\r\nOUT STOP mode\r\n");
  41.                                 if(rtcwkup_flag==1)
  42.                                 {
  43.                                         rtcwkup_flag=0;
  44.                                           printf("\r\nrtc WKUP STOP mode\r\n");
  45.                                 }
  46.                                 if(keywkup_flag==1)
  47.                                 {
  48.                                         keywkup_flag=0;
  49.                                                 printf("\r\nkey WKUP STOP mode\r\n");
  50.                                 }
  51.                         }
  52.     }
  53. }
需要stop模式就这样测试,需要测试standby就打开对应的代码。
用按键唤醒:
2e823fb59e2b1a95f5660aba6aee004.png
等待RTC唤醒:
662ff658441da44c9d8babae51932cb.png
APM32F402_403_SDK_stop_standby_key_RTC.zip (4.51 MB, 下载次数: 2)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

113

帖子

2

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

49

主题

113

帖子

2

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