1

STANDBYモードにチューニングstm32l100しています。MCUは毎秒 2 回起動する必要があります。これにはRTC wakeup timerを使用します。しかし、MCUがSTANDBYモードに入った後、すぐに復帰します。

STANDBYモードの代わりに単純なスリープ モード ( __WFI ) を使用すると、すべて正常に動作します。

私のコードはここにあります

  1. MCU起動後

    を。フラグCSR_SBFCSR_WUFを保存し、その後クリアします。

    if (PWR->CSR & PWR_CSR_SBF_BIT) {
       // ...
    }
    
    if (PWR->CSR & PWR_CSR_WUF_BIT) {
        // ...
    }
    
    PWR->CR |= PWR_CR_CSBF_BIT|PWR_CR_CWUF_BIT;
    
    //while (PWR->CSR & PWR_CSR_SBF_BIT);
    while (PWR->CSR & PWR_CSR_WUF_BIT);
    

    CSR_SBFはクリアされないことに注意しました。文字列のコメントを外すとwhile、その場所でMCUが停止します。理由がわかりません。

    b. リセット ソース フラグを保存し、その後クリアします。

    volatile uint32_t csr;
    csr = RCC->CSR;
    
    // .... saving
    
    // clear flags
    RCC->CSR |= RCC_CSR_RMVF_BIT;
    

    MCUがSTANDBYからウェイクアップした後、すべてのリセット ソース フラグがクリアされます。リセット ソースが存在しないように見えますが、コードは 0x0 から実行されます。

  2. RTC ウェイクアップタイマーのチューニング

    void rtc_set_wakeup_mode(const uint32_t wakeup_counter)
    {
        RTC_WRITE_PROTECT_DISABLE();
        RTC->CR &= ~RTC_CR_WUTE_BIT;
        while (!(RTC->ISR & RTC_ISR_WUTWF_BIT));
    
        RTC->WUTR = wakeup_counter;
        RTC->CR &= 0xfffffff7;
        RTC->CR |= RTC_WAKEUPCLOCK_RTCCLK_DIV2;
    
        __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT();
        __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_RISING_EDGE();
    
        RTC->CR |= RTC_CR_WUTIE_BIT|RTC_CR_WUTE_BIT;
        RTC_WRITE_PROTECT_ENABLE();
    }
    
  3. スタンバイモードに入る

    void pwdm_enter_standby_mode(void)
    {
        PWR->CR |= PWR_CR_PDDS_BIT;
        SCB->SCR |= SCB_SCR_SLEEPDEEP_BIT;
    
        __WFI();
    }
    
4

1 に答える 1

1

ということで、やっと手に入れました。

スタートアップの初期化に関する私自身の失敗でした。鍵はこれにありました:

CSR_SBF はクリアされないことに注意しました。while で文字列のコメントを外すと、その場所で MCU が停止します。理由がわかりません。

の先頭に、ウェイクアップ/スタンバイフラグを操作するコードを配置しましたmain。しかし、このコードはこの操作を実行しませんでした。これは、この操作__HAL_RCC_PWR_CLK_ENABLE();が oscill 初期化ルーチンで実行されるためです。そのため、PWR->CSRは未定義の状態にあり、PWR_CSR_WUFフラグは決してクリアされません。

于 2017-05-18T16:05:32.680 に答える