OpenEdv-开源电子网

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

关于STM32F4的RTC闹铃和唤醒中断不工作

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2016-1-15
在线时间
3 小时
发表于 2016-1-18 10:22:56 | 显示全部楼层 |阅读模式
1金钱
在用RTC实验时我采用的是内部晶振LSI,在时间显示这一块没有问题,但是闹铃和周期唤醒中断不工作。代码如下,请高手指点一下。

#include "rtc.h"
#include "delay.h"
#include "uart.h"
#include "lcd.h"

void RTCSet_Time(uint8_t hour,uint8_t min,uint8_t sec,uint8_t RTC_H12)
{
        RTC_TimeTypeDef RTC_TimeStruct;
        RTC_TimeStruct.RTC_H12=RTC_H12_AM;
        RTC_TimeStruct.RTC_Hours=hour;
        RTC_TimeStruct.RTC_Minutes=min;
        RTC_TimeStruct.RTC_Seconds=sec;
        RTC_SetTime(RTC_Format_BIN,&RTC_TimeStruct);
}

void RTCSet_Date(uint8_t dat,uint8_t mon,uint8_t year,uint8_t week)
{       
        RTC_DateTypeDef RTC_DateStruct;
        RTC_DateStruct.RTC_Date=dat;
        RTC_DateStruct.RTC_Month=mon;
        RTC_DateStruct.RTC_WeekDay=week;
        RTC_DateStruct.RTC_Year=year;  
        RTC_SetDate(RTC_Format_BIN,&RTC_DateStruct);
}

u8 myrtc_init()
{
        RTC_InitTypeDef RTC_InitStruct;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR时钟
        PWR_BackupAccessCmd(ENABLE);        //使能后备寄存器访问
        RCC_LSICmd(ENABLE);             //使能内部时钟
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)   //等待就绪
        {
                ;
        }
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);            //配置RTC为内部低速时钟
    RCC_RTCCLKCmd(ENABLE);                             //使能RTC
    RTC_WaitForSynchro();                              //等待同步
        if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)   //判断是否第一次配置
        {
                RTC_WriteProtectionCmd(DISABLE);              //关闭写保护
        RTC_EnterInitMode();                          //进入初始化模式
        /*外部时钟32KHZ   spre=32KHZ/[(0X63+1)*(0X13F+1)]刚好是1HZ*/               
                RTC_InitStruct.RTC_HourFormat=RTC_HourFormat_24;
                RTC_InitStruct.RTC_AsynchPrediv=0x63;
                RTC_InitStruct.RTC_SynchPrediv=0x13f;     
                RTC_Init(&RTC_InitStruct);                                        //初始化RTC参数
                RTCSet_Time(12,47,56,RTC_H12_AM);
                RTCSet_Date(1,10,16,6);                                           //设置时间,日期
                RTC_ExitInitMode();                            //退出写保护
                RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);  //标记已经初始化RTC
                RTC_WriteProtectionCmd(ENABLE);
        }
        PWR_BackupAccessCmd(DISABLE);                     //关闭后备寄存器访问
        return 0;
}

void RTC_setArma(u8 day,u8 hour,u8 min,u8 sec)
{
        RTC_AlarmTypeDef RTC_AlarmStruct;
        RTC_TimeTypeDef RTC_AlarmTime;
        NVIC_InitTypeDef NVIC_InitStruct;
        EXTI_InitTypeDef EXTI_InitStruct;
        RTC_AlarmCmd(RTC_Alarm_A,DISABLE);                //关定时器A
       
        RTC_AlarmTime.RTC_H12=RTC_H12_AM;
        RTC_AlarmTime.RTC_Hours=hour;
        RTC_AlarmTime.RTC_Minutes=min;
        RTC_AlarmTime.RTC_Seconds=sec;
        RTC_AlarmStruct.RTC_AlarmDateWeekDay=day;   
        RTC_AlarmStruct.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_Date; //按天定时
        RTC_AlarmStruct.RTC_AlarmMask=RTC_AlarmMask_None;                     //精确定时
        RTC_AlarmStruct.RTC_AlarmTime=RTC_AlarmTime;
        RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmStruct);                     //设置闹铃
       
        EXTI_ClearITPendingBit(EXTI_Line22);  //清除外部中断22
        RTC_ClearITPendingBit(RTC_IT_ALRA);   //清除RTC闹铃A中断
        RTC_ITConfig(RTC_IT_ALRA,ENABLE);    //开启闹铃A中断
       
       
        EXTI_InitStruct.EXTI_Line=EXTI_Line22;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStruct);               //初始化中断
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStruct.NVIC_IRQChannel=RTC_Alarm_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);                                                          //中断初始化
}

void RTC_Alarm_IRQHandler()//RTC Alarm (A and B) through EXTI Line
{
        if(RTC_GetFlagStatus(RTC_FLAG_ALRAF))  //AlarmA中断
        {
                RTC_ClearFlag(RTC_FLAG_ALRAF);//清除AlarmA中断
                printf("\n\rRTC_Alarm_IRQHandler()\n\r");
        }
        EXTI_ClearITPendingBit(EXTI_Line22);  //清除外部中断22
}

