新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM學習筆記--RTC編程(二)

        ARM學習筆記--RTC編程(二)

        作者: 時間:2016-11-10 來源:網絡 收藏
        上一篇我們從用戶手冊對RTC有了一個大致的了解,現在就開始通過程序編寫來學習RTC的應用和操作了。這里先總結一下:實時時鐘是一組用于測量時間的計數器,如果使用電池供電,在系統掉電以后它也可以正常運行以記錄系統的時間。LPC1788時鐘采用內部的32K振蕩器輸出1HZ的時鐘信號做為RTC的時鐘源。

        RTC的寄存器比較簡單,主要有時鐘計數器寄存器包括秒SEC 分MIN 小時HOUR 日期(月)DOM 星期DOW 日期(年)DOY 月MONTH 年YEAR, 這些寄存器為R/W 可以從中讀出具體的時間信息。其中的秒計數由1HZ時鐘驅動。報警寄存器組中的值將和時間計數器寄存器中的值比較,如果所有為屏蔽的報警寄存器都與他們對應的時間計數器相匹配,那么將產生一次中斷。報警屏蔽在報警屏蔽寄存器AMR中設置。中斷設置在中斷位置寄存器ILR中設置。RTC中斷不僅可以在報警寄存器和時間計數器匹配時產生,我們也可以配置計數器增量中斷寄存器CIIR,使計數器每增加1就產生一次中斷。RTC的控制在時鐘控制寄存器CCR中,我們可以使能或禁止時鐘,以及復位等。

        本文引用地址:http://www.104case.com/article/201611/317286.htm下面這段代碼就是RTC寄存器結構體,里面包含了關于RTC的寄存器的一個列舉:

        /*------------- Real-Time Clock (RTC) ----------------------------------------*/
        typedef struct
        {
        __IO uint8_t ILR;
        uint8_t RESERVED0[7];
        __IO uint8_t CCR;
        uint8_t RESERVED1[3];
        __IO uint8_t CIIR;
        uint8_t RESERVED2[3];
        __IO uint8_t AMR;
        uint8_t RESERVED3[3];
        __I uint32_t CTIME0;
        __I uint32_t CTIME1;
        __I uint32_t CTIME2;
        __IO uint8_t SEC;
        uint8_t RESERVED4[3];
        __IO uint8_t MIN;
        uint8_t RESERVED5[3];
        __IO uint8_t HOUR;
        uint8_t RESERVED6[3];
        __IO uint8_t DOM;
        uint8_t RESERVED7[3];
        __IO uint8_t DOW;
        uint8_t RESERVED8[3];
        __IO uint16_t DOY;
        uint16_t RESERVED9;
        __IO uint8_t MONTH;
        uint8_t RESERVED10[3];
        __IO uint16_t YEAR;
        uint16_t RESERVED11;
        __IO uint32_t CALIBRATION;
        __IO uint32_t GPREG0;
        __IO uint32_t GPREG1;
        __IO uint32_t GPREG2;
        __IO uint32_t GPREG3;
        __IO uint32_t GPREG4;
        __IO uint8_t RTC_AUXEN;
        uint8_t RESERVED12[3];
        __IO uint8_t RTC_AUX;
        uint8_t RESERVED13[3];
        __IO uint8_t ALSEC;
        uint8_t RESERVED14[3];
        __IO uint8_t ALMIN;
        uint8_t RESERVED15[3];
        __IO uint8_t ALHOUR;
        uint8_t RESERVED16[3];
        __IO uint8_t ALDOM;
        uint8_t RESERVED17[3];
        __IO uint8_t ALDOW;
        uint8_t RESERVED18[3];
        __IO uint16_t ALDOY;
        uint16_t RESERVED19;
        __IO uint8_t ALMON;
        uint8_t RESERVED20[3];
        __IO uint16_t ALYEAR;
        uint16_t RESERVED21;
        __IO uint32_t ERSTATUS;
        __IO uint32_t ERCONTROL;
        __IO uint32_t ERCOUNTERS;
        uint32_t RESERVED22;
        __IO uint32_t ERFIRSTSTAMP0;
        __IO uint32_t ERFIRSTSTAMP1;
        __IO uint32_t ERFIRSTSTAMP2;
        uint32_t RESERVED23;
        __IO uint32_t ERLASTSTAMP0;
        __IO uint32_t ERLASTSTAMP1;
        __IO uint32_t ERLASTSTAMP2;
        } LPC_RTC_TypeDef;

        RTC初始化

        void RTC_Init (LPC_RTC_TypeDef *RTCx)
        {
        /* Set up clock and power for RTC module */
        CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRTC, ENABLE); //開啟RTC功能,配置寄存器PCONP

        // Clear all register to be default
        RTCx->ILR = 0x00; // 中斷地址寄存器,增量中斷、報警中斷
        RTCx->CCR = 0x00; // 時鐘控制寄存器(控制使能、復位、是否校準)
        RTCx->CIIR = 0x00;// 計數增量中斷寄存器 (控制按秒或分等變化一次發生中斷)
        RTCx->AMR = 0xFF; // 報警中斷寄存器
        RTCx->CALIBRATION = 0x00; //校準寄存器,看時間走多長然后校準一次(1s或2s)
        }

        復位時間節拍器

        void RTC_ResetClockTickCounter(LPC_RTC_TypeDef *RTCx)
        {
        RTCx->CCR |= RTC_CCR_CTCRST;
        RTCx->CCR &= (~RTC_CCR_CTCRST) & RTC_CCR_BITMASK; // RTC_CCR_BITMASK:1101
        }

        設置RTC時鐘的初始值

        void RTC_Default_Set(void)
        {
        //Set current time
        RTC_SetTime (LPC_RTC, RTC_TIMETYPE_SECOND, 0);//參數:(LPC_RTC_TypeDef *RTCx, uint32_t Timetype, uint32_t TimeValue)
        RTC_SetTime (LPC_RTC, RTC_TIMETYPE_MINUTE, 30);
        RTC_SetTime (LPC_RTC, RTC_TIMETYPE_HOUR, 11);
        RTC_SetTime (LPC_RTC, RTC_TIMETYPE_DAYOFMONTH, 31);
        RTC_SetTime (LPC_RTC, RTC_TIMETYPE_MONTH, 8);
        RTC_SetTime (LPC_RTC, RTC_TIMETYPE_YEAR, 12);
        }

        開啟中斷

        RTC_CntIncrIntConfig (LPC_RTC, RTC_TIMETYPE_SECOND, ENABLE);

        /* Enable RTC interrupt */
        NVIC_EnableIRQ(RTC_IRQn);

        中斷處理

        void RTC_IRQHandler(void)
        {
        uint32_t secval;

        /* This is increment counter interrupt*/
        if (RTC_GetIntPending(LPC_RTC, RTC_INT_COUNTER_INCREASE))
        {
        secval = RTC_GetTime (LPC_RTC, RTC_TIMETYPE_SECOND);

        /* Send debug information */
        _DBG ("Current time: ");
        _DBD(RTC_GetTime (LPC_RTC, RTC_TIMETYPE_YEAR)); _DBG ("年");
        _DBD(RTC_GetTime (LPC_RTC, RTC_TIMETYPE_MONTH)); _DBG ("月");
        _DBD(RTC_GetTime (LPC_RTC, RTC_TIMETYPE_DAYOFMONTH));_DBG ("日");
        _DBD(RTC_GetTime (LPC_RTC, RTC_TIMETYPE_HOUR)); _DBG (":");
        _DBD(RTC_GetTime (LPC_RTC, RTC_TIMETYPE_MINUTE));_DBG (":");
        _DBD(RTC_GetTime (LPC_RTC, RTC_TIMETYPE_SECOND));
        _DBG_("");

        // Clear pending interrupt
        RTC_ClearIntPending(LPC_RTC, RTC_INT_COUNTER_INCREASE);
        }
        }

        運行結果如下
        總結一下,RTC的整個運用綜合起來就是啟動、配置和處理數據,這也是學習arm最最主要的思路;
        1、找出需要功能運行的引腳配置寄存器或者配置寄存器
        2、配置電源管理寄存器開啟需要的功能電源
        3、配置功能寄存器
        4、開啟功能
        5、檢測狀態寄存器和中斷
        6、讀或寫數據寄存器,處理數據
        以后的學習之路就需要這樣分析寄存器。
        發現白天真是做不了什么事情,但晚上不能熬夜太久,對身體不好,怎么辦呢?如何安排好自己的時間,是一個學問和一個問題……



        關鍵詞: ARMRTC編

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 上杭县| 江油市| 锡林浩特市| 云林县| 惠水县| 永年县| 陆川县| 石屏县| 尼勒克县| 岳西县| 原阳县| 博爱县| 东明县| 铜陵市| 界首市| 太原市| 庆阳市| 思南县| 宁化县| 东光县| 青铜峡市| 金阳县| 东乌珠穆沁旗| 金山区| 拉孜县| 义乌市| 福海县| 高青县| 红河县| 景谷| 和政县| 柳河县| 新源县| 扶沟县| 阳山县| 巧家县| 泾源县| 浮梁县| 宣城市| 二连浩特市| 剑河县|