版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第八章定時/計數(shù)器接口設(shè)計2/1/2023本章學習目標與要求1.
掌握定時/計數(shù)器的基本原理。2.掌握實時時鐘RTC的編程方法。3.掌握看門狗定時器的設(shè)計方法。4.掌握tick中斷的設(shè)計方法。5.掌握PWM的設(shè)計方法。基于ARM的嵌入式系統(tǒng)接口技術(shù)定時控制部件定時部件是嵌入式系統(tǒng)中常用的部件,其主要用作定時功能或計數(shù)功能。不同的定時部件在使用上有所差異,但它們的邏輯原理是相同的。S3C2410芯片中的定時部件有多個,不同的定時部件有不同的應(yīng)用。這里主要介紹其中的看門狗定時器、RTC部件和Timer部件的控制原理及應(yīng)用?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.1工作場景導入2/1/20238.1.1工作場景一設(shè)計一個簡單的電子鐘可以在超級終端上顯示實時時間的年月日時分秒,時間實時更新,即每秒鐘更新;通常電子時鐘校準時間只能校準時分,該鬧鐘可以實現(xiàn)秒校準;另外,可以設(shè)置在重要的時間點的報時功能。具體功能如下。(1)給系統(tǒng)設(shè)置一個起始時間,如2010/12/2509:35:00,星期六,要求時間每隔一秒更新顯示,即可以看到時間在一秒一秒變化(時間顯示通過串口通信在超級終端上顯示)?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.1.1工作場景一(2)具有小范圍校準秒時間的功能:當顯示的時間有誤差時,可以通過按鍵2(接外部中斷EINT2),在實時時間秒數(shù)大于40秒時,進位到整秒時間;實時時間秒數(shù)小于40秒時,退到00秒(如在09:36:47時,按下按鍵2則變成09:37:00;如在09:36:37時,按下按鍵2則變成09:36:00)實現(xiàn)時間校準。(3)設(shè)置電子鐘的報時功能,在2010/12/2509:38:05時報時,報時時四只發(fā)光二極管閃爍三次?;贏RM的嵌入式系統(tǒng)接口技術(shù)引導問題(1)如何設(shè)置實時時間?(2)如何使顯示的時間每秒鐘更新一次?(3)通常的電子鐘在校準時間時都只有小時和分鐘的調(diào)整,而沒有秒調(diào)整,那么如何得到準備到秒的時間?(4)如何設(shè)置電子鐘報時的功能?基于ARM的嵌入式系統(tǒng)接口技術(shù)8.1.2工作場景二帶看門狗功能的電子鐘如果在工作場景一中所制作的電子鐘放在城市的馬路上使用,由于無人職守,并且環(huán)境條件不好,可能會出現(xiàn)死機、程序跑飛(時間顯示不正確)等狀況。要解決這個問題,需要增加看門狗的功能,當出現(xiàn)上述狀況時,能夠自動重啟(假設(shè)內(nèi)部時鐘正常,重新啟動后會顯示正確的時間)。在實驗環(huán)境中,通常程序不會出現(xiàn)問題,因此實驗中采用的方法是:加入看門狗后,定時喂狗則程序正常執(zhí)行;如果人為修改程序不喂狗,則會使實驗箱重新啟動?;贏RM的嵌入式系統(tǒng)接口技術(shù)引導問題(1)看門狗在程序中起什么作用?(2)如何初始化看門狗?如何啟動看門狗工作?(3)看門狗的定時時間間隔如何計算?基于ARM的嵌入式系統(tǒng)接口技術(shù)8.1.3工作場景三用蜂鳴器作鬧鈴聲鬧鐘在報警時可以發(fā)出各種不同的顯示效果。在工作場景一(3)中為簡化程序使用的報警方法是讓發(fā)光二極管發(fā)光,通常鬧鐘報警時應(yīng)該是發(fā)出聲音。因此我們給鬧鐘增加聲音報警功能:修改工作場景一(3)中的報警方法,改為當報警時間到時蜂鳴器響,并且用PWM控制蜂鳴器?;贏RM的嵌入式系統(tǒng)接口技術(shù)引導問題(1)ARM中的定時部件有什么作用?(2)什么是PWM?(3)如何通過PWM控制蜂鳴器發(fā)出不同的聲音?基于ARM的嵌入式系統(tǒng)接口技術(shù)8.2定時/計數(shù)器原理2/1/20238.2.1定時/計數(shù)器如果將定時器定時到1分鐘,那么秒針計數(shù)到60次后,時鐘鬧鈴就會響。這里有個計數(shù)和定時之間的概念轉(zhuǎn)化,時間表示為秒針計數(shù)值,即秒針每一次走動的時間正好是1s,走60次即計數(shù)60次為1分鐘?;贏RM的嵌入式系統(tǒng)接口技術(shù)定時部件的一般性原理定時/計數(shù)器內(nèi)部工作原理圖是以一個N位的加1或減1計數(shù)器為核心,計數(shù)器的初始值由初始化編程設(shè)置,計數(shù)脈沖的來源有兩類:系統(tǒng)時鐘和外部事件脈沖。
系統(tǒng)時鐘M分頻外部事件脈沖N位計數(shù)器=0回0信號初始值基于ARM的嵌入式系統(tǒng)接口技術(shù)定時部件的一般性原理定時器或計數(shù)器的邏輯電路本質(zhì)上是相同的,它們之間的區(qū)別主要在用途上。它們都是主要由帶有保存當前值的寄存器和當前寄存器值加1或減1邏輯組成。定時器的計數(shù)信號是由內(nèi)部的、周期性的時鐘信號承擔,以便產(chǎn)生具有固定時間間隔的脈沖信號,實現(xiàn)定時的功能。計數(shù)器的計數(shù)信號是由非周期性的信號承擔,通常是外部事件產(chǎn)生的脈沖信號,以便對外部事件發(fā)生的次數(shù)進行計數(shù)。因為同樣的邏輯電路可用于這兩個目的,所以該功能部件通常被稱為“定時/計數(shù)器”。基于ARM的嵌入式系統(tǒng)接口技術(shù)定時部件的一般性原理若編程設(shè)置定時/計數(shù)器為定時工作方式時,則N位計數(shù)器的計數(shù)脈沖來源于內(nèi)部系統(tǒng)時鐘,并經(jīng)過M分頻。每個計數(shù)脈沖使計數(shù)器加1或減1,當N位計數(shù)器里的數(shù)加到0或減到0時,則會產(chǎn)生一個“回0信號”,該信號有效時表示N位計數(shù)器里的當前值是0。因為系統(tǒng)時鐘的頻率是固定的,其M分頻后所得到的計數(shù)脈沖頻率也就是固定的,因此通過對該頻率脈沖的計數(shù)就轉(zhuǎn)換為定時,實現(xiàn)了定時功能。基于ARM的嵌入式系統(tǒng)接口技術(shù)定時部件的一般性原理若編程設(shè)置定時/計數(shù)器為計數(shù)方式時,則N位計數(shù)器的計數(shù)脈沖來源于外部事件產(chǎn)生的脈沖信號。有一個外部事件脈沖,計數(shù)器加1或減1,直到N位計數(shù)器中的值為0,產(chǎn)生“回0信號”。N位計數(shù)器里初始值的計算,在不同的定時部件中其具體的計算公式是不同的。
基于ARM的嵌入式系統(tǒng)接口技術(shù)8.2.2看門狗定時器如果你養(yǎng)了一只狗,讓狗看家護院,那么你必須及時喂它,否則它可能不會給你看門,甚至可能會咬你。嵌入式系統(tǒng)經(jīng)常工作在惡劣的環(huán)境下,或者需要在無人狀態(tài)下連續(xù)工作,可能常常會受到來自外界的各種干擾,造成程序紊亂(俗稱程序跑飛),而陷入死循環(huán):程序的正常運行被打斷,系統(tǒng)無法繼續(xù)工作,造成整個系統(tǒng)陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.2.2看門狗定時器對于嵌入式系統(tǒng),人們想到在系統(tǒng)中設(shè)置一種能夠?qū)崟r監(jiān)測系統(tǒng)運行狀態(tài)的功能,當系統(tǒng)程序出現(xiàn)功能錯亂、引起系統(tǒng)程序死循環(huán)或無法運行下去時,這個功能能中斷該系統(tǒng)程序的不正常運行,恢復系統(tǒng)程序的正常運行。Watchdogtimer,中文名稱叫做“看門狗定時器”,就是完成這種功能的部件??撮T狗定時器計時超時時也會引起事件的發(fā)生,只是這個事件除了可以是系統(tǒng)中斷外,也可以是一個系統(tǒng)重起信號(ResetSignal),即能發(fā)送系統(tǒng)重起信號的定時器就是watchdog?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.2.3Timer部件Timer部件是主要用于提供定時功能的部件,能夠滿足人們控制時間的需求。Timer部件作為定時器,可以得到一定時間間隔的定時信號、一定頻率的脈沖信號,充分顯示了“定時”的功能,而計時的功能是次要的。即Timer定時器通常用于不帶計時功能的定時,如“看門狗”就是一種定時器?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.2.3Timer部件Timer部件的典型應(yīng)用是脈寬調(diào)制(PWM)功能,脈寬調(diào)制(PWM)是生成占空比可變、頻率可變、相位可變的方波的設(shè)計方法。PWM是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù),廣泛應(yīng)用于測量、通信、功率控制與變換等許多領(lǐng)域。PWM的一個優(yōu)點是從處理器到被控系統(tǒng)信號都是數(shù)字信號,無需進行數(shù)模轉(zhuǎn)換,數(shù)字信號可將噪聲影響降到最小?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.3實時時鐘2/1/20238.3.1RTC部件實時時鐘部件RTC是用于提供年、月、日、時、分、秒、星期等實時時間信息的定時部件。
RTC部件可以將年、月、日、時、分、秒、星期等信息的8位數(shù)據(jù)以BCD碼格式輸出。它由外部時鐘驅(qū)動工作,外部時鐘頻率為32.768kHz晶體。同時RTC部件還可以具有報警功能。
基于ARM的嵌入式系統(tǒng)接口技術(shù)實時時鐘在嵌入式系統(tǒng)中的作用在一個嵌入式系統(tǒng)中,實時時鐘單元可以其提供可靠的時鐘,包括時分秒和年月日;即使在系統(tǒng)處于關(guān)機狀態(tài)下它也能夠正常工作(通常采用后備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的晶振基于ARM的嵌入式系統(tǒng)接口技術(shù)S3C2410內(nèi)部RTC模塊結(jié)構(gòu)框圖PMWKUP215時鐘分頻秒閏年發(fā)生器重置寄存器ALMINTRTCALMXTlrtc時鐘滴答分時日期星期月控制寄存器年報警發(fā)生器XTortc時鐘滴答發(fā)生器①②④③1Hz⑤基于ARM的嵌入式系統(tǒng)接口技術(shù)8.3.2S3C2410RTC的主要特點·年、月、日、時、分、秒、星期等信息采用BCD碼表示?!らc年發(fā)生器,簡單以判斷最后兩位為00時為閏年,2100年會出錯。·具有報警功能,能提供報警中斷或者系統(tǒng)在節(jié)電模式下的喚醒?!碛歇毩⒌碾娫匆_(RTCVDD)?!ぶС諶TOS內(nèi)核時間片所需的毫秒計時中斷。·進位復位功能。
基于ARM的嵌入式系統(tǒng)接口技術(shù)BCD碼BCD碼是用4位二進制數(shù)來表示1位十進制數(shù)中的0~9這10個數(shù)碼,這種編碼形式利用了四個位元來儲存一個十進制的數(shù)碼。RTC部件能將8位數(shù)據(jù)轉(zhuǎn)換為BCD碼的格式傳送給CPU。使用BCD碼存儲各個時間值,BCD碼在二進制和十進制之間可以很容易的轉(zhuǎn)換,因此使設(shè)置變得很簡單?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.3.2S3C2410RTC的主要特點RTC的時間片計時器用于產(chǎn)生一個中斷請求,TICNT寄存器有一個中斷使能位,和計數(shù)器中的值一起用來控制中斷。當計數(shù)器的值變?yōu)?時,引起時間片計時中斷。中斷信號的周期用下列公式計算: 周期=(n+1)/128s
n:時間片計數(shù)器的值,范圍為1-127RTC的時間片計時器可以用來產(chǎn)生實時操作系統(tǒng)內(nèi)核所需要的時間片?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.3.3S3C2410RTC的基本操作時鐘產(chǎn)生寄存器時間計數(shù)器組報警寄存器組中斷相關(guān)寄存器組基于ARM的嵌入式系統(tǒng)接口技術(shù)RTC的基本操作RTC的主要功能是提供時間信息和產(chǎn)生與時間相關(guān)的中斷。對RTC的操作分為兩部分:RTC初始化讀RTC時間或產(chǎn)生中斷基于ARM的嵌入式系統(tǒng)接口技術(shù)RTC的初始化初始化RTC時鐘值中斷設(shè)置啟動RTC基于ARM的嵌入式系統(tǒng)接口技術(shù)初始化RTC時鐘值初始化RTC時鐘值是通過設(shè)置時間計數(shù)器組完成的,時間計數(shù)器組包括8個寄存器。一般設(shè)置其中七個:如:設(shè)置RTC時間為“2009-11-23,星期一,10:30:02”基于ARM的嵌入式系統(tǒng)接口技術(shù)1.RTC控制寄存器(RTCCON)注意:讀寫RTC寄存器前需要先將RTCEN位置1,修改完各數(shù)據(jù)寄存器后,為防止無意修改,設(shè)置RTCEN不使能,即RTCEN位置0。另外還有一點需要注意的是CNTSEL位,RTC默認是使用BCD編碼,這樣對BCD時鐘寄存器的讀寫就變得非常方便。rRTCCON=0x01; //讀寫使能…… //設(shè)置各個時間計數(shù)器的值或者讀出各個時間計數(shù)器的值rRTCCON=0x00; //禁止讀寫使能符號位描述初始CLKRST[3]實時時鐘計數(shù)器復位0:不復位1:復位0CNTSEL[2]BCD計數(shù)選擇,將計數(shù)器設(shè)置為BCD模式0:選擇BCD模式1:保留0CLKSEL[1]BCD時鐘選擇0:將輸入時鐘進行1/223分頻1:保留0RTCEN[0]RTC讀寫使能0:禁止1:使能0基于ARM的嵌入式系統(tǒng)接口技術(shù)2.時間計數(shù)器組基于ARM的嵌入式系統(tǒng)接口技術(shù)秒數(shù)據(jù)寄存器(BCDSEC)符號位描述初始狀態(tài)SECDATA[6:4]秒數(shù)據(jù)十位的BCD碼值,范圍為0~5-[3:0]秒數(shù)據(jù)個位的BCD碼值,范圍為0~9如設(shè)置當前時間2010年9月1日9時32分00秒,星期三,其中秒數(shù)是00秒,則可以設(shè)置如下。要想獲得當前實時時間的秒數(shù),即讀取秒數(shù)據(jù)寄存器的值,則編寫如下的程序段。//設(shè)置各個時間計數(shù)器的值,設(shè)置秒數(shù)據(jù)寄存器的值rBCDSEC=0x00; //rBCDSEC是BCDSEC寄存器的名字//讀出秒數(shù)據(jù)寄存器的值,放在已聲明的變量sec中sec=rBCDSEC; //sec已聲明的變量基于ARM的嵌入式系統(tǒng)接口技術(shù)分數(shù)據(jù)寄存器(BCDMIN)符號位描述初始狀態(tài)MINDATA[6:4]分數(shù)據(jù)十位的BCD碼值,范圍為0~5-[3:0]分數(shù)據(jù)個位的BCD碼值,范圍為0~9如設(shè)置當前時間2010年9月1日9時32分00秒,星期三,其中分鐘是32分,則可以設(shè)置如下。要想獲得當前實時時間的分鐘數(shù),則可以編寫如下的程序段。//設(shè)置各個時間計數(shù)器的值,設(shè)置分鐘數(shù)據(jù)寄存器的值rBCDMIN=0x32;//讀出分鐘數(shù)據(jù)寄存器的值,放在已聲明的變量min中min=rBCDMIN;基于ARM的嵌入式系統(tǒng)接口技術(shù)時數(shù)據(jù)寄存器(BCDHOUR)符號位描述初始狀態(tài)reserved[7:6]保留HOURDATA[5:4]時數(shù)據(jù)十位的BCD碼值,范圍為0~2-[3:0]時數(shù)據(jù)個位的BCD碼值,范圍為0~9如設(shè)置當前時間2010年9月1日9時32分00秒,星期三,其中小時數(shù)是09時,則可以設(shè)置如下。要想獲得當前實時時間的小時數(shù),則可以編寫如下的程序段。//設(shè)置各個時間計數(shù)器的值,設(shè)置時數(shù)據(jù)寄存器的值rBCDHOUR=0x09;//讀出時數(shù)據(jù)寄存器的值,放在已聲明的變量hour中hour=rBCDHOUR; 基于ARM的嵌入式系統(tǒng)接口技術(shù)日數(shù)據(jù)寄存器(BCDDATE)符號位描述初始狀態(tài)reserved[7:6]保留DATEDATA[5:4]日數(shù)據(jù)十位的BCD碼值,范圍為0~3-[3:0]日數(shù)據(jù)個位的BCD碼值,范圍為0~9如設(shè)置當前時間2010年9月1日9時32分00秒,星期三,其中日期是1日,則可以設(shè)置如下。要想獲得當前實時時間的日期值,則可以編寫如下的程序段。//設(shè)置各個時間計數(shù)器的值,設(shè)置日期數(shù)據(jù)寄存器的值rBCDDATE=0x01;//讀出日期數(shù)據(jù)寄存器的值,放在已聲明的變量date中date=rBCDDATE; 基于ARM的嵌入式系統(tǒng)接口技術(shù)星期數(shù)據(jù)寄存器(BCDDAY)符號位描述初始狀態(tài)reserved[7:3]保留-DAYDATA[2:0]星期數(shù)據(jù)的BCD碼值,范圍為1~7其余略基于ARM的嵌入式系統(tǒng)接口技術(shù)因為時間計數(shù)器組的各個寄存器都是定義為unsignedchar類型,因此,rBCDYEAR寄存器中也只能存放年份的最后兩位,因此設(shè)置時雖然設(shè)置的是四位十進制數(shù),但保存的只是后面的兩位,而取出其中值的時候需要加上前兩位值?;贏RM的嵌入式系統(tǒng)接口技術(shù)例設(shè)置RTC時間為“2009-11-23,星期一,10:30:02”rRTCCON=0x01;//讀寫使能rBCDSEC=0x02;rBCDMIN=0x30;rBCDHOUR=0x10;rBCDDAY=0x23;rBCDDATE=0x01;rBCDMON=0x11;rBCDYEAR=0x2009;rRTCCON=0x00;基于ARM的嵌入式系統(tǒng)接口技術(shù)獲取實時時間,即獲取實時時鐘當前時間、日期rRTCCON=0x01;sec=rBCDSEC;min=rBCDMIN;hour=rBCDHOUR;day=rBCDDAY;date=rBCDDATE;mon=rBCDMON;year=0x2000+rBCDYEAR;rRTCCON=0x00;基于ARM的嵌入式系統(tǒng)接口技術(shù)8.3.3.2報警中斷可以在RTC中設(shè)定在某個時間產(chǎn)生中斷,該功能可通過報警中斷來實現(xiàn):當未屏蔽的報警時間寄存器和對應(yīng)的時間計數(shù)器計數(shù)值都相匹配時,就產(chǎn)生報警中斷,且輸出一個約為1.8V的報警輸出信號。通過設(shè)置報警控制寄存器即可設(shè)定報警中斷的產(chǎn)生時刻。例如:設(shè)置秒時鐘告警,則設(shè)置:rRTCALM=0x41;//0x41表示使能RTC告警,以及使能秒時鐘告警基于ARM的嵌入式系統(tǒng)接口技術(shù)報警控制寄存器(RTCALM)符號位描述初始狀態(tài)保留[7]保留0ALMEN[6]時鐘告警總使能/禁止0:禁止1:使能0YEAREN[5]年時鐘告警使能/禁止0:禁止1:使能0MONREN[4]月時鐘告警使能/禁止0:禁止
1:使能0DAYEN[3]日時鐘告警使能/禁止0:禁止1:使能0HOUREN[2]時時鐘告警使能/禁止0:禁止1:使能0MINEN[1]分時鐘告警使能/禁止0:禁止1:使能0SECEN[0]秒時鐘告警使能/禁止0:禁止1:使能0基于ARM的嵌入式系統(tǒng)接口技術(shù)日數(shù)據(jù)寄存器(BCDDATE)報警控制寄存器(RTCALM)用來確定報警功能是否使能以及各報警時間寄存器是否使能(被屏蔽)。RTCALM寄存器是可讀/寫的如設(shè)置秒時鐘告警,則需要使能總告警位和秒時鐘告警位。
要設(shè)置報警時間為每天的9時35分05秒,即相應(yīng)的時分秒各位都要匹配時報警,應(yīng)該如下設(shè)置。//先設(shè)置報警時間,即設(shè)置相應(yīng)的報警數(shù)據(jù)寄存器的值rRTCALM=0x41;//0x41表示告警總使能bit[6]和使能秒時鐘告警bit[0]//先設(shè)置報警時間,即設(shè)置相應(yīng)的報警數(shù)據(jù)寄存器的值rRTCALM=0x47;//0x47表示告警總使能bit[6]=1并使能bit[2:0]=111基于ARM的嵌入式系統(tǒng)接口技術(shù)報警時間數(shù)據(jù)寄存器基于ARM的嵌入式系統(tǒng)接口技術(shù)報警秒數(shù)據(jù)寄存器(ALMSEC)(其余略)符號位描述初始狀態(tài)reserved[7]保留0SECDATA[6:4]報警定時器秒數(shù)據(jù)的十位數(shù)BCD碼值,范圍為0~5000[3:0]報警定時器秒數(shù)據(jù)的個位BCD碼值,范圍為0~90000如設(shè)置報警時間為每天的9時35分05秒,其中秒報警時間為05秒,則可以如下設(shè)置。rALMSEC=0x05;基于ARM的嵌入式系統(tǒng)接口技術(shù)例設(shè)置報警時間為每天的9時35分05秒,可以如下設(shè)置。rRTCCON=0x01;//讀寫使能//以下六行設(shè)置各個報警數(shù)據(jù)寄存器的值rALMSEC=0x05;rALMMIN=0x35;rALMHOUR=0x09;rALMDATE=0x01;rALMMON=0x09;rALMYEAR=0x2010;rRTCALM=0x47; //報警總使能、時、分、秒報警使能rRTCCON=0x00; //禁止讀寫使能基于ARM的嵌入式系統(tǒng)接口技術(shù)8.3.3.2報警中斷若要在報警時間到時產(chǎn)生報警中斷,還需要進行中斷設(shè)置,利用第六章的中斷處理函數(shù),可以如下設(shè)置void__irq
rtc_int_isr(void); //放在函數(shù)外,聲明中斷處理函數(shù)Irq_Request(IRQ_RTC,rtc_int_isr); //請求中斷,IRQ_RTC為中斷號//此處加入設(shè)置報警時間及方式的語句或函數(shù)調(diào)用Irq_Enable(IRQ_RTC); //使能中斷//在中斷處理函數(shù)里清除中斷Irq_Clear(IRQ_RTC);基于ARM的嵌入式系統(tǒng)接口技術(shù)8.3.3.2報警中斷ALMEN使能,對應(yīng)RTCALM都相應(yīng)使能。設(shè)置相應(yīng)告警時分秒寄存器。當RTC時鐘運行到跟我們設(shè)定的告警時鐘值相等瞬間發(fā)生一次告警中斷,RTC時鐘跟告警時鐘比較時,只是按照RTCALM中設(shè)定的使能的年月日時分秒順序比較,均想等時才發(fā)生,如果其中的RTCALM中的某位設(shè)為禁止,則不對此位作比即可?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.3.3.3進位復位功能在S3C2410的RTC單元中有一個循環(huán)復位寄存器(RTCRST),具有進位復位的功能,即可以把實時時間直接調(diào)整到整分鐘值,把秒置為00。更具體地說,秒的進位周期可以選擇,進位周期可以設(shè)置為30、40、50。有兩種調(diào)整方式:大于設(shè)定的進位周期時,分鐘數(shù)據(jù)加1,秒置為00;小于設(shè)定的進位周期時,分鐘數(shù)據(jù)不變,秒置00。這個功能類似于數(shù)學上“四舍五入”的計算方法?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.3.3.3進位復位功能例如,當進位周期選為40秒,若當前時間是09:36:47,通過使能循環(huán)復位位,則當前時間將變?yōu)?9:37:00;若當前時間是09:36:37,通過使能循環(huán)復位位,則當前時間將變?yōu)?9:36:00。進位復位功能是通過循環(huán)復位寄存器(RTCRST)完成的?;贏RM的嵌入式系統(tǒng)接口技術(shù)循環(huán)復位寄存器(RTCRST)符號位描述初始狀態(tài)SRSTEN[3]秒循環(huán)復位使能位1:使能
0:不使能0SCCR[2:0]確定秒循環(huán)進位的周期011=超過30秒100=超過40秒101=超過50秒000秒的進位周期可以進行選擇(30、40、50),在進位復位發(fā)生后秒,秒的數(shù)值又循回到0。例如,當前時間是23:37:47,進位周期選為40秒,則當前時間將變?yōu)?3:38:00?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.3.3.4時鐘節(jié)拍中斷RTC的時間片計時器即時鐘節(jié)拍用于中斷請求,可以用來產(chǎn)生實時操作系統(tǒng)內(nèi)核所需的時間片。在TICNT寄存器中有一個時間片計數(shù)器,該寄存器共有八位,有一位中斷使能位和一個計數(shù)數(shù)值n(n占7位,因此n的取值范圍為1~127(27-1=127)),該計數(shù)器是減1計數(shù)器,啟動計數(shù)后,當計數(shù)器的值減到0后,則產(chǎn)生一個毫秒級中斷,叫做時間片計時中斷或時鐘節(jié)拍中斷?;贏RM的嵌入式系統(tǒng)接口技術(shù)實時時鐘計數(shù)器(時間片計數(shù)器)TICNT符號位描述初始狀態(tài)TICKINTENABLE[7]中斷使能/禁止0:禁止1:使能0TICKTIMECOUNT[6:0]實時時鐘計數(shù)器0000000當計數(shù)值減少到0則產(chǎn)生時間片計時(時鐘節(jié)拍)中斷。那么中斷周期就是: 周期=(n+1)/128sec其中n為時間片計數(shù)器中的值(Ticktimecountvalue),范圍是1-127?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.3.3.4時鐘節(jié)拍中斷例如,程序中設(shè)置每秒鐘引發(fā)一次中斷rRTCCON=0x0; //禁止RTC寄存器讀寫使能rTICNT=0x7f|0x80; //TICK中斷使能,周期為(1+127)/128秒//0x80即設(shè)置此寄存器的位[7]為1,使能時間片計數(shù)中斷基于ARM的嵌入式系統(tǒng)接口技術(shù)8.4回到工作場景一2/1/2023工作過程一1)通過超級終端顯示實時時間的時、分、秒首先設(shè)置實時時間,然后讀取實時時間值,并在超級終端上打印出來。建立一個工程打開CodeWarriorIDE,新建一個工程,輸入工程名rtc,存放在D:\test\rtc目錄下;新建一個C語言源文件,輸入文件名rtctest.c,存放在D:\test\rtc目錄下并加入到工程rtc中?;贏RM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序首先包含寄存器地址定義的頭文件。/*包含文件*/#include"2410addr.h"/*在此頭文件中有對RTC中用到的寄存器的定義,例如#definerRTCCON (*(volatileunsignedchar*)0x57000040)//RTCcontrol#definerTICNT (*(volatileunsignedchar*)0x57000044)//Ticktimecount#definerRTCALM (*(volatileunsignedchar*)0x57000050)//RTCalarmcontrol#definerALMSEC (*(volatileunsignedchar*)0x57000054)//Alarmsecond……*/基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序在程序中,定義一個函數(shù)rtcset(),用來設(shè)置當前時間,函數(shù)的參數(shù)為要設(shè)置的時間,用數(shù)組(年只存儲后面兩位)或結(jié)構(gòu)體(可以表示不同的數(shù)據(jù)類型)來定義此參數(shù)更加方便。假設(shè)設(shè)置的時間為2010/12/2509:35:00,星期六。①定義一個結(jié)構(gòu)體類型rtc_date。typedef
structST_DATE //定義結(jié)構(gòu)體類型,該類型命名為rtc_date{ shortyear; //年,定義為short類型,可以存儲4位的年份
char mon; //月
char day; //日
char week; //星期
char hour; //時
char min; //分
char sec; //秒}rtc_date; //用typedef定義結(jié)構(gòu)體類型的別名為rtc_date基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序②定義函數(shù)rtcset(rtc_date*p_date),用于設(shè)置系統(tǒng)的實時時間,其中p_date是rtc_date類型的結(jié)構(gòu)體變量。rtcset(rtc_date*p_date){
rRTCCON=0x01; //讀寫使能
rBCDSEC=p_date->sec; //以下使用結(jié)構(gòu)體成員賦值,
rBCDMIN=p_date->min; //用指針取成員時用->運算符
rBCDHOUR=p_date->hour;
rBCDDAY=p_date->week;
rBCDDATE=p_date->day;
rBCDMON=p_date->mon;
rBCDYEAR=p_date->year;
rRTCCON=0x00; //禁止讀寫}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序③再定義一個獲取時間的函數(shù)rtcget(rtc_date*p_date),用于取出實時時間。rtcget(rtc_date*p_date){
rRTCCON=0x01; //讀寫使能
p_date->sec=rBCDSEC; //以下取出時間計數(shù)器組的值賦給結(jié)構(gòu)體成員
p_date->min=rBCDMIN;
p_date->hour=rBCDHOUR;
p_date->week=rBCDDAY;
p_date->day=rBCDDATE;
p_date->mon=rBCDMON;
p_date->year=rBCDYEAR;
rRTCCON=0x00; //禁止讀寫}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序④實時時間要通過串口在超級終端上顯示,因此在主函數(shù)中,首先要初始化時鐘和串口,參見第十章,在這里仍然直接調(diào)用已有的函數(shù)設(shè)置。voidMain(void){ SetClockDivider(1,1); SetMPllValue(0xa1,0x3,0x1);
Isr_Init();
Port_Init(); uart0_init(); …… //下面是具體的對RTC的操作}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序⑤因為要求每隔一秒更新顯示時間,所以在這里利用秒中斷,每秒中斷一次,重新顯示實時時間,秒中斷的設(shè)置也定義為函數(shù),把相應(yīng)的中斷請求和中斷使能都在函數(shù)中實現(xiàn)。#include"interrupt.h" //包含處理中斷相關(guān)的頭文件void__irqrtctick_isr(void); //在主函數(shù)前聲明中斷處理函數(shù)……rtc_tickset(chartick){ pISR_TICK=(unsigned)rtctick_isr; //請求中斷
rRTCCON=0x0; //設(shè)置前禁止對數(shù)據(jù)寄存器讀寫
rTICNT=(tick&0x7f)|0x80; //bit[7]=1,使能TICK中斷,周期為(1+tick)/128秒
Irq_Enable(IRQ_TICK); //使能中斷,在中斷處理函數(shù)中清除}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序⑥調(diào)用上面的兩個函數(shù)進行實時時間的設(shè)置,再取出實時時間,并設(shè)置一個全局變量,標識是否需要更新顯示的內(nèi)容,最后把實時時間通過串口顯示在超級終端里。(程序清單見書上。)上述寫法,每隔一秒鐘重新獲取時間,再更新超級終端的顯示。如果不用秒中斷而直接在while(1)循環(huán)中顯示實時時間,如下面的寫法,雖然也可以實時更新顯示,但這樣的寫法,程序一直在取時間并顯示,浪費資源?;贏RM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序while(1){
rtcget(&m_date);
Uart_Printf(“\b\b\b\b\b\b\b\b%02x:%02x:%02x”,m_date.hour,m_date.min,m_date.sec);}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二編寫rtctest.c程序⑦只要設(shè)置好了時間片中斷計數(shù)器,到時間就會產(chǎn)生中斷,時間片中斷的中斷處理函數(shù)很簡單,只要更改一下標識,保證每秒鐘重新到時間計數(shù)器組取實時時間值。voidrtctick_isr(void){
Irq_Clear(IRQ_TICK); //清除TICK中斷
flag++; //使flag=flag+1}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程三設(shè)置工程并編譯工程①加入需要的啟動文件和其他需要的文件。 加入2410init.s和2410slib.s; 加入2410lib.c,interrupt.c(從提供的光盤資料中拷貝到D:\test目錄),并在工程窗口的LinkOrder標簽頁設(shè)置把它們放在主程序前面;②在工程屬性對話框中的Target\AccessPaths設(shè)置包含的頭文件路徑,對工程的ARMLinker進行設(shè)置,同前。③編譯工程?;贏RM的嵌入式系統(tǒng)接口技術(shù)工作過程四、五下載程序打開AXDDebugger,選擇File|LoadImage命令,加載要調(diào)試的文件D:\test\rtc\rtc_Data\DebugRel\rtc.axf,將程序下載到目標系統(tǒng)。調(diào)試、運行打開超級終端,下載完成后調(diào)試運行,可以在超級終端上看到實時時間年月日時分秒的顯示。此工作場景是在超級終端上顯示實時時間,也可以用六只數(shù)碼管顯示年月日,再顯示時分秒,程序見第11章11.10節(jié)“工作實訓營”的訓練實例1?;贏RM的嵌入式系統(tǒng)接口技術(shù)工作過程一2)校準秒時間在1)所完成的實時時間顯示程序基礎(chǔ)上填加功能:通過按下按鍵2,在實時時間秒數(shù)大于40秒時,進位到整秒時間;實時時間秒數(shù)小于40秒時,退到00秒(如在09:36:47時,按下按鍵2則變成09:37:00;如在09:36:37時,按下按鍵2則變成09:36:00。)假設(shè)按鍵2接外部中斷2。修改rtctest.c程序因為需要使用外部中斷,所以要增加中斷設(shè)置編程?;贏RM的嵌入式系統(tǒng)接口技術(shù)工作過程二①在包含文件部分加入(如果沒有)處理中斷需要用到的頭文件:interrupt.h,2410lib.h(前面用到了tick中斷,已經(jīng)有一部分中斷設(shè)置,只需填加和EINT2相關(guān)的中斷處理部分),在主函數(shù)外部,定義中斷處理函數(shù)。/*定義中斷處理函數(shù)*/void__irqeint2_isr(void);基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二②在主函數(shù)中,加入對EINT2中斷處理過程的函數(shù),包括請求中斷、使能中斷。voidMain(void){
......
//已有端口設(shè)置和中斷初始化
pISR_EINT2=(unsigned)eint2_isr; //請求中斷
Irq_Enable(IRQ_EINT2); //使能中斷
......}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二③在中斷處理函數(shù)中,設(shè)置RTCRST寄存器,主要是使能秒循環(huán)復位,設(shè)置如何循環(huán)復位可以在主函數(shù)中設(shè)置也可以在中斷函數(shù)中設(shè)置。voideint2_isr(void){ Irq_Clear(IRQ_EINT2);//清除中斷
rRTCCON=0x01;//因為復位置位要修改時間計數(shù)器組的值,因此允許其讀寫
rRTCRST|=0xB; //或者在Main中,rRTCRST=0x3,這里rRTCRST|=0x8
rRTCCON=0x00;//修改完后使讀寫禁止,防止被誤修改}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二重新編譯工程、下載并運行重新編譯工程,并下載到實驗箱上運行,分別在不同的時刻按下按鍵2,在超級終端的時間顯示上,觀察秒和分鐘值的變化。基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程一3)設(shè)置在每分鐘的第5秒時報時,報時時間到時四只發(fā)光二極管閃爍三次。修改rtctest.c程序①報警功能也是中斷,因此也需要進行中斷處理。在前面已經(jīng)設(shè)置好包含文件,在主函數(shù)外部,定義中斷處理函數(shù),報警中斷的中斷號命名為IRQ_RTC。/*定義中斷處理函數(shù)*/void__irqalarm_isr(void);基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程一②對于報警的時間和報警方式的設(shè)置,也用一個函數(shù)來完成。在程序中主函數(shù)的前面定義函數(shù)alarmset(rtc_date*p_date,unsignedcharalmmode),這個函數(shù)有兩個參數(shù),第一個是報警的時間,和上面設(shè)置實時時間及獲得實時時間的參數(shù)一樣;第二個參數(shù)是報警的方式,也就是RTCALM報警控制寄存器(RTCALM)中的內(nèi)容,此寄存器共有七位有效位,因此設(shè)置參數(shù)類型為unsignedchar?;贏RM的嵌入式系統(tǒng)接口技術(shù)工作過程一alarmset(rtc_date*p_date,unsignedcharalmmode){
rRTCCON=0x01; //讀寫使能
rALMSEC=p_date->sec;
rALMMIN=p_date->min;
rALMHOUR=p_date->hour;
rALMDATE=p_date->day;
rALMMON=p_date->mon;
rALMYEAR=p_date->year;
rRTCALM=almmode;
rRTCCON=0x00; //禁止讀寫}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程一③在主函數(shù)中,加入中斷處理過程的函數(shù),包括中斷初始化、端口初始化、請求中斷、并調(diào)用上面的函數(shù)實現(xiàn)報警中斷設(shè)置,最后使能中斷。voidMain(void){
......
Isr_Init();//中斷初始化,如果有其他中斷已經(jīng)調(diào)用此函數(shù),不用調(diào)用兩次
Port_Init(); //初始化端口,說明同上
pISR_RTC=(unsigned)alarm_isr; //請求中斷
m_date.sec=0x05; //設(shè)置告警時間,與設(shè)置實時時間類似
m_date.min=0x35;//變量m_date只在賦初值時用到,此處可以重復使用
m_date.hour=0x09;
m_date.date=0x25;
m_date.mon=0x12;
m_date.year=0x10;/*以上賦值語句其實只修改了m_date.sec的值,其他沒變的賦值語句可以不用*/ alarmset(&m_date,0x41); //調(diào)用函數(shù)設(shè)置報警的時間和方式
Irq_Enable(IRQ_RTC); //使能中斷
......}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程一④在中斷處理函數(shù)中,使四只二極管閃爍三次,假設(shè)二極管由0x10000000的bit[7:4]控制。voidrtc_alarm_isr(void){
Irq_Clear(IRQ_RTC); //清除中斷
for(intm=0;m<3;m++){ //閃爍三次 *((unsignedchar*)0x10000000)=0x0f;//0x10000000用于控制二極管
Delay(10); //調(diào)用延時函數(shù) *((unsignedchar*)0x10000000)=0xff; Delay(10); //調(diào)用延時函數(shù)
}//因為這段程序執(zhí)行時間不長,所以放在中斷處理函數(shù)里。}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二重新編譯工程、下載并運行重新編譯工程,并下載到實驗箱上運行,觀察當秒值為5時發(fā)光二極管的變化。基于ARM的嵌入式系統(tǒng)接口技術(shù)8.5看門狗定時器2/1/20238.5.1看門狗定時器的原理S3C2410芯片看門狗定時器的作用是,當系統(tǒng)程序出現(xiàn)功能錯亂,引起系統(tǒng)程序死循環(huán)時,能中斷該系統(tǒng)程序的不正常運行,恢復系統(tǒng)程序的正常運行。基于ARM的嵌入式系統(tǒng)接口技術(shù)五基礎(chǔ)知識8.5.1看門狗定時器的原理其基本原理為:設(shè)本系統(tǒng)程序完整運行一周期的時間是Tp,看門狗的定時周期為Ti,Ti>Tp,在程序運行一周期后就修改定時器的計數(shù)值,只要程序正常運行,定時器就不會溢出,若由于干擾等原因使系統(tǒng)不能在Tp時刻修改定時器的計數(shù)值,定時器將在Ti時刻溢出,引發(fā)系統(tǒng)復位,使系統(tǒng)得以重新運行,從而起到監(jiān)控作用。在一個完整的嵌入式系統(tǒng)或單片機小系統(tǒng)中通常都有看門狗定時器,且一般集成在處理器芯片中,看門狗實際上就是一個定時器,只是它在期滿后將自動引起系統(tǒng)復位?;贏RM的嵌入式系統(tǒng)接口技術(shù)輸入時鐘為PCLK(該時鐘頻率等于系統(tǒng)的主頻),它經(jīng)過兩級分頻,最后將分頻后的時鐘作為該定時器的輸入時鐘,當計數(shù)器期滿后可以產(chǎn)生中斷或者復位信號。S3C2410的看門狗定時器有兩個功能作為常規(guī)定時器使用,并且可以產(chǎn)生中斷作為看門狗定時器使用,期滿時,它可以產(chǎn)生128個時鐘周期的復位信號系統(tǒng)時鐘M分頻外部事件脈沖N位計數(shù)器=0回0信號初始值基于ARM的嵌入式系統(tǒng)接口技術(shù)8.5.1看門狗定時器的原理Watchdog根據(jù)系統(tǒng)時鐘、預(yù)分頻值、分割器因子會產(chǎn)生一個watchdog自己的工作周期,t_watchdog=1/(PCLK/(Prescalervalue+1)/Division_factor)watchdog在一個t_watchdog周期結(jié)束時會產(chǎn)生一個記數(shù)遞減信號,每當這個信號產(chǎn)生時,WTCNT中的值便減1,若在WTCNT遞減為0(TimerOut)的時候軟件層還沒有重新往WTCNT中寫入數(shù)值(喂狗),則watchdog觸發(fā)ResetSignal,系統(tǒng)重起。基于ARM的嵌入式系統(tǒng)接口技術(shù)8.5.1看門狗定時器的原理預(yù)分頻器的值和頻率分解因子可由看門狗定時器的控制寄存器(WTCON)進行編程設(shè)定。預(yù)分頻器值的可選范圍是:
0~28-1。頻率分割因子可選擇的值為16,32,64,128。使用下面公式來計算看門狗定時器的計數(shù)時鐘周期: 計數(shù)時鐘周期
=1/(PCLK/(預(yù)分頻器值
+1)/分割因子)看門狗的定時周期
T=WTCNT*計數(shù)時鐘周期#defineFCLK202800000#defineHCLK(FCLK/2)#definePCLK(FCLK/4)#defineUCLKPCLK基于ARM的嵌入式系統(tǒng)接口技術(shù)8.5.1看門狗定時器的原理一旦看門狗定時器被啟動工作,看門狗定時器中的計數(shù)常數(shù)寄存器(WTDAT)就無法自動的重載到計數(shù)寄存器(WTCNT)中。因此,應(yīng)該在看門狗定時器啟動工作之前,通過初始化編程使計數(shù)常數(shù)寫入計數(shù)寄存器(WTCNT)中。voidwatchdog_init(){
rWTCNT=8448*2; /*設(shè)置看門狗初始值*/
rWTCON=WDT_ENABLE|WDT_RST_ENABLE|WDT_CLK_SEL|WDT_PRE_SCALER; /*打開看門狗*/}基于ARM的嵌入式系統(tǒng)接口技術(shù)五基礎(chǔ)知識8.5.2看門狗定時器的基本操作與看門狗定時器相關(guān)的有如下三個寄存器??撮T狗控制寄存器(WTCON)??撮T狗數(shù)據(jù)寄存器(WTDAT)??撮T狗計數(shù)寄存器(WTCNT)?;贏RM的嵌入式系統(tǒng)接口技術(shù)五基礎(chǔ)知識8.5.2看門狗定時器的基本操作使用看門狗定時器時,需要進行以下三個基本操作步驟的設(shè)置。(1)給減1計數(shù)器WTCNT一個值,用來設(shè)置定時的時鐘周期個數(shù),通過這個值計算出來的定時長度應(yīng)該大于程序運行的周期。(2)設(shè)置計數(shù)脈沖值,即設(shè)置預(yù)分頻器值及分割器因子值;設(shè)置計數(shù)器溢出時的動作。(3)啟動看門狗定時器?;贏RM的嵌入式系統(tǒng)接口技術(shù)1.看門狗控制寄存器(WTCON)符號位描述初始狀態(tài)PrescalerValue[15:8]預(yù)分頻值,有效范圍為:0到(28-1)0x80Reserved[7:6]保留,必須為0000WatchdogTimer[5]看門狗定時器使能/禁止0:禁止看門狗定時器1:使能看門狗定時器1ClockSelect[4:3]決定時鐘分頻因子(分割器因子)
00:1/1601:1/3210:1/6411:1/12800InterruptGeneration[2]中斷使能/禁止0:禁止產(chǎn)生中斷1:使能產(chǎn)生中斷0Reserved[1]保留,必須為00ResetEnable/Disable[0]看門狗定時器輸出引發(fā)復位信號的使能/禁止位0:禁止看門狗定時器的復位功能1:看門狗定時器超時后引發(fā)復位信號1基于ARM的嵌入式系統(tǒng)接口技術(shù)五基礎(chǔ)知識8.5.2看門狗定時器的基本操作設(shè)置計數(shù)脈沖也就是設(shè)置預(yù)分頻值和分割器因子值。預(yù)分頻器的值和頻率分割器因子可由看門狗定時器的控制寄存器(WTCON)進行編程設(shè)定:控制寄存器(WTCON)的bit[15:8]共8位二進制數(shù)決定預(yù)分頻器的分頻值,因此預(yù)分頻器值的可選范圍是0~28-1;控制寄存器(WTCON)的bit[4:3]2位決定頻率分割因子的值,可選擇的值為16,32,64,128。基于ARM的嵌入式系統(tǒng)接口技術(shù)五基礎(chǔ)知識8.5.2看門狗定時器的基本操作控制寄存器還可以設(shè)置定時器溢出時產(chǎn)生什么動作,由控制寄存器(WTCON)的bit[2]設(shè)定是否產(chǎn)生中斷信號,bit[0]設(shè)定是否產(chǎn)生復位信號。最后設(shè)置好上面幾位之后,把該寄存器的bit[5]置1則啟動看門狗開始工作?;贏RM的嵌入式系統(tǒng)接口技術(shù)例要設(shè)置預(yù)分頻值為255,分割器因子選擇16,計數(shù)器溢出時產(chǎn)生復位信號,不生產(chǎn)中斷信號,同時啟動看門狗,則設(shè)置語句:rWTCON=0x7F21;//[15:8]設(shè)為0x7f,[5]設(shè)為1,[4:3]設(shè)為00,[2]設(shè)為0,[0]設(shè)為1,其余位設(shè)為0使用下面公式來計算看門狗定時器的計數(shù)時鐘周期(也就是一個脈沖的時間)。 計數(shù)時鐘周期(t_watchdog)=1/(PCLK/(預(yù)分頻器值+1)/分割因子)基于ARM的嵌入式系統(tǒng)接口技術(shù)2.計數(shù)器寄存器(WTCNT)計數(shù)器寄存器(WTCNT)中存放的是當前的計數(shù)值,正常情況下用作減1計數(shù)器,每來一個計數(shù)時鐘脈沖,計數(shù)器的值減1。重載計數(shù)值即計數(shù)常數(shù)的計算:計數(shù)常數(shù)
=所需時間間隔/計數(shù)時鐘周期=所需時間間隔*(PCLK/(預(yù)分頻器值
+1)/分割因子)位描述初始狀態(tài)[15:0]看門狗定時器的重載計數(shù)值0x8000基于ARM的嵌入式系統(tǒng)接口技術(shù)2.計數(shù)器寄存器(WTCNT)設(shè)置計數(shù)器的初始值以及重置計數(shù)器值的語句如下。rWTCNT=d; //d表示計數(shù)常數(shù)(十進制或十六進制),由上面的公式計算得到基于ARM的嵌入式系統(tǒng)接口技術(shù)3.數(shù)據(jù)寄存器(WTDAT)位描述初始狀態(tài)[15:0]看門狗定時器的當前計數(shù)值0x8000數(shù)據(jù)寄存器(WTDAT)里存放的是看門狗定時器的計數(shù)常數(shù)值,即看門狗定時器的溢出時間間隔值。數(shù)據(jù)寄存器(WTDAT)是可讀/寫的,這個寄存器的功能很簡單,就是保存計數(shù)常數(shù)值,這里存放的值始終不變,并不做減1的操作?;贏RM的嵌入式系統(tǒng)接口技術(shù)3.數(shù)據(jù)寄存器(WTDAT)位描述初始狀態(tài)[15:0]看門狗定時器的當前計數(shù)值0x8000數(shù)據(jù)寄存器(WTDAT)里存放的是看門狗定時器的計數(shù)常數(shù)值,即看門狗定時器的溢出時間間隔值。數(shù)據(jù)寄存器(WTDAT)是可讀/寫的,這個寄存器的功能很簡單,就是保存計數(shù)常數(shù)值,這里存放的值始終不變,并不做減1的操作?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.5.2看門狗定時器的基本操作下面通過一個例子,看看看門狗定時器是如何工作的。例:假設(shè)要監(jiān)測的系統(tǒng)程序的周期不大于40μs,系統(tǒng)時鐘頻率PCLK=50MHz,設(shè)計時假設(shè)取分割器因子為16,預(yù)分頻值為0,則可以得到計數(shù)時鐘周期如下。計數(shù)時鐘周期=1/(PCLK/(預(yù)分頻器值+1)/分割因子)=0.32μs即一個計數(shù)脈沖的時間是0.32μs,要產(chǎn)生一個大于40μs的時間間隔,則計數(shù)脈沖的個數(shù)即計數(shù)常數(shù)的計算公式如下。計數(shù)常數(shù)=所需時間間隔/計數(shù)時鐘周期=40/0.32=125(0x7d)基于ARM的嵌入式系統(tǒng)接口技術(shù)8.5.2看門狗定時器的基本操作voidmain()
{
init_system();
.
...
.....
enable_watchdog();
.
...
.....
while(1)
{
feed_dog();
}
}在實際應(yīng)用中,一般來說feed_dog函數(shù)的調(diào)用是被安插在定時器的中斷服務(wù)例程中。定時器的timeout(不是watchdog的timeout)時間長度必須合適,否則在定時器還沒來得及發(fā)生中斷調(diào)用feed_dog函數(shù)之前,watchdog已經(jīng)timeout了,將引起系統(tǒng)重起基于ARM的嵌入式系統(tǒng)接口技術(shù)例如:監(jiān)測系統(tǒng)程序的周期不大于40μs,PCLK=50MHz。#definerWTCON(*(volatileunsigned*)0x53000000)#definerWTDAT(*(volatileunsigned*)0x53000004)#definerWTCNT(*(volatileunsigned*)0x53000008)voidwatchdog_init(){
rWTCNT=0x7d;
rWTCON=0x21;}取分割因子為:16,預(yù)分頻值為:取0計數(shù)時鐘周期=1/(PCLK/(預(yù)分頻器值+1)/分割因子)=0.32μs定時周期:T=計數(shù)值*計數(shù)時鐘周期,T=40μs,因此計數(shù)值=T/計數(shù)時鐘周期=40/0.32=125基于ARM的嵌入式系統(tǒng)接口技術(shù)匯編語言實現(xiàn)ldr
r0,=WTDAT
;WTDAT寄存器對應(yīng)的地址賦給R0
ldr
r1,=0x7d
;計數(shù)器初始值
str
r1,[r0]
ldr
r0,=WTCON
;WTCON寄存器對應(yīng)的地址賦給R0
ldr
r1,=0x0021
;使能看門狗及其復位功能,分割器值設(shè)為16
str
r1,[r0]
基于ARM的嵌入式系統(tǒng)接口技術(shù)8.6回到工作場景二2/1/2023工作過程一修改rtctest.c程序在8.4節(jié)所編寫的C程序基礎(chǔ)上,填加看門狗定時器的功能。在本程序中我們設(shè)置在時鐘節(jié)拍中斷里喂狗,每秒中斷一次,即每秒喂狗一次。①在主函數(shù)中加入看門狗定時器的初始化程序,初始化程序中設(shè)置WTCNT計數(shù)器的值,并設(shè)置看門狗控制寄存器,(這段程序加在Main()函數(shù)里面,在設(shè)置部分即可,只要不是在while(1)中)。voidMain(void){
……
rWTCNT=0x0800; //此計數(shù)值根據(jù)程序執(zhí)行的時間調(diào)整
rWTCON=0x7f21;
……}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程一②時鐘節(jié)拍中斷的設(shè)置已經(jīng)在工作場景一中的程序中完成,在工作場景一中,通過時鐘節(jié)拍中斷使顯示的時間每秒鐘更新一次。在本場景中,時鐘節(jié)拍中斷除了完成上述功能外,還要在時鐘節(jié)拍中斷的中斷處理函數(shù)中喂狗。時鐘節(jié)拍中斷的中斷處理函數(shù)內(nèi)容如下。voidrtctick_isr(void){Irq_Clear(IRQ_TICK); //清除TICK中斷flag++; //原來程序中的內(nèi)容rWTCNT=0x0800; //加入喂狗}基于ARM的嵌入式系統(tǒng)接口技術(shù)工作過程二重新編譯工程、下載并運行重新編譯工程,并下載到實驗箱上運行,觀察程序的運行情況,再把中斷處理函數(shù)中的喂狗部分注釋掉,再重新編譯工程,并下載到實驗箱上運行,觀察此時程序運行的情況。結(jié)論:當加入看門狗功能,并且每秒中喂狗一次時,程序運行和原來一樣;當注釋掉喂狗的語句后,程序很快就會重新啟動。基于ARM的嵌入式系統(tǒng)接口技術(shù)8.7Timer部件2/1/20238.7.1基礎(chǔ)知識Timer部件主要是用于提供定時功能、脈寬調(diào)制(PWM)功能的部件,它的應(yīng)用比較靈活,對于需要一定頻率的脈沖信號、一定時間間隔的定時信號的應(yīng)用場合,它都能提供應(yīng)用支持。s3c2410提供了5個16位的Timer(Timer0~Timer4),其中Timer0~Timer3支持PulseWidthModulation——PWM(脈寬調(diào)制)。Timer4是一個內(nèi)部定時器(internaltimer),沒有輸出引腳(outputpins)。定時器0有Dead-zone發(fā)生器,可以保證一對反向信號不會同時改變狀態(tài),常用于大電流設(shè)備中?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.7.1基礎(chǔ)知識脈寬調(diào)制(PWM)就是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中,例如多相位電機控制、燈光亮度控制、DC-DC轉(zhuǎn)換器等場合。PWM從處理器到被控系統(tǒng)信號都是數(shù)字式的,無需進行數(shù)模轉(zhuǎn)換。讓信號保持為數(shù)字形式可將噪聲影響降到最小。PWM控制器使得ARM具備了強大的矩形波輸出能力,可以十分方便地輸出不同頻率、不同占空比的矩形波?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.7.1基礎(chǔ)知識PWM是一種對模擬信號電平進行數(shù)字編碼的方法。通過高分辨率計數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體模擬信號的電平進行編碼。PWM信號仍然是數(shù)字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。通的時候即是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM進行編碼?;贏RM的嵌入式系統(tǒng)接口技術(shù)PWM信號占空比為10%的PWM輸出0.9V的模擬信號供電電壓為9V占空比為50%的PWM輸出4.5V的模擬信號占空比為70%的PWM輸出6.3V的模擬信號基于ARM的嵌入式系統(tǒng)接口技術(shù)接通時間、周期、占空比和調(diào)制頻率以上頁例子為例,接通時間為燈泡點亮時間周期為一次通斷的時間占空比是接通時間與周期之比調(diào)制頻率為周期的倒數(shù)。要想取得調(diào)光燈(保持點亮)的效果,必須提高調(diào)制頻率。通常調(diào)制頻率為1kHz到200kHz之間?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.7.2Timer部件的基本原理Timer定時器的基本功能原理和通用定時/計數(shù)器的原理是相同的,如圖所示,圖中是S3C2410處理器中五個Timer中的一個Timer的功能原理圖,其他四個基本原理與此相同。基于ARM的嵌入式系統(tǒng)接口技術(shù)8.7.2Timer部件的基本原理PCLK是Timer的信號源,我們通過設(shè)置每個Timer相應(yīng)的Prescaler和ClockDivider把PCLK轉(zhuǎn)換成輸入時鐘信號傳送給各個Timer的邏輯控制單元(ControlLogic),事實上每個Timer都有一個稱為輸入時鐘頻率(TimerinputclockFrequency)的參數(shù),這個頻率就是通過PCLK,Prescaler和ClockDivider確定下來的,每個Timer的邏輯控制單元就是以這個頻率在工作?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.7.2Timer部件的基本原理輸入時鐘頻率的公式:
定時器輸入時鐘頻率=PCLK/(預(yù)分頻系數(shù)+1)/(分割器值)
預(yù)分頻系數(shù)的范圍=0~255
分割器值的取值范圍=2,4,8,16
定時器在一個工作周期(Timerinputclockcycle)內(nèi)的具體工作內(nèi)容主要有3個。分別是:
1.對一個數(shù)值進行遞減操作
2.把遞減后的數(shù)值和另一個數(shù)值進行比較操作
3.產(chǎn)生中斷或執(zhí)行DMA操作基于ARM的嵌入式系統(tǒng)接口技術(shù)8.7.3S3C2410的Timer部件S3C2410提供了5個16位的定時器Timer(Timer0~Timer4)Timer0~Timer3支持PulseWidthModulation——PWM(脈寬調(diào)制)。Timer4是一個內(nèi)部定時器(internaltimer),沒有輸出引腳(outputpins)。定時器0有Dead-zone發(fā)生器,可以保證一對反向信號不會同時改變狀態(tài),常用于大電流設(shè)備中?;贏RM的嵌入式系統(tǒng)接口技術(shù)8.7.3S3C2410的Timer部件定時器0和定時器1使用相同的分頻器,但他們的計數(shù)器以及控制器是各自獨立的,定時器2/3/4情況相同。基于ARM的嵌入式系統(tǒng)接口技術(shù)8.7.4Timer部件的基本操作S3C2410定時器有關(guān)的寄存器定時器配置寄存器定時器初值計數(shù)器以及比較計數(shù)器定時器控制寄存器計數(shù)觀察寄存器(TCNTOn)基于ARM的嵌入式系統(tǒng)接口技術(shù)8.7.4Timer部件的基本操作在啟用Timer之前我們會對Timer進行一系列初始化操作,然后啟動定時器工作。初始化定時器就是設(shè)置定時器的預(yù)分頻系數(shù)、設(shè)置分割器值、將初始值寫到TCNTB和TCMPB寄存器、設(shè)置定時器手動更新位。下面我們通過一個簡單的例子,利用Timer0做定時器,了解Timer部件的操作步驟?;贏RM的嵌入式系統(tǒng)接口技術(shù)1.初始化控制定時器的寄存器符號位描述初始狀態(tài)reserved[31:24]保留0x00Deadzonelength[23:16]確定死區(qū)長度,死區(qū)長度的1個單位等于Timer0的定時間隔。0x00Prescaler1[15:8]確定Timer2、Timer3、Timer4的預(yù)分頻器值0x00Prescaler0[0:7]確定Timer0、Timer1的預(yù)分頻器值。0x00(1)定時器配置寄存器0(TCFG0)設(shè)置預(yù)分頻系數(shù)如要設(shè)置Timer0的預(yù)分頻系數(shù)為119:rTCFG0=119; //TCFG0寄存器的位[7:0]確定Timer0、Timer1的預(yù)分頻器值基于ARM的嵌入式系統(tǒng)接口技術(shù)1.初始化控制定時器的寄存器符號位描述初始狀態(tài)reserved[31:24]保留DMAmode[23:20]選擇產(chǎn)生DMA請求的定時器。0000=不選擇(所有采用中斷請求)0001=Timer0
0010=Timer10011=Timer2
0100=Timer30101=Timer4
0110=保留0000……………………MUX1[7:4]選擇Timer1的分割器值。0000=1/2
0001=1/4
0010=1/80011=1/16
01XX=外部TCLK10000MUX0[3:0]選擇Timer0的分割器值。0000=1/2
0001=1/4
0010=1/80011=1/16
01XX=外部TCLK10000(2)定時器配置寄存器1(TCFG1)基于ARM的嵌入式系統(tǒng)接口技術(shù)1.初始化控制定時器的寄存器(2)定時器配置寄存器1(TCFG1)定時器配置寄存器1(TCFG1)主要用來設(shè)置分割器值,并且設(shè)置定時器的工作模式為產(chǎn)生中斷還是執(zhí)行DMA操作。TCFG1寄存器是可讀/寫的如要設(shè)置Timer0的分割器值為16
rTCFG1=3; //TCFG1寄存器的位[3:0]選擇Timer0的分割器值,0011=1/16基于ARM的嵌入式系統(tǒng)接口技術(shù)1.初始化控制定時器的寄存器通過TCFG0、TCFG1的設(shè)置,可以確定預(yù)分頻系數(shù)和分割器值,最終通過下面公式計算定時器輸入時鐘頻率。 定時器輸入時鐘頻率=PCLK/(預(yù)分頻系數(shù)+1)/(分割器值)本例中,由上面的條件可以得到Timer0的輸入時鐘頻率如下。
Timer0的輸入時鐘頻率=50700000/(119+1)/16=26406基于ARM的嵌入式系統(tǒng)接口技術(shù)1.初始化控制定時器的寄存器符號位描述初始狀態(tài)TCNTB0[15:0]存放Timer0的計數(shù)初始值0x0000TCMPB0[15:0]存放Timer0的比較緩沖值0x0000(3)Ti
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年特色酒店租賃合同
- 2024年度貨物進口與銷售合同2篇
- 2024年歐盟數(shù)字單一市場戰(zhàn)略合同
- 2024年度綠色建筑借貸擔保合同示范文本3篇
- 2025采購機票合同范本
- 2024年二手汽車買賣合同樣本3篇
- 臨時辦公搭棚施工合同范本
- 2025建筑安裝工程招標合同書范本
- 公司宿舍晚歸規(guī)定
- 企業(yè)文化建設(shè)輔導員聘任書
- 江蘇省電力公司結(jié)算管理實施細則
- 承插型盤扣式盤扣高支模施工方案(專家論證通過)
- 煤礦電氣試驗規(guī)程
- 屋頂分布式光伏項目施工安全管理方案
- 新人教版高中物理課本必修1復習與提高AB組解析
- 關(guān)于轉(zhuǎn)發(fā)中國中鐵股份有限公司管理人員政紀處分規(guī)定試行的通知
- 標準節(jié)流裝置計算
- 企業(yè)行為模擬試驗報告2016
- 清朝年號干支紀年對照表
- 菜么么收銀系統(tǒng)使用說明PPT課件
- 鋼軌超聲波探傷知識講解
評論
0/150
提交評論