打印
[应用相关]

关于STM32战舰开发板待机模式RTC闹钟唤醒的一点总结

[复制链接]
759|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
standar|  楼主 | 2020-3-21 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于STM32战舰开发板待机模式RTC闹钟唤醒的一点总结(提供RTC待机自动唤醒源码)


最近学习了STM32上待机模式的设置及唤醒,原子的配套教程上只给出了使用WKUP键唤醒,但在学习了RTC时钟之后许多同僚都冒出了用RTC闹钟上升沿退出待机模式的想法,但貌似论坛上有关这个主题的讲解比较少,也可能是我们实验室的网速太垃圾没有搜到那么多,不管怎样吧,我没在论坛上找到有关源码,倒是看到有人提出WKUP上升沿唤醒和RTC闹钟唤醒不可同时进行,有关这一点,STM32手册上也没有详细介绍,于是就想亲自验证一下,结果如何呢,且听我细细道来:

使用特权

评论回复
沙发
standar|  楼主 | 2020-3-21 20:50 | 只看该作者
首先我们还是要啰嗦一下待机模式的进入与退出:
进入:只有一种方式,就是执行WFI(等待中断)或WFE(等待事件)指令
        教程中程序进入待机模式的程序是在sys.c中,各位设置完毕后执行了WFI_SET()
        也就是说进入待机模式与WKUP键没有直接关联,很多初学者会以为WKUP键上升沿唤醒与长按WKUP键进入待机模式是相对应的(当然也可能只有我这么认为),所以在更改唤醒条件的时候会混乱。

使用特权

评论回复
板凳
standar|  楼主 | 2020-3-21 20:52 | 只看该作者
        OK,现在我们弄清楚进入待机模式是WFI_SET()的功劳,只要调用Sys_Standby()函数就可以实现进入待机模式,用哪个键都是一样的,而且教程程序有使用的是外部中断,于是索性,我将进入待机模式的程序放到外部中断程序中去做,并且将KEY2分配给它作为进入模式的中断入口,期望长按3sKEY2 键可以进入待机模式,结果成功了
        
        这里使用的Check_KEY2()程序是根据教程程序改编的,只注意KEY2是低电平有效

使用特权

评论回复
地板
standar|  楼主 | 2020-3-21 20:53 | 只看该作者
        进入模式大家清楚了之后,我们再来说说退出模式,手册里明确指出退出方式:
       WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位。
但是没有交代能否同时存在互不干扰,于是开始验证
        当WKUP引脚的上升沿作为退出模式的方式的时候,需要有某寄存器的某一位进行设置,    PWR->CSR|=1<<8;       就是它了,那是不是把它屏蔽了就可以使用RTC闹钟了呢,我们先不忙验证RTC闹钟,我们先来弄清楚WKUP上升沿唤醒到底是通过什么方式唤醒。

使用特权

评论回复
5
conditio| | 2020-3-21 20:54 | 只看该作者
       验证过程是这样的:进入待机模式程序放到了外部中断程序里做,因为外部中断程序中有对WKUP键的初始化,所以唤醒程序没有用到,也就是在主程序中没有调用WKUP初始化程序,在外部中断程序中EXTI0_IRQHandler()没有写,执行结果:按下KEY2后可以进入待机模式,按下WKUP可以唤醒,但重复操作几次后出现死机情况,怀疑是没有清除中断0的标志位,加了如下程序后正常:
void EXTI0_IRQHandler(void)
{
    EXTI->PR=1<<0;   
}

使用特权

评论回复
6
conditio| | 2020-3-21 20:55 | 只看该作者
此时,已经可以实现KEY2 进入,WKUP唤醒,可以得知,唤醒也是通过中断的,这时看了一下手册这样介绍WKUP设置位的

为0时WKUP是通用IO口,为1时用于唤醒,那还是不是通用IO口,可以执行外部中断呢?这个疑问我们一会儿再聊。

使用特权

