OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 25337|回复: 17

使用RTC闹钟,从待机模式唤醒的问题

[复制链接]

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-6-5 12:59:48 | 显示全部楼层 |阅读模式

使用RTC的秒中断来作为实时时间,同时开启闹钟中断可以从待机模式来唤醒
遇到问题:机子运行时可以出现闹钟中断,待机之后闹钟并没唤醒机子。

void RTC_Alm_NVIC_Config(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;
 EXTI_InitTypeDef EXTI_InitStructure;

    // 配置EXTI_Line17(RTC Alarm)上升沿触发
    EXTI_ClearITPendingBit(EXTI_Line17);
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
    NVIC_Init(&NVIC_InitStructure);

}

static void RTC_NVIC_Config(void)

    NVIC_InitTypeDef NVIC_InitStructure;

 NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;  //RTC全局中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级1位,从优先级3位
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //先占优先级0位,从优先级4位
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //使能该通道中断
 NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}

进入待机的代码:
 printf("\n\r Now is %d年 %d月 %d日 %d点 %d分 %d秒 ,星期%d\n\r",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);
    RTC_SetAlarm(RTC_GetCounter() + 10);
    RTC_WaitForLastTask();

 Sys_Enter_Standby();

中断处理
void RTCAlarm_IRQHandler(void)
{
   if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
    {
        // user code

  printf("\n\r RTCAlarm_IRQHandler \n\r");
  printf("\n\r Now is %d年 %d月 %d日 %d点 %d分 %d秒 ,星期%d\n\r",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);
        // 清EXTI_Line17挂起位
        EXTI_ClearITPendingBit(EXTI_Line17);
        // 检查唤醒标志是否设置
        if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
        {
            // 清除唤醒标志
            PWR_ClearFlag(PWR_FLAG_WU);
        }
        RTC_WaitForLastTask();
        // 清RTC报警中断挂起
        RTC_ClearITPendingBit(RTC_IT_ALR);
        RTC_WaitForLastTask();
    }

}

void RTC_IRQHandler(void)
{
  //RTC时钟中断
//每秒触发一次 
  
 if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
 {       
  RTC_Get();//更新时间  
  }
 if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
 {
  RTC_ClearITPendingBit(RTC_IT_ALR);  //清闹钟中断
  printf("\n\rRTC Alarm \n\r"); 
  printf("\n\r Now is %d年 %d月 %d日 %d点 %d分 %d秒 ,星期%d\n\r",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);     
       RTC_SetAlarm(RTC_GetCounter() + 8);
        RTC_WaitForLastTask();
 }               
 RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);  //清闹钟中断
 RTC_WaitForLastTask();                    

}

运行时进入的闹钟中断是第二个中断函数。有用过的朋友么

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-6-5 13:01:26 | 显示全部楼层
void RTC_IRQHandler(void)

void RTCAlarm_IRQHandler(void)

这俩对于alarm的区别有人知道么
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-6-5 16:31:11 | 显示全部楼层
发现问题了,不能使用 // PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能

所以RTC闹钟唤醒时候不能使用WakeUpPin 唤醒,二者只能有一个使用。
不知道有人遇到过么,还是我设置的问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-6-5 23:25:16 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-6-6 01:36:55 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥你也觉得二者只能用其中一个?我很不理解,ST不会这样设计吧
而且在官方文档中对此也没提到过。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-6-6 11:47:33 | 显示全部楼层
回复【5楼】wwjdwy:
---------------------------------
我没这么用过,所以目前为未知状态.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-12-4
在线时间
3 小时
发表于 2013-12-10 11:01:38 | 显示全部楼层
没看明白,具体是什么原因导致没唤醒呢?我也遇到不进入停止模式时中断触发正常,一停止就再也起不来了的问题
回复 支持 反对

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
发表于 2015-1-18 17:31:03 | 显示全部楼层
回复【3楼】wwjdwy:
---------------------------------
大神不知道你是否知道该如何再原子rtc实验中单纯的增加闹钟功能
回复 支持 反对

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-5-15
在线时间
7 小时
发表于 2015-8-1 15:27:18 | 显示全部楼层
回复【8楼】hack906447:
---------------------------------
在rtc初始化函数中开启闹钟中断 然后在编写一个向南中寄存器写定时值的函数 每次用USMART调用这个函数设定闹铃时间即可,自己研究的 方法可能有些笨仅供参考
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-7-27
在线时间
7 小时
发表于 2017-6-14 14:52:01 | 显示全部楼层
本帖最后由 莫非。 于 2017-6-14 14:59 编辑

可以的,而且,待机模式唤醒不需要中断17,使能wakeup引脚就可以了
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RTC_SetAlarm(RTC_GetCounter() + 60); //待机60秒
RTC_WaitForLastTask();               
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_WakeUpPinCmd(ENABLE);
PWR_EnterSTANDBYMode();
这样就可以了而且不需要使能闹钟中断
捕获.PNG
手册也有提到的,这是一个或门


回复 支持 反对

使用道具 举报

