OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 26238|回复: 39

STM32的RTC闹钟中断 总算整明白了

[复制链接]

  离线 

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
487
金钱
487
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-9-26 21:23:05 | 显示全部楼层 |阅读模式
正点原子公众号

现在用到了STM32的闹钟中断 去唤醒停机模式下的系统
看STM32的demo 里边写的明明白白的 到我的例程上就是不行

后来总结出来了 呵呵 STM32的Demo只是用到了闹钟中断函数RTCAlarm_IRQHandler() 并没有用到RTC全局中断RTC_IRQHandler()    好 那么我的问题就出在这里了

如果两个中断函数同时使用的话,我们必须这样设置才不会有漏洞  RTCAlarm_IRQHandler() 函数的优先级一定要高于RTC_IRQHandler()  

为什么?

原因如下:
1,产生闹钟中断的前一瞬间,一定产生了秒中断,那么会先执行RTC_IRQHandler() 中断函数, 在RTC_IRQHandler() 执行的过程中,闹钟中断标志又被挂起,

由于RTC_IRQHandler()是全局中断函数,必须清除所有的中断标志,程序才能退出该函数, 假如RTC_IRQHandler()  和RTCAlarm_IRQHandler() 是同样的优先级,

要想让程序退出RTC_IRQHandler() 函数,那么你必须清除闹钟中断标志(如果不清除闹钟中断标志,程序会死在RTC_IRQHandler() ), 这样问题又出现了,清除闹钟中断标志后,程序就不会进入RTCAlarm_IRQHandler(),那么RTCAlarm_IRQHandler()函数永远也不会被执行。

我们只有这样做
设置闹钟中断函数RTCAlarm_IRQHandler() 的优先级高于全局中断函数RTC_IRQHandler(),
 在执行全局中断函数RTC_IRQHandler() 的时候,如果产生闹钟中断,那么中断嵌套去执行RTCAlarm_IRQHandler(),执行完毕RTCAlarm_IRQHandler()后,再去执行RTC_IRQHandler() 。

代码如下:

static void RTC_NVIC_Config(void)
{ /*尼玛  闹钟中断的优先级必须必秒中断高
 闹钟中断和秒中断几乎同时到来 秒中断的处理函数 是RTC_IRQHandler()
 如果进入这个函数 那么要想从RTC_IRQHandler()退出  则必须清除所有中断标志
    (包括闹钟中断), 这样 闹钟中断标志被清除 则RTCAlarm_IRQHandler()函数肯定是进不去了
 如果不清楚闹钟中断标志 那么程序会死在RTC_IRQHandler()里边
 综上所述 那种中断必须能打断秒中断的执行 这样程序才能执行到RTCAlarm_IRQHandler()里边
   */
    NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;  //RTC全局中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //使能该通道中断
 NVIC_Init(&NVIC_InitStructure);  

 NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;  //闹钟中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //比RTC全局中断的优先级高
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStructure);
}
static void RTC_Alarm_EXIT(void)
{
 EXTI_InitTypeDef EXTI_InitStructure;
 EXTI_ClearITPendingBit(EXTI_Line17);
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

}


void RTC_IRQHandler(void)
{
     if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
    {
    }
    RTC_ClearITPendingBit(RTC_IT_SEC);
  RTC_WaitForLastTask();

}

void RTCAlarm_IRQHandler(void)
{     if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
      {

      }
     EXTI_ClearITPendingBit(EXTI_Line17);
  RTC_WaitForLastTask();
  RTC_ClearITPendingBit(RTC_IT_ALR);
  RTC_WaitForLastTask();
 }

按照我理解的,就应该是这样,我也实际测试了,结果和预期的一样,呵呵 如果有不对的地方,欢迎拍砖。

回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117247
金钱
117247
注册时间
2010-12-1
在线时间
900 小时
发表于 2013-9-26 21:28:41 | 显示全部楼层
楼主这是F几啊?
F1的RTC只有一个中断服务函数哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复 支持 反对

使用道具 举报

  离线 

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
487
金钱
487
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-9-27 17:08:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我用的是TM32F103RBT6啊  这个我实验成功了 一个中断函数?? 原子哥看错了吧 
我现在的程序都能进去RTCAlarm_IRQHandler()函数 并且一直在运行
回复 支持 反对

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117247
金钱
117247
注册时间
2010-12-1
在线时间
900 小时
发表于 2013-9-27 18:06:45 | 显示全部楼层
回复【3楼】langwanglx:
---------------------------------
嗯,我后面查了下,是对的,有2个服务函数。
我理解错了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-11-18 11:35:06 | 显示全部楼层
回复【楼主位】langwanglx:
---------------------------------
我这两天也遇到一个问题,先设置RTC基本配置,然后开启秒中断,之后开启闹钟中断,在设置闹钟值时候:
    RTC_ClearFlag(RTC_FLAG_SEC);
    while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);
    RTC_SetAlarm(RTC_GetCounter() + 5);
    RTC_WaitForLastTask();

