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," |
RE: stm32 rtc问题(转)
RE: stm32 rtc问题(转)