你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 18311|回复: 28

[STM32F3] 【STM32F303开发】(四)实时时钟RTC闹钟和唤醒中断问题的解决

  [复制链接]

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-5-31 20:13:36 | 显示全部楼层 |阅读模式
本帖最后由 风子 于 2015-6-3 23:37 编辑

这两天在搞STM32F303RE的RTC,遇到点问题,求各位大神帮忙看看。情况是这样的:

RTC中设置当前时间为 15年05月31日,星期日(7),15:50:40,

1、开weakup中断,每秒钟来一次中断,用串口输出当前时间值;

2、设置闹钟A在 星期日 15:50:45,并开中断,这样程序运行5秒之后就会产生闹钟A中断,在中断中输出”闹钟A“和当前时间

问题来了,当单独开启weakup中断、程序运行正常,如图1,单独开启闹钟A中断,程序运行也正常,如图2。但是如果同时开启两个中断,那么从输出结果中只能看到weakup的输出,没有闹钟A的输出,结果和图1一样,查看程序运行,发现根本没有进闹钟A的中断。

中断设置中已经设置闹钟中断优先级高于weakup中断,把weakup改为3秒,这样就不会同时发生中断,但是结果还是一样,只能进入一个中断。请问这样的问题是为什么?要怎样改?

(问题已经解决)

QQ截图20150531195424.png QQ截图20150531200258.png

还有个问题,我设置的是50分45秒产生闹钟中断,但是从打印信息来看才44秒,这又是因为什么?是获取当前时间有延迟吗?

问题已经解决,暂时不知道闹钟不准是什么原因,后来测试又是准确了的

经过更改后运行结果如下:

QQ截图20150531231902.png

经过更改后贴上完整的程序和代码附件。

RTC看起来很简单的基本功能,但是使用起来感觉还是蛮复杂的,贴上自己总结的大概使用步骤:

1、打开PWR时钟和Backup区数据访问

2、若使用外部低速时钟(LSE),打开LSE并等待起振

3、选择和打开RTC时钟,等待时钟同步

4、配置时间格式,分频系数等

5、根据需要配置时钟,日期,闹钟,唤醒,输出,时间戳,备份寄存器等模块

6、根据需要配置和打开中断,其中: RTC Alarm ——EXTI line 17 ;

RTC tamper and Timestamps——EXTI line 19 ; RTC wakeup——EXTI line 20

写得不太详细,具体请参考官方库STM32F3函数说明手册和参考手册

相关的程序如下,基本按上面的步骤:

  1. void RTC_Config(void)
  2. {
  3.         RTC_TimeTypeDef RTC_TimeStructure;
  4.         RTC_DateTypeDef RTC_DateStructure;
  5.         RTC_InitTypeDef  RTC_InitStructure;
  6.         RTC_AlarmTypeDef RTC_AlarmStructure;

  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

  8.         PWR_BackupAccessCmd(ENABLE);
  9.         RCC_BackupResetCmd(ENABLE);
  10.         RCC_BackupResetCmd(DISABLE);

  11.         RCC_LSEConfig(RCC_LSE_ON);
  12.         while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  13.         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  14.         RCC_RTCCLKCmd(ENABLE);
  15.         RTC_WaitForSynchro();

  16.         RTC_InitStructure.RTC_HourFormat=RTC_HourFormat_24;
  17.         RTC_InitStructure.RTC_AsynchPrediv=0x7F;
  18.         RTC_InitStructure.RTC_SynchPrediv=0xFF;
  19.         RTC_Init(&RTC_InitStructure);

  20.         RTC_DateStructure.RTC_Date=31;                // 15,05,31
  21.         RTC_DateStructure.RTC_Month=RTC_Month_May;
  22.         RTC_DateStructure.RTC_Year=15;
  23.         RTC_DateStructure.RTC_WeekDay=RTC_Weekday_Sunday;
  24.         RTC_SetDate(RTC_Format_BIN,&RTC_DateStructure);

  25.         RTC_TimeStructure.RTC_H12=RTC_H12_AM;                // 15:50:40
  26.         RTC_TimeStructure.RTC_Hours=15;
  27.         RTC_TimeStructure.RTC_Minutes=50;
  28.         RTC_TimeStructure.RTC_Seconds=40;
  29.         RTC_SetTime(RTC_Format_BIN,&RTC_TimeStructure);
  30.         
  31.         RTC_AlarmStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_WeekDay;
  32.         RTC_AlarmStructure.RTC_AlarmDateWeekDay=RTC_Weekday_Sunday;
  33.         RTC_AlarmStructure.RTC_AlarmMask=RTC_AlarmMask_None;
  34.         RTC_AlarmStructure.RTC_AlarmTime=RTC_TimeStructure;// 15:50:40
  35.         RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=45;// 15:50:45
  36.         RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmStructure);
  37.         RTC_AlarmCmd(RTC_Alarm_A,ENABLE);

  38.         RTC_ITConfig(RTC_IT_ALRA,ENABLE);
  39.         RTC_ITConfig(RTC_IT_WUT,ENABLE);

  40.         RTC_WakeUpCmd(DISABLE);
  41.         RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
  42.         RTC_SetWakeUpCounter(0);
  43.         RTC_WakeUpCmd(ENABLE);
  44.         
  45. }
