成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文搞懂Cortex-A9 RTC

開發(fā)
RTC是集成電路,通常稱為時鐘芯片。在一個嵌入式系統(tǒng)中,通常采用RTC來提供可靠的系統(tǒng)時間,包括時分秒和年月日等,而且要求在系統(tǒng)處于關(guān)機(jī)狀態(tài)下它也能正常工作(通常采用后備電池供電)。本篇主要以Cortex-A9 soc為例講解RTC的使用方法。

[[373945]]

一、RTC

RTC(Real-Time Clock) 實(shí)時時鐘。


RTC

RTC是集成電路,通常稱為時鐘芯片。在一個嵌入式系統(tǒng)中,通常采用RTC來提供可靠的系統(tǒng)時間,包括時分秒和年月日等,而且要求在系統(tǒng)處于關(guān)機(jī)狀態(tài)下它也能正常工作(通常采用后備電池供電)。

它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768kHz 晶體和電阻電容等,并且具有鬧鐘的功能。。

二、Exynos 4412 RTC

本篇主要以Cortex-A9 soc為例講解RTC的使用方法。

1. 特性

實(shí)時時鐘(RTC)單元可以通過備用電池供電,因此,即使系統(tǒng)電源關(guān)閉,它也可以繼續(xù)工作。RTC可以通過STRB/LDRB 指令將8位BCD碼數(shù)據(jù)送至CPU。這些BCD數(shù)據(jù)包括秒、分、時、日期、星期、月和年。

RTC單元通過一個外部的32.768kHz 晶振提供時鐘。

RTC具有定時報(bào)警的功能。

其功能說明如下:

1 -- 時鐘數(shù)據(jù)采用BCD編碼。

2 -- 能夠?qū)﹂c年的年月日進(jìn)行自動處理。

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

4 -- 具有獨(dú)立的電源輸入。

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

2. RTC Block


RTC Block Diagram

RTC在Linux中主要實(shí)現(xiàn)兩種功能,分別是系統(tǒng)掉電后的時間日期維持和時間日期報(bào)警(類似定時器)。

「1)時間日期維持功能:」

主要是由RTC實(shí)時時鐘控制寄存器RTCCON進(jìn)行功能的使能控制,由節(jié)拍時間計(jì)數(shù)寄存器TICNT來產(chǎn)生節(jié)拍時間中斷來實(shí)現(xiàn)實(shí)時操作系統(tǒng)功能相關(guān)的時間和實(shí)時同步。其中對時間日期的操作實(shí)際上是對BCD碼操作,而BCD碼則是由一系列的寄存器組成(BCD秒寄存器BCDSEC、BCD分寄存器BCDMIN、BCD小時寄存器BCDHOUR、BCD日期寄存器BCDDATE、BCD日寄存器BCDDAY、BCD月寄存器BCDMON、BCD年寄存器BCDYEAR)。

「2)報(bào)警功能:」

主要由RTC報(bào)警控制寄存器RTC ALM進(jìn)行功能使能控制,并產(chǎn)生報(bào)警中斷。報(bào)警時間日期的設(shè)置也是對一系列的寄存器進(jìn)行操作(報(bào)警秒數(shù)據(jù)寄存器ALMSEC、報(bào)警分鐘數(shù)據(jù)寄存器ALMMIN、報(bào)警小時數(shù)據(jù)寄存器ALMHOUR、報(bào)警日期數(shù)據(jù)寄存器ALMDATE、報(bào)警月數(shù)據(jù)寄存器ALMMON、報(bào)警年數(shù)據(jù)寄存器ALMYEAR)。

「3)閏年發(fā)生器」

可以根據(jù)BCDDAY、BCDMON和BCDEEAR的值自動計(jì)算閏年。

3. 備用電池

備用電池可以驅(qū)動RTC邏輯。備用電池通過RTCVDD引腳向RTC塊,即使系統(tǒng)電源關(guān)閉。如果系統(tǒng)關(guān)閉,您應(yīng)該阻止CPU和RTC邏輯。為了減少功耗,備用電池單獨(dú)驅(qū)動振蕩電路和BCD計(jì)數(shù)器。

4. Alarm【報(bào)警】