9

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-3-7
在线时间
25 小时
发表于 2017-7-24 11:47:35 | 显示全部楼层
RTC设置闹钟的时候,并不需要void RTCAlarm_IRQHandler(void)相关的中断函数,只需要在开启秒中断的时候开启闹钟中断就行了,闹钟中断处理都在void RTC_IRQHandler(void) 里面去处理就行
回复 支持 反对

使用道具 举报

14

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
500
金钱
500
注册时间
2017-4-25
在线时间
110 小时
发表于 2017-7-24 14:53:00 | 显示全部楼层
没弄过,我用的LED做实验闹钟到达之前进入黑屏待机闹钟时间到唤醒屏幕亮但灯不亮。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-1-20
在线时间
2 小时
发表于 2017-10-12 21:51:11 | 显示全部楼层
我遇到了相同的问题
同时采用alarm 和 wkup唤醒standby模式,有时alarm到了会醒不来
我又测休眠前保证PA0为低电平,这样PA0变为高电平直接唤醒,或者RTC时间到也唤醒就好像没问题
如果休眠前PA0高电平,可能会导致alarm唤不醒的情况

你们测下是不是这样
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-12-11
在线时间
4 小时
发表于 2017-12-11 18:01:40 | 显示全部楼层
czr27 发表于 2017-10-12 21:51
我遇到了相同的问题
同时采用alarm 和 wkup唤醒standby模式,有时alarm到了会醒不来
我又测休眠前保证PA0 ...

您好,我也遇到 了相同的问题,请问大神解决了吗,,,
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-12-11
在线时间
4 小时
发表于 2017-12-12 09:22:58 | 显示全部楼层
求大神指点,
stm32f103,采用alarm 和 wkup唤醒standby模式,有时alarm到了会醒不来
我又测休眠前保证PA0为低电平,这样PA0变为高电平直接唤醒,或者RTC时间到也唤醒就好像没问题
如果休眠前PA0高电平,可能会导致alarm唤不醒的情况,,,
回复 支持 反对

使用道具 举报

19

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
793
金钱
793
注册时间
2013-9-29
在线时间
178 小时
发表于 2019-4-10 11:19:43 | 显示全部楼层
stmshine 发表于 2017-12-12 09:22
求大神指点,
stm32f103,采用alarm 和 wkup唤醒standby模式,有时alarm到了会醒不来
我又测休眠前保证PA0 ...

我采用的F429,唤醒用了闹钟和wkup,但闹钟唤不醒,wkup那里我用了下拉的。
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-7-5
在线时间
7 小时
发表于 2019-8-23 16:39:22 | 显示全部楼层
zkyzhh 发表于 2019-4-10 11:19
我采用的F429,唤醒用了闹钟和wkup,但闹钟唤不醒,wkup那里我用了下拉的。

你好,我也在用F429的芯片,和你遇到的现象是一样的,请问你解决了吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-3-12
在线时间
2 小时
发表于 2020-3-23 11:49:41 | 显示全部楼层
出现和楼上一样的问题,在详细看参考手册后解决。
需要按次序在进入待机前清楚相关标志位。

-----------**附上说明摘录**-----------------------------
RTC 复用功能唤醒标志安全清零顺序
如果在 PWR 唤醒标志 (WUTF) 清零之前将所选 RTC 复用功能置 1,则出现下一事件时无法 检测到相关功能,因为检测操作只在信号上升沿到来时执行一次。
为了避免 RTC 复用功能所映射到的引脚发生跳变,并确保器件从停止模式和待机模式正常 退出,建议在进入待机模式之前按照以下顺序进行操作:
● 使用 RTC 闹钟从低功耗模式唤醒器件时:
a) 禁止 RTC 闹钟中断(RTC_CR 寄存器中的 ALRAIE 或 ALRBIE 位)
b) 将 RTC 闹钟 (ALRAF/ALRBF) 标志清零
c) 将 PWR 唤醒 (WUF) 标志清零
d) 使能 RTC 闹钟中断
e) 重新进入低功耗模式
● 使用 RTC 唤醒从低功耗模式唤醒器件时:
a) 禁止 RTC 唤醒中断(RTC_CR 寄存器中的 WUTIE 位)
b) 将 RTC 唤醒 (WUTF) 标志清零
c) 将 PWR 唤醒 (WUF) 标志清零
d) 使能 RTC 唤醒中断
e) 重新进入低功耗模式
● 使用 RTC 入侵从低功耗模式唤醒器件时:
a) 禁止 RTC 入侵中断(RTC_TAFCR 寄存器中的 TAMPIE 位)
b) 将入侵 (TAMP1F/TSF) 标志清零
c) 将 PWR 唤醒 (WUF) 标志清零
d) 使能 RTC 入侵中断
e) 重新进入低功耗模式
● 使用 RTC 时间戳从低功耗模式唤醒器件时:
a) 禁止 RTC 时间戳中断(RTC_CR 寄存器中的 TSIE 位)
b) 将 RTC 时间戳 (TSF) 标志清零
c) 将 PWR 唤醒 (WUF) 标志清零
d) 使能 RTC 时间戳中断
e) 重新进入低功耗模式
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 13:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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