新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32開發板基礎教程(十) - RTC初探

        STM32開發板基礎教程(十) - RTC初探

        作者: 時間:2016-11-09 來源:網絡 收藏
        STM32RTC實際是一個獨立的定時器。
        下面將介紹如何使用RTC。
        我們將頭一次牽扯到振源的問題。

        首先介紹一下STM32使用的各種振源。
        有三種
        HSE:外置晶振
        HSI:內置RC振蕩
        LSE:外置RTC振蕩(32768居多)

        APB1 和 APB2 是經過PLL以后的振蕩源。

        STM32啟動,首先使用的HSI振蕩,在確認HSE振蕩可用的情況下,才可以轉而使用HSE,
        當HSE出現問題,STM32可自動切換回HSI振蕩,維持工作。
        LSE振蕩則是專門供RTC使用。

        LSE晶振需要特別注意。
        STM32非常奇怪,要求使用 6p負載的晶振,
        市面買到的時鐘晶振,絕大多是是12.5pF的
        算是一個不小的bug,
        大家做相關開發的時候,要留神。
        要買6pF的晶振,配10pF的諧振電容。

        由此,馬七懷念一下AVR單片機。不用諧振電容都跑的飛,當然是Mega系列。

        下面介紹RTC驅動過程。

        第一件事情,喂時鐘。

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE);

        注意,喂的是什么?不是RTC,是電源管理和BKP備份器的時鐘。用于備份模式下。
        即系統掉電了,BKP和RTC還能繼續工作,RTC繼續計時。
        那么RTC的時鐘呢?前面提到,RTC的時鐘,一般用LSE。

        第二件事情,初始化RTC

        // RTC config
        void RTC_configuration()
        {
        //Open the BKP
        PWR_BackupAccessCmd(ENABLE);

        BKP_DeInit();

        //RTC use the LSE Clock
        RCC_LSEConfig(RCC_LSE_ON);//RCC打開了LSE時鐘

        //Wait LSE Ready
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);//等待LSE就緒,一般來說,如果諧振不對,就會死在這里。實

        際代碼請慎重

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RTC使用時鐘,可以使用LSE,也可以使用HSI,也可以使用HSE/128

        RCC_RTCCLKCmd(ENABLE); //RTC的時鐘開啟

        RTC_WaitForSynchro();//RTC等待同步,

        RTC_WaitForLastTask();//這個代碼在RTC中常常出現,類似于等待就緒的含義

        // Interrupt Each Second
        RTC_ITConfig(RTC_IT_SEC, ENABLE);//RTC開中斷,RTC中斷有三種,秒中斷,鬧鐘中斷,溢出中斷,很明顯他們的作用。秒中斷用于即時操作,鬧鐘中斷用于關閉或者喚醒,溢出中斷的話,用于復位RTC

        RTC_WaitForLastTask();//

        RTC_SetPrescaler(32767);//RTC預分頻,32768HZ,分為一秒一個振蕩,RTC period = RTCCLK/RTC_PR = (32.768

        KHz)/(32767+1)

        RTC_WaitForLastTask(); //等待同步

        }

        這樣,RTC就啟動了。
        通過 RTC_GetCounter() 這個函數。讀到計數器的值。
        既然 一秒增一個。
        很容易就可以從 計數器的值,算出確切的時間值。
        對于這種時間分量復雜的,我習慣用結構體定義

        typedef struct
        {
        unsigned char Sec;
        unsigned char Min;
        unsigned char Hour;
        unsigned char Day;
        unsigned char Month;
        unsigned char Year;
        }Time_Struct;

        // translate seconds to YY::MM:D::HH::MM::SS
        Time_Struct read_RTC_time()
        {
        unsigned long Time_Value;

        Time_Struct TimeStruct;

        Time_Value = RTC_GetCounter();

        TimeStruct.Year = Time_Value/(12*30*24*3600);

        TimeStruct.Month = Time_Value/(30*24*3600) - TimeStruct.Year*12;

        TimeStruct.Day = Time_Value/(24*3600) - TimeStruct.Year*12*30 - TimeStruct.Month*30;

        TimeStruct.Hour = Time_Value/3600 - TimeStruct.Year*12*30*24 - TimeStruct.Month*30*24 - TimeStruct.Day*24;

        TimeStruct.Min = Time_Value/60 - TimeStruct.Year*12*30*24*60 - TimeStruct.Month*30*24*60 -

        TimeStruct.Day*24*60 - TimeStruct.Hour*60;

        TimeStruct.Sec = Time_Value - TimeStruct.Year*12*30*24*60*60 - TimeStruct.Month*30*24*60*60 -

        TimeStruct.Day*24*60*60 - TimeStruct.Hour*60*60 -TimeStruct.Min*60;

        return TimeStruct;
        }

        當然,也可以在任意時候設置這個時間,手工修改Counter即可。相關函數在工程文件rtc.c當中。


        關鍵詞: STM32基礎教程RT

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 图木舒克市| 朔州市| 措美县| 济宁市| 广宁县| 松溪县| 巧家县| 襄汾县| 江孜县| 安图县| 潜山县| 青川县| 巴中市| 太谷县| 平山县| 涞水县| 仁寿县| 莆田市| 天祝| 祁阳县| 永泰县| 休宁县| 广平县| 凤冈县| 磐安县| 兴安县| 太和县| 曲麻莱县| 云安县| 安国市| 揭西县| 托克逊县| 随州市| 会同县| 班玛县| 阳泉市| 临沭县| 彭阳县| 平顺县| 苏尼特右旗| 山阳县|