功能RTC在斷電模式或正常運(yùn)行模式都可以在執(zhí)行的時間產(chǎn)生一個ALARM_INT 和ALARM_WK信號。在正常工作模式下,它會產(chǎn)生ALARM_INT。在斷電模式下,它會ALARM_WK以及ALARM_INT信號。RTC報(bào)警寄存器(RTCALM)確定報(bào)警啟用/禁用狀態(tài)和報(bào)警時間設(shè)置的條件。

5. 晶振

32.768 kHz X-Tal Connection Example


晶振時鐘頻率 32.768 kHz。


  1. XT_RTC_I 32.768 kHz RTC振蕩器時鐘輸入
  2.  
  3. XT_RTC_O 32.768 kHz RTC振蕩器時鐘輸出
  4. XRTCCLKO 32.768 kHz RTC振蕩器時鐘輸出,此信號默認(rèn)關(guān)閉。可以通過設(shè)置寄存器RTCCON的CLKOUTEN字段為1來啟用它。

引腳連接圖:


由電路圖可知,只連接了RTC振蕩器時鐘輸入引腳XT_RTC_I 。

三、寄存器

1. RTC寄存器組:


寄存器組

2. INTP


設(shè)置對應(yīng)的bit為1就可以清除中斷。

3. RTCCONRTCCON

1.RTCCON寄存器由10位組成,如控制BCD SEL讀/寫啟用的CTLEN, CNTSEL、CLKRST、TICKSEL、TICEN用于測試,CLKOUTEN用于RTC時鐘輸出控制。

2.CTLEN位控制CPU和RTC之間的所有接口。因此,您應(yīng)該在RTC控件中將其設(shè)置為“1”,在系統(tǒng)重置后啟用數(shù)據(jù)寫入的例程。為了防止無意中寫入BCD計(jì)數(shù)器寄存器,應(yīng)該關(guān)閉電源前將CTLEN位清除為0。

3.CLKRST是2^15^時鐘分頻器的計(jì)數(shù)器復(fù)位。在設(shè)置RTC時鐘之前,應(yīng)重置215時鐘分頻器以獲得精確的RTC操作。

四、RTC的操作

1. 設(shè)置時間

「舉例:」我們要將當(dāng)前時間設(shè)置為 「2020年11月11日, 15:24:50」

1) 先將RTC控制使能開啟,即RTCCON[0]置為1;2)然后將時間對應(yīng)的BCD格式數(shù)值,設(shè)置到應(yīng)對的寄存器,BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC;3) 將RTCCON[0]置為0,防止誤操作修改了時間;4)如果我們要訪問當(dāng)前時間,可以直接讀取寄存器BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC。

  1. void rtc_init(void) 
  2.  RTCCON = 1;//使能RTC控制寫功能 
  3.  RTC.BCDYEAR = 0x20;// 2020年11月11日, 15:24:50.以BCD碼格式寫入 
  4.  RTC.BCDMON = 0x11; 
  5.  RTC.BCDDAY = 0x11; 
  6.  RTC.BCDHOUR = 0x15; 
  7.  RTC.BCDMIN = 0x24; 
  8.  RTC.BCDSEC = 0x50; 
  9.  RTCCON = 0;//關(guān)閉RTC控制寫功能 

2. 操作滴答定時器

TICNT


TICNT

RTC計(jì)時器是一個遞增計(jì)數(shù)器,并引發(fā)計(jì)時中斷。TICNT寄存器包含32位目標(biāo)計(jì)數(shù)值,并且CURTICCNT寄存器包含32位當(dāng)前計(jì)時計(jì)數(shù)。如果當(dāng)前滴答數(shù)達(dá)到TICNT中指定的目標(biāo)值時,計(jì)時中斷發(fā)生。

一秒鐘計(jì)數(shù)的次數(shù),由RTCCON[7:4]即TICCKSEL位決定:


TICCKSEL

因?yàn)槲覀兊木д耦l率也是32768,為方便計(jì)數(shù),所以我們設(shè)置RTCCON[7:4]為0,開啟滴答計(jì)時器需要設(shè)置RTCCON[8]位1:

TICEN

代碼如下:

  1. RTCCON = RTCCON & (~(0xf << 4)) | (1 << 8); 
  2. TICCNT = 32768; 

3. 操作ALARM鬧鐘

RTCALM


RTCALM寄存器控制報(bào)警功能的啟用和報(bào)警時間。請注意,RTCALM寄存器在斷電模式下將同時生成ALARM_INT和ALARM_WK信號,但在正常模式下僅生成ALARM_INT信號。設(shè)置ALMEN[6]為1以產(chǎn)生ALARM_INT和ALARM_WK信號。

