[N32L4xx] N32L406 RTC唤醒不稳定(sleep模式)

[复制链接]
1176|3
 楼主| Sam131208 发表于 2023-11-29 08:53 | 显示全部楼层 |阅读模式
本帖最后由 Sam131208 于 2023-11-29 08:57 编辑

   RTC唤醒配置为0.5秒唤醒一次,上电后,前三次唤醒,大概1秒多才中断一次。
   另外还有未确认的问题,CPU计算任务重的时候,0.5秒的中断,似乎也变为了1秒钟。
   在STOP2模式下,0.5秒中断比较稳定,尚未发现问题。
   下面时RTC初始化:


    中断处理:
  1.     EXTI_ClrITPendBit(EXTI_LINE20);
  2.     if (RTC_GetITStatus(RTC_INT_WUT) != RESET)
  3.     {
  4.                 RTC_ClrIntPendingBit(RTC_INT_WUT);
  5.     }

    初始化:   
  1.      RTC_InitType  RTC_InitStructure;
  2.      RTC_DateType  RTC_DateStructure;
  3.      RTC_TimeType  RTC_TimeStructure;
  4.      EXTI_InitType EXTI_InitStructure;
  5.      NVIC_InitType NVIC_InitStructure;
  6.         
  7.      PWR_BackupAccessEnable(ENABLE);
  8.     if (0xA5A5 != BKP_ReadBkpData(0x0000) )
  9.     {
  10.                 /* Enable the PWR clock */
  11.                 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE);
  12.                 RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);

  13.                 /* Allow access to RTC */
  14.                 PWR_BackupAccessEnable(ENABLE);
  15.                 /* Disable RTC clock */
  16.                 RCC_EnableRtcClk(DISABLE);

  17.                 /* Enable the LSE OSC32_IN PC14 */
  18.                 RCC_EnableLsi(DISABLE); // LSI is turned off here to ensure that only one clock is turned on
  19.                 RCC_ConfigLse(RCC_LSE_ENABLE,0x1FF);

  20.                 /****Waite LSE Ready *****/
  21.                 while(RCC_GetFlagStatus(RCC_LDCTRL_FLAG_LSERD) == RESET){
  22.                         
  23.                 };
  24.                 RCC_ConfigRtcClk(RCC_RTCCLK_SRC_LSE);
  25.                 RCC_EnableRtcClk(ENABLE);
  26.                 RTC_WaitForSynchro();

  27.                 /* Configure the RTC data register and RTC prescaler */
  28.                 RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  29.                 RTC_InitStructure.RTC_SynchPrediv  = 0xff;
  30.                 RTC_InitStructure.RTC_HourFormat   = RTC_24HOUR_FORMAT;
  31.                 /* Check on RTC init */
  32.                 if (RTC_Init(&RTC_InitStructure) == ERROR)
  33.                 {

  34.                 }

  35.                 RTC_DateStructure.WeekDay = 7;
  36.                 RTC_DateStructure.Date = 1;
  37.                 RTC_DateStructure.Month = 10;
  38.                 RTC_DateStructure.Year = 23;
  39.                 if(RTC_SetDate(RTC_FORMAT_BIN, &RTC_DateStructure) == ERROR){

  40.                 }

  41.                 RTC_TimeStructure.H12 = RTC_AM_H12;
  42.                 RTC_TimeStructure.Hours = 0;
  43.                 RTC_TimeStructure.Minutes = 0;
  44.                 RTC_TimeStructure.Seconds = 0;
  45.                 if (RTC_ConfigTime(RTC_FORMAT_BIN, &RTC_TimeStructure) == ERROR){

  46.                 }
  47.                 /* wake up clock select */
  48.                 RTC_ConfigWakeUpClock(RTC_WKUPCLK_RTCCLK_DIV16);
  49.                 /* wake up timer value */
  50.                 RTC_SetWakeUpCounter(0x400 - 1);
  51.                 BKP_WriteBkpData(0x0000, 0xA5A5);
  52.     }
  53.     EXTI_ClrITPendBit(EXTI_LINE20);
  54.     EXTI_InitStructure.EXTI_Line = EXTI_LINE20;
  55.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  56.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  57.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  58.     EXTI_InitPeripheral(&EXTI_InitStructure);
  59.     /* Enable the RTC WakeUp Interrupt */
  60.     NVIC_InitStructure.NVIC_IRQChannel                   = RTC_IRQn;
  61.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  62.     NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
  63.     NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
  64.     NVIC_Init(&NVIC_InitStructure);

  65.     /* Enable the RTC Wakeup Interrupt */
  66.     RTC_ClrIntPendingBit(RTC_INT_WUT);
  67.     RTC_ConfigInt(RTC_INT_WUT, ENABLE);
  68.     RTC_EnableWakeUp(ENABLE);
o88ne 发表于 2024-8-27 20:47 | 显示全部楼层
你提到使用LSE作为RTC的时钟源,LSE通常比较稳定,但在上电初期,LSE可能还未完全稳定,导致唤醒时间不准确。你可以尝试增加等待LSE稳定的时间(例如延长RCC_ConfigLse()后的等待时间)。
好几遍vh 发表于 2024-9-30 15:23 来自手机 | 显示全部楼层
另外还有未确认的问题,CPU计算任务重的时候,0.5秒的中断
申小林一号 发表于 2024-10-30 20:54 | 显示全部楼层
晶振PLL锁频需要一些时间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

131

帖子

1

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