请问一下,网上关于STM32的RTC不能振的讨论多了去了,不过我们现在的产品比较特殊,没有使用LSE,而是使用的HSE/128,但是很奇怪的现象,程序已经正常运行,HSE不可能没有起振,不然机器早死机了,为什么RTC还是不动呢,在买回的开发板上测试使用HSE是正常的。
以下是我的RTC配置代码,被屏蔽部分使用的LSI,测试RTC正常,使用HSE/128则RTC没有工作,就改动了这两个地方。
我想问一下,是否HSE正常起振,RTC对电容值什么的还有要求呢?按理说只要起振就可以吧?
//在这之前有调用库函数 SystemInit();初始化HSE
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
#if 0
//!!!使用内部低速晶振
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
#else
//使用外部高速晶振8M/128 = 62.5K
RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
#endif
//允许RTC
RCC_RTCCLKCmd(ENABLE);
//等待RTC寄存器同步
RTC_WaitForSynchro();
RTC_WaitForLastTask();
//允许RTC的秒中断(还有闹钟中断和溢出中断可设置)
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
//62500晶振预分频值是62500,不过一般来说晶振都不那么准
#if 0
//!!!使用内部低速晶振
RTC_SetPrescaler(32768); //如果需要校准晶振,可修改此分频值
#else
RTC_SetPrescaler(62498); //如果需要校准晶振,可修改此分频值
#endif
RTC_WaitForLastTask();
//RTC 的时钟校准,暂不使用
//BKP_SetRTCCalibrationValue(120);
PWR_BackupAccessCmd(DISABLE);
//清除标志
RCC_ClearFlag();
} |