「舉例:」

比如我們想每個小時的25分58秒產(chǎn)生一個中斷信號,那我們需要設(shè)置RTCALM[1]、RTCALM[0]為1,同時設(shè)置RTCALM[6]為1以開啟alarm功能,然后將BCD格式的時間設(shè)置到寄存器ALMSEC、ALMMIN。

代碼如下:

  1. RTCALM.ALM = (1 << 6)|(1 << 0)|(1 << 1);//使能bite:MINEN、SECEN 
  2. RTCALM.SEC = 0x58; 
  3. RTCALM.MIN = 0x25;  //每小時25:58產(chǎn)生一次中斷 

alarm功能設(shè)置鬧鐘時間寄存器如下:






寄存器操作,采用BCD格式。

五、完整代碼實(shí)現(xiàn)

滴答計(jì)時器和alarm鬧鐘會產(chǎn)生內(nèi)部中斷信號,所以我們必須給這兩個中斷信號進(jìn)行中斷相關(guān)的初始化,并在中斷處理函數(shù)中增加相應(yīng)的處理代碼。

中斷號

參考datasheet 9.2.2 GIC Interrupt Table


rtc中斷號

關(guān)于中斷的初始化的寄存器配置,我們可以參考《11. 從0開始學(xué)ARM-基于Exynos4412中斷詳解、key程序編寫》

區(qū)別是,key連接在了第一級中斷控制器,而rtc的這兩個中斷則沒有。清中斷需要設(shè)置的寄存器如下:

「滴答計(jì)時器清中斷:」

  1. RTCINTP  = RTCINTP | (1 << 0); 
  2. //清GIC中斷標(biāo)志位 
  3. ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 13); 
  4. //清cpu中斷標(biāo)志位 
  5. CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num;  

「alarm計(jì)時器清中斷:」

  1. RTCINTP  = RTCINTP | (1 << 1); 
  2. //清GIC中斷標(biāo)志位 
  3. ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 12); 
  4. //清cpu中斷標(biāo)志位 
  5. CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num;  

「滴答計(jì)時器中斷初始化:」

  1. void rtc_tic(void) 
  2.  RTCCON = RTCCON & (~(0xf << 4)) | (1 << 8); 
  3.  TICCNT = 32768; 
  4.  ICDDCR = 1;  //使能分配器 
  5.  ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 13); //使能相應(yīng)中斷到分配器 
  6.  ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 8))|(0x1 << 8); //選擇CPU接口 
  7.  CPU0.ICCPMR = 255; //中斷屏蔽優(yōu)先級 
  8.  CPU0.ICCICR = 1;   //使能中斷到CPU 

「alarm初始化」

  1. void rtc_alarm(void) 
  2.  RTCALM.ALM = (1 << 6)|(1 << 0)|(1 << 1); 
  3.  RTCALM.SEC = 0x58; 
  4.  RTCALM.MIN = 0x25;  //每小時25:58產(chǎn)生一次中斷 
  5.  ICDDCR = 1;    //使能分配器 
  6.   //使能相應(yīng)中斷到分配器 
  7.  ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 12); 
  8.  //選擇CPU接口 
  9.  ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 0))|(0x1 << 0);  
  10.  CPU0.ICCPMR = 255; //中斷屏蔽優(yōu)先級 
  11.  CPU0.ICCICR = 1;   //使能中斷到CPU 

「中斷處理函數(shù)」

  1. void do_irq(void) 
  2.  static int a = 1; 
  3.  int irq_num; 
  4.  irq_num = CPU0.ICCIAR&0x3ff;  //獲取中斷號 
  5.  switch(irq_num) 
  6.  { 
  7.   case 57: //按鍵key 
  8.    printf("in the irq_handler\n"); 
  9.    //清GPIO中斷標(biāo)志位 
  10.    EXT_INT41_PEND = EXT_INT41_PEND |((0x1 << 1));  
  11.    //清GIC中斷標(biāo)志位 
  12.    ICDICPR.ICDICPR1 = ICDICPR.ICDICPR1 | (0x1 << 25);  
  13.   break; 
  14.   case 76: 
  15.    printf("in the alarm interrupt!\n"); 
  16.    RTCINTP  = RTCINTP | (1 << 1); 
  17.    //清GIC中斷標(biāo)志位 
  18.    ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 12);  
  19.   break; 
  20.   case 77: 
  21.    printf("in the tic interrupt!\n"); 
  22.    RTCINTP  = RTCINTP | (1 << 0); 
  23.     //清GIC中斷標(biāo)志位 
  24.    ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 13); 
  25.    break; 
  26.  } 
  27.  //清cpu中斷標(biāo)志位 
  28.  CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num;  