/************************************************
wkse:Configures the RTC Wakeup clock source,
cnt:Configures the RTC Wakeup counter,自动重装载,减到零中断
**********************************************/
void RTC_Wakeup(u32 wkse,u16 cnt)  //周期性唤醒定时器
{
        EXTI_InitTypeDef EXTI_InitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;
       
        RTC_WakeUpCmd(DISABLE);              //关闭Wake Up
        RTC_WakeUpClockConfig(wkse);         //唤醒时钟选择
        RTC_SetWakeUpCounter(cnt);           //设置自动重装载值
       
        RTC_ClearITPendingBit(RTC_IT_WUT);   //清除Wake Up中断标志
        EXTI_ClearITPendingBit(EXTI_Line17);  //清除外部中断17
        RTC_ITConfig(RTC_IT_WUT,ENABLE);      //开启Wake Up中断
       
        EXTI_InitStruct.EXTI_Line=EXTI_Line17;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStruct);               //初始化中断
               
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStruct.NVIC_IRQChannel=RTC_WKUP_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);                                //WKUP中断初始化
        RTC_WakeUpCmd(ENABLE);                      //开启Wake Up
}

void RTC_WKUP_IRQHandler()//RTC_WKUP_IRQHandler
{

        if(RTC_GetFlagStatus(RTC_FLAG_WUTF))
        {
                RTC_ClearFlag(RTC_FLAG_WUTF);   //清除唤醒中断
                printf("\n\rRTC_GetITStatus(RTC_IT_WUT)\n\r");
        }
        EXTI_ClearITPendingBit(EXTI_Line17);  //清除外部中断17
       
}


还有一个问题是当中断处理函数采用RTC_GetITStatus(),EXTI_ClearITPendingBit(),这对函数判断时,用usmart调试中断函数会直接让串口崩溃,提示检测不到串口了,只能重启电脑才能检测到串口。

最佳答案

查看完整内容[请看2#楼]

硬件仿真器不会进入闹钟中断,请大家在调试RTC的时候不要使用软件或者硬件仿真,因为不会看到效果。 我用硬件仿真一直等待闹钟中断,尝试了两次,结果都是失败的,只有在关闭硬件仿真器的时候闹钟才会正常响应, 有兴趣的话大家可以尝试下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

254

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2015-10-17
在线时间
145 小时
发表于 2016-1-18 10:22:57 | 显示全部楼层
本帖最后由 原_子_哥门徒 于 2016-7-30 12:42 编辑

硬件仿真器不会进入闹钟中断,请大家在调试RTC的时候不要使用软件或者硬件仿真,因为不会看到效果。

硬件仿真不会进入闹钟中断.JPG


我用硬件仿真一直等待闹钟中断,尝试了两次,结果都是失败的,只有在关闭硬件仿真器的时候闹钟才会正常响应,
有兴趣的话大家可以尝试下。


开着单片机翱翔在天空
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2016-1-15
在线时间
3 小时
 楼主| 发表于 2016-1-18 13:08:07 | 显示全部楼层
求原子大哥帮我看看
回复

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2013-5-23
在线时间
46 小时
发表于 2016-2-3 09:30:50 | 显示全部楼层
我也出现一样的问题  进不了 闹钟中断程序
回复

使用道具 举报

0

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2016-2-5
在线时间
13 小时
发表于 2016-2-5 15:38:18 | 显示全部楼层
顶你一下,好贴要顶!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-2-7 19:08:03 | 显示全部楼层
参考我们综合测试实验
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2016-7-19
在线时间
12 小时
发表于 2016-7-19 18:53:43 | 显示全部楼层
我按综合实验的配置了一下,还是进不了闹钟中断
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-7-20 22:11:43 | 显示全部楼层
siguoyalike 发表于 2016-7-19 18:53
我按综合实验的配置了一下,还是进不了闹钟中断

综合实验就可以进入闹钟中断哦。
另外,RTC实验,通过USMART设置闹钟,也可以进入闹钟中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-4-16
在线时间
16 小时
发表于 2016-7-26 13:09:19 | 显示全部楼层
我也遇到了同样的问题,就是F4的RTC闹钟无法进入中断服务函数
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-4-16
在线时间
16 小时
发表于 2016-7-26 13:10:09 | 显示全部楼层
我也遇到了同样的问题,就是F4的RTC闹钟无法进入中断服务函数,你的问题解决了吗?给我讲讲怎么才能进入?
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-4-16
在线时间
16 小时
发表于 2016-7-26 13:11:35 | 显示全部楼层
yangzi6000 发表于 2016-2-3 09:30
我也出现一样的问题  进不了 闹钟中断程序

我也出现一样的问题  进不了 闹钟中断程序,你的问题解决了吗?给我讲讲怎么才能进入中断服务函数?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 21:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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