STM32 RTC采用外部晶振初始化通过但未启振
采用STM32F2平台,使用外部32.768晶振。RTC初始化如下,实际调试跟踪让其运行到RTC_Config下的while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);后能正常往后运行但用示波器测量晶振时没有启振。大家用的平台有没有测试下晶振到底启振没?
为什么这个判断在外部晶振没启振时还可以通过,难道读回来的寄存器值不是真实反应外部晶振状态么?
如果外部的32.768晶振没启振,是不是默认采用内部LSI的32KHz作为RTC时钟源了?因为我发现软件配置采用外部LSE,但是LSE没有启振时,RTC也能正常工作只是时间久了不准了。
void MyRTC_Init(void)
{
if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)//未设置时间
{
RTC_Config();
RTC_WriteBackupRegister(RTC_BKP_DR10,0xAA55);
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
if(RTC_Init(&RTC_InitStructure) == ERROR)return 1;
RTC_Timeset(0,0,0,15,4,23);
}
else
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RTC_WaitForSynchro();
RTC_ClearFlag(RTC_FLAG_ALRAF);
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WriteBackupRegister(RTC_BKP_DR10,0xAA55);
}
}
void RTC_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);//为什么LSE没启振,此处还可以往下运行?
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
}
1.时钟配置看不出说明问题
2.LSE启振后肯定可以用示波器看
3.楼主的代码里面读的是RTC_BKP_DR0,而写得是RTC_BKP_DR10? 换个晶振试试?这种晶振比较容易坏。 如果硬件正常的话,晶振肯定会起振的。
还有,跟进 MyRTC_Init函数,看看程序是进入 未设置时间,还是已经设置时间。 楼主可以运行起来后,暂停程序,跟踪看一下RCC相关寄存器状态,判断是否正常。万一楼主测试方法不对,或是示波器探头有问题导致测量时晶振不振了呢,多方面排除一下。 一般测试晶振时,要求示波器探头打到X10档,增加输入电阻,否则探头的并联电阻阻值过小,可能导致晶体反馈回路停止振荡。 用示波器测试方法是否正确?之前我们的同事在测试8MHz时,测试结果都是在400-500KHz之间,但是系统配置也是外部晶振法,但是就是测试不到8M信号。后来发现是那个示波器在测试时,由于没有自动功能,那个时间轴是设置在100uS极别,就是分辨率不够,测试不到8M信号,当调到几个nS极别就可以了。 这种情况多为硬件故障,ST的如果要求很严格,怕出错,我一次性直接用有源晶振~ 换个晶振试试?这种晶振比较容易坏。 STM32对RTC晶振的选择很严格,有一份使用说明中有说明,自己找找看看
页:
[1]
2