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

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

[复制链接]
风子 提问时间:2015-5-31 20:13 /
本帖最后由 风子 于 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, 下载次数: 343)

收藏 5 评论28 发布时间:2015-5-31 20:13

举报

28个回答
风子 回答时间:2015-6-3 23:19:15
creep 发表于 2015-6-3 23:03
不知道你是否解决了你提到的那2个问题,闹钟不准和中断优先级问题。
我测试了你的RTC代码,没发现你说的 ...

谢谢你,我之前已经解决了中断的问题,帖子中已经写了,我再看看不准的问题
creep 回答时间:2015-6-3 23:03:05
风子 发表于 2015-6-1 15:32
用的以前的标准外设库

不知道你是否解决了你提到的那2个问题,闹钟不准和中断优先级问题。
我测试了你的RTC代码,没发现你说的问题。
rtc.jpg
测试程序:


STM32Nucleo_F303RE_RTC.rar

下载

573.83 KB, 下载次数: 78, 下载积分: ST金币 -1

RTC_DEMO

creep 回答时间:2015-6-3 23:25:18
风子 发表于 2015-6-3 23:19
谢谢你,我之前已经解决了中断的问题,帖子中已经写了,我再看看不准的问题 ...

我看到你说调整优先级才可以,这2个优先级是无所谓的,谁的高谁的低都不会影响正常的中断。
yceast 回答时间:2015-5-31 22:11:58
能把整个工程贴下吗
风子 回答时间:2015-5-31 22:25:28
yceast 发表于 2015-5-31 22:11
能把整个工程贴下吗

我贴上了剩下部分的代码,相关的就是这些了,另外还有个USART
yceast 回答时间:2015-5-31 22:28:53
风子 发表于 2015-5-31 22:25
我贴上了剩下部分的代码,相关的就是这些了,另外还有个USART

非常感谢
风子 回答时间:2015-5-31 22:32:50

我以为你能帮我回答问题呢
lkl0305 回答时间:2015-5-31 22:52:54
帮顶
你好我好大家好! 回答时间:2015-6-1 08:27:05
谢谢楼主            
为什么是EEFOCUS小白 回答时间:2015-6-1 09:13:11
楼主是用cube生成的工程么
JackieLaura 回答时间:2015-6-1 10:26:05
很详细的资料,支持楼主。
yceast 回答时间:2015-6-1 11:24:17
风子 发表于 2015-5-31 22:32
我以为你能帮我回答问题呢

不一定哦  我试验好了  说不定就能帮上你了哦
风子 回答时间:2015-6-1 11:52:53
yceast 发表于 2015-6-1 11:24
不一定哦  我试验好了  说不定就能帮上你了哦

嗯,加油,部分问题我已经解决了,期待你帮我解决剩下的
yceast 回答时间:2015-6-1 15:15:59
不是用的HAL库啊?
星辰一方 回答时间:2015-6-1 15:27:01
楼主用的不是HAL库吗?
风子 回答时间:2015-6-1 15:32:05
星辰一方 发表于 2015-6-1 15:27
楼主用的不是HAL库吗?

不是,用的标准外设库,之前那个
风子 回答时间:2015-6-1 15:32:51
yceast 发表于 2015-6-1 15:15
不是用的HAL库啊?

用的以前的标准外设库
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版