接口技術-8定時部件_第1頁
接口技術-8定時部件_第2頁
接口技術-8定時部件_第3頁
接口技術-8定時部件_第4頁
接口技術-8定時部件_第5頁
已閱讀5頁,還剩145頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第八章定時/計數器接口(jiēkǒu)設計精品資料2/4/2023本章(běnzhānɡ)學習目標與要求1.掌握定時/計數器的基本原理。2.掌握實時(shíshí)時鐘RTC的編程方法。3.掌握看門狗定時器的設計方法。4.掌握tick中斷的設計方法。5.掌握PWM的設計方法。基于ARM的嵌入式系統接口技術精品資料定時(dìnɡshí)控制部件定時部件是嵌入式系統中常用的部件,其主要用作定時功能或計數功能。不同的定時部件在使用上有所差異,但它們的邏輯原理是相同的。S3C2410芯片(xīnpiàn)中的定時部件有多個,不同的定時部件有不同的應用。這里主要介紹其中的看門狗定時器、RTC部件和Timer部件的控制原理及應用。基于ARM的嵌入式系統接口技術精品資料8.1工作(gōngzuò)場景導入精品資料2/4/20238.1.1工作(gōngzuò)場景一設計(shèjì)一個簡單的電子鐘可以在超級終端上顯示實時時間的年月日時分秒,時間實時更新,即每秒鐘更新;通常電子時鐘校準時間只能校準時分,該鬧鐘可以實現秒校準;另外,可以設置在重要的時間點的報時功能。具體功能如下。(1)給系統設置一個起始時間,如2010/12/2509:35:00,星期六,要求時間每隔一秒更新顯示,即可以看到時間在一秒一秒變化(時間顯示通過串口通信在超級終端上顯示)。基于ARM的嵌入式系統接口技術精品資料8.1.1工作(gōngzuò)場景一(2)具有小范圍校準秒時間的功能:當顯示的時間有誤差(wùchā)時,可以通過按鍵2(接外部中斷EINT2),在實時時間秒數大于40秒時,進位到整秒時間;實時時間秒數小于40秒時,退到00秒(如在09:36:47時,按下按鍵2則變成09:37:00;如在09:36:37時,按下按鍵2則變成09:36:00)實現時間校準。(3)設置電子鐘的報時功能,在2010/12/2509:38:05時報時,報時時四只發光二極管閃爍三次。基于ARM的嵌入式系統接口技術精品資料引導(yǐndǎo)問題(1)如何設置實時(shíshí)時間?(2)如何使顯示的時間每秒鐘更新一次?(3)通常的電子鐘在校準時間時都只有小時和分鐘的調整,而沒有秒調整,那么如何得到準備到秒的時間?(4)如何設置電子鐘報時的功能?基于ARM的嵌入式系統接口技術精品資料8.1.2工作(gōngzuò)場景二帶看門狗功能的電子鐘如果在工作場景一中所制作的電子鐘放在城市的馬路上使用,由于無人職守,并且環境條件不好,可能會出現死機、程序跑飛(時間顯示不正確)等狀況。要解決這個問題,需要增加看門狗的功能,當出現上述狀況時,能夠自動重啟(假設內部時鐘正常(zhèngcháng),重新啟動后會顯示正確的時間)。在實驗環境中,通常程序不會出現問題,因此實驗中采用的方法是:加入看門狗后,定時喂狗則程序正常(zhèngcháng)執行;如果人為修改程序不喂狗,則會使實驗箱重新啟動。基于ARM的嵌入式系統接口技術精品資料引導(yǐndǎo)問題(1)看門狗在程序中起什么作用?(2)如何初始化看門狗?如何啟動(qǐdòng)看門狗工作?(3)看門狗的定時時間間隔如何計算?基于ARM的嵌入式系統接口技術精品資料8.1.3工作(gōngzuò)場景三用蜂鳴器作鬧鈴聲鬧鐘在報警時可以發出(fāchū)各種不同的顯示效果。在工作場景一(3)中為簡化程序使用的報警方法是讓發光二極管發光,通常鬧鐘報警時應該是發出(fāchū)聲音。因此我們給鬧鐘增加聲音報警功能:修改工作場景一(3)中的報警方法,改為當報警時間到時蜂鳴器響,并且用PWM控制蜂鳴器。基于ARM的嵌入式系統接口技術精品資料引導(yǐndǎo)問題(1)ARM中的定時部件(bùjiàn)有什么作用?(2)什么是PWM?(3)如何通過PWM控制蜂鳴器發出不同的聲音?基于ARM的嵌入式系統接口技術精品資料8.2定時(dìnɡshí)/計數器原理精品資料2/4/20238.2.1定時(dìnɡshí)/計數器如果將定時器定時到1分鐘,那么秒針計數到60次后,時鐘鬧鈴就會響。這里(zhèlǐ)有個計數和定時之間的概念轉化,時間表示為秒針計數值,即秒針每一次走動的時間正好是1s,走60次即計數60次為1分鐘。基于ARM的嵌入式系統接口技術精品資料定時(dìnɡshí)部件的一般性原理定時/計數器內部工作原理圖是以一個N位的加1或減1計數器為核心,計數器的初始值由初始化編程設置,計數脈沖的來源有兩類:系統時鐘和外部(wàibù)事件脈沖。系統時鐘M分頻外部事件脈沖N位計數器=0回0信號初始值基于ARM的嵌入式系統接口技術精品資料定時(dìnɡshí)部件的一般性原理定時器或計數(jìshù)器的邏輯電路本質上是相同的,它們之間的區別主要在用途上。它們都是主要由帶有保存當前值的寄存器和當前寄存器值加1或減1邏輯組成。定時器的計數(jìshù)信號是由內部的、周期性的時鐘信號承擔,以便產生具有固定時間間隔的脈沖信號,實現定時的功能。計數(jìshù)器的計數(jìshù)信號是由非周期性的信號承擔,通常是外部事件產生的脈沖信號,以便對外部事件發生的次數進行計數(jìshù)。因為同樣的邏輯電路可用于這兩個目的,所以該功能部件通常被稱為“定時/計數(jìshù)器”。基于ARM的嵌入式系統接口技術精品資料定時(dìnɡshí)部件的一般性原理若編程設置定時/計數器為定時工作方式時,則N位計數器的計數脈沖來源于內部系統時鐘(shízhōng),并經過M分頻。每個計數脈沖使計數器加1或減1,當N位計數器里的數加到0或減到0時,則會產生一個“回0信號”,該信號有效時表示N位計數器里的當前值是0。因為系統時鐘(shízhōng)的頻率是固定的,其M分頻后所得到的計數脈沖頻率也就是固定的,因此通過對該頻率脈沖的計數就轉換為定時,實現了定時功能。基于ARM的嵌入式系統接口技術精品資料定時部件(bùjiàn)的一般性原理若編程設置定時/計數(jìshù)器為計數(jìshù)方式時,則N位計數(jìshù)器的計數(jìshù)脈沖來源于外部事件產生的脈沖信號。有一個外部事件脈沖,計數(jìshù)器加1或減1,直到N位計數(jìshù)器中的值為0,產生“回0信號”。N位計數(jìshù)器里初始值的計算,在不同的定時部件中其具體的計算公式是不同的。基于ARM的嵌入式系統接口技術精品資料8.2.2看門狗定時器如果你養了一只狗,讓狗看家護院,那么你必須及時喂它,否則它可能不會給你看門,甚至可能會咬你。嵌入式系統經常工作在惡劣的環境下,或者需要在無人狀態下連續工作,可能常常會受到來自外界的各種干擾,造成程序紊亂(俗稱程序跑飛),而陷入(xiànrù)死循環:程序的正常運行被打斷,系統無法繼續工作,造成整個系統陷入(xiànrù)停滯狀態,發生不可預料的后果。基于(jīyú)ARM的嵌入式系統接口技術精品資料8.2.2看門狗定時器對于嵌入式系統,人們想到在系統中設置一種能夠實時監測系統運行(yùnxíng)狀態的功能,當系統程序出現功能錯亂、引起系統程序死循環或無法運行(yùnxíng)下去時,這個功能能中斷該系統程序的不正常運行(yùnxíng),恢復系統程序的正常運行(yùnxíng)。Watchdogtimer,中文名稱叫做“看門狗定時器”,就是完成這種功能的部件。看門狗定時器計時超時時也會引起事件的發生,只是這個事件除了可以是系統中斷外,也可以是一個系統重起信號(ResetSignal),即能發送系統重起信號的定時器就是watchdog。基于(jīyú)ARM的嵌入式系統接口技術精品資料8.2.3Timer部件(bùjiàn)Timer部件是主要用于提供定時功能的部件,能夠滿足人們控制時間的需求。Timer部件作為定時器,可以(kěyǐ)得到一定時間間隔的定時信號、一定頻率的脈沖信號,充分顯示了“定時”的功能,而計時的功能是次要的。即Timer定時器通常用于不帶計時功能的定時,如“看門狗”就是一種定時器。基于ARM的嵌入式系統接口技術精品資料8.2.3Timer部件(bùjiàn)Timer部件的典型應用是脈寬調制(PWM)功能,脈寬調制(PWM)是生成占空比可變、頻率可變、相位可變的方波的設計方法。PWM是利用微處理器的數字輸出來對模擬電路進行控制(kòngzhì)的一種非常有效的技術,廣泛應用于測量、通信、功率控制(kòngzhì)與變換等許多領域。PWM的一個優點是從處理器到被控系統信號都是數字信號,無需進行數模轉換,數字信號可將噪聲影響降到最小。基于ARM的嵌入式系統接口技術精品資料8.3實時(shíshí)時鐘精品資料2/4/20238.3.1RTC部件(bùjiàn)實時時鐘部件RTC是用于提供年、月、日、時、分、秒、星期等實時時間信息的定時部件。RTC部件可以將年、月、日、時、分、秒、星期等信息的8位數據以BCD碼格式輸出。它由外部(wàibù)時鐘驅動工作,外部(wàibù)時鐘頻率為32.768kHz晶體。同時RTC部件還可以具有報警功能。基于ARM的嵌入式系統接口技術精品資料實時(shíshí)時鐘在嵌入式系統中的作用在一個嵌入式系統中,實時時鐘單元(dānyuán)可以其提供可靠的時鐘,包括時分秒和年月日;即使在系統處于關機狀態下它也能夠正常工作(通常采用后備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的晶振基于ARM的嵌入式系統接口技術精品資料S3C2410內部RTC模塊(mókuài)結構框圖PMWKUP215時鐘分頻秒閏年發生器重置寄存器ALMINTRTCALMXTlrtc時鐘滴答分時日期星期月控制寄存器年報警發生器XTortc時鐘滴答發生器①②④③1Hz⑤基于(jīyú)ARM的嵌入式系統接口技術精品資料8.3.2S3C2410RTC的主要(zhǔyào)特點·年、月、日、時、分、秒、星期等信息采用BCD碼表示。·閏年發生器,簡單以判斷最后兩位為00時為閏年,2100年會出錯。·具有報警功能,能提供報警中斷或者系統在節電模式下的喚醒。·擁有獨立的電源引腳(RTCVDD)。·支持RTOS內核時間片所需的毫秒計時中斷。·進位(jìnwèi)復位功能。基于ARM的嵌入式系統接口技術精品資料BCD碼BCD碼是用4位二進制數來表示1位十進制數中的0~9這10個數碼,這種編碼形式利用了四個位元來儲存一個十進制的數碼。RTC部件能將8位數據轉換(zhuǎnhuàn)為BCD碼的格式傳送給CPU。使用BCD碼存儲各個時間值,BCD碼在二進制和十進制之間可以很容易的轉換(zhuǎnhuàn),因此使設置變得很簡單。基于(jīyú)ARM的嵌入式系統接口技術精品資料8.3.2S3C2410RTC的主要(zhǔyào)特點RTC的時間片計時器用于產生一個中斷請求,TICNT寄存器有一個中斷使能位,和計數器中的值一起用來控制中斷。當計數器的值變為0時,引起時間片計時中斷。中斷信號的周期用下列公式計算: 周期=(n+1)/128s n:時間片計數器的值,范圍為1-127RTC的時間片計時器可以(kěyǐ)用來產生實時操作系統內核所需要的時間片。基于ARM的嵌入式系統接口技術精品資料8.3.3S3C2410RTC的基本操作時鐘產生寄存器時間計數器組報警寄存器組中斷(zhōngduàn)相關寄存器組基于(jīyú)ARM的嵌入式系統接口技術精品資料RTC的基本操作RTC的主要(zhǔyào)功能是提供時間信息和產生與時間相關的中斷。對RTC的操作分為兩部分:RTC初始化讀RTC時間或產生中斷基于(jīyú)ARM的嵌入式系統接口技術精品資料RTC的初始化初始化RTC時鐘值中斷設置(shèzhì)啟動RTC基于(jīyú)ARM的嵌入式系統接口技術精品資料初始化RTC時鐘(shízhōng)值初始化RTC時鐘值是通過(tōngguò)設置時間計數器組完成的,時間計數器組包括8個寄存器。一般設置其中七個:如:設置RTC時間為“2009-11-23,星期一,10:30:02”基于ARM的嵌入式系統接口技術精品資料1.RTC控制(kòngzhì)寄存器(RTCCON)注意:讀寫RTC寄存器前需要先將RTCEN位置1,修改完各數據寄存器后,為防止無意修改,設置RTCEN不使能,即RTCEN位置0。另外還有一點需要注意的是CNTSEL位,RTC默認是使用(shǐyòng)BCD編碼,這樣對BCD時鐘寄存器的讀寫就變得非常方便。rRTCCON=0x01; //讀寫使能…… //設置各個時間計數器的值或者讀出各個時間計數器的值rRTCCON=0x00; //禁止讀寫使能符號位描述初始CLKRST[3]實時時鐘計數器復位0:不復位1:復位0CNTSEL[2]BCD計數選擇,將計數器設置為BCD模式0:選擇BCD模式1:保留0CLKSEL[1]BCD時鐘選擇0:將輸入時鐘進行1/223分頻1:保留0RTCEN[0]RTC讀寫使能0:禁止1:使能0基于ARM的嵌入式系統接口技術精品資料2.時間(shíjiān)計數器組基于(jīyú)ARM的嵌入式系統接口技術精品資料秒數據(shùjù)寄存器(BCDSEC)符號位描述初始狀態SECDATA[6:4]秒數據十位的BCD碼值,范圍為0~5-[3:0]秒數據個位的BCD碼值,范圍為0~9如設置當前時間2010年9月1日9時32分00秒,星期三,其中秒數是00秒,則可以設置如下。要想獲得當前實時(shíshí)時間的秒數,即讀取秒數據寄存器的值,則編寫如下的程序段。//設置各個時間計數器的值,設置秒數據寄存器的值rBCDSEC=0x00; //rBCDSEC是BCDSEC寄存器的名字//讀出秒數據寄存器的值,放在已聲明的變量sec中sec=rBCDSEC; //sec已聲明的變量基于ARM的嵌入式系統接口技術精品資料分數據(shùjù)寄存器(BCDMIN)符號位描述初始狀態MINDATA[6:4]分數據十位的BCD碼值,范圍為0~5-[3:0]分數據個位的BCD碼值,范圍為0~9如設置當前時間2010年9月1日9時32分00秒,星期三,其中分鐘是32分,則可以(kěyǐ)設置如下。要想獲得當前實時時間的分鐘數,則可以(kěyǐ)編寫如下的程序段。//設置各個時間計數器的值,設置分鐘數據寄存器的值rBCDMIN=0x32;//讀出分鐘數據寄存器的值,放在已聲明的變量min中min=rBCDMIN;基于ARM的嵌入式系統接口技術精品資料時數據(shùjù)寄存器(BCDHOUR)符號位描述初始狀態reserved[7:6]保留HOURDATA[5:4]時數據十位的BCD碼值,范圍為0~2-[3:0]時數據個位的BCD碼值,范圍為0~9如設置當前時間2010年9月1日9時32分00秒,星期三,其中(qízhōng)小時數是09時,則可以設置如下。要想獲得當前實時時間的小時數,則可以編寫如下的程序段。//設置各個時間計數器的值,設置時數據寄存器的值rBCDHOUR=0x09;//讀出時數據寄存器的值,放在已聲明的變量hour中hour=rBCDHOUR; 基于ARM的嵌入式系統接口技術精品資料日數據(shùjù)寄存器(BCDDATE)符號位描述初始狀態reserved[7:6]保留DATEDATA[5:4]日數據十位的BCD碼值,范圍為0~3-[3:0]日數據個位的BCD碼值,范圍為0~9如設置當前時間2010年9月1日9時32分00秒,星期三,其中(qízhōng)日期是1日,則可以設置如下。要想獲得當前實時時間的日期值,則可以編寫如下的程序段。//設置各個時間計數器的值,設置日期數據寄存器的值rBCDDATE=0x01;//讀出日期數據寄存器的值,放在已聲明的變量date中date=rBCDDATE; 基于ARM的嵌入式系統接口技術精品資料星期(xīngqī)數據寄存器(BCDDAY)符號位描述初始狀態reserved[7:3]保留-DAYDATA[2:0]星期數據的BCD碼值,范圍為1~7其余(qíyú)略基于ARM的嵌入式系統接口技術精品資料因為時間計數器組的各個寄存器都是定義為unsignedchar類型,因此,rBCDYEAR寄存器中也只能(zhīnénɡ)存放年份的最后兩位,因此設置時雖然設置的是四位十進制數,但保存的只是后面的兩位,而取出其中值的時候需要加上前兩位值。基于(jīyú)ARM的嵌入式系統接口技術精品資料例設置(shèzhì)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;基于(jīyú)ARM的嵌入式系統接口技術精品資料獲取實時時間(shíjiān),即獲取實時時鐘當前時間(shíjiān)、日期rRTCCON=0x01;sec=rBCDSEC;min=rBCDMIN;hour=rBCDHOUR;day=rBCDDAY;date=rBCDDATE;mon=rBCDMON;year=0x2000+rBCDYEAR;rRTCCON=0x00;基于(jīyú)ARM的嵌入式系統接口技術精品資料8.3.3.2報警(bàojǐng)中斷可以在RTC中設定在某個時間產生中斷,該功能(gōngnéng)可通過報警中斷來實現:當未屏蔽的報警時間寄存器和對應的時間計數器計數值都相匹配時,就產生報警中斷,且輸出一個約為1.8V的報警輸出信號。通過設置報警控制寄存器即可設定報警中斷的產生時刻。例如:設置秒時鐘告警,則設置:rRTCALM=0x41;//0x41表示使能RTC告警,以及使能秒時鐘告警基于ARM的嵌入式系統接口技術精品資料報警(bàojǐng)控制寄存器(RTCALM)符號位描述初始狀態保留[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基于(jīyú)ARM的嵌入式系統接口技術精品資料日數據(shùjù)寄存器(BCDDATE)報警控制寄存器(RTCALM)用來確定報警功能(gōngnéng)是否使能以及各報警時間寄存器是否使能(被屏蔽)。RTCALM寄存器是可讀/寫的如設置秒時鐘告警,則需要使能總告警位和秒時鐘告警位。要設置報警時間為每天的9時35分05秒,即相應的時分秒各位都要匹配時報警,應該如下設置。//先設置報警時間,即設置相應的報警數據寄存器的值rRTCALM=0x41;//0x41表示告警總使能bit[6]和使能秒時鐘告警bit[0]//先設置報警時間,即設置相應的報警數據寄存器的值rRTCALM=0x47;//0x47表示告警總使能bit[6]=1并使能bit[2:0]=111基于ARM的嵌入式系統接口技術精品資料報警時間(shíjiān)數據寄存器基于(jīyú)ARM的嵌入式系統接口技術精品資料報警(bàojǐng)秒數據寄存器(ALMSEC)(其余略)符號位描述初始狀態reserved[7]保留0SECDATA[6:4]報警定時器秒數據的十位數BCD碼值,范圍為0~5000[3:0]報警定時器秒數據的個位BCD碼值,范圍為0~90000如設置報警時間為每天的9時35分05秒,其中秒報警時間為05秒,則可以(kěyǐ)如下設置。rALMSEC=0x05;基于ARM的嵌入式系統接口技術精品資料例設置報警時間(shíjiān)為每天的9時35分05秒,可以如下設置。rRTCCON=0x01;//讀寫使能//以下六行(liùxínɡ)設置各個報警數據寄存器的值rALMSEC=0x05;rALMMIN=0x35;rALMHOUR=0x09;rALMDATE=0x01;rALMMON=0x09;rALMYEAR=0x2010;rRTCALM=0x47; //報警總使能、時、分、秒報警使能rRTCCON=0x00; //禁止讀寫使能基于ARM的嵌入式系統接口技術精品資料8.3.3.2報警(bàojǐng)中斷若要在報警時間到時產生(chǎnshēng)報警中斷,還需要進行中斷設置,利用第六章的中斷處理函數,可以如下設置void__irqrtc_int_isr(void); //放在函數外,聲明中斷處理函數Irq_Request(IRQ_RTC,rtc_int_isr); //請求中斷,IRQ_RTC為中斷號//此處加入設置報警時間及方式的語句或函數調用Irq_Enable(IRQ_RTC); //使能中斷//在中斷處理函數里清除中斷Irq_Clear(IRQ_RTC);基于ARM的嵌入式系統接口技術精品資料8.3.3.2報警(bàojǐng)中斷ALMEN使能,對應RTCALM都相應使能。設置相應告警(gàojǐng)時分秒寄存器。當RTC時鐘運行到跟我們設定的告警(gàojǐng)時鐘值相等瞬間發生一次告警(gàojǐng)中斷,RTC時鐘跟告警(gàojǐng)時鐘比較時,只是按照RTCALM中設定的使能的年月日時分秒順序比較,均想等時才發生,如果其中的RTCALM中的某位設為禁止,則不對此位作比即可。基于ARM的嵌入式系統接口技術精品資料8.3.3.3進位復位(fùwèi)功能在S3C2410的RTC單元中有一個循環復位寄存器(RTCRST),具有進位復位的功能,即可以把實時時間直接調整(tiáozhěng)到整分鐘值,把秒置為00。更具體地說,秒的進位周期可以選擇,進位周期可以設置為30、40、50。有兩種調整(tiáozhěng)方式:大于設定的進位周期時,分鐘數據加1,秒置為00;小于設定的進位周期時,分鐘數據不變,秒置00。這個功能類似于數學上“四舍五入”的計算方法。基于ARM的嵌入式系統接口技術精品資料8.3.3.3進位(jìnwèi)復位功能例如,當進位周期選為40秒,若當前時間是09:36:47,通過使能循環(xúnhuán)復位位,則當前時間將變為09:37:00;若當前時間是09:36:37,通過使能循環(xúnhuán)復位位,則當前時間將變為09:36:00。進位復位功能是通過循環(xúnhuán)復位寄存器(RTCRST)完成的。基于ARM的嵌入式系統接口技術精品資料循環(xúnhuán)復位寄存器(RTCRST)符號位描述初始狀態SRSTEN[3]秒循環復位使能位1:使能

0:不使能0SCCR[2:0]確定秒循環進位的周期011=超過30秒100=超過40秒101=超過50秒000秒的進位周期可以進行(jìnxíng)選擇(30、40、50),在進位復位發生后秒,秒的數值又循回到0。例如,當前時間是23:37:47,進位周期選為40秒,則當前時間將變為23:38:00。基于ARM的嵌入式系統接口技術精品資料8.3.3.4時鐘(shízhōng)節拍中斷RTC的時間片計時器即時鐘節拍用于中斷請求,可以用來產生實時操作系統內核所需的時間片。在TICNT寄存器中有一個時間片計數器,該寄存器共有八位,有一位中斷使能位和一個計數數值n(n占7位,因此n的取值范圍為1~127(27-1=127)),該計數器是減1計數器,啟動(qǐdòng)計數后,當計數器的值減到0后,則產生一個毫秒級中斷,叫做時間片計時中斷或時鐘節拍中斷。基于ARM的嵌入式系統接口技術精品資料實時時鐘(shízhōng)計數器(時間片計數器)TICNT符號位描述初始狀態TICKINTENABLE[7]中斷使能/禁止0:禁止1:使能0TICKTIMECOUNT[6:0]實時時鐘計數器0000000當計數值(shùzí)減少到0則產生時間片計時(時鐘節拍)中斷。那么中斷周期就是: 周期=(n+1)/128sec其中n為時間片計數器中的值(Ticktimecountvalue),范圍是1-127。基于ARM的嵌入式系統接口技術精品資料8.3.3.4時鐘(shízhōng)節拍中斷例如,程序(chéngxù)中設置每秒鐘引發一次中斷rRTCCON=0x0; //禁止RTC寄存器讀寫使能rTICNT=0x7f|0x80; //TICK中斷使能,周期為(1+127)/128秒//0x80即設置此寄存器的位[7]為1,使能時間片計數中斷基于ARM的嵌入式系統接口技術精品資料8.4回到工作(gōngzuò)場景一精品資料2/4/2023工作(gōngzuò)過程一1)通過超級終端顯示實時時間的時、分、秒首先設置實時時間,然后讀取實時時間值,并在超級終端上打印出來。建立一個工程打開CodeWarriorIDE,新建一個工程,輸入(shūrù)工程名rtc,存放在D:\test\rtc目錄下;新建一個C語言源文件,輸入(shūrù)文件名rtctest.c,存放在D:\test\rtc目錄下并加入到工程rtc中。基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫rtctest.c程序首先包含(bāohán)寄存器地址定義的頭文件。/*包含文件*/#include"2410addr.h"/*在此頭文件中有對RTC中用到的寄存器的定義,例如#definerRTCCON (*(volatileunsignedchar*)0x57000040)//RTCcontrol#definerTICNT (*(volatileunsignedchar*)0x57000044)//Ticktimecount#definerRTCALM (*(volatileunsignedchar*)0x57000050)//RTCalarmcontrol#definerALMSEC (*(volatileunsignedchar*)0x57000054)//Alarmsecond……*/基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫rtctest.c程序在程序中,定義一個函數rtcset(),用來設置當前時間,函數的參數為要設置的時間,用數組(年只存儲后面(hòumian)兩位)或結構體(可以表示不同的數據類型)來定義此參數更加方便。假設設置的時間為2010/12/2509:35:00,星期六。①定義一個結構體類型rtc_date。typedefstructST_DATE //定義結構體類型,該類型命名為rtc_date{ shortyear; //年,定義為short類型,可以存儲4位的年份 char mon; //月 char day; //日 char week; //星期 char hour; //時 char min; //分 char sec; //秒}rtc_date; //用typedef定義結構體類型的別名為rtc_date基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫(biānxiě)rtctest.c程序②定義函數rtcset(rtc_date*p_date),用于設置系統的實時時間,其中p_date是rtc_date類型的結構體變量。rtcset(rtc_date*p_date){ rRTCCON=0x01; //讀寫使能 rBCDSEC=p_date->sec; //以下使用結構體成員賦值, 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的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫rtctest.c程序③再定義一個獲取(huòqǔ)時間的函數rtcget(rtc_date*p_date),用于取出實時時間。rtcget(rtc_date*p_date){ rRTCCON=0x01; //讀寫使能 p_date->sec=rBCDSEC; //以下取出時間計數器組的值賦給結構體成員 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的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫rtctest.c程序(chéngxù)④實時時間要通過串口在超級終端上顯示,因此在主函數中,首先要初始化時鐘和串口,參見第十章,在這里仍然直接調用已有的函數設置。voidMain(void){ SetClockDivider(1,1); SetMPllValue(0xa1,0x3,0x1); Isr_Init(); Port_Init(); uart0_init(); …… //下面是具體的對RTC的操作}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫rtctest.c程序⑤因為要求每隔一秒更新(gēngxīn)顯示時間,所以在這里利用秒中斷,每秒中斷一次,重新顯示實時時間,秒中斷的設置也定義為函數,把相應的中斷請求和中斷使能都在函數中實現。#include"interrupt.h" //包含處理中斷相關的頭文件void__irqrtctick_isr(void); //在主函數前聲明中斷處理函數……rtc_tickset(chartick){ pISR_TICK=(unsigned)rtctick_isr; //請求中斷rRTCCON=0x0; //設置前禁止對數據寄存器讀寫rTICNT=(tick&0x7f)|0x80; //bit[7]=1,使能TICK中斷,周期為(1+tick)/128秒Irq_Enable(IRQ_TICK); //使能中斷,在中斷處理函數中清除}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫rtctest.c程序⑥調用上面的兩個函數進行實時時間的設置,再取出實時時間,并設置一個全局變量,標識是否需要更新顯示的內容,最后把實時時間通過串口顯示在超級終端里。(程序清單見書上。)上述寫法,每隔一秒鐘重新獲取時間,再更新超級終端的顯示。如果不用秒中斷而直接在while(1)循環中顯示實時時間,如下面的寫法,雖然也可以(kěyǐ)實時更新顯示,但這樣的寫法,程序一直在取時間并顯示,浪費資源。基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫(biānxiě)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的嵌入式系統接口技術精品資料工作(gōngzuò)過程二編寫rtctest.c程序⑦只要設置(shèzhì)好了時間片中斷計數器,到時間就會產生中斷,時間片中斷的中斷處理函數很簡單,只要更改一下標識,保證每秒鐘重新到時間計數器組取實時時間值。voidrtctick_isr(void){Irq_Clear(IRQ_TICK); //清除TICK中斷flag++; //使flag=flag+1}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程三設置工程并編譯工程①加入需要的啟動文件和其他需要的文件。 加入2410init.s和2410slib.s; 加入2410lib.c,interrupt.c(從提供的光盤(ɡuānɡpán)資料中拷貝到D:\test目錄),并在工程窗口的LinkOrder標簽頁設置把它們放在主程序前面;②在工程屬性對話框中的Target\AccessPaths設置包含的頭文件路徑,對工程的ARMLinker進行設置,同前。③編譯工程。基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程四、五下載程序打開AXDDebugger,選擇File|LoadImage命令,加載要調試的文件(wénjiàn)D:\test\rtc\rtc_Data\DebugRel\rtc.axf,將程序下載到目標系統。調試、運行打開超級終端,下載完成后調試運行,可以在超級終端上看到實時時間年月日時分秒的顯示。此工作場景是在超級終端上顯示實時時間,也可以用六只數碼管顯示年月日,再顯示時分秒,程序見第11章11.10節“工作實訓營”的訓練實例1。基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程一2)校準秒時間在1)所完成的實時時間顯示程序基礎上填加功能:通過按下按鍵2,在實時時間秒數大于40秒時,進位到整秒時間;實時時間秒數小于40秒時,退到00秒(如在09:36:47時,按下按鍵2則變成09:37:00;如在09:36:37時,按下按鍵2則變成09:36:00。)假設按鍵2接外部中斷2。修改rtctest.c程序因為(yīnwèi)需要使用外部中斷,所以要增加中斷設置編程。基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二①在包含文件部分(bùfen)加入(如果沒有)處理中斷需要用到的頭文件:interrupt.h,2410lib.h(前面用到了tick中斷,已經有一部分(bùfen)中斷設置,只需填加和EINT2相關的中斷處理部分(bùfen)),在主函數外部,定義中斷處理函數。/*定義中斷處理函數*/void__irqeint2_isr(void);基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二②在主函數中,加入(jiārù)對EINT2中斷處理過程的函數,包括請求中斷、使能中斷。voidMain(void){

...... //已有端口設置和中斷初始化pISR_EINT2=(unsigned)eint2_isr; //請求中斷Irq_Enable(IRQ_EINT2); //使能中斷

......}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二③在中斷(zhōngduàn)處理函數中,設置RTCRST寄存器,主要是使能秒循環復位,設置如何循環復位可以在主函數中設置也可以在中斷(zhōngduàn)函數中設置。voideint2_isr(void){ Irq_Clear(IRQ_EINT2);//清除中斷 rRTCCON=0x01;//因為復位置位要修改時間計數器組的值,因此允許其讀寫 rRTCRST|=0xB; //或者在Main中,rRTCRST=0x3,這里rRTCRST|=0x8 rRTCCON=0x00;//修改完后使讀寫禁止,防止被誤修改}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二重新編譯工程、下載并運行重新編譯工程,并下載到實驗箱上運行,分別在不同(bùtónɡ)的時刻按下按鍵2,在超級終端的時間顯示上,觀察秒和分鐘值的變化。基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程一3)設置在每分鐘的第5秒時報時,報時時間到時四只發光二極管閃爍三次。修改rtctest.c程序①報警功能也是中斷,因此也需要進行中斷處理。在前面已經設置好包含文件,在主函數外部,定義(dìngyì)中斷處理函數,報警中斷的中斷號命名為IRQ_RTC。/*定義中斷處理函數*/void__irqalarm_isr(void);基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程一②對于報警的時間和報警方式的設置,也用一個函數來完成。在程序中主函數的前面定義(dìngyì)函數alarmset(rtc_date*p_date,unsignedcharalmmode),這個函數有兩個參數,第一個是報警的時間,和上面設置實時時間及獲得實時時間的參數一樣;第二個參數是報警的方式,也就是RTCALM報警控制寄存器(RTCALM)中的內容,此寄存器共有七位有效位,因此設置參數類型為unsignedchar。基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程一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; //禁止(jìnzhǐ)讀寫}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程一③在主函數中,加入(jiārù)中斷處理過程的函數,包括中斷初始化、端口初始化、請求中斷、并調用上面的函數實現報警中斷設置,最后使能中斷。voidMain(void){

...... Isr_Init();//中斷初始化,如果有其他中斷已經調用此函數,不用調用兩次 Port_Init(); //初始化端口,說明同上 pISR_RTC=(unsigned)alarm_isr; //請求中斷 m_date.sec=0x05; //設置告警時間,與設置實時時間類似 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); //調用函數設置報警的時間和方式 Irq_Enable(IRQ_RTC); //使能中斷

......}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程一④在中斷處理函數中,使四只二極管閃爍三次,假設(jiǎ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); //調用延時函數 *((unsignedchar*)0x10000000)=0xff; Delay(10); //調用延時函數 }//因為這段程序執行時間不長,所以放在中斷處理函數里。}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二重新編譯工程、下載并運行(yùnxíng)重新編譯工程,并下載到實驗箱上運行(yùnxíng),觀察當秒值為5時發光二極管的變化。基于ARM的嵌入式系統接口技術精品資料8.5看門狗定時器精品資料2/4/20238.5.1看門狗定時器的原理(yuánlǐ)S3C2410芯片(xīnpiàn)看門狗定時器的作用是,當系統程序出現功能錯亂,引起系統程序死循環時,能中斷該系統程序的不正常運行,恢復系統程序的正常運行。基于ARM的嵌入式系統接口技術精品資料五基礎知識8.5.1看門狗定時器的原理(yuánlǐ)其基本原理為:設本系統程序(chéngxù)完整運行一周期的時間是Tp,看門狗的定時周期為Ti,Ti>Tp,在程序(chéngxù)運行一周期后就修改定時器的計數值,只要程序(chéngxù)正常運行,定時器就不會溢出,若由于干擾等原因使系統不能在Tp時刻修改定時器的計數值,定時器將在Ti時刻溢出,引發系統復位,使系統得以重新運行,從而起到監控作用。在一個完整的嵌入式系統或單片機小系統中通常都有看門狗定時器,且一般集成在處理器芯片中,看門狗實際上就是一個定時器,只是它在期滿后將自動引起系統復位。基于ARM的嵌入式系統接口技術精品資料輸入時鐘為PCLK(該時鐘頻率等于(děngyú)系統的主頻),它經過兩級分頻,最后將分頻后的時鐘作為該定時器的輸入時鐘,當計數器期滿后可以產生中斷或者復位信號。S3C2410的看門狗定時器有兩個功能作為常規定時器使用,并且可以(kěyǐ)產生中斷作為看門狗定時器使用,期滿時,它可以(kěyǐ)產生128個時鐘周期的復位信號系統時鐘M分頻外部事件脈沖N位計數器=0回0信號初始值基于ARM的嵌入式系統接口技術精品資料8.5.1看門狗定時器的原理(yuánlǐ)Watchdog根據系統時鐘、預分頻值、分割器因子(yīnzǐ)會產生一個watchdog自己的工作周期,t_watchdog=1/(PCLK/(Prescalervalue+1)/Division_factor)watchdog在一個t_watchdog周期結束時會產生一個記數遞減信號,每當這個信號產生時,WTCNT中的值便減1,若在WTCNT遞減為0(TimerOut)的時候軟件層還沒有重新往WTCNT中寫入數值(喂狗),則watchdog觸發ResetSignal,系統重起。基于ARM的嵌入式系統接口技術精品資料8.5.1看門狗定時器的原理(yuánlǐ)預分頻器的值和頻率分解(fēnjiě)因子可由看門狗定時器的控制寄存器(WTCON)進行編程設定。預分頻器值的可選范圍是:0~28-1。頻率分割因子可選擇的值為16,32,64,128。使用下面公式來計算看門狗定時器的計數時鐘周期: 計數時鐘周期 =1/(PCLK/(預分頻器值+1)/分割因子)看門狗的定時周期 T=WTCNT*計數時鐘周期#defineFCLK202800000#defineHCLK(FCLK/2)#definePCLK(FCLK/4)#defineUCLKPCLK基于ARM的嵌入式系統接口技術精品資料8.5.1看門狗定時器的原理(yuánlǐ)一旦看門狗定時器被啟動工作,看門狗定時器中的計數常數寄存器(WTDAT)就無法自動的重載到計數寄存器(WTCNT)中。因此,應該在看門狗定時器啟動工作之前(zhīqián),通過初始化編程使計數常數寫入計數寄存器(WTCNT)中。voidwatchdog_init(){ rWTCNT=8448*2; /*設置看門狗初始值*/ rWTCON=WDT_ENABLE|WDT_RST_ENABLE|WDT_CLK_SEL|WDT_PRE_SCALER; /*打開看門狗*/}基于ARM的嵌入式系統接口技術精品資料五基礎知識8.5.2看門狗定時器的基本操作與看門狗定時器相關的有如下三個寄存器。看門狗控制寄存器(WTCON)。看門狗數據(shùjù)寄存器(WTDAT)。看門狗計數寄存器(WTCNT)。基于(jīyú)ARM的嵌入式系統接口技術精品資料五基礎知識8.5.2看門狗定時器的基本操作使用看門狗定時器時,需要進行以下三個基本操作步驟的設置。(1)給減1計數器WTCNT一個(yīɡè)值,用來設置定時的時鐘周期個數,通過這個值計算出來的定時長度應該大于程序運行的周期。(2)設置計數脈沖值,即設置預分頻器值及分割器因子值;設置計數器溢出時的動作。(3)啟動看門狗定時器。基于(jīyú)ARM的嵌入式系統接口技術精品資料1.看門狗控制(kòngzhì)寄存器(WTCON)符號位描述初始狀態PrescalerValue[15:8]預分頻值,有效范圍為:0到(28-1)0x80Reserved[7:6]保留,必須為0000WatchdogTimer[5]看門狗定時器使能/禁止0:禁止看門狗定時器1:使能看門狗定時器1ClockSelect[4:3]決定時鐘分頻因子(分割器因子)

