我正在调谐到待机模式。MCU每秒应唤醒2次。为此,我使用RTC唤醒计时器。但当MCU进入待机模式后,它会立即唤醒。
如果我用一个简单的睡眠模式(WFI)来代替待机模式,一切都会好起来的。
我的密码在这里
MCU启动后
a.保存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 U SBF从不清除。如果我用stm32l100取消对字符串的注释,则MCU将暂停。我不明白为什么。
保存重置源标志,然后清除它们。
volatile uint32_t csr;
csr = RCC->CSR;

// .... saving

// clear flags
RCC->CSR |= RCC_CSR_RMVF_BIT;

MCU如何从待机状态唤醒后,所有重置源标志都将清除。似乎没有重置源,但代码从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();
}

最佳答案

所以,我终于明白了。
这是我自己的启动初始化失败。关键在于:
我注意到CSR U SBF从不清除。如果我用while取消对字符串的注释
然后MCU停在上面。我不明白为什么。
我将使用唤醒/待机标志的代码放在main开头。但此代码没有执行此操作,因为该操作将在oscill初始化例程中执行。因此,__HAL_RCC_PWR_CLK_ENABLE();处于未定义状态,PWR->CSR标志永远不会清除。

关于c - 在stm32l100中不处于待机模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44046588/

10-09 07:34