Я настраиваю stm32l100
на режим STANDBY. MCU должен просыпаться 2 раза в секунду. Для этого я использую таймер пробуждения RTC. Но после того, как 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 остановится на этом месте. Не понимаю почему.б. сохраняет сброс исходных флагов, после чего их очищает.
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(); }
Войдите в режим STANDBY.
void pwdm_enter_standby_mode(void) { PWR->CR |= PWR_CR_PDDS_BIT; SCB->SCR |= SCB_SCR_SLEEPDEEP_BIT; __WFI(); }
RCC->CSR
будет 0x00420003. - person Serge Maslyakov   schedule 18.05.20170x1FF80004
равно0xFF870078
- person Serge Maslyakov   schedule 18.05.2017