想省一个外部低速晶振,因此修改了原子的实时时钟配置函数:
//实时时钟配置
//初始化RTC时钟,同时检测时钟是否工作正常
//BKP->DR1用于保存是否第一次配置的设置
//返回0:正常
//其他:错误代码
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
// 测试:无论如何都进入配置:
// if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050 ||BKP_ReadBackupRegister(BKP_DR1) == 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
PUT("\r\n\r\n Start Config RTC... \r\n");
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
BKP_DeInit(); //复位备份区域
// RCC_LSEConfig(RCC_LSE_ON); //配置外部低速晶振:设置外部低速晶振(LSE),使用外设低速晶振
RCC_LSICmd(ENABLE); // 配置内部低速晶振:使能内部低速晶振
// while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待外部低速晶振就绪
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //检查指定的RCC标志位设置与否,等待内部低速晶振就绪
{
temp++;
//delay_ms(10); // 该函数只能用于外部低速晶振
delay_GSM(10000); // 延时函数
}
if(temp>=250)
{
PUT("\r\n\r\n Config RTC Failed... \r\n");
return 1; //初始化时钟失败,晶振有问题
}
// 配置RTC时钟:
// RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK), 选择LSE作为RTC时钟
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); // 选择LSI作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode(); // 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2009,12,2,10,0,55); //设置时间
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
PUT("\r\n\r\n Finish Config RTC... \r\n");
}
else //系统继续计时
{
PUT("\r\n\r\n Already Config RTC... \r\n");
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_NVIC_Config(); //RCT中断分组设置
RTC_Get(); //更新时间
PUT("\r\n\r\n Config RTC Success... \r\n");
return 0; //ok
}
故障现象:
首次能配置成功,
第2次运行时,卡在RTC_WaitForSynchro()函数:
在 void RTC_WaitForSynchro(void)的while 里不出来了。
while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET)
{
}
请教大师们:哪里配置错了? 谢谢!
|