使用__WFI()时STM32L073冻结

时间:2017-04-28 11:40:16

标签: wait freeze stm32

使用我的STM32我尝试配置深度睡眠模式并使用RTC生成中断(实际上每30秒)。

当我的STM启动时,这个配置RTC并直接进入停止模式。 30秒后,电路板唤醒并使用串行配置LoRa无线电模块RN2483与串行通信,并使用I2C读取和写入一些数据。但是对于RN2483的配置,我们需要等待响应(大约需要3秒钟)。

之后,STM再次进入深度睡眠模式。这是一个循环。如果两个深度睡眠之间的这个周期花费太多时间(例如,由于等待或打印),下一个深度睡眠将被错误配置,并且STM永远不会再次唤醒并且功耗很高。

这是我的deepSleep配置

void STM32_DeepSleep(void){
//Clear bits
EXTI->PR &= 0xFF840000;
//Enter in stopmode
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON | PWR_CR_CWUF | PWR_CR_ULP | PWR_CR_FWU , PWR_STOPENTRY_WFI);
}

经过一些研究,我知道问题来自__WFI()函数。这个在HAL_PWR_EnterSTOPMode函数内部调用。

对不起,我没有发布我的状态机图像的声誉

有没有人有任何想法?

也许我需要检查一些深层次的寄存器或类似的东西?

感谢您的帮助 问候 西蒙

2 个答案:

答案 0 :(得分:2)

您正在清除EXTI-PR寄存器错误 它们是rc_w1,因此:EXTI->PR = EXTI_PR_PR15单个写1就足够了。

答案 1 :(得分:0)

可能你错了位。 RTC wakup位于EXTI第20行。此外,您应该使用库提供的函数和宏来设置和清除位。例如,您需要使用它来清除EXTI模块中的RTC唤醒位:

__HAL_RTC_EXTI_CLEAR_FLAG(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);

但是,我从未使用过RTC从低功耗模式唤醒,但是你不需要清除RTC模块中的标志吗?