色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

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

          本文引用地址:http://cafeforensic.com/article/201611/322170.htm

          它具有以下特點:

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

          能夠?qū)﹂c年的年、月、日進行自動處理;

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

          具有獨立的電源輸入;

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

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

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

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

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

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

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

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

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

          廢話少說,上程序(開發(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ù),操作是不是比較簡單?呵呵

          {
          rRTCCON = 1 ;//RTC 讀寫使能

          rBCDYEAR = wRTCyear ;//年
          rBCDMON= wRTCmon ;//月
          rBCDDATE = wRTCdate ;//日
          rBCDDAY= wRTCday ;//星期
          rBCDHOUR = wRTChour ;//小時
          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è)置
          {rRTCCON=0x01;//RTCCON實時時鐘控制寄存器,
          //【0】位RTC使能信號控制位,0為禁止,1為允許
          //對RTC模塊進行讀寫操作前應(yīng)對其最低位至1
          rALMYEAR = almyear;
          rALMMON= almmon;
          rALMDATE = almdate;
          rALMHOUR = almhour;
          rALMMIN= almmin;
          rALMSEC= almsec;

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

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

          }

          //關(guān)鬧鐘功能函數(shù)
          void CloseAlarm(void)
          {
          rRTCALM = 0; //RTCALM鬧鐘控制寄存器所有位禁止
          DisableIrq(BIT_RTC);//關(guān)中斷
          }
          void __irq IsrAlarm(void)//利用中斷,鬧鐘時進入中斷函數(shù)
          {
          ClearPending(BIT_RTC);//SRCPND,INTPND分別置1.
          beep = 0;// 蜂鳴器標(biāo)志位清0
          CloseAlarm();//關(guān)鬧鐘,即如果要開鬧鐘的先要把它關(guān)了,再開。
          }
          void delay(int x)//延時函數(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個LED
          rGPBDAT|=0x560;//4個LED全滅
          RTC_Time_Set(0x11,0x08,0x06,0x06,0x10,0x00,0x00) ;//設(shè)置時間
          RTC_Alm_Set(0x11,0x08,0x06,0x10,0x01,0x00);//設(shè)置鬧鐘時間按
          OpenAlarm();
          while(1)
          {
          if(beep==0)
          {
          rGPBDAT=0x01;//燈亮,蜂鳴器響
          delay(1000);
          rGPBDAT=0x561;//燈滅,實際是閃爍
          delay(1000);
          }
          }
          }



          關(guān)鍵詞: ARM9S3C2440實時時鐘RT

          評論


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

          關(guān)閉