复制代码
  1. void RTC_NvicExti_Config(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         EXTI_InitTypeDef         EXTI_InitStructure;

  5.         NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
  6.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  7.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  8.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9.         NVIC_Init(&NVIC_InitStructure);

  10.         EXTI_ClearITPendingBit(EXTI_Line17);
  11.         EXTI_InitStructure.EXTI_Line=EXTI_Line17;
  12.         EXTI_InitStructure.EXTI_LineCmd =ENABLE;
  13.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  14.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
  15.         EXTI_Init(&EXTI_InitStructure);
  16.         
  17.         NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn ;
  18.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  19.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  20.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21.         NVIC_Init(&NVIC_InitStructure);

  22.         EXTI_ClearITPendingBit(EXTI_Line20);
  23.         EXTI_InitStructure.EXTI_Line=EXTI_Line20;
  24.         EXTI_InitStructure.EXTI_LineCmd =ENABLE;
  25.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  26.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
  27.         EXTI_Init(&EXTI_InitStructure);

  28. }
复制代码

中断函数中就只是输出信息和清除标志,没有其他的。

  1.    RTC_TimeTypeDef GetTime;
  2.    RTC_DateTypeDef GetDate;

  3. void RTC_Test(void)
  4. {
  5.         RTC_Config();
  6.         RTC_NvicExti_Config();
  7.         //delay_ms(1000);
  8.         
  9.         RTC_GetDate(RTC_Format_BIN,&GetDate);
  10.         printf("Date: %02d,%02d,%02d  星期 %d\n",GetDate.RTC_Year,GetDate.RTC_Month,GetDate.RTC_Date,GetDate.RTC_WeekDay);
  11.         RTC_GetTime(RTC_Format_BIN,&GetTime);
  12.         printf("Time: %2d:%2d:%2d\n",GetTime.RTC_Hours,GetTime.RTC_Minutes,GetTime.RTC_Seconds);
  13.         printf("-----------------------------------------------\n");
  14. }
  15. void RTC_Alarm_IRQHandler(void)
  16. {
  17.         if(RTC_GetITStatus(RTC_IT_ALRA)!=RESET)
  18.                 {
  19.                         RTC_ClearITPendingBit(RTC_IT_ALRA);
  20.                         printf("\n-----------这是闹钟 A ------------------\n");
  21.                         RTC_GetTime(RTC_Format_BIN,&GetTime);
  22.                         printf("Time: %02d:%02d:%02d\n",GetTime.RTC_Hours,GetTime.RTC_Minutes,GetTime.RTC_Seconds);
  23.                         printf("--------------------------------------\n");
  24.                 }
  25.         EXTI_ClearITPendingBit(EXTI_Line17);
  26. }

  27. void RTC_WKUP_IRQHandler(void)
  28. {
  29.         if(RTC_GetITStatus(RTC_IT_WUT))
  30.                 {
  31.                         RTC_ClearITPendingBit(RTC_IT_WUT);
  32.                         RTC_GetTime(RTC_Format_BIN,&GetTime);
  33.                         printf("Time: %02d:%02d:%02d\n",GetTime.RTC_Hours,GetTime.RTC_Minutes,GetTime.RTC_Seconds);
  34.                 }
  35.         EXTI_ClearITPendingBit(EXTI_Line20);
  36. }
复制代码

补上两个中断处理函数,main函数中调用 RTC_Test();然后就进入死循环,没有了

STM32_RTC.rar (1.51 KB, 下载次数: 330)

回复

使用道具 举报

24

主题

313

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-7-29
发表于 2015-5-31 22:11:58 | 显示全部楼层
能把整个工程贴下吗
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-5-31 22:25:28 | 显示全部楼层
yceast 发表于 2015-5-31 22:11
能把整个工程贴下吗

我贴上了剩下部分的代码,相关的就是这些了,另外还有个USART
回复 支持 反对

使用道具 举报

24

主题

313

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-7-29
发表于 2015-5-31 22:28:53 | 显示全部楼层
风子 发表于 2015-5-31 22:25
我贴上了剩下部分的代码,相关的就是这些了,另外还有个USART

非常感谢
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-5-31 22:32:50 | 显示全部楼层

我以为你能帮我回答问题呢
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-5-31 22:52:54 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

57

主题

1159

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-12-6
发表于 2015-6-1 08:27:05 | 显示全部楼层
谢谢楼主            
回复 支持 反对

使用道具 举报

26

主题

492

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-11-11
发表于 2015-6-1 09:13:11 | 显示全部楼层
楼主是用cube生成的工程么
回复 支持 反对

使用道具 举报

7

主题

912

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-4
发表于 2015-6-1 10:26:05 | 显示全部楼层
很详细的资料,支持楼主。
回复 支持 反对

使用道具 举报

24

主题

313

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-7-29
发表于 2015-6-1 11:24:17 | 显示全部楼层
风子 发表于 2015-5-31 22:32
我以为你能帮我回答问题呢

不一定哦  我试验好了  说不定就能帮上你了哦
回复 支持 反对

使用道具 举报

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版