00:1/1601:1/3210:1/6411:1/12800InterruptGeneration[2]中斷使能/禁止0:禁止產生中斷1:使能產生中斷0Reserved[1]保留,必須為00ResetEnable/Disable[0]看門狗定時器輸出引發復位信號的使能/禁止位0:禁止看門狗定時器的復位功能1:看門狗定時器超時后引發復位信號1基于(jīyú)ARM的嵌入式系統接口技術精品資料五基礎知識8.5.2看門狗定時器的基本操作設置計數脈沖也就是設置預分頻值和分割器因子值。預分頻器的值和頻率(pínlǜ)分割器因子可由看門狗定時器的控制寄存器(WTCON)進行編程設定:控制寄存器(WTCON)的bit[15:8]共8位二進制數決定預分頻器的分頻值,因此預分頻器值的可選范圍是0~28-1;控制寄存器(WTCON)的bit[4:3]2位決定頻率(pínlǜ)分割因子的值,可選擇的值為16,32,64,128。基于(jīyú)ARM的嵌入式系統接口技術精品資料五基礎知識8.5.2看門狗定時器的基本操作控制寄存器還可以設置定時器溢出時產生什么動作,由控制寄存器(WTCON)的bit[2]設定是否產生中斷信號,bit[0]設定是否產生復位信號。最后設置好上面(shàngmiɑn)幾位之后,把該寄存器的bit[5]置1則啟動看門狗開始工作。基于(jīyú)ARM的嵌入式系統接口技術精品資料例要設置預分頻值為255,分割器因子選擇16,計數器溢出時產生復位信號,不生產中斷信號,同時啟動看門狗,則設置語句:rWTCON=0x7F21;//[15:8]設為0x7f,[5]設為1,[4:3]設為00,[2]設為0,[0]設為1,其余位設為0使用下面(xiàmian)公式來計算看門狗定時器的計數時鐘周期(也就是一個脈沖的時間)。 計數時鐘周期(t_watchdog)=1/(PCLK/(預分頻器值+1)/分割因子)基于(jīyú)ARM的嵌入式系統接口技術精品資料2.計數器寄存器(WTCNT)計數器寄存器(WTCNT)中存放的是當前的計數值,正常情況下用作減1計數器,每來一個計數時鐘脈沖,計數器的值減1。重載計數值即計數常數的計算:計數常數=所需時間間隔(jiàngé)/計數時鐘周期=所需時間間隔(jiàngé)*(PCLK/(預分頻器值+1)/分割因子)位描述初始狀態[15:0]看門狗定時器的重載計數值0x8000基于(jīyú)ARM的嵌入式系統接口技術精品資料2.計數器寄存器(WTCNT)設置計數器的初始值以及重置計數器值的語句如下。rWTCNT=d; //d表示計數常數(十進制或十六進制),由上面的公式(gōngshì)計算得到基于(jīyú)ARM的嵌入式系統接口技術精品資料3.數據(shùjù)寄存器(WTDAT)位描述初始狀態[15:0]看門狗定時器的當前計數值0x8000數據(shùjù)寄存器(WTDAT)里存放的是看門狗定時器的計數常數值,即看門狗定時器的溢出時間間隔值。數據(shùjù)寄存器(WTDAT)是可讀/寫的,這個寄存器的功能很簡單,就是保存計數常數值,這里存放的值始終不變,并不做減1的操作。基于ARM的嵌入式系統接口技術精品資料3.數據(shùjù)寄存器(WTDAT)位描述初始狀態[15:0]看門狗定時器的當前計數值0x8000數據寄存器(WTDAT)里存放的是看門狗定時器的計數常數值,即看門狗定時器的溢出時間間隔值。數據寄存器(WTDAT)是可讀/寫的,這個寄存器的功能很簡單(jiǎndān),就是保存計數常數值,這里存放的值始終不變,并不做減1的操作。基于ARM的嵌入式系統接口技術精品資料8.5.2看門狗定時器的基本操作下面通過一個例子,看看看門狗定時器是如何(rúhé)工作的。例:假設要監測的系統程序的周期不大于40μs,系統時鐘頻率PCLK=50MHz,設計時假設取分割器因子為16,預分頻值為0,則可以得到計數時鐘周期如下。計數時鐘周期=1/(PCLK/(預分頻器值+1)/分割因子)=0.32μs即一個計數脈沖的時間是0.32μs,要產生一個大于40μs的時間間隔,則計數脈沖的個數即計數常數的計算公式如下。計數常數=所需時間間隔/計數時鐘周期=40/0.32=125(0x7d)基于(jīyú)ARM的嵌入式系統接口技術精品資料8.5.2看門狗定時器的基本操作voidmain()

