在 stm32l100 中不工作待机模式
Not working standby mode in the stm32l100
我正在为 STANDBY 模式调整 stm32l100
。 MCU 应该每秒唤醒 2 次。为此,我使用 RTC 唤醒定时器。但是在 MCU 进入 STANDBY 模式后,它会立即唤醒。
如果我使用简单的睡眠模式 (__WFI) 而不是 STANDBY 模式,一切正常。
我的代码在这里
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();
}
所以,我终于明白了。
这是我自己的启动初始化失败。关键在于:
I noted that CSR_SBF never clears. If I uncomment string with while
then MCU stall on it place. I don't understand why.
我将使用 wakeup/standby 标志的代码放在 main
的开头。但是这段代码没有执行此操作 __HAL_RCC_PWR_CLK_ENABLE();
因为该操作将在 oscill 初始化例程中执行。因此,PWR->CSR
处于未定义状态并且 PWR_CSR_WUF
标志永远不会清除。
我正在为 STANDBY 模式调整 stm32l100
。 MCU 应该每秒唤醒 2 次。为此,我使用 RTC 唤醒定时器。但是在 MCU 进入 STANDBY 模式后,它会立即唤醒。
如果我使用简单的睡眠模式 (__WFI) 而不是 STANDBY 模式,一切正常。
我的代码在这里
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(); }
所以,我终于明白了。
这是我自己的启动初始化失败。关键在于:
I noted that CSR_SBF never clears. If I uncomment string with while then MCU stall on it place. I don't understand why.
我将使用 wakeup/standby 标志的代码放在 main
的开头。但是这段代码没有执行此操作 __HAL_RCC_PWR_CLK_ENABLE();
因为该操作将在 oscill 初始化例程中执行。因此,PWR->CSR
处于未定义状态并且 PWR_CSR_WUF
标志永远不会清除。