这是初始化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();//更新时间
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>