在实际使用STM32的过程中,发现实时时钟经常不能完成初始化,程序死在时钟初始化的等待循环中,发生的几率大概超过5%。而且不是固定的哪一个机器,每个机器都有可能开机后进入死循环。重新开关几次机,又可能正常了,以后可能就很难再发生。这个问题非常令人烦恼,因为具有很大的随机性,既难以判断问题,又不好测试是否已经解决。可以肯定不是32768HZ时钟晶振的问题,同一批晶振,在其它MCU或时钟芯片上批量使用一直都是正常的。
void RTC_Config(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); /* Allow access to BKP Domain */
BKP_DeInit(); /* Reset Backup Domain */
RCC_LSEConfig(RCC_LSE_ON); /* Enable LSE */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);/* Wait till LSE is ready */ (可能的死循环点)
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Select LSE as RTC Clock Source */
RCC_RTCCLKCmd(ENABLE);/* Enable RTC Clock */
RTC_WaitForSynchro();(可能的死循环点)
/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();(可能的死循环点)
/* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE);
/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } |