1. <track id="ob6no"><strike id="ob6no"><tt id="ob6no"></tt></strike></track>

      <track id="ob6no"></track>

      當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 >
      實時時鐘RTC
      時間:2018-08-16作者:華清遠見

      實時時鐘的縮寫是RTC(Real_Time Clock)。RTC 是集成電路,通常稱為時鐘芯片。RTC通常情況下需要外接32.768kHz晶體,匹配電容、備份電源等元件。RTC除了I/O口的定位不同,還有功能上的區別,比如與MCU的接口,現在常用的是I2C接口(距離短,可以與其他器件共用)還有RAM的數量、靜態功耗大小、中斷的數量,特別是精度的區別。 RTC的精度可以說與溫度有很大的關系,而溫度會影響晶體的頻率。本章介紹的是集成在芯片內部的時鐘功能模塊。

      1 RTC介紹

      在一個嵌入式系統中,通常采用RTC 來提供可靠的系統時間,包括時分秒和年月日等,而且要求在系統處于關機狀態下它也能夠正常工作(通常采用后備電池供電)。它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768kHz晶體和電阻電容等,如圖1所示。



      圖12-1 RTC外接電路

      2 RTC控制器

      實時時鐘(RTC)單元可以通過備用電池供電,因此,即使系統電源關閉,它也可以繼續工作。RTC 可以通過STRB/LDRB 指令將8 位BCD 碼數據送至CPU。這些BCD 數據包括秒、分、時、日期、星期、月和年。RTC 單元通過一個外部的32.768kHz晶振提供時鐘。RTC具有定時報警的功能,如圖2所示。RTC 控制器功能說明:


      圖12-2 RTC控制器

      ● 時鐘數據采用BCD 編碼。
              ● 能夠對閏年的年月日進行自動處理。
              ● 具有告警功能,當系統處于關機狀態時,能產生告警中斷。
              ● 具有獨立的電源輸入。
              ● 提供毫秒級時鐘中斷,該中斷可用于作為嵌入式操作系統的內核時鐘。

      3 RTC控制器寄存器詳解

      如表3所示為相關寄存器描述。

      表3 RTC控制寄存器

      RTCCON 描述 復位值
      保留 [31:9] 保留 0
      TICEN [8] 嘀嗒計時器
      0 = 禁止
      1 = 使能
      0
      TICCKSEL [7:4] 嘀嗒計時器子時鐘源選擇
      4'b0000 = 32768 Hz       4'b0001 = 16384 Hz
      4'b0010 = 8192 Hz        4'b0011 = 4096 Hz
      4'b0100 = 2048 Hz        4'b0101 =1024 Hz
      4'b0110 =512 Hz          4'b0111 =256 Hz
      4'b1000 =128 Hz          4'b1001 =64 Hz
      4'b1010 =32 Hz           4'b1011 =16 Hz
      4'b1100 =8 Hz            4'b1101 =4 Hz
      4'b1110 =2 Hz            4'b1111 =1 Hz
      4'b0000
      CLKRST [3] RTC時鐘計數復位
      0 = 不復位
      1 = 復位
      0
      CNTSEL [2] BCD計數選擇
      0 = 分配 BCD 計數
      1 = 保留
      0
      CLKSEL [1] BCD 時鐘選擇
      0 = XTAL 1/2 divided clock
      1 = 保留(XTAL 供頻)
      0
      RTCEN [0] RTC控制使能
      0 = 禁止
      1 = 使能
      0

      如表4所示為BCD秒寄存器描述。

      表4 BCDSEC寄存器

      BCDSEC 描述 復位值
      保留 [31:7] 保留 --
      SECDATA [6:4] BCD 值 0~5 --
      [3:0] 0~9 --

      如表5所示為BCD分鐘寄存器描述。

      表5 BCDMIN寄存器

      BCDMIN 描述 復位值
      保留 [31:7] 保留 --
      MINDATA [6:4] BCD 值 0~5 --
      [3:0] 0~9 --

      如表6所示為BCD小時寄存器描述。

      表6 BCDHOUR寄存器

      BCDHOUR 描述 復位值
      保留 [31:7] 保留 --
      HOURDATA [5:4] BCD 值 0~5 --
      [3:0] 0~9 --

      如表7所示為BCD日期寄存器描述。

      表7 BCDDATE寄存器

      BCDDATE 描述 復位值
      保留 [31:7] 保留 --
      DATEDATA [5:4] BCD 值 0~3 --
      [3:0] 0~9 --

      如表8所示為BCD星期寄存器描述。

      表8 BCDDAY寄存器

      BCDDAY 描述 復位值
      保留 [31:3] 保留 --
      DAYDATA [2:0] 1~7 --

      如表9所示為BCD月寄存器描述。

      表9 BCDMON寄存器

      BCDMON 描述 復位值
      保留 [31:5] 保留 --
      MONDATA [4] BCD 值 0~1 --
        [3:0] 0~9 --

      如表10所示為BCD年寄存器描述。

      表10 BCDYEAR寄存器

      BCDYEAR 描述 復位值
      保留 [31:8] 保留 --
      YEARDATA [7:4] BCD 值 0~9 --
      [3:0] 0~9 --

      4 RTC應用示例

      1.相關寄存器定義

      typedef struct {

                              unsigned int BCDSEC;
                              unsigned int BCDMIN;
                              unsigned int BCDHOUR;
                              unsigned int BCDDATE;
                              unsigned int BCDDAY;
                              unsigned int BCDMON;
                              unsigned int BCDYEAR;
              }rtcbcd;
              #define RTCBCD (* (volatile rtcbcd *)0xEA300070)

      2.主程序

      下面的代碼實現了一個將RTC的年月日、時分秒讀出的功能,可以將注釋掉的代碼打開來復位值。

      void rtc_init(void)
              {
                      RTCCON = 0X01; //使能RTC控制些功能
                      RTCBCD.BCDSEC = 0x0; // 2012 03 15, 12:59:00.以BCD碼格式寫入
                      RTCBCD.BCDMIN = 0x59; 
                      RTCBCD.BCDHOUR =0x12;
         &nbsnbsp;            RTCBCD.BCDDATE = 0x15;
                      RTCBCD.BCDMON = 0x03;
                      RTCBCD.BCDYEAR = 0x12;
                      RTCCON = 0; //關閉RTC控制些功能
              }
              int main()
              {
                      unsigned int i = 0;
                      uart0_init();
                      rtc_init(); //初始化時間
                      while(1) //循環打印時間
                      {
                              printf("hour %x : min %x : sec %x\r",RTCBCD.BCDHOUR,RTCBCD.BCDMIN,RTCBCD.BCDSEC);
                              for(i=0;i<10000000;i++);
                      }
                      return 0;
              }

      2.實驗過程及現象:

      編譯生成的.elf文件,硬件接線。并連接好FS_JTAG仿真器套件。將程序編譯后獲得.elf文件,將該文件通過仿真器下載并運行在目標版上,終端打印信息如下所示。

      hour 12 : min 59 : sec 17
              hour 12 : min 59 : sec 18
              hour 12 : min 59 : sec 19
              hour 12 : min 59 : sec 20


      發表評論

      全國咨詢電話:400-611-6270,雙休日及節假日請致電值班手機:15010390966

      在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)

      企業培訓洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)

      Copyright 2004-2018 華清遠見教育集團 版權所有 ,京ICP備16055225號,京公海網安備11010802025203號

      操你啦,操你啦视频,操你啦影院,操你啦网站