求教:使用RTC实时时钟总在非第一次配置卡住,见代码!

2019-10-16 07:42发布

   这是初始化RTC的程序,就是用的原子大哥的,第一次上电可以,但是之后我只要下载,程序就会卡在代码中标红的地方RTC_WaitForSynchro(),请问大家这是什么情况。是因为我没装电池吗,但是没装电池的话,我之后怎么能走到else呢?


//检查是不是第一次配置时钟
    NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE );// 通过设置寄存器RCC_APB1ENR的PWREN 和BKPEN位来打开电源和后备接口的时钟
        PWR_BackupAccessCmd(ENABLE);     //电源控制寄存器(PWR_CR) 的DBP位来使能对后备寄存器和RTC的访问        
        
        if(BKP_ReadBackupRegister(BKP_DR1) != 0x1111)//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相符
        {
                printf("first time.. ");
                BKP_DeInit();                                     //初始化复位BKP寄存器
        #if OSE_ENA==1  //使用外部晶振        
                RCC_LSEConfig(RCC_LSE_ON);       //选择外部低速晶振
                while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//设置后需要等待启动
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);////选择LSE为RTC设备 的 时钟,LSE为32.767KHZ
        #else           //使用内部晶振
                RCC_LSEConfig(RCC_LSE_OFF);//关闭LSE
                RCC_LSICmd(ENABLE);//使能LSI为40khz        
                while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);//设置后需要等待启动
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);////选择LSI为RTC设备 的 时钟,LSI为40khz        
        #endif
        
                RCC_RTCCLKCmd(ENABLE);; //使能RTC
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成               
                RTC_WaitForSynchro();        //等待同步
                RTC_ITConfig(RTC_IT_SEC, ENABLE);                //使能RTC秒中断
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
                RTC_EnterConfigMode();/// 允许配置               
                RTC_WaitForLastTask();
                #if OSE_ENA==1        
                        RTC_SetPrescaler(32767);  //设置预分频值RTC period = RTCCLK/RTC_PR = (32.767KHZ)/(32767+1) 约等于1s
                #else
                        RTC_SetPrescaler(39999);  //设置预分频值RTC period = RTCCLK/RTC_PR = (40khz)/(39999+1) 约等于1s               
                #endif        
                RTC_WaitForLastTask();    /*查询RTOFF位,直到RTOFF的值变为1 */
                RTC_Set(2016,11,15,13,56,10);  //设置时间        
                RTC_ExitConfigMode(); //退出配置模式  
                BKP_WriteBackupRegister(BKP_DR1, 0x1111);        //向指定的后备寄存器中写入用户程序数据
        }
        else //系统继续计时
        {
                printf("not first time.. ");
                RTC_WaitForSynchro();        //等待最近一次对RTC寄存器的写操作完成
                RTC_ITConfig(RTC_IT_SEC, ENABLE);        //使能RTC秒中断
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成               
        }
                                
        //配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
    NVIC_Init(&NVIC_InitStructure);               
        RTC_Get();//更新时间        
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。