|
本帖最后由 takent 于 2020-7-8 10:01 编辑
当天调试RTC掉电是保存的,第二天查看RTC又是从默认日期开始了。
程序默认时钟是使用外部LSE,如果不起振就使用内部LSI。
备份寄存器掉电是保存的,说明电池没问题
下面是初始化的代码
- void bsp_InitRTC(void)
- {
- uint16_t u16_WaitForOscSource;
- uint16_t usTimeCnt = 0;
- /*
- ÎòÃÇÔúBKPμÄo󱸼Ä′æÆ÷1ÖD£¬′æáËò»¸öìØêa×Ö·û0xA5A5, μúò»′ÎéÏμç»òoó±¸μçÔ′μôμço󣬸üÄ′æÆ÷êy¾Y¶aê§£¬
- ±íÃ÷RTCêy¾Y¶aê§£¬DèòaÖØDÂÅäÖÃ
- */
- if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
- {
- //ÖØDÂÅäÖÃRTC
- /* Enable PWR and BKP clocks */ /* PWRê±Öó£¨μçÔ′¿ØÖÆ£©óëBKPê±Öó£¨RTCo󱸼Ä′æÆ÷£©ê1Äü */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- /* Allow access to BKP Domain */ /*ê1ÄüRTCoío󱸼Ä′æÆ÷·ÃÎê */
- PWR_BackupAccessCmd(ENABLE);
-
- /* Reset Backup Domain */ /* ½«íaéèBKPμÄè«2¿¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ */
- BKP_DeInit();
- /* Enable LSE */
- RCC_LSEConfig(RCC_LSE_ON);
-
- #if 0
- for(u16_WaitForOscSource=0; u16_WaitForOscSource < 5000; u16_WaitForOscSource++)
- {
- ;
- }
- #endif
-
- /* Wait till LSE is ready */ /* μè′yía2¿¾§ÕñÕeμ′Î趨êä3ö */
- while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
- {
- bsp_DelayMS(1);
- usTimeCnt++;
- if(usTimeCnt >= RTC_WAIT_TIME)
- {
- break;
- }
- }
-
- if(usTimeCnt >= RTC_WAIT_TIME)
- {
- /* 1رÕLSE */
- RCC_LSEConfig(RCC_LSE_OFF);
-
- /* ê1ÄüLSI */
- RCC_LSICmd(ENABLE);
- /* μè′yÖ±μ½LSI¾íD÷ */
- while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
- /* Ñ¡ÔñLSI×÷ÎaRTCμÄê±Öó */
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
-
- }
- else
- {
- /* Select LSE as RTC Clock Source */ /*ê1óÃía2¿32.768KHz¾§Õñ×÷ÎaRTCê±Öó */
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
- }
-
- /* Enable RTC Clock */
- RCC_RTCCLKCmd(ENABLE);
- /* Wait for RTC registers synchronization */
- RTC_WaitForSynchro();
- /* Wait until last write operation on RTC registers has finished */
- RTC_WaitForLastTask();
- /* Enable the RTC Second */
- RTC_ITConfig(RTC_IT_SEC, ENABLE);
- /* Wait until last write operation on RTC registers has finished */
- RTC_WaitForLastTask();
-
- // RTC_EnterConfigMode();
-
- if(usTimeCnt >= RTC_WAIT_TIME)
- {
- /*
- 1. LSIμÄÆμÂêμäDíÖμêÇ40KHz(30KHzμ½60KHz)
- 2. Õaàï°′40KHzà′¼ÆËã
- RTC ÖüÆú = RTCCLK / RTC_PR = (40 KHz)/(39999 + 1) = 1Hz
- */
- RTC_SetPrescaler(39999);
- }
- else
- {
- /* Set RTC prescaler: set RTC period to 1sec */
- /* 32.768KHz¾§ÕñÔ¤·ÖÆμÖμêÇ32767,èç1û¶Ô¾«¶èòaÇóoü¸ß¿éòÔDT¸Ä′Ë·ÖÆμÖμà′D£×¼¾§Õñ */
- RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
- }
-
- /* Wait until last write operation on RTC registers has finished */
- RTC_WaitForLastTask();
-
- RTC_WriteClock(DEFAULT_RTC_YEAR, DEFAULT_RTC_MON, DEFAULT_RTC_DAY,
- DEFAULT_RTC_HOUR, DEFAULT_RTC_MIN, DEFAULT_RTC_SEC);//ĬèÏê±¼ä
-
- /* ÅäÖÃíê3éoó£¬Ïòo󱸼Ä′æÆ÷ÖDD′ìØêa×Ö·û0xA5A5 */
- BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
- }
- else
- {
- /* èôo󱸼Ä′æÆ÷ûóDμôμ磬ÔòÎTDèÖØDÂÅäÖÃRTC */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- /* Allow access to BKP Domain */ /*ê1ÄüRTCoío󱸼Ä′æÆ÷·ÃÎê */
- PWR_BackupAccessCmd(ENABLE);
- for (u16_WaitForOscSource = 0; u16_WaitForOscSource < 5000; u16_WaitForOscSource++)
- {
- ;
- }
- if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
- {
- /* éÏμç¸′λ */
- }
- else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
- {
- /* ía2¿RST1ü½Å¸′λ */
- }
- /* Çå3yRCCÖD¸′λ±êÖ¾ */
- RCC_ClearFlag();
-
- //Ëäè»RTCÄ£¿é2»DèòaÖØDÂÅäÖã¬Çòμôμçoóòà¿¿oó±¸μç3Øòàè»ÔËDD
- //μ«êÇÿ′ÎéÏμço󣬻1êÇòaê1ÄüRTCCLK???????
- //RCC_RTCCLKCmd(ENABLE);
- //μè′yRTCê±ÖóóëAPB1ê±Öóí¬2½
- //RTC_WaitForSynchro();
-
- //ê1ÄüÃëÖD¶Ï
- //RTC_ITConfig(RTC_IT_SEC, ENABLE);
-
- //μè′y2ù×÷íê3é
- RTC_WaitForLastTask();
- }
- return;
- }
复制代码
|
|