新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32筆記(五)RTC的初始化

        STM32筆記(五)RTC的初始化

        作者: 時間:2016-11-25 來源:網絡 收藏
        這次是RTC的筆記:)
        RTC這東西暈暈的,因為一個模塊涉及到了RTC,BKP,RCC多個模塊,之間的關系讓人有點模糊
        入門的知識請大家看手冊,我來總結:
        總之,RTC只是個能靠電池維持運行的32位定時器over!
        所以,使用時要注意以下問題:
        1. 上電后要檢查備份電池有沒有斷過電。如何檢查? 恩,RTC的示例代碼中已經明示:
        往備份域寄存器中寫一個特殊的字符,備份域寄存器是和RTC一起在斷電下能保存數據的。
        上電后檢查下這個特殊字符是否還存在,如果存在,ok,RTC的數據應該也沒丟,不需要重新配置它
        如果那個特殊字符丟了,那RTC的定時器數據一定也丟了,那我們要重新來配置RTC了
        這個過程包括時鐘使能、RTC時鐘源切換、設置分頻系數等等,這個可以參考FWLibexampleRTCCalendar的代碼
        在我的這個實例里,檢查備份域掉電在Init.c的RTC_Conig()中,函數內若檢測到BKP掉電,則會調用RTC_Configuration()
        2. 因為RTC的一些設置是保存在后備域中的,so,操作RTC的設置寄存器前,要打開后備域模塊中的寫保護功能。
        3. RTC設定值寫入前后都要檢查命令有沒有完成,調用RTC_WaitForLastTask();
        具體的RTC初始化代碼如下:
        ////////////////////////////////////////////////////////////////////////////////
        // RTC時鐘初始化!
        ////////////////////////////////////////////////////////////////////////////////
        void RTC_Configuration(void)
        {
        //啟用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);
        //等待穩定
        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();
        return;
        }
        void RTC_Config(void)
        {
        //我們在BKP的后備寄存器1中,存了一個特殊字符0xA5A5
        //第一次上電或后備電源掉電后,該寄存器數據丟失,
        //表明RTC數據丟失,需要重新配置
        if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
        {
        //重新配置RTC
        RTC_Configuration();
        //配置完成后,向后備寄存器中寫特殊字符0xA5A5
        BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
        }
        else
        {
        //若后備寄存器沒有掉電,則無需重新配置RTC
        //這里我們可以利用RCC_GetFlagStatus()函數查看本次復位類型
        if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
        {
        //這是上電復位
        }
        else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
        {
        //這是外部RST管腳復位
        }
        //清除RCC中復位標志
        RCC_ClearFlag();
        //雖然RTC模塊不需要重新配置,且掉電后依靠后備電池依然運行
        //但是每次上電后,還是要使能RTCCLK???????
        //RCC_RTCCLKCmd(ENABLE);
        //等待RTC時鐘與APB1時鐘同步
        //RTC_WaitForSynchro();
        //使能秒中斷
        RTC_ITConfig(RTC_IT_SEC, ENABLE);
        //等待操作完成
        RTC_WaitForLastTask();
        }
        #ifdef RTCClockOutput_Enable
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
        PWR_BackupAccessCmd(ENABLE);
        BKP_TamperPinCmd(DISABLE);
        BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
        #endif
        return;
        }


        關鍵詞: STM32RTC初始

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 望谟县| 金华市| 晴隆县| 巍山| 易门县| 沭阳县| 林周县| 双峰县| 伊宁市| 徐汇区| 蚌埠市| 奉新县| 兰溪市| 崇明县| 唐海县| 喀喇沁旗| 连江县| 邓州市| 集安市| 甘泉县| 黔西县| 莱西市| 永年县| 北流市| 兰溪市| 合水县| 含山县| 科尔| 建湖县| 堆龙德庆县| 盐边县| 澜沧| 灵宝市| 靖边县| 汽车| 江阴市| 东山县| 濉溪县| 淮滨县| 谷城县| 宁远县|