c401b953 发表于 2019-1-23 11:10:47

STM32G0 休眠和唤醒问题

///////////////////////////////////////////////////////////
在Standby模式休眠后,等RTC时间到后会复位一次。但进入STOP1模式时,RTC无法唤醒系统
////////////////////////////////////////////////////////////
void RCT_Init(void) {
    /* Enable RTC APB clock*/
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_RTC);
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);

    LL_PWR_EnableBkUpAccess();
    /* Enable LSE only if disabled.*/
    if (LL_RCC_LSE_IsReady() == 0) {
      LL_RCC_ForceBackupDomainReset();
      LL_RCC_ReleaseBackupDomainReset();
      LL_RCC_LSE_Enable();

      while (LL_RCC_LSE_IsReady() != 1) {

      }
      LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE);
    }
    /* Peripheral clock enable */
    LL_RCC_EnableRTC();

    /////////////////////////////////////////////////
    /* ######## ENABLE WUT #################################################*/
    /* Disable RTC registers write protection */
    LL_RTC_DisableWriteProtection(RTC);
    /* Set prescaler according to source clock */
    LL_RTC_SetAsynchPrescaler(RTC, RTC_ASYNCH_PREDIV);
    LL_RTC_SetSynchPrescaler(RTC, RTC_SYNCH_PREDIV);
    /* Disable wake up timer to modify it */
    LL_RTC_WAKEUP_Disable(RTC);
    /* Wait until it is allow to modify wake up reload value */
    while (LL_RTC_IsActiveFlag_WUTW(RTC) != 1) {

    }
    /* Setting the Wakeup time to RTC_WUT_TIME s
         If LL_RTC_WAKEUPCLOCK_CKSPRE is selected, the frequency is 1Hz,
         this allows to get a wakeup time equal to RTC_WUT_TIME s
         if the counter is RTC_WUT_TIME */
    LL_RTC_WAKEUP_SetAutoReload(RTC, 1);
    LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE);
    /* Enable RTC registers write protection */
    LL_RTC_EnableWriteProtection(RTC);
    /* Disable RTC registers write protection */
    LL_RTC_DisableWriteProtection(RTC); //禁用RTC寄存器写入保护
    /* Enable wake up counter and wake up interrupt */
    /* Note: Periodic wakeup interrupt should be enabled to exit the device
       from low-power modes.*/
    LL_RTC_EnableIT_WUT(RTC); //启用唤醒计数器和唤醒中断(没看见这个中断入口函数)
    LL_RTC_WAKEUP_Enable(RTC); //唤醒使能
    /* Enable RTC registers write protection */
    LL_RTC_EnableWriteProtection(RTC);
    /* Reset Internal Wake up flag */
    LL_RTC_ClearFlag_WUT(RTC);
    /* ######## ENTER IN STANDBY MODE ######################################*/

    /////////////////////////////////////////////////

}

void EnterStandbyMode(void) {


    /* Set Standby mode */
    LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY);

    /* Set SLEEPDEEP bit of Cortex System Control Register */
    LL_LPM_EnableDeepSleep();

    /* This option is used to ensure that store operations are completed */


    /* Request Wait For Interrupt */
    __WFI();
}

void EnterSTOP1Mode(void) {


    /* Set STOP1 mode */
    LL_PWR_SetPowerMode(LL_PWR_MODE_STOP1);

    /* Set SLEEPDEEP bit of Cortex System Control Register */
    LL_LPM_EnableDeepSleep();

    /* This option is used to ensure that store operations are completed */


    /* Request Wait For Interrupt */
    __WFI();
}



chifen 发表于 2019-1-23 12:00:10

没有看到你定时多久唤醒

c401b953 发表于 2019-1-23 14:07:01

    /* Setting the Wakeup time to RTC_WUT_TIME s
          If LL_RTC_WAKEUPCLOCK_CKSPRE is selected, the frequency is 1Hz,
          this allows to get a wakeup time equal to RTC_WUT_TIME s
          if the counter is RTC_WUT_TIME */
   LL_RTC_WAKEUP_SetAutoReload(RTC, 1);
   LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE);
一秒唤醒一次

c401b953 发表于 2019-1-23 14:07:23

chifen 发表于 2019-1-23 12:00
没有看到你定时多久唤醒

/* Setting the Wakeup time to RTC_WUT_TIME s
         If LL_RTC_WAKEUPCLOCK_CKSPRE is selected, the frequency is 1Hz,
         this allows to get a wakeup time equal to RTC_WUT_TIME s
         if the counter is RTC_WUT_TIME */
      LL_RTC_WAKEUP_SetAutoReload(RTC, 1);
      LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE);
一秒唤醒一次
页: [1]
查看完整版本: STM32G0 休眠和唤醒问题