{

init_system();

.

...

.....

enable_watchdog();

.

...

.....

while(1)

{

feed_dog();

}

}在實際(shíjì)應用中,一般來說feed_dog函數的調用是被安插在定時器的中斷服務例程中。定時器的timeout(不是watchdog的timeout)時間長度必須合適,否則在定時器還沒來得及發生中斷調用feed_dog函數之前,watchdog已經timeout了,將引起系統重起基于(jīyú)ARM的嵌入式系統接口技術精品資料例如(lìrú):監測系統程序的周期不大于40μs,PCLK=50MHz。#definerWTCON(*(volatileunsigned*)0x53000000)#definerWTDAT(*(volatileunsigned*)0x53000004)#definerWTCNT(*(volatileunsigned*)0x53000008)voidwatchdog_init(){ rWTCNT=0x7d; rWTCON=0x21;}取分割因子為:16,預分頻值為:取0計數時鐘(shízhōng)周期=1/(PCLK/(預分頻器值+1)/分割因子)=0.32μs定時周期:T=計數值*計數時鐘(shízhōng)周期,T=40μs,因此計數值=T/計數時鐘(shízhōng)周期=40/0.32=125基于ARM的嵌入式系統接口技術精品資料匯編語言(huìbiānyǔyán)實現ldr

