使用我的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函数内部调用。
对不起,我没有发布我的状态机图像的声誉
有没有人有任何想法?
也许我需要检查一些深层次的寄存器或类似的东西?
感谢您的帮助 问候 西蒙
答案 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模块中的标志吗?