最后一句程序就跑死了: RTC_WaitForLastTask();,
单独跑秒中断日历都是正常的,晶振也起振OK的。楼主有啥指导意见不?
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-11-18 21:59:17 | 显示全部楼层
我的没有设置:
static void RTC_Alarm_EXIT(void)

 EXTI_InitTypeDef EXTI_InitStructure;
 EXTI_ClearITPendingBit(EXTI_Line17);
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure); 

}

正常运行,standby模式进入后可以唤醒
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-11-18 22:02:33 | 显示全部楼层
我的设置RTCAlarm_IRQn较高,还是进入的全局的void RTC_IRQHandler(void)
回复 支持 反对

使用道具 举报

  离线 

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
487
金钱
487
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-11-25 17:40:59 | 显示全部楼层
回复【7楼】wwjdwy:
---------------------------------
是有这种情况... 手册上说 闹钟中断可以进入全局中断函数.
回复 支持 反对

使用道具 举报

  离线 

51

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1551
金钱
1551
注册时间
2013-9-21
在线时间
119 小时
发表于 2015-1-18 10:06:46 | 显示全部楼层
回复【3楼】langwanglx:
---------------------------------
请问楼主如果我用原子哥的rtc实验该如何加入闹钟功能
回复 支持 反对

使用道具 举报

  离线 

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2015-9-4
在线时间
0 小时
发表于 2015-9-9 14:26:30 | 显示全部楼层
好贴  有帮助
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
21
金钱
21
注册时间
2015-9-29
在线时间
0 小时
发表于 2015-9-29 12:59:18 | 显示全部楼层
万分感谢楼主,昨天调了一晚上闹钟就是唤不醒停机模式,看了本帖恍然大悟了,都不用修改,复制楼主的程序段过来项目直接调通~
回复 支持 反对

使用道具 举报

  离线 

78

主题

902

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1497
金钱
1497
注册时间
2013-4-15
在线时间
102 小时
发表于 2015-11-17 10:41:12 | 显示全部楼层
楼主说的对我很有用,谢啦
合肥-文盲
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2015-3-1
在线时间
1 小时
发表于 2015-11-17 15:09:25 | 显示全部楼层
学习研究le
回复 支持 反对

使用道具 举报

  离线 

13

主题

771

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2161
金钱
2161
注册时间
2015-7-26
在线时间
552 小时
发表于 2015-11-17 15:35:42 | 显示全部楼层
学习,mark!!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

0

主题

4

帖子

0

精华

新手上路

Rank: 1

积分
24
金钱
24
注册时间
2015-9-8
在线时间
0 小时
发表于 2015-12-4 17:02:06 | 显示全部楼层
用原子哥的rtc实验,怎么假如闹钟功能啊?用lcd一直改不出来
回复 支持 反对

使用道具 举报

  离线 

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-7-26
在线时间
9 小时
发表于 2016-2-18 21:10:13 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

  离线 

6

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-4-12
在线时间
89 小时
发表于 2016-4-27 22:44:44 | 显示全部楼层
请问楼主闹钟要怎么加啊
回复 支持 反对

使用道具 举报

  离线 

1

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
40
金钱
40
注册时间
2016-6-12
在线时间
13 小时
发表于 2016-6-16 14:12:29 | 显示全部楼层
你这个不用设置counter值和ALARM的值吗?
回复 支持 反对

使用道具 举报

  离线 

9

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
518
金钱
518
注册时间
2015-7-11
在线时间
82 小时
发表于 2016-8-10 12:48:38 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

  离线 

20

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2016-3-17
在线时间
93 小时
发表于 2016-8-10 14:04:17 | 显示全部楼层
  参考一下
回复 支持 反对

使用道具 举报

  离线 

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-8-10
在线时间
13 小时
发表于 2016-8-10 22:30:38 | 显示全部楼层
请问这个闹钟是怎么配置出来的啊?RTC能看懂,但是闹钟完全没有头绪诶
回复 支持 反对

使用道具 举报

  离线 

0

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-8-15
在线时间
43 小时
发表于 2016-8-25 18:36:00 | 显示全部楼层
MARK.........
回复 支持 反对

使用道具 举报

  离线 

15

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2016-1-18
在线时间
61 小时
发表于 2016-9-28 14:57:26 | 显示全部楼层
楼主能否发一下整个工程给我,试了您这个思路,闹钟没出来,我邮箱936679030@qq.com
回复 支持 反对