评论回复
7
conditio| | 2020-3-21 20:56 | 只看该作者
是时候聊聊我们期盼已久的RTC闹钟唤醒了,先来梳理一下实验程序:KEY2键按下进入待机模式,WKUP键按下唤醒,接下来我把WKUP键屏蔽掉,也就是将WKUP引脚作为通用IO口使用,在RTC程序中配置闹钟设置,这个在例程中已经配置好了,为了增添一些明显元素,我在程序处理中加了蜂鸣:
if(RTC->CRL&0x0002)
    {
        RTC->CRL&=~(0x0002);
        BEEP=1;
        delay_ms(3000);
        BEEP=0;
    }

使用特权

评论回复
8
downcount| | 2020-3-21 20:57 | 只看该作者
之前有在论坛中搜到使用RTC_AlarmIRQHandler()程序的,这个没有试验,有兴趣的可以试试
要实现闹钟功能,当然还需要闹钟时间的设置程序,这个可以模仿例程中时间的设置程序来做,调用的时候也是通过Usmart那个不错的方法,全部处理好之后下载验证了一下,实现RTC闹钟唤醒,需要提醒的是,此时我依然没有调用WKUP初始化程序,此次进出待机模式是利用exti.c及rtc.c的程序做的。也就是说当屏蔽掉WKUP键唤醒功能时,STM32 是可以顺利通过RTC闹钟唤醒的。

使用特权

评论回复
9
downcount| | 2020-3-21 20:58 | 只看该作者
到目前为止的两个实验分别验证了WKUP及RTC闹钟唤醒,但是之前论坛上出现二者不能同时使用的状况到底是真是假呢,下面来验证下:
第三个实验的预期效果是这样的:KEY2按下进入待机模式,WKUP按下可唤醒,设置RTC闹钟时间后也可唤醒
在第二个实验程序的基础上,我将sys.c程序的相应设置位置1,检查了一下没有可设置变动的了,就等着见证奇迹的时刻了,最后结果很好,两个都可以唤醒,也就是说WKUP唤醒与RTC闹钟唤醒是可以同时使用的

使用特权

评论回复
10
downcount| | 2020-3-21 20:58 | 只看该作者
于是又想,是不是当WKUP键既作为待机模式进入键又作为唤醒键的时候RTC闹钟不能唤醒呢,于是想办法让WKUP键作为进入待机模式,此时我们再来说说前面埋下的疑问,当WKUP位为唤醒使用时还能不能作为通用IO口使用呢?
void EXTI0_IRQHandler(void)
{
    EXTI->PR=1<<0;
    delay_ms(10);
    if(Check_WKUP())        //WK_UP
{
        Sys_Enter_Standby();
}
}
在exti.c中把KEY2按键的处理程序贴到WKUP按键处理程序中,实验结果可以通过长按3秒WKUP键进入待机模式,并且再按下WKUP键唤醒,RTC闹钟也可以进行唤醒

使用特权

评论回复
11
downcount| | 2020-3-21 20:59 | 只看该作者
至此,我的疑问解决了:
1:RTC闹钟唤醒与WKUP键唤醒可以同时使用
2:WKUP键的唤醒方式也是通过中断,只是此时不需要我们写什么代码来退出待机模式,STM32自己知道需要退出待机模式,但需要在处理程序中清除外中断标志位
3:待机模式的退出不需要外加EXTIline17
程序运行后可以实现双唤醒,但由于WKUP键进入与退出都是在外中断程序中做的,按键有时会有抖动导致刚待机马上唤醒的情况
菜鸟一枚,还请各位批评指正

使用特权

评论回复
12
downcount| | 2020-3-21 21:00 | 只看该作者
特提供战舰板RTC 循环自动唤醒例程,见附件!

战舰板 RTC闹钟唤醒实验.rar (180.26 KB)

使用特权

评论回复
13
wowu| | 2020-4-7 13:41 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
14
xiaoqizi| | 2020-4-7 13:41 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
15
磨砂| | 2020-4-7 13:41 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
16
晓伍| | 2020-4-7 13:41 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
17
八层楼| | 2020-4-7 13:42 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

14

帖子

0

粉丝