「其他代碼:」

  1. void rtc_init(void) 
  2.  RTCCON = 1;//使能RTC控制寫功能 
  3.  RTC.BCDYEAR = 0x20;// 2020年11月11日, 15:24:50.以BCD碼格式寫入 
  4.  RTC.BCDMON = 0x11; 
  5.  RTC.BCDDAY = 0x11; 
  6.  RTC.BCDHOUR = 0x15; 
  7.  RTC.BCDMIN = 0x24; 
  8.  RTC.BCDSEC = 0x50; 
  9.  RTCCON = 0;//關(guān)閉RTC控制寫功能 
  10. int main (void) 
  11. {     rtc_init(); 
  12.   rtc_alarm(); 
  13.   rtc_tic(); 
  14.   //每隔一秒打印以下當(dāng)前時間 
  15.   while(1) 
  16.   { 
  17.    printf("%x-%x-%x %x:%x:%x\n",RTC.BCDYEAR, 
  18.    RTC.BCDMON, 
  19.    RTC.BCDDAY, 
  20.    RTC.BCDHOUR, 
  21.    RTC.BCDMIN,RTC.BCDSEC); 
  22.    delay_ms(1000); 
  23.   } 

 

責(zé)任編輯:姜華 來源: 一口Linux
相關(guān)推薦

2021-01-26 06:15:42

Cortex-A9 R嵌入式系統(tǒng)啟動代碼

2020-12-22 11:54:42

C語言Cortex-A9LED匯編

2021-01-19 19:32:01

Cortex-A9 R嵌入式系統(tǒng)i2c 外設(shè)

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2024-04-12 12:19:08

語言模型AI

2021-01-08 12:06:59

WDT定時裝置

2020-12-30 15:17:25

Cortex-A9UARTprintf函數(shù)

2021-03-22 10:05:59

netstat命令Linux

2023-09-15 12:00:01

API應(yīng)用程序接口

2023-09-08 08:20:46

ThreadLoca多線程工具

2021-01-16 11:40:28

ARM嵌入式開發(fā)ADC應(yīng)用

2023-09-02 21:27:09

2021-02-28 20:53:37

Cookie存儲瀏覽器

2020-09-03 06:35:44

Linux權(quán)限文件

2023-05-22 13:27:17

2021-03-04 00:09:31

MySQL體系架構(gòu)

2023-03-06 21:29:41

mmap技術(shù)操作系統(tǒng)

2020-12-07 06:19:50

監(jiān)控前端用戶

2021-07-08 10:08:03

DvaJS前端Dva

2024-07-12 14:46:20

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 精品欧美一区二区三区久久久 | 97超在线视频 | 日日操操操 | 国产精品高清在线 | 亚洲免费视频一区 | 久久久久久艹 | 亚洲一区二区精品视频在线观看 | 国产精品久久片 | 91精品国产91久久久久久 | 午夜在线观看免费 | 亚洲bt 欧美bt 日本bt | 久久久资源 | 国产精品成人国产乱一区 | 久久www免费视频 | 成人综合一区 | 久草新在线 | av资源中文在线天堂 | 国产成在线观看免费视频 | 天天躁人人躁人人躁狂躁 | 一级欧美 | 欧美日韩精品综合 | 日本在线观看视频 | 伊人网站在线 | 黄色一级毛片免费看 | 范冰冰一级做a爰片久久毛片 | 涩涩视频在线观看 | 欧美精品一区二区在线观看 | 色综合99 | 国产区精品视频 | 91大神在线资源观看无广告 | 日韩一级免费看 | 国产精品久久久久久久久久免费看 | 国产精品一区二区福利视频 | 日产精品久久久一区二区福利 | 国产精品久久久久久久久久尿 | 一区二区三区国产好的精 | 久久伊人免费视频 | 欧美xxxx在线| 久久99精品久久久久久国产越南 | 中文字幕一区二区三区在线观看 | 99久久免费精品国产免费高清 |