stm32 rtc時鍾 RTC_WaitForSynchro();死循環解決辦法


內部晶振低速時鍾40KHZ    在if外開啟時鍾

//實時時鍾配置
//初始化RTC時鍾,同時檢測時鍾是否工作正常
//BKP->DR1用於保存是否第一次配置的設置
//返回0:正常
//其他:錯誤代碼

u8 RTC_Init(void)
{
//檢查是不是第一次配置時鍾
u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外設時鍾
PWR_BackupAccessCmd(ENABLE); //使能后備寄存器訪問
RCC_LSICmd(ENABLE); //設置內部低速晶振(LSI)
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //從指定的后備寄存器中讀出數據:讀出了與寫入的指定數據不相乎
{
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外設時鍾
//PWR_BackupAccessCmd(ENABLE); //使能后備寄存器訪問
BKP_DeInit(); //復位備份區域
//RCC_LSEConfig(RCC_LSE_ON); //設置外部低速晶振(LSE),使用外設低速晶振
// while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //檢查指定的RCC標志位設置與否,等待低速晶振就緒
// {
// temp++;
// delay_ms(10);
// }
//RCC_LSICmd(ENABLE); //設置內部低速晶振(LSI)
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //檢查指定的RCC標志位設置與否,等待低速晶振就緒
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//初始化時鍾失敗,晶振有問題
// RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //設置RTC時鍾(RTCCLK),選擇LSE作為RTC時鍾
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //設置RTC時鍾(RTCCLK),選擇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_SetPrescaler(40000); //設置RTC預分頻的值
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
RTC_Set(2017,3,6,0,0,0); //設置時間
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后備寄存器中寫入用戶程序數據
}
else//系統繼續計時
{

RTC_WaitForSynchro(); //等待最近一次對RTC寄存器的寫操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中斷
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
}
RTC_NVIC_Config();//RCT中斷分組設置
RTC_Get();//更新時間
return 0; //ok

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM