1:32768HZ晶体,选一般6pF--12.5pF的都可以(本身品质有问题例外),并非传说中的猛兽
2(重要):在STM32的VBAT脚与GND必须接至少一个陶瓷电容(100nF X7R介质材料)退藕,线要短/粗
3:32768HZ晶体的负载电容焊盘与晶体焊盘之间线要短/粗,实际安装的电容须为NPO介质材料
4:STM32 RTC起振到稳定需要时间(1--3秒,和温度有关)建议写代码先开启STM32 RTC,然后去初始化其他外设,最后来判断RTC状态 分2个函数 代码如下:
================================================================================================================================
u8 Cheak_RTC_MY(void)
{
if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)
{
// u32 delay;
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//后备域解锁
PWR_BackupAccessCmd(ENABLE);
//备份寄存器模块复位
BKP_DeInit();
//外部32.768K
RCC_LSEConfig(RCC_LSE_ON);
return 1;
}
else
{
//清除RCC中复位标志
RCC_ClearFlag();
//虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行
RCC_RTCCLKCmd(ENABLE);
//等待RTC时钟与APB1时钟同步
RTC_WaitForSynchro();
//使能秒中断
RTC_ITConfig(RTC_IT_SEC,ENABLE);
//等待操作完成
RTC_WaitForLastTask();
RCC_ClearFlag();
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
return 0; //RTC OK
}
}
void Setup_RTC(void)
{
struct tm time_now;
//等待稳定
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
//RTC时钟源配置成LSE(外部32.768K)
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//RTC开启
RCC_RTCCLKCmd(ENABLE);
//开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
RTC_WaitForSynchro();
//读写寄存器前,要确定上一个操作已经结束
RTC_WaitForLastTask();
//设置RTC分频器,使RTC时钟为1Hz
//RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
RTC_SetPrescaler(32767);
//等待寄存器写入完成
RTC_WaitForLastTask();
//使能秒中断
RTC_ITConfig(RTC_IT_SEC, ENABLE);
//等待写入完成
RTC_WaitForLastTask();
time_now.tm_year = 2010;
time_now.tm_mon = 6;
time_now.tm_mday = 30;
time_now.tm_hour = 12;
time_now.tm_min = 00;
time_now.tm_sec = 00;
time_now.tm_isdst=0;//刚加的
Time_SetCalendarTime(time_now);
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);//配置完成后,向后备寄存器中写特殊字符0xA5A5
RCC_ClearFlag();
// Enable PWR and BKP clocks
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
// Allow access to BKP Domain
PWR_BackupAccessCmd(ENABLE);
}
//-------------------------------------------------------------------------------
u8 RTC_FG=0;
/* Initialize the Demo */
System_Init();
RTC_FG=Cheak_RTC_MY();
LCD_Init();
//GPIOB->BSRR =GPIO_Pin_11;
Key_GPIO_Init();
LCD_write_english_string(5,66,"guanfu_wang@126.com",0X001F,0X0000);
// LCD_write_english_string(5,66+16,"RTC Init......",0Xf800,0X0000);
if( RTC_FG==1)
{
Setup_RTC();
LCD_write_english_string(5,66+16,"RTC Init....OK",0Xf800,0X0000);
}
else
{
LCD_write_english_string(5,66+16,"RTC ........OK",0Xf800,0X0000);
} |