r0,=WTDAT

;WTDAT寄存器對應的地址(dìzhǐ)賦給R0

ldr

r1,=0x7d

;計數器初始值

str

r1,[r0]

ldr

r0,=WTCON

;WTCON寄存器對應的地址(dìzhǐ)賦給R0

ldr

r1,=0x0021

;使能看門狗及其復位功能,分割器值設為16

str

r1,[r0]

基于ARM的嵌入式系統接口技術精品資料8.6回到工作(gōngzuò)場景二精品資料2/4/2023工作(gōngzuò)過程一修改rtctest.c程序在8.4節所編寫的C程序基礎上,填加看門狗定時器的功能。在本程序中我們設置在時鐘節拍中斷里喂狗,每秒中斷一次,即每秒喂狗一次。①在主函數中加入看門狗定時器的初始化程序,初始化程序中設置WTCNT計數器的值,并設置看門狗控制寄存器,(這段程序加在Main()函數里面(lǐmiàn),在設置部分即可,只要不是在while(1)中)。voidMain(void){

……rWTCNT=0x0800; //此計數值根據程序執行的時間調整rWTCON=0x7f21;

……}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程一②時鐘節拍中斷的設置已經在工作場景一中的程序中完成,在工作場景一中,通過時鐘節拍中斷使顯示的時間每秒鐘更新一次。在本場景中,時鐘節拍中斷除了完成上述(shàngshù)功能外,還要在時鐘節拍中斷的中斷處理函數中喂狗。時鐘節拍中斷的中斷處理函數內容如下。voidrtctick_isr(void){Irq_Clear(IRQ_TICK); //清除TICK中斷flag++; //原來程序中的內容rWTCNT=0x0800; //加入喂狗}基于ARM的嵌入式系統接口技術精品資料工作(gōngzuò)過程二重新編譯工程、下載并運行重新編譯工程,并下載到實驗箱上運行,觀察程序的運行情況,再把中斷處理函數中的喂狗部分(bùfen)注釋掉,再重新編譯工程,并下載到實驗箱上運行,觀察此時程序運行的情況。結論:當加入看門狗功能,并且每秒中喂狗一次時,程序運行和原來一樣;當注釋掉喂狗的語句后,程序很快就會重新啟動。基于ARM的嵌入式系統接口技術精品資料8.7Timer部件(bùjiàn)精品資料2/4/20238.7.1基礎知識Timer部件主要是用于提供定時功能、脈寬調制(PWM)功能的部件,它的應用比較靈活,對于需要(xūyào)一定頻率的脈沖信號、一定時間間隔的定時信號的應用場合,它都能提供應用支持。s3c2410提供了5個16位的Timer(Timer0~Timer4),其中Timer0~Timer3支持PulseWidthModulation——PWM(脈寬調制)。Timer4是一個內部定時器(internaltimer),沒有輸出引腳(outputpins)。定時器0有Dead-zone發生器,可以保證一對反向信號不會同時改變狀態,常用于大電流設備中。基于(jīyú)ARM的嵌入式系統接口技術精品資料8.7.1基礎知識脈寬調制(PWM)就是利用微處理器的數字輸出來對模擬電路進行控制(kòngzhì)的一種非常有效的技術。廣泛應用在從測量、通信到功率控制與變換的許多領域中,例如多相位電機控制、燈光(dēngguāng)亮度控制、DC-DC轉換器等場合。PWM從處理器到被控系統信號都是數字式的,無需進行數模轉換。讓信號保持為數字形式可將噪聲影響降到最小。PWM控制器使得ARM具備了強大的矩形波輸出能力,可以十分方便地輸出不同頻率、不同占空比的矩形波。基于ARM的嵌入式系統接口技術精品資料8.7.1基礎知識PWM是一種對模擬信號電平進行數字編碼的方法。通過高分辨率計數器的使用(shǐyòng),方波的占空比被調制用來對一個具體模擬信號的電平進行編碼。PWM信號仍然(réngrán)是數字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。通的時候即是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM進行編碼。基于ARM的嵌入式系統接口技術精品資料PWM信號(xìnhào)占空比為10%的PWM輸出(shūchū)0.9V的模擬信號供電電壓為9V占空比為50%的PWM輸出4.5V的模擬信號占空比為70%的PWM輸出6.3V的模擬信號基于ARM的嵌入式系統接口技術精品資料接通時間(shíjiān)、周期、占空比和調制頻率以上(yǐshàng)頁例子為例,接通時間為燈泡點亮時間周期為一次通斷的時間占空比是接通時間與周期之比調制頻率為周期的倒數。要想取得調光燈(保持點亮)的效果,必須提高調制頻率。通常調制頻率為1kHz到200kHz之間。基于ARM的嵌入式系統接口技術精品資料8.7.2Timer部件(bùjiàn)的基本原理Timer定時器的基本功能(gōngnéng)原理和通用定時/計數器的原理是相同的,如圖所示,圖中是S3C2410處理器中五個Timer中的一個Timer的功能(gōngnéng)原理圖,其他四個基本原理與此相同。基于ARM的嵌入式系統接口技術精品資料8.7.2Timer部件(bùjiàn)的基本原理PCLK是Timer的信號源,我們通過設置每個Timer相應的Prescaler和ClockDivider把PCLK轉換成輸入時鐘信號傳送給各個Timer的邏輯控制單元(ControlLogic),事實上每個Timer都有一個稱為輸入時鐘頻率(TimerinputclockFrequency)的參數,這個頻率就是通過PCLK,Prescaler和ClockDivider確定下來(xiàlái)的,每個Timer的邏輯控制單元就是以這個頻率在工作。基于ARM的嵌入式系統接口技術精品資料8.7.2Timer部件(bùjiàn)的基本原理輸入時鐘頻率的公式:

定時器輸入時鐘頻率=PCLK/(預分頻系數+1)/(分割器值)

預分頻系數的范圍=0~255

分割器值的取值范圍=2,4,8,16

定時器在一個工作周期(Timerinputclockcycle)內的具體工作內容主要有3個。分別是:

1.對一個數值進行遞減(dìjiǎn)操作

2.把遞減(dìjiǎn)后的數值和另一個數值進行比較操作

3.產生中斷或執行DMA操作基于ARM的嵌入式系統接口技術精品資料8.7.3S3C2410的Timer部件(bùjiàn)S3C2410提供了5個16位的定時器Timer(Timer0~Timer4)Timer0~Timer3支持PulseWidthModulation——PWM(脈寬調制)。Timer4是一個內部定時器(internaltimer),沒有輸出引腳(outputpins)。定時器0有Dead-zone發生器,可以(kěyǐ)保證一對反向信號不會同時改變狀態,常用于大電流設備中。基于ARM的嵌入式系統接口技術精品資料8.7.3S3C2410的Timer部件(bùjiàn)定時器0和定時器1使用相同的分頻器,但他們的計數器以及(yǐjí)控制器是各自獨立的,定時器2/3/4情況相同。基于ARM的嵌入式系統接口技術精品資料8.7.4Timer部件(bùjiàn)的基本操作S3C2410定時器有關(yǒuguān)的寄存器定時器配置寄存器定時器初值計數器以及比較計數器定時器控制寄存器計數觀察寄存器(TCNTOn)基于ARM的嵌入式系統接口技術精品資料8.7.4Timer部件(bùjiàn)的基本操作在啟用Timer之前我們會對Timer進行一系列初始化操作,然后啟動定時器工作。初始化定時器就是設置定時器的預分頻系數、設置分割器值、將初始值寫到TCNTB和TCMPB寄存器、設置定時器手動更新位。下面我們通過一個簡單的例子,利用Timer0做定時器,了解(liǎojiě)Timer部件的操作步驟。基于ARM的嵌入式系統接口技術精品資料1.初始化控制(kòngzhì)定時器的寄存器符號位描述初始狀態reserved[31:24]保留0x00Deadzonelength[23:16]確定死區長度,死區長度的1個單位等于Timer0的定時間隔。0x00Prescaler1[15:8]確定Timer2、Timer3、Timer4的預分頻器值0x00Prescaler0[0:7]確定Timer0、Timer1的預分頻器值。0x00(1)定時器配置寄存器0(TCFG0)設置預分頻(fēnpín)系數如要設置Timer0的預分頻(fēnpín)系數為119:rTCFG0=119; //TCFG0寄存器的位[7:0]確定Timer0、Timer1的預分頻器值基于ARM的嵌入式系統接口技術精品資料1.初始化控制(kòngzhì)定時器的寄存器符號位描述初始狀態reserved[31:24]保留DMAmode[23:20]選擇產生DMA請求的定時器。0000=不選擇(所有采用中斷請求)0001=Timer0

0010=Timer10011=Timer2

0100=Timer30101

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論