新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 五 ARM9(S3C2440)的實(shí)時(shí)時(shí)鐘(RTC)-理論知識(shí)及程序?qū)嵗v解

        五 ARM9(S3C2440)的實(shí)時(shí)時(shí)鐘(RTC)-理論知識(shí)及程序?qū)嵗v解

        作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏

        在一個(gè)嵌入式系統(tǒng)中,實(shí)時(shí)時(shí)鐘單元可以提供可靠的時(shí)鐘,包括時(shí)、分、秒和年、月、日。即使系統(tǒng)處于關(guān)機(jī)狀態(tài)下,它也能夠正常工作(通常采用后備電池供電,能夠可靠工作十年),其外圍也不需要太多的輔助電路,只需要一個(gè)高精度的晶振。

        本文引用地址:http://www.104case.com/article/201611/322170.htm

        它具有以下特點(diǎn):

        時(shí)鐘數(shù)據(jù)采用BCD編碼或二進(jìn)制表示;

        能夠?qū)﹂c年的年、月、日進(jìn)行自動(dòng)處理;

        具有告警功能,當(dāng)系統(tǒng)處于關(guān)機(jī)狀態(tài)時(shí),能產(chǎn)生告警中斷;

        具有獨(dú)立的電源輸入;

        提供毫秒級(jí)的時(shí)鐘中斷,該中斷可用于嵌入式操作系統(tǒng)的內(nèi)核時(shí)鐘。

        實(shí)時(shí)時(shí)鐘特殊功能寄存器
        實(shí)時(shí)時(shí)鐘控制(RTCCON)寄存器
        RTCCON 寄存器由4 位組成,如控制BCD 寄存器讀/寫(xiě)使能的RTCEN、CLKSEL、CNTSEL 和測(cè)試用的
        CLKRST。
        RTCEN 位可以控制所有CPU 與RTC 之間的接口,因此在系統(tǒng)復(fù)位后在RTC 控制程序中必須設(shè)置為1 來(lái)使
        能數(shù)據(jù)的讀/寫(xiě)。同樣的在掉電前,RTCEN 位應(yīng)該清除為0 來(lái)預(yù)防誤寫(xiě)入RTC 寄存器中。

        RTC 鬧鐘控制(RTCALM)寄存器
        RTCALM 寄存器決定了鬧鐘使能和鬧鐘時(shí)間。請(qǐng)注意RTCALM 寄存器在掉電模式中同時(shí)通過(guò)INT_RTC 和
        PMWKUP 產(chǎn)生鬧鐘信號(hào),但是在正常工作模式中只產(chǎn)生INT_RTC。

        鬧鐘秒數(shù)據(jù)(ALMSEC)寄存器:鬧鐘秒數(shù)據(jù)寄存器

        同理:鬧鐘分?jǐn)?shù)據(jù)(ALMMIN)寄存器,鬧鐘時(shí)數(shù)據(jù)(ALMHOUR)寄存器,鬧鐘日數(shù)據(jù)(ALMDATE)寄存器,鬧鐘月數(shù)據(jù)(ALMMON)寄存器,鬧鐘年數(shù)據(jù)(ALMYEAR)寄存器

        BCD 秒(BCDSEC)寄存器:存儲(chǔ)的是當(dāng)前時(shí)間秒,同樣還有,BCDMIN,BCDHOUR,BCDDATE(日),BCDDAY(星期),BCDMON,BCDYEAR

        注意以上這些寄存器存儲(chǔ)的數(shù)據(jù)都是BCD碼,即是自動(dòng)處理的數(shù)據(jù),如果自己想做時(shí)鐘顯示時(shí),如果調(diào)時(shí)間的請(qǐng)注意時(shí)間加減時(shí)實(shí)際上是十六進(jìn)制的

        下面結(jié)合具體的程序介紹一下RTC操作

        程序編寫(xiě)包括三步,第一步是時(shí)鐘初始化,第二步把嵌入式控制系統(tǒng)投入運(yùn)行時(shí)要將當(dāng)前準(zhǔn)確時(shí)間寫(xiě)入RTC,俗稱效表;第三步是系統(tǒng)正常運(yùn)行后,讀取RTC時(shí)間在LCD上顯示。

        廢話少說(shuō),上程序(開(kāi)發(fā)板FL2440)

        #include "def.h"
        #include "option.h"
        #include "2440addr.h"
        U8 beep=1;
        void __irq IsrAlarm(void);//下面這些都是函數(shù)聲明
        void delay(int x);
        void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
        U8 almhour,U8 almmin,U8 almsec);
        void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec );
        void OpenAlarm(void) ;
        void CloseAlarm(void) ;
        //==================================================================================
        void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec )//時(shí)間設(shè)置函數(shù),操作是不是比較簡(jiǎn)單?呵呵

        {
        rRTCCON = 1 ;//RTC 讀寫(xiě)使能

        rBCDYEAR = wRTCyear ;//年
        rBCDMON= wRTCmon ;//月
        rBCDDATE = wRTCdate ;//日
        rBCDDAY= wRTCday ;//星期
        rBCDHOUR = wRTChour ;//小時(shí)
        rBCDMIN= wRTCmin ;//分
        rBCDSEC= wRTCsec ;//秒

        rRTCCON &= ~1 ;//RTC read and write disable
        }
        void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
        U8 almhour,U8 almmin,U8 almsec)//年、月、日、時(shí)、分、秒//鬧鐘設(shè)置
        {rRTCCON=0x01;//RTCCON實(shí)時(shí)時(shí)鐘控制寄存器,
        //【0】位RTC使能信號(hào)控制位,0為禁止,1為允許
        //對(duì)RTC模塊進(jìn)行讀寫(xiě)操作前應(yīng)對(duì)其最低位至1
        rALMYEAR = almyear;
        rALMMON= almmon;
        rALMDATE = almdate;
        rALMHOUR = almhour;
        rALMMIN= almmin;
        rALMSEC= almsec;

        rRTCCON = 0;//讀取數(shù)據(jù)完后禁止使能信號(hào),以防誤操作,
        //整個(gè)文件的設(shè)置都一樣,不重覆
        }
        void OpenAlarm(void) //開(kāi)鬧鐘函數(shù)
        {
        pISR_RTC = (unsigned)IsrAlarm;//中斷寄存器ISR中的RTC中斷位
        ClearPending(BIT_RTC);
        rRTCALM = (0x7f); //RTCALM鬧鐘控制寄存器,

        //【0-7】分別對(duì)應(yīng)秒到年的鬧鐘 使能,
        //相應(yīng)位0表示禁止,1表示允許
        EnableIrq(BIT_RTC);//開(kāi)中斷

        }

        //關(guān)鬧鐘功能函數(shù)
        void CloseAlarm(void)
        {
        rRTCALM = 0; //RTCALM鬧鐘控制寄存器所有位禁止
        DisableIrq(BIT_RTC);//關(guān)中斷
        }
        void __irq IsrAlarm(void)//利用中斷,鬧鐘時(shí)進(jìn)入中斷函數(shù)
        {
        ClearPending(BIT_RTC);//SRCPND,INTPND分別置1.
        beep = 0;// 蜂鳴器標(biāo)志位清0
        CloseAlarm();//關(guān)鬧鐘,即如果要開(kāi)鬧鐘的先要把它關(guān)了,再開(kāi)。
        }
        void delay(int x)//延時(shí)函數(shù)
        {
        while(x)
        {
        int k,j;
        for(k=0xff;k>0;k--)
        for(j=0xff;j>0;j--);
        x--;
        }
        }

        //==================================================================================
        void RTCmain(void)
        {
        rGPBCON = (1<<0)|(1<<10)|(1<<12)|(1<<16)|(1<<20);// GPB5,GPB6,GPB8,GPB10設(shè)置為輸出,分別連了4個(gè)LED
        rGPBDAT|=0x560;//4個(gè)LED全滅
        RTC_Time_Set(0x11,0x08,0x06,0x06,0x10,0x00,0x00) ;//設(shè)置時(shí)間
        RTC_Alm_Set(0x11,0x08,0x06,0x10,0x01,0x00);//設(shè)置鬧鐘時(shí)間按
        OpenAlarm();
        while(1)
        {
        if(beep==0)
        {
        rGPBDAT=0x01;//燈亮,蜂鳴器響
        delay(1000);
        rGPBDAT=0x561;//燈滅,實(shí)際是閃爍
        delay(1000);
        }
        }
        }



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 临江市| 九龙城区| 睢宁县| 申扎县| 枣阳市| 霍林郭勒市| 霞浦县| 中江县| 安新县| 合肥市| 武隆县| 芒康县| 大城县| 根河市| 晋中市| 静安区| 南和县| 香港| 庄浪县| 英吉沙县| 阳泉市| 曲松县| 渝北区| 黄浦区| 莎车县| 五华县| 鸡西市| 亚东县| 奉化市| 加查县| 新巴尔虎右旗| 游戏| 诏安县| 阿瓦提县| 巩义市| 兴文县| 山丹县| 黔西| 正蓝旗| 神池县| 鄂托克前旗|