使用道具 举报

  离线 

4

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2015-9-7
在线时间
65 小时
发表于 2016-9-28 17:33:23 | 显示全部楼层
mark.......
回复 支持 反对

使用道具 举报

  离线 

1

主题

3

帖子

0

精华

新手上路

Rank: 1

积分
16
金钱
16
注册时间
2016-11-1
在线时间
5 小时
发表于 2016-11-1 14:05:06 | 显示全部楼层
大好大 发表于 2016-9-28 14:57
楼主能否发一下整个工程给我,试了您这个思路,闹钟没出来,我邮箱

你好,你有这个闹钟程序吗?    可以分享一下吗?谢谢了
回复 支持 反对

使用道具 举报

  离线 

9

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2016-8-15
在线时间
46 小时
发表于 2016-11-1 14:18:03 | 显示全部楼层
祝中国健儿奥运好成绩
回复 支持 反对

使用道具 举报

  离线 

11

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2016-5-18
在线时间
42 小时
发表于 2016-12-9 22:35:34 | 显示全部楼层
请问·闹钟·程序能发我一份吗?
398325900@qq.com
回复 支持 反对

使用道具 举报

  离线 

1

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
3
金钱
3
注册时间
2016-12-26
在线时间
0 小时
发表于 2016-12-26 11:00:45 | 显示全部楼层
楼主,闹钟程序能给我一份吗,谢谢376319663@qq.com
回复 支持 反对

使用道具 举报

  离线 

8

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2017-3-7
在线时间
18 小时
发表于 2017-3-22 16:49:50 | 显示全部楼层
需要使用外部中断吗,例程里面好像没有啊
回复 支持 反对

使用道具 举报

  离线 

7

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2017-4-25
在线时间
79 小时
发表于 2017-5-8 11:19:46 | 显示全部楼层
按键控制改变LCD上显示的时分秒,年月日,即选定++或--怎么弄?没思路谁知道?按键输入捕获吗?
回复 支持 反对

使用道具 举报

  离线 

8

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-7-6
在线时间
15 小时
发表于 2017-5-24 16:31:22 | 显示全部楼层
楼主,我用的是STM32F0系列的,只有RTC_IRQHandler()怎么办呢
回复 支持 反对

使用道具 举报

  离线 

7

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2017-4-25
在线时间
79 小时
发表于 2017-6-7 15:03:58 | 显示全部楼层
楼主能分享个吗?到现在闹钟中断配置加中断服务函数还没有头绪,2386248280@qq.com
回复 支持 反对

使用道具 举报

  离线 

7

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2017-4-25
在线时间
79 小时
发表于 2017-6-8 14:59:18 | 显示全部楼层
中断服务线17是怎么来的?是什么?我记得外部中断好像是5,10,15
回复 支持 反对

使用道具 举报

  离线 

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2017-7-14
在线时间
29 小时
发表于 2017-7-26 20:09:45 | 显示全部楼层
MARK 好贴
回复 支持 反对

使用道具 举报

  离线 

22

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
531
金钱
531
注册时间
2012-3-30
在线时间
127 小时
发表于 2017-7-27 07:42:01 | 显示全部楼层
时间准不准?
回复 支持 反对

使用道具 举报

  离线 

1

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2016-10-28
在线时间
98 小时
发表于 2017-7-27 08:37:27 来自手机 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

  离线 

5

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
791
金钱
791
注册时间
2016-7-20
在线时间
83 小时
发表于 2017-7-27 11:27:27 | 显示全部楼层
mark一下,过段时间要做时钟。
我是可以什么都不说 ,但不可以什么都不做。
回复 支持 反对

使用道具 举报

  离线 

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-9-26
在线时间
11 小时
发表于 2017-11-13 14:42:47 | 显示全部楼层
ZTO13 发表于 2017-6-8 14:59
中断服务线17是怎么来的?是什么?我记得外部中断好像是5,10,15

17线是RTC的闹钟外部中断  要多看手册  
潜伏LED流水灯百八十年
回复 支持 反对

使用道具 举报

  离线 

2

主题

21

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2017-11-12
在线时间
3 小时
发表于 2017-11-14 20:57:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

  离线 

46

主题

425

帖子

0

精华

高级会员

Rank: 4

积分
736
金钱
736
注册时间
2014-11-18
在线时间
131 小时
发表于 7 天前 | 显示全部楼层
大家小心了,如果是产品上面需要长时间计时的,不能用这个,误差很大的。  最好是用别的时钟芯片来做。
自己选择的路,成家前走完。
回复 支持 反对

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-22 07:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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