STANDBYモードにチューニングstm32l100
しています。MCUは毎秒 2 回起動する必要があります。これにはRTC wakeup timerを使用します。しかし、MCUがSTANDBYモードに入った後、すぐに復帰します。
STANDBYモードの代わりに単純なスリープ モード ( __WFI ) を使用すると、すべて正常に動作します。
私のコードはここにあります
MCU起動後
を。フラグCSR_SBFとCSR_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 から実行されます。
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(); }
スタンバイモードに入る
void pwdm_enter_standby_mode(void) { PWR->CR |= PWR_CR_PDDS_BIT; SCB->SCR |= SCB_SCR_SLEEPDEEP_BIT; __WFI(); }