OpenEdv-开源电子网

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

STM32F4无法进入闹钟中断,A和B都不行

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2023-3-9
在线时间
3 小时
发表于 2023-3-14 14:43:31 | 显示全部楼层 |阅读模式
5金钱
NVIC_InitTypeDef   NVIC_InitStructure;
RTC_InitTypeDef  RTC_InitStructure;
RTC_TimeTypeDef  RTC_TimeStruct;
RTC_DateTypeDef  RTC_DateStructure;


ErrorStatus RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm)
{       
        RTC_TimeStruct.RTC_Hours=hour;
        RTC_TimeStruct.RTC_Minutes=min;
        RTC_TimeStruct.RTC_Seconds=sec;
        RTC_TimeStruct.RTC_H12=ampm;
       
        return RTC_SetTime(RTC_Format_BIN,&RTC_TimeStruct);
       
}

//RTC日期设置
//year,month,date:年(0~99),月(1~12),日(0~31)
//week:星期(1~7,0,非法!)
//返回值:SUCEE(1),成功
//       ERROR(0),进入初始化模式失败
ErrorStatus RTC_Set_Date(u8 year,u8 month,u8 date,u8 week)
{
        RTC_DateStructure.RTC_Date=date;
        RTC_DateStructure.RTC_Month=month;
        RTC_DateStructure.RTC_WeekDay=week;
        RTC_DateStructure.RTC_Year=year;
        return RTC_SetDate(RTC_Format_BIN,&RTC_DateStructure);
}

u8 rtc_init(void)
{
        RTC_InitTypeDef RTC_InitStructure;
        //u16 retry=0X1FFF;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
        PWR_BackupAccessCmd(ENABLE);        //使能后备寄存器访问
       
        if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0xA0A0)                //是否第一次配置?
        {
                RCC_LSEConfig(RCC_LSE_ON);//LSE 开启   
                while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)        //检查指定的RCC标志位设置与否,等待低速晶振就绪
                        {
                        //retry++;
                        //delay_ms(10);
                        }
                //if(retry==0)return 1;                //LSE 开启失败.
                       
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟   
                RCC_RTCCLKCmd(ENABLE);        //使能RTC时钟
                RTC_WaitForSynchro();                       

    RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC异步分频系数(1~0X7F)
    RTC_InitStructure.RTC_SynchPrediv  = 0xFF;//RTC同步分频系数(0~7FFF)
    RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;//RTC设置为,24小时格式
    RTC_Init(&RTC_InitStructure);

                RTC_Set_Time(16,13,00,RTC_H12_AM);        //设置时间
                RTC_Set_Date(23,2,16,4);                //设置日期
         
                RTC_WriteBackupRegister(RTC_BKP_DR0,0xA0A0);        //标记已经初始化过了
        }

        return 0;
}


//设置闹钟时间(,24小时制)
//hour,min,sec:小时,分钟,秒钟
void RTC_Set_AlarmA(u8 hour,u8 min,u8 sec)
{
        EXTI_InitTypeDef   EXTI_InitStructure;
        RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;
        RTC_TimeTypeDef RTC_TimeTypeInitStructure;

        RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//关闭闹钟A

        RTC_TimeTypeInitStructure.RTC_Hours=hour;//小时
        RTC_TimeTypeInitStructure.RTC_Minutes=min;//分钟
        RTC_TimeTypeInitStructure.RTC_Seconds=sec;//秒
        RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM;

        //RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay=week;//星期
        //RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_WeekDay;//按星期闹
       
        RTC_AlarmTypeInitStructure.RTC_AlarmMask=RTC_AlarmMask_DateWeekDay;//(日期或星期无效)
        RTC_AlarmTypeInitStructure.RTC_AlarmTime=RTC_TimeTypeInitStructure;
        RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure);


        RTC_ClearITPendingBit(RTC_IT_ALRA);//清除RTC闹钟A的标志
        EXTI_ClearITPendingBit(EXTI_Line17);//清除LINE17上的中断标志位

        RTC_ITConfig(RTC_IT_ALRA,ENABLE);//开启闹钟A中断
        RTC_AlarmCmd(RTC_Alarm_A,ENABLE);//开启闹钟A

        EXTI_InitStructure.EXTI_Line = EXTI_Line17;//LINE17
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE17
        EXTI_Init(&EXTI_InitStructure);//配置

        NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);//配置
}

RTC_Set_AlarmB(14,40,00);//设置闹钟

//RTC闹钟中断服务函数
void RTC_Alarm_IRQHandler(void)
{   
        printf("闹钟!!!");
                RTC_ClearITPendingBit(RTC_IT_ALRA);
                EXTI_ClearITPendingBit( EXTI_Line17);//清除中断线17的中断标志                
                                                                         
}


闹钟毫无反应





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

使用道具 举报

11

主题

2130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4724
金钱
4724
注册时间
2015-1-10
在线时间
590 小时
发表于 2023-3-15 14:46:15 | 显示全部楼层
查看RTC寄存器的设置对不对
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 17:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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