搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2015-2-4 10:11:26 | 显示全部楼层 |阅读模式
原本发在正点原子的论坛上的,看到有坛友在问,就转过来给大家看看,放心这个真是我写的,那个论坛上的作者也是我,不存在抄袭



最近学习了STM32上待机模式的设置及唤醒,原子的配套教程上只给出了使用WKUP键唤醒,但在学习了RTC时钟之后许多同僚都冒出了用RTC闹钟上升沿退出待机模式的想法,但貌似论坛上有关这个主题的讲解比较少,也可能是我们实验室的网速太垃圾没有搜到那么多,不管怎样吧,我没在论坛上找到有关源码,倒是看到有人提出WKUP上升沿唤醒和RTC闹钟唤醒不可同时进行,有关这一点,STM32手册上也没有详细介绍,于是就想亲自验证一下,结果如何呢,且听我细细道来:
首先我们还是要啰嗦一下待机模式的进入与退出:
进入:只有一种方式,就是执行WFI(等待中断)或WFE(等待事件)指令
        教程中程序进入待机模式的程序是在sys.c中,各位设置完毕后执行了WFI_SET()
        也就是说进入待机模式与WKUP键没有直接关联,很多初学者会以为WKUP键上升沿唤醒与长按WKUP键进入待机模式是相对应的(当然也可能只有我这么认为),所以在更改唤醒条件的时候会混乱。
        OK,现在我们弄清楚进入待机模式是WFI_SET()的功劳,只要调用Sys_Standby()函数就可以实现进入待机模式,用哪个键都是一样的,而且教程程序有使用的是外部中断,于是索性,我将进入待机模式的程序放到外部中断程序中去做,并且将KEY2分配给它作为进入模式的中断入口,期望长按3sKEY2 键可以进入待机模式,结果成功了
        
        这里使用的Check_KEY2()程序是根据教程程序改编的,只注意KEY2是低电平有效
        进入模式大家清楚了之后,我们再来说说退出模式,手册里明确指出退出方式:
       WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位。
但是没有交代能否同时存在互不干扰,于是开始验证
        当WKUP引脚的上升沿作为退出模式的方式的时候,需要有某寄存器的某一位进行设置,    PWR->CSR|=1<<8;       就是它了,那是不是把它屏蔽了就可以使用RTC闹钟了呢,我们先不忙验证RTC闹钟,我们先来弄清楚WKUP上升沿唤醒到底是通过什么方式唤醒。
        验证过程是这样的:进入待机模式程序放到了外部中断程序里做,因为外部中断程序中有对WKUP键的初始化,所以唤醒程序没有用到,也就是在主程序中没有调用WKUP初始化程序,在外部中断程序中EXTI0_IRQHandler()没有写,执行结果:按下KEY2后可以进入待机模式,按下WKUP可以唤醒,但重复操作几次后出现死机情况,怀疑是没有清除中断0的标志位,加了如下程序后正常:
void EXTI0_IRQHandler(void)
{
    EXTI->PR=1<<0;   
}
此时,已经可以实现KEY2 进入,WKUP唤醒,可以得知,唤醒也是通过中断的,这时看了一下手册这样介绍WKUP设置位的

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

是时候聊聊我们期盼已久的RTC闹钟唤醒了,先来梳理一下实验程序:KEY2键按下进入待机模式,WKUP键按下唤醒,接下来我把WKUP键屏蔽掉,也就是将WKUP引脚作为通用IO口使用,在RTC程序中配置闹钟设置,这个在例程中已经配置好了,为了增添一些明显元素,我在程序处理中加了蜂鸣:
if(RTC->CRL&0x0002)
    {
        RTC->CRL&=~(0x0002);
        BEEP=1;
        delay_ms(3000);
        BEEP=0;
    }
之前有在论坛中搜到使用RTC_AlarmIRQHandler()程序的,这个没有试验,有兴趣的可以试试
要实现闹钟功能,当然还需要闹钟时间的设置程序,这个可以模仿例程中时间的设置程序来做,调用的时候也是通过Usmart那个不错的方法,全部处理好之后下载验证了一下,实现RTC闹钟唤醒,需要提醒的是,此时我依然没有调用WKUP初始化程序,此次进出待机模式是利用exti.c及rtc.c的程序做的。也就是说当屏蔽掉WKUP键唤醒功能时,STM32 是可以顺利通过RTC闹钟唤醒的。
到目前为止的两个实验分别验证了WKUP及RTC闹钟唤醒,但是之前论坛上出现二者不能同时使用的状况到底是真是假呢,下面来验证下:
第三个实验的预期效果是这样的:KEY2按下进入待机模式,WKUP按下可唤醒,设置RTC闹钟时间后也可唤醒
在第二个实验程序的基础上,我将sys.c程序的相应设置位置1,检查了一下没有可设置变动的了,就等着见证奇迹的时刻了,最后结果很好,两个都可以唤醒,也就是说WKUP唤醒与RTC闹钟唤醒是可以同时使用的
于是又想,是不是当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闹钟也可以进行唤醒
至此,我的疑问解决了:
1:RTC闹钟唤醒与WKUP键唤醒可以同时使用
2:WKUP键的唤醒方式也是通过中断,只是此时不需要我们写什么代码来退出待机模式,STM32自己知道需要退出待机模式,但需要在处理程序中清除外中断标志位
3:待机模式的退出不需要外加EXTIline17
程序运行后可以实现双唤醒,但由于WKUP键进入与退出都是在外中断程序中做的,按键有时会有抖动导致刚待机马上唤醒的情况
菜鸟一枚,还请各位批评指正



代码是原子加的,我就不贴了

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-2-4 10:29:50 | 显示全部楼层
专门注册个号来分享经验,lz好人啊。。。

出0入0汤圆

发表于 2015-2-4 11:40:42 | 显示全部楼层
话说等待事件是什么意思  一直看着就是不知道什么意思

出0入0汤圆

发表于 2015-2-4 11:40:47 | 显示全部楼层
myxiaonia 发表于 2015-2-4 10:29
专门注册个号来分享经验,lz好人啊。。。

古二真啊

出0入0汤圆

 楼主| 发表于 2015-2-4 12:41:19 | 显示全部楼层
日日夜夜 发表于 2015-2-4 11:40
话说等待事件是什么意思  一直看着就是不知道什么意思

目测是两种唤醒方式对应的休眠模式吧,我的理解是执行WFI指令进入休眠后唤醒时需要执行被嵌套向量中断控制器响应的外设中断进行唤醒,如果执行WFE指令则需要执行唤醒事件来唤醒单片机,唤醒事件可以在外设控制寄存器中使能中断而不需要再嵌套向量中断控制器中使能,也可以配置EXIT线为事件模式进行唤醒。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 01:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表