问题描述:最近在做一个项目,需要实现低功耗,需要把stm32主控进入待机模式,然后使用RTC在指定的时间唤醒,多次进入休眠、唤醒之后,会出现刚进入待机模式后,还没有到达指定的唤醒时间,

系统会自动唤醒。开始以为是进入休眠之前,没有清除一些标志位,所以把相关的中断标志位都清除了一遍,例如的:RTC的唤醒中断、闹钟中断等中断标志位都进行清除、以及进入待机之前把systick也关掉;

然而问题依然没有解决。另外,只有在待机模式下出现这样的问题,停止模式都是ok的,思来想去,把自己都搞得有点懵逼了。

几经折腾之后,终于发现了问题,原来是设置了唤醒时钟后,唤醒时钟会一直有效,会出现重复唤醒的现象,所以出现已进入待机模式,唤醒时间到,就会立刻唤醒,所以当从待机模式下唤醒时,需要禁用掉唤醒时钟,包括闹钟也是如此。

当然相关的中断标志位也需要清除一遍。

android rtc唤醒原因 关闭rtc唤醒功能_android rtc唤醒原因

 

2022.9.22 本以为问题已经彻底解决了,然而被狠狠的打脸了。依然还是出现已进入休眠就会立刻唤醒的。

原因是电路上使用PC13作为WKUP PIN2,而PC13是一个特殊管脚,使用需要特别注意。

 

android rtc唤醒原因 关闭rtc唤醒功能_入侵检测_02

 

用PC13做了3V3的使能开关,结果发现驱动不了,给它输出高,用示波器测量输出还是低;查了很多资料,看到DATASHEET上有这样的描述:

参考手册中的描述,RTC_TAFCR寄存器中的值:

手动在代码中添加了如下部分,也是不起作用:

后来找到这个博客:http://forum.eepw.com.cn/thread/312420/1/

博客里面有这样一个回答,就是关闭入侵检测:

我按照这样在RTC初始化后执行了这一句,还是不行,检查RTC的配置,做如下更改:

这样再次下载程序,PC13就输出高电平了,并且这之后,即使把程序里的HAL_RTCEx_DeactivateTimeStamp(&hrtc);这句注释掉,把RTC中的WKUP打开,PC13依然可以输出脉冲;

我配置完RTC,程序运行起来后,PC13管脚依然会产生一个周期性脉冲,实际上时RTC对外输出的时间戳信号。而我同时把PC13作为WKUP PIN2,所以自然而然会自动被唤醒。

android rtc唤醒原因 关闭rtc唤醒功能_入侵检测_03

 把其配置为DISABLE ,并不起作用,于是把它配置wakeup信号输出,即只有唤醒时才会产生一个信号,所以对我此处并没有影响。

android rtc唤醒原因 关闭rtc唤醒功能_低功耗_04

 

 

总结:在使用PC13 /PC14/PC15管脚时,因为它们的特殊性,所以需要特别注意。