轉自奔跑的博客
出現的現象:使用野火的RTC例程,在軟件仿真時如果不需要配置,則程序會死在 RTC_WaitForSynchro() 函數中。而下載到硬件上時,有時候可以跑,有時候也會在該函數中死循環。
可能的原因:
首先,一定要確認是否使能了對後備寄存器和RTC的訪問。
系統復位後,對後備寄存器和RTC的訪問被禁止,這是爲了防止對後備區域(BKP)的意外寫操
作。執行以下操作將使能對後備寄存器和RTC的訪問:
● 設置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能電源和後備接口時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
● 設置寄存器PWR_CR的DBP位,使能對後備寄存器和RTC的訪問
PWR_BackupAccessCmd(ENABLE);
另外還要使能RTC時鐘 RCC_RTCCLKCmd(ENABLE); 雖然該函數的說明中說只在RCC_RTCCLKConfig()函數調用之後才能調用,但是實際上如果不調用該函數,仿真時就會在 RTC_WaitForSynchro() 函數中死循環,等待RTC時鐘同步。
也就是說,不論是否需要配置RTC寄存器,每次系統復位都需要執行如下操作:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_RTCCLKCmd(ENABLE);
其次,STM32的RTC對外部LSE要求比較高,最好使用負載電容爲6pF的晶振。在芯片的DataSheet中有明確的說明,不能使用12.5pF的晶振。“ To avoid exceeding the maximum value of CL1 and CL2 (15 pF) it is strongly recommended to use a resonator with a load capacitance CL≤ 7 pF. Never use
a resonator with a load
capacitance of 12.5 pF.”