版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1第9章微處理器S3C2410A的定時/計數(shù)器定時器部件在實時控制系統(tǒng)中起著舉足輕重的作用,它可以實現(xiàn)對設(shè)備的周期性控制,同時使用定時器的PWM輸出功能可以實現(xiàn)設(shè)備功率的控制,用于恒溫控制系統(tǒng)等。S3C2410A芯片中的定時部件有多個,不同的定時部件有不同的用途??撮T狗定時器(WATCHDOG)主要用來防止處理器的死機,需要在看門狗定時器規(guī)定的時間內(nèi)喂狗,就是重新給看門狗定時器賦初值,否則時間到產(chǎn)生溢出復位信號,使ARM系統(tǒng)復位而重新啟動;定時器(TIMER)主要用于定時或計數(shù),還可用于脈寬調(diào)制PWM(PulseWidthModulation)的控制;實時時鐘RTC(RealTimeClock)主要用于為系統(tǒng)提供日歷與實時鐘信號。定時部件雖然種類較多,但它們的工作原理基本相同。本章主要介紹各自的原理與應(yīng)用。29.1S3C2410A定時/計數(shù)器原理定時器或計數(shù)器的邏輯電路是相同的,它們的主要區(qū)別在用途上。在應(yīng)用時,定時器的輸入信號來自于內(nèi)部,是周期信號,從而通過計數(shù)實現(xiàn)了定時的功能;而計數(shù)器的輸入信號一般來自于外部,是非周期信號,因而只能實現(xiàn)計數(shù)的功能。因此這樣的邏輯電路被稱為定時/計數(shù)器。圖9-1是一般定時/計數(shù)器內(nèi)部工作原理框圖,它是以一個N位計數(shù)器(加1或減1)為核心,計數(shù)器的初值在編程時設(shè)置。計數(shù)器的輸入脈沖分為2類:系統(tǒng)時鐘和外部事件脈沖。微處理器S3C2410A使用的是具有減法功能的定時/計數(shù)器。39.2看門狗定時器(WATCHDOG)
S3C2410A中看門狗定時器的作用是,當系統(tǒng)程序出現(xiàn)功能錯亂,引起系統(tǒng)程序出現(xiàn)死循環(huán)時,是系統(tǒng)重新啟動開始工作。嵌入式系統(tǒng)由于使用環(huán)境的復雜,即使用環(huán)境中有較強的干擾信號,或者系統(tǒng)程序本身的不完善,因而不能排除系統(tǒng)程序不會出現(xiàn)死循環(huán)現(xiàn)象。當系統(tǒng)使用看門狗部件時,如果系統(tǒng)出現(xiàn)了死循環(huán),看門狗定時器將產(chǎn)生一個具有一定寬度的復位信號,強迫系統(tǒng)復位,恢復系統(tǒng)的正常運行??撮T狗定時器必須在小于定時的時間周期內(nèi),對其重新賦初值(俗稱“喂狗”),使看門狗定時器不會產(chǎn)生復位信號,系統(tǒng)正常運行。當系統(tǒng)程序出現(xiàn)死循環(huán)時,無法給看門狗定時器喂狗或者說不能執(zhí)行喂狗函數(shù),將會產(chǎn)生復位信號。49.2.1看門狗定時器的工作原理
S3C2410A看門狗定時器有2種工作模式:
①帶中斷請求信號的常規(guī)時隙定時器。
②產(chǎn)生內(nèi)部復位信號的定時器,即當定時器的值為0時,產(chǎn)生一個寬度為128PCLK(系統(tǒng)時鐘周期)的復位脈沖信號。圖9-2是看門狗定時器的邏輯功能圖??撮T狗定時器一旦啟動工作,看門狗定時器的計數(shù)常數(shù)寄存器(WTDAT)就無法自動地裝載到計數(shù)寄存器(WTCNT)中。因此應(yīng)該在看門狗定時器工作之前,通過初始化編程將計數(shù)常數(shù)寄存器(WTDAT)的值寫入到計數(shù)寄存器(WTCNT)中。59.2.2看門狗特殊功能控制寄存器
S3C2410A芯片的看門狗定時器邏輯中有3個控制其操作的特殊功能寄存器:看門狗控制寄存器(WTCON);計數(shù)常數(shù)寄存器(WTDAT)和看門狗計數(shù)寄存器(WTCNT)。它們的屬性如表9-1。寄存器名占用地址讀寫屬性描述初值WTCON0x53000000讀/寫看門狗控制寄存器0x8021WTDAT0x53000004讀/寫看門狗常數(shù)寄存器0x8000WTCNT0x53000008讀/寫看門狗計數(shù)寄存器0x800061.看門狗控制寄存器(WTCON)比特位描述初值[15:8]預分頻值(PrescalerValue):范圍0~2550x80[7:6]保留,但取值必須為0000[5]看門狗定時器使能位:1=使能;0=不使能1[4:3]分割因子(Clockselect):00=16;01=32;10=64;11=12800[2]中斷請求使能位:1=允許中斷(看門狗作為一般定時器使用時);0=不允許中斷0[1]保留位,取值為00[0]看門狗定時器復位信號輸出使能(ResetEnable/Disable):0=禁止看門狗定時器的復位功能;1=在看門狗定時器回0時復位信號有效。172.看門狗常數(shù)寄存器(WTDAT)看門狗常數(shù)寄存器WTDAT(WatchdogTimerDataRegister)用來存儲看門狗定時器的溢出時間間隔常數(shù)值。看門狗計數(shù)寄存器從此值開始做減法計數(shù),直到變?yōu)?為時間間隔。計數(shù)公式如下:
計數(shù)常數(shù)=所需時間間隔/計數(shù)時鐘周期T=所需時間間隔*(PCLK/(預分頻值+1)/分割因子)WTDAT是可讀寫的,地址為0x53000004,復位初值為0x8000。其位功能如下表所示。比特位描述初值[15:0]看門狗計數(shù)常數(shù)寄存器值(CountReloadValue)0x800083.看門狗計數(shù)寄存器(WTCNT)
看門狗計數(shù)寄存器WTCNT(WatchdogTimerCounterRegister)是一個實時動態(tài)變化的減法計數(shù)器,WTCNT工作時存儲當前計數(shù)值。WTCNT是可讀寫的,地址為0x53000008,復位后初值為0x8000??撮T狗計數(shù)寄存器的位功能描述如下表所示。比特位描述初值[15:0]看門狗計數(shù)器的當前值(CountValue)0x800099.2.3看門狗定時器應(yīng)用示例
1.Bootloader中的看門狗定時器編程
在系統(tǒng)啟動引導的Bootloader程序中,由于這時ARM系統(tǒng)的部件初始化需要進行大量的工作,需要關(guān)閉看門狗定時器,就是設(shè)置看門狗控制寄存器WTCON的b5=0(看門狗定時器使能位無效),b0=0(禁止看門狗定時器的復位功能),與其它位無關(guān),因此控制字可為0x00,而且必須使用匯編語言編寫程序。程序代碼如下:WTDOGEQU0x53000000;定義WTCON的地址 LDRR0,=WTCON;WTCON地址送R0 LDRR1,=0x00;控制字0x00送R1
STRR1,[R0]
;控制字寫入R02.程序正常運行時的看門狗定時器編程
看門狗可以實現(xiàn)ARM系統(tǒng)的復位,不需要外圍的控制電路。要實現(xiàn)看門狗的功能,需要對看門狗的特殊功能寄存器進行配置操作。編程流程如下:①看門狗定時器作為一般定時器使用時,需要設(shè)置看門狗的中斷操作,因為這是看門狗作為一般定時器使用時的唯一用法。除包括ARM系統(tǒng)的各個中斷寄存器的設(shè)置外,還要看門狗自身中斷使能有效。如果作為ARM系統(tǒng)的看門狗使用,這一步不用設(shè)置。②設(shè)置看門狗控制寄存器WTCON,主要包括預分頻值、分割因子,看門狗定時器復位信號輸出使能b0=1(在看門狗定時器回0時復位信號有效)。③在預估的預分頻值、分割因子的情況下,計算看門狗的定時常數(shù)。只要計算的結(jié)果不大于WTDAT的數(shù)值范圍即216-1均為有效數(shù)據(jù)。將定時常數(shù)賦給WTDAT寄存器和WTCNT寄存器。④啟動看門狗定時器。使看門狗定時器使能位b5=1(使能有效電平信號)。1011應(yīng)用實例使用看門狗功能時,必須事先進行初始化。初始化的主要工作就是設(shè)置WTCON寄存器和WTDAT寄存器。例如,實現(xiàn)S3C2410A芯片的看門狗功能,監(jiān)測系統(tǒng)的周期不大于40us,PCKL=50Mhz。首先計算賦給WTDAT寄存器的初值。初值=40us*(PCKL/(預分頻值+1)/分割系數(shù))注意:這里PCKL的單位是赫茲,預分頻值和分割系數(shù)必須事先有一個固定的值。本例中預分頻值=0,分割系數(shù)=16,即設(shè)置WTCON的值為0x0021,允許看門狗定時器工作,允許看門狗復位信號有效。初值計算過程如下:初值=40*10-6*(50*106/(0+1)/16)=125=0x7d
程序代碼如下:12匯編語言代碼段WTCONEQU0x53000000WTDATEQU0x53000004 AREAWatchdog_Ini,CODE,READONLY ENTRY CODE32ldrr0,=WTDAT;將WTDAT寄存器地址值賦給r0ldrr1,=0x7d;將計數(shù)器初值0x7d賦給r1strr1,[r0];將r1的內(nèi)容寫到以r0內(nèi)容為地址的單元中
ldrr0,=WTCON;將WTCON寄存器地址值賦給r0ldrr1,=0x0021/*設(shè)啟動看門狗??撮T狗復位使能、看門狗使能*/strr1,[r0]END C語言代碼段#definerWTCON=(*(volatileunsignedchar*)0x53000000)#definerWTDAT=(*(volatileunsignedchar*)0x53000004)#definerWTCNT=(*(volatileunsignedchar*)0x53000008)voidwatchdog40(void){rWTCON=(rWTCON&0x0000)|(1<<8)|(1<<3);/*設(shè)置預分頻值、分割因子*/rWTDAT=0x7d;rWTCNT=0x7d;rWTCON=rWTCON|(1<<5)|(1<<0);/*設(shè)啟動看門狗??撮T狗復位使能、看門狗使能*/}13149.3具有脈寬調(diào)制(PWM)的定時器(TIMER)Timer部件主要用于提供定時功能,脈寬調(diào)制(PWM)功能,它的應(yīng)用比較靈活,對于需要一定頻率的脈沖信號,一定時間間隔定時信號的應(yīng)用場合,都能提供支持。9.3.1定時器Timer概述
S3C2410A芯片中有5個16位的Timer部件,其中Timer0~Timer3具有PWM功能,Timer4僅用于定時,不具有PWM功能,它沒有輸出引腳。Timer0是一個同時具有死區(qū)(dead-zone)發(fā)生器,通常用于控制大電流設(shè)備。15
9.3.2TIMER部件的操作每個定時/計數(shù)器都是16位的減法計數(shù)器,是通過定時器自己的時鐘驅(qū)動的。當計數(shù)器減到0時,可產(chǎn)生定時器中斷請求信號,通知CPU定時器的操作已經(jīng)完成了。此時定時/計數(shù)緩沖寄存器TCNTBn(TimerCounterBufferRegistern)的值將自動裝載到遞減計數(shù)器,開始下一輪的操作。但是,若定時器停止工作,則TCNTBn的值將不會重新裝載到計數(shù)器中。定時器比較緩沖寄存器TCMPBn(TimerCompareBufferRegistern)的值用于脈寬調(diào)制。當計數(shù)器的值與比較寄存器的值相同時,定時器的邏輯將改變輸出電平。因此TCMPBn確定脈寬調(diào)制信號輸出的上升時間(或下降時間)。每個定時器(TIMER4除外)均含有TCNTBn,TCNTn,TCMPBn和TCMPn四種計數(shù)緩沖寄存器,其中定時器計數(shù)寄存器TCNTn(TimerCounterRegistern)和定時器比較寄存器TCMPn(TimerCompareRegistern)是內(nèi)部寄存器(編程不可見),內(nèi)部寄存器TCNTn的值可以通過計數(shù)觀察寄存器讀取。16179.3.2TIMER部件操作(續(xù))
每個定時器讀時都是16位的減法計數(shù)器,是通過定時器自己的時鐘驅(qū)動的。當計數(shù)器減到0時,可產(chǎn)生定時器中斷請求信號,通知CPU定時器的操作已經(jīng)完成了。此時TCNTBn的值將自動裝載到遞減計數(shù)器,開始下一輪的操作。但是,若定時器停止工作,則TCNTBn的值將不會重新裝載到計數(shù)器中。
TCMPBn的值用于脈寬調(diào)制。當計數(shù)器的值與比較寄存器的值相同時,定時器的邏輯將改變輸出電平。因此TCMPBn確定脈寬調(diào)制信號輸出的上升時間(或下降時間)。每個定時器(TIMER4除外)均含有TCNTBn,TCNTn,TCMPBn和TCMPn四種計數(shù)緩沖寄存器,其中TCNTn和TCMPn是內(nèi)部寄存器(編程不可見),內(nèi)部寄存器TCNTn的值可以通過計數(shù)觀察寄存器讀取。181.自動重載和雙緩沖器S3C2410A處理器的定時器具有雙緩沖功能,即在不停止當前定時器運行的情況下,重載下次定時器運行周期(或頻率)的參數(shù)、PWM波形的占空比。主要是指向TCNTBn,TCMPBn寄存器賦值。裝載新值之后,在按原參數(shù)運行完前周期后,在下一個新的周期,按新的設(shè)置參數(shù)運行。當內(nèi)部寄存器TCNTn的值減到0時將自動裝載TCNTBn的值到TCNTn中,并可重新開始進行減法計數(shù),前提條件是自動重載允許。如果TCNTn=0,但自動重載禁止,則定時器停止運行。19雙緩沖功能編程圖例當內(nèi)部寄存器TCNTn的值減到0時將自動裝載TCNTBn的值到TCNTn中,并可重新開始進行減法計數(shù),前提條件是自動裝載功能允許。如果TCNTn=0,但自動裝載禁止,則定時器停止運行。2.復雜的定時器設(shè)置示例定時器初始化時,使用手動裝載位和反轉(zhuǎn)位。因為定時器的自動操作發(fā)生在減法計數(shù)器為0和TCNTBn沒有預先賦值時。在這種情況下必須使用手動裝載功能給TCNTBn賦初值。開啟一個定時器的操作如下:①向TCNTBn和TCMPBn中寫入初值;②定時器控制寄存器TCON(TimerControlRegister)相關(guān)的手動裝載位置1,不管是否需要反轉(zhuǎn)位功能,都將反轉(zhuǎn)位的開關(guān)打開;③設(shè)置定時器控制寄存器TCON的相關(guān)啟動位,同時清除其手動裝載位;④如果定時器被強行關(guān)閉,TCNTn就保持原有的計數(shù)值,且不從TCNTBn重新自動裝載計數(shù)值。如果必須重新設(shè)置新值,則必須使用手動裝載。定時器的操作示例如下,以圖9-5進行敘述。201)允許自動裝載功能,給TCNTBn和TCMPBn賦值,這里控制TOUTn周期的TCNTBn=250,控制高電平持續(xù)時間的TCMPBn=150;使能手動裝載功能,TCNTBn和TCMPBn的值將被復制到TCNTn和TCMPn寄存器中;最后設(shè)置在TCNTBn和TCMPBn的值分別為300和100,作為下一個周期定時器的工作參數(shù)。2)設(shè)置相應(yīng)定時器的啟動位為1,清除手動裝載控制位為0,關(guān)閉反轉(zhuǎn)開關(guān),自動裝載開始,定時器按照第一個設(shè)定的參數(shù)運行工作。3)當TCNTn的值等于TCMPBn的值時,TOUTn從低電平跳變到高電平。4)當TCNTn的值等于0時,定時器產(chǎn)生中斷請求,同時TCNTBn=300和TCMPBn=100的值自動裝載到TCNTn和TCMPn中,定時器使用這個參數(shù)將進行下一個周期的工作。5)在響應(yīng)4)的中斷服務(wù)程序中,對TCNTBn和TCMPBn重新賦值,這里分別是130和80,用于下一個周期的工作參數(shù)。6)當TCNTn的值等于TCMPBn的值時,TOUTn又從低電平跳變到高電平。7)重復4)的操作。8)在這個中斷服務(wù)程序中,相應(yīng)定時器的中斷請求和自動裝載功能被禁止,定時器將使用最后一個給定的參數(shù)工作完后,終止工作。9)同3)完成的操作相同。10)當TCNTn的值等于0時,由于自動裝載被禁止,因此TCNTn將不再裝載計數(shù)值,定時器停止工作。11)不再產(chǎn)生中斷請求,工作過程徹底結(jié)束。21223.脈寬調(diào)制(PWM)
PWM的頻率由TCNTBn的值來確定,PWM的每個周期中高電平(或低電平)的持續(xù)時間由TCMPBn的值來確定。如果TCON中某定時器的輸出反轉(zhuǎn)位置0(不反轉(zhuǎn)),若要得到較高的PWM脈寬輸出值(高電平持續(xù)時間),則需要增加TCMPBn的值;若要得到較低的PWM脈寬輸出值,則需要減小TCMPBn的值。
如果TCON中某定時器的輸出反轉(zhuǎn)位置1(反轉(zhuǎn)器被使能),若要得到較高的PWM脈寬輸出值(高電平持續(xù)時間),則需要減小TCMPBn的值;若要得到較低的PWM脈寬輸出值,則需要增加TCMPBn的值?;陔p緩沖器的功能,下一周期TCMPBn的值,可以在中斷服務(wù)程序中,并且在當前的PWM周期內(nèi)的任何時刻寫入。23脈寬調(diào)制(PWM)設(shè)置圖例
圖中上面的波形是減法計數(shù)器的計數(shù)過程示意圖,為畫圖方便,使用(216-計數(shù)器值)。兩條橫線代表TCMPB的取值,取值為(TCNTBn-TCMPBn)。圖例是在反轉(zhuǎn)器關(guān)閉的情況下繪制的。244.輸出電平控制輸出電平控制是通過定時器TCON中的輸出反轉(zhuǎn)位控制的。包括定時器輸出TOUTn的初值及工作過程的波形。在定時器的反轉(zhuǎn)器開關(guān)關(guān)閉(即反轉(zhuǎn)位置0),可以控制TOUTn電平的高或低,方法如下。①關(guān)閉TCON自動重載位之后,TOUTn變?yōu)楦唠娖剑⑶叶〞r器在TCNTn=0時停止;②通過對定時器的啟動/停止位清0停止定時器工作。如果TCNTn不大于TCMPn,TOUTn輸出高電平;如果TCNTn大于TCMPn,TOUTn輸出低電平;③通過對TCON中的輸出反轉(zhuǎn)位置1控制TOUTn輸出反相。開關(guān)。反轉(zhuǎn)位開關(guān)控制TOUTn的波形如下。25定時器反轉(zhuǎn)位控制TOUTn圖例圖例如下:265.死區(qū)(DZDeadZone)發(fā)生器死區(qū)DZ(DeadZone)是當定時器用于PWM,為大電流控制設(shè)備提供電能的時候,需要使用死區(qū)功能。這個功能允許在一個設(shè)備關(guān)閉和另一個設(shè)備開啟之間插入一個時間間隔,可防止兩個設(shè)備同時動作對電網(wǎng)及現(xiàn)場環(huán)境造成較大的危害。TOUT0是T0的PWM輸出,nTOUT0是TOUT0的反相輸出。如果允許死區(qū)功能,TOUT0和nTOUT0的輸出波形就變?yōu)門OUT0_DZ和nTOUT0_DZ,nTOUT0_DZ在TOUT1引腳輸出。定時器的死區(qū)功能使得TOUT0_DZ和nTOUT0_DZ不會同時發(fā)生變化。死區(qū)功能的波形圖9-8所示。27死區(qū)功能允許波形圖死區(qū)允許波形圖即在原波形圖上將上升沿延遲一個死區(qū)間隔時間,而其下降沿的時間與原波形圖相同。6.DMA請求模式與中斷
配置寄存器TCFG1中的DMA模式位可以用來控制定時器n產(chǎn)生DMA請求或中斷使能,一個定時器只能在DMA方式或中斷方式中選擇其一,且最多只有一個定時器可以設(shè)置為DMA方式。現(xiàn)將TCFG1中的DMA方式位[23:20]設(shè)置如表9-5所示:28表9-5DMA模式字對應(yīng)表29DMA模式字DMA請求T0中斷T1中斷T2中斷T4中斷T4中斷0000未選擇允許允許允許允許允許0001定時器T0關(guān)閉允許允許允許允許0010定時器T1允許關(guān)閉允許允許允許0011定時器T2允許允許關(guān)閉允許允許0100定時器T3允許允許允許關(guān)閉允許0101定時器T4允許允許允許允許關(guān)閉309.3.3TIMER部件內(nèi)部功能寄存器控制TIMER控件的操作,需要編程設(shè)置TIMER內(nèi)部的許多功能寄存器。主要有:
●定時器配置寄存器0(TCFG0);
●定時器配置寄存器1(TCFG1);
●定時器控制寄存器(TCON);
●TIMER0計數(shù)緩沖寄存器和比較緩沖寄存器(TCNTB0/TCMPB0);
●TIMER0計數(shù)觀察寄存器(TCNTO0)。以下分別予以介紹。表9-6定時器主要功能寄存器屬性表31寄存器名占用地址讀寫屬性描述初值TCFG00x51000000讀/寫配置預分頻值0、預分頻值1和死區(qū)長度0x00TCFG10x51000004讀/寫配置Timer0~Timer4的分割系數(shù)0x00TCON0x51000008讀/寫設(shè)置各定時器的自動裝載、手動裝載,啟動/停止操作,反轉(zhuǎn)輸出等0x00TCNTBn0x510000××讀/寫設(shè)置各定時器的輸出周期0x00TCMPBn0x510000××讀/寫正常輸出,控制PWM輸出高電平持續(xù)時間0x00TCNTOn0x510000××只讀當需要觀察當前的定時器數(shù)值時使用0x00注意:表中的××,對于不同的定時器取不同的數(shù)值,排列從定時器0開始到定時器3結(jié)束,按TCNTBn、TCMPBn、TCNTOn次序取值是0x0C、0x10、0x14、0x18…0x30、0x34、0x38。說明數(shù)值序列是等差數(shù)列,等差為4。由于定時器4沒有PWM功能輸出,所以沒有TCMPB4,它的TCNTB4、TCNTO4最后2位取值是0x3C和0x40。321)
定時器配置寄存器0(TCFG0)TCFG0是可讀寫的,主要用來設(shè)置預分頻系數(shù)的。其地址為0x51000000,復位初值是0x0。具體位定義如下:位描述初值[31:24]保留0x00[23:16]死區(qū)長度控制。死區(qū)長度的1個單位等于Timer0的定時間隔(dead-zonelength)0x00[15:8]Timer2-Timer4預分頻值設(shè)置(Prescaler1)0x00[7:0]Timer0、Timer1預分頻值設(shè)置(Prescaler0)0x00332)
定時器配置寄存器1(TCFG1)TCFG1是可讀寫的,主要用來設(shè)置分割器值。其地址為0x51000004,復位初值是0x0。具體位定義如下:位描述初值[31:24]保留0x00[23:20]選擇DMA請求的定時器:0=不選擇;1=選擇Timer0;2=選擇Timer1;3=選擇Timer2;4=選擇Timer3;5=選擇Timer4;其它保留0x0[19:16]MUX4.Timer4分割器值:0=2;1=4;2=8;3=16;01xx=外部TCLK10x0[15:12]MUX3.Timer3分割器值:0=2;1=4;2=8;3=16;01xx=外部TCLK10x0342)TCFG1(Continue)位描述初值[11:8]MUX2.Timer2分割器值:0=2;1=4;2=8;
3=16;01xx=外部TCLK10x0[7:4]MUX1.Timer1分割器值:0=2;1=4;2=8;
3=16;01xx=外部TCLK00x0[3:0]MUX0.Timer0分割器值:0=2;1=4;2=8;3=16;01xx=外部TCLK00x035TCFG0和TCFG1的聯(lián)合作用
通過TCFG0和TCFG1的設(shè)置,可以確定各定時器預分頻系數(shù)和分割器的值,最后通過以下公式計算定時器的輸入時鐘頻率。
定時器輸入時鐘頻率=PCLK/(預分頻值+1)/分割器值預分頻器系數(shù)范圍=0~255
分割器取值域={2,4,8,16}363.定時器控制寄存器(TCON)
定時器控制寄存器是可讀寫的,地址是0x51000008,復位初值是0x0。具體位定義如下表。位功能初值[22]Timer4自動裝載控制位:1=自動裝載;0=否0[21]Timer4手動更新控制位:1=更新TCNTB4;0=否0[20]Timer4啟動/停止控制位:1=啟動;0=不操作0[19]Timer3自動裝載控制位:1=自動裝載;0=否0[18]Timer3輸出反轉(zhuǎn)位:1=TOUT3反轉(zhuǎn);0=不反轉(zhuǎn)0[17]Timer3手動更新控制位:1=更新TCNTB3和TCMPB3;0=不操作0[16]Timer3啟動/停止控制位:1=啟動;0=不操作037定時器控制寄存器(TCON)位定義(續(xù))位功能初值[15:8]Timer2與Timer1定時器控制位,各使用4bit。Timer2使用b15-b12,Timer1使用b11-b8??刂莆坏拇涡蚝凸δ芘cTimer3控制位的b19-b16相同。0[7:5]保留000[4]死區(qū)使能操作控制位:1=使能;0=否0[3]Timer0自動裝載控制位:1=自動裝載;0=否0[2]Timer0輸出反轉(zhuǎn)位:1=TOUT3反轉(zhuǎn);0=不反轉(zhuǎn)0[1]Timer0手動更新控制位:1=更新TCNTB0和TCMPB0;0=不操作0[0]Timer0啟動/停止控制位:1=啟動;0=不操作0384.TIMERn的三個計數(shù)寄存器TIMERn定時器的三個計數(shù)寄存器:有緩沖寄存器(TCNTBn)是可讀寫的;比較緩沖寄存器(TCMPBn)也是可讀寫的;和計數(shù)觀察寄存器(TCNTOn),它是只讀的。這里n=0~4,即指TIMER0~TIMER4。具體定義格式如下表。位描述初值TCNTBn[15:0]存放TIMERn計數(shù)寄存器初值0x0TCMPBn[15:0]存放TIMERn比較寄存器初值0x0TCNTOn[15:0]存放TIMERn的當前計數(shù)值0x0394.TIMERn三個計數(shù)寄存器(續(xù))從TIMER0-TIMER4它們的三個計數(shù)寄存器有相同的格式位定義,但是TIMER4沒有比較計數(shù)寄存器。它們分別占用不同的物理地址,具體如下表。地址為。地址為。Timer0的它們的復位初值均為0x0。TCNTBTCMPTCNTOTIMER00x5100000c0x510000100x51000014TIMER10x510000180x5100001c0x51000020TIMER20x510000240x510000280x5100002cTIMER30x510000300x510000340x51000038TIMER40x5100003c-0x510000409.3.4定時器Timer應(yīng)用示例
定時器的應(yīng)用非常廣泛,也很靈活,不同的應(yīng)用需求,將決定定時器使用不同的編程方式。可歸結(jié)為以下幾種:
●一種是作為定時器使用,需要根據(jù)定時時間和ARM系統(tǒng)提供的PCLK時鐘,配置預分頻值,分割器值計算數(shù)據(jù)緩沖寄存器的值等;
●二種是作為計數(shù)器使用,分割器的值選TCLK0或TCLK1,將計數(shù)的初值賦給數(shù)據(jù)緩沖寄存器等,啟動定時/計數(shù)器即可;
●三種是作為周期脈沖信號的輸出,即PWM輸出,這時除需要一種的工作外,還要設(shè)置比較緩沖寄存器的數(shù)值,以決定在反轉(zhuǎn)位=0時高電平的持續(xù)時間或反轉(zhuǎn)位=1時低電平的持續(xù)時間。這一功能也可以用于恒溫控制系統(tǒng)的功率調(diào)節(jié)(在一個周期內(nèi)高電平的持續(xù)時間越長,直流分量越大,對應(yīng)的平均功率越大),必要時可以使用死區(qū)這一功能。401.定時器的程序設(shè)計流程
1)設(shè)置配置寄存器0。內(nèi)容是設(shè)置預分頻器0或預分頻器1的值,以及Timer0的死區(qū)寬度。2)設(shè)置配置寄存器1。內(nèi)容是各個定時器的分割器值,DMA方式或中斷方式。3)根據(jù)前2項的設(shè)置、PCLK的時鐘,以及實際需要,計算計數(shù)緩沖寄存器TCNTBn和TCMPBn的初值并賦之。
4)設(shè)置定時器控制寄存器TCON。計數(shù)初值自動裝載、手動裝載位=1、設(shè)置反轉(zhuǎn)位=1等。
5)重新設(shè)置定時器控制寄存器TCON。清除手動裝載位、設(shè)置反轉(zhuǎn)位=0,啟動定時器。41422.應(yīng)用實例實例需要產(chǎn)生一個500ms的PWM脈沖周期信號,高電平的持續(xù)時間占40%,系統(tǒng)的PCLK為66MHz。選用定時器TIMER0,要求從ARM的引腳TOUT0輸出。編程敘述如下。1)根據(jù)需要的脈沖信號周期500ms及系統(tǒng)PCLK=66MHz,確定預分頻系數(shù)和分割器值,并計算計數(shù)緩沖寄存器初值。本例預分頻值取31,分割器值取16,則計數(shù)緩沖寄存器的初值計算如下:
初值=定時間隔/(1/(PCLK/(預分頻系數(shù)+1)/分割器值))=500ms*(66MHz/32/16)=500*10-3*(66*106/32/16)=64453=0xfbc5
比較緩沖寄存器的初值=64453×40%=0x64b5432)編寫定時器程序:先設(shè)置TCFG0、TCFG1寄存器,再設(shè)置TCNTB0寄存器,最后設(shè)置TCON寄存器啟動定時器工作。3)編寫程序#definerTCFG0(*(volitaleunsigned*)0x51000000/*定義定時器配置寄存器0地址*/#definerTCFG1(*(volitaleunsigned*)0x51000004/*定義定時器配置寄存器1地址*/#definerTCON(*(volitaleunsigned*)0x51000008
/*定義定時器控制寄存器地址*/#definerTCNTB0(*(volitaleunsigned*)0x5100000C#definerTCOMB0(*(volitaleunsigned*)0x51000010#definerGPBCON(*(volitaleunsigned*)0x56000010
/*定義B端口控制寄存器地址*/#definerGPBDAT(*(volitaleunsigned*)0x56000014
/*定義B端口數(shù)據(jù)寄存器地址*/#definerGPBUP(*(volitaleunsigned*)0x56000018/*定義B端口上拉電阻寄存器地址*/voidtimer0(void){GPBCON=rGPBCON|(2<0);/*設(shè)置GPB0為第2功能TOUT0*/rGPBUP=rGPBUP&(~(1<0));/*使能GPB0上拉電阻*/rTCFG0=(rTCFG0&0x00)|(31<<0);
/*deadzone=0,Timer0預分頻系數(shù)31*/rTCFG1=(rTCFG1&0x00)|(3<<0);/*均工作在中斷方式,分割系數(shù)16*/rTCNTB0=0xfbc5;rTCMPB0=0x64b5;rTCON=rTCON|(1<<2)|(1<<1);
/*反轉(zhuǎn)位置1,手動裝載TCNTB0和TCMPB0*/rTCON=rTCON&(~(1<<2))&(~(1<<1))|(1<<3)|(1<0);/*手動裝載清0,自動裝載置1,并啟動*/}44459.4實時時鐘(RTC)S3C2410A提供RTC(RealTimeClock)實時時鐘單元,在系統(tǒng)掉電后由后備電池供電繼續(xù)工作。RTC是用于提供年、月、日、時、分、秒、星期等實時時間信息的定時部件。它由外部時鐘驅(qū)動工作,時鐘頻率為32.768khz。
以下主要介紹它的工作原理、功能控制寄存器和編程方法。46479.4.1RTC概述
RTC部件可以將提供實時信息的8位數(shù)據(jù)以BCD碼的格式輸出,同時還具有各種報警功能。其主要特點有:
1.年、月、日、時、分、秒、星期等實時時間信息采用BCD碼表示;
2.閏年發(fā)生器;
3.具有報警功能,提供報警中斷或者系統(tǒng)在節(jié)電模式下的喚醒;
4.擁有獨立的電源引腳(RTCVDD);
5.支持RTOS內(nèi)核時間片所需的毫秒計時中斷;
6.進位復位功能。489.4.1RTC概述(續(xù)1)RTC部件提供專門的電源引腳可以由備用電源供電。當系統(tǒng)電源關(guān)閉時,微處理器接口和RTC邏輯電路均是斷開的,后備電池僅驅(qū)動RTC部件的振蕩器和BCD碼計數(shù)器,以使功耗降到最低。在節(jié)電模式或正常運行模式下,RTC可以在特定的時候觸發(fā)蜂鳴器。在正常運行模式下,激活的是報警中斷信號(ARMINT)。在節(jié)電模式下,激活的是電源管理器部件的喚醒信號(PMWKUP)并同時激活報警中斷信號(ARMINT)。RTC內(nèi)部的報警寄存器(RTCALM)可以設(shè)置報警工作狀態(tài)的使能/不使能以及報警時間的條件。499.4.1RTC概述(續(xù)2)RTC的時間片計時器用于產(chǎn)生一個中斷請求,TICNT寄存器有一個中斷使能位,和計數(shù)器中的值一起用來控制中斷。當計數(shù)器的值變?yōu)?時,引起時間片計時中斷。中斷信號的周期計算如下:
周期s=(n+1)/128
其中n是時間片計數(shù)器中的值,范圍在0-127之間。RTC的時間片計時器可以用來產(chǎn)生實時操作系統(tǒng)內(nèi)核所需的時間片。進位復位功能可以由RTC的進位復位寄存器(RTCRST)來控制。秒的進位周期可以進行選擇(30、40、50),在進位復位發(fā)生后,秒的數(shù)值又循回到0。例如當前時間是23:37:47,進位周期選為40秒,則當前時間將變?yōu)?3:38:00。509.4.2實時時鐘RTC控制寄存器RTC的內(nèi)部有許多用于控制操作的寄存器。通過程序?qū)@些寄存器進行設(shè)置,用戶就可控制RTC部件的工作。以下介紹這些寄存器的功能及位定義。511.RTC控制寄存器(RTCCON)RTC控制寄存器(RTCCON)是可讀/寫的,地址為0x57000040,初值是0x0。該寄存器僅使用4位,RTCEN控制BCD碼寄存器的讀寫使能,同時控制微處理器和RTC間的所有接口的使能。因此,在系統(tǒng)復位后需要對RTC進行操作時,RTCEN=1。而在其它時間,RTCEN應(yīng)清0,以防數(shù)據(jù)無意地寫入到RTC的寄存器中。52RTC控制寄存器RTCCON的位定義位描述初值[3]RTC時鐘計數(shù)器復位使能(RTCRST):0=不復位;1=復位0[2]BCD碼選擇位(CNTSEL):0=合并BCD碼;1=保留0[1]BCD碼時鐘選擇位(CLKSEL):0=2-16XTAL;1=保留0[0]RTC使能位(RTCEN):0=不使能;1=使能0532.時間片計數(shù)器(TICNT)計數(shù)器TICNT是可/讀寫的,地址為0x57000044,初值為0x0。具體格式定義如下表。位描述初值[7]時間片計數(shù)器中斷使能(TICNTINTENABLE):1=使能;0=不使能0[6:0]時間片計數(shù)器的值(TICKTIMECOUNT)0x0543.報警控制寄存器(RTCALM)報警控制寄存器(RTCALM)是可讀/寫的,地址為0x57000050,初值是0x0。RTCALM的組成格式如下所示。注意:在節(jié)電模式下,RTCALM寄存器通過ALMINT和PMWKUP來產(chǎn)生報警信號;而在正常操作模式下,只通過ALMINT產(chǎn)生報警信號。位描述初值[6]全局報警使能位ALMEN:1=使能;0=不使能0[5]年報警使能位YEAREN:1=使能;0=不使能0[4]月報警使能位ALMEN:1=使能;0=不使能0[3]日報警使能位ALMEN:1=使能;0=不使能0[2]時報警使能位ALMEN:1=使能;0=不使能0[1]分報警使能位ALMEN:1=使能;0=不使能0[0]秒報警使能位ALMEN:1=使能;0=不使能0554.報警秒數(shù)據(jù)寄存器(ALMSEC)寄存器ALMSEC是可/讀寫的,地址為0x57000054,初值為0x0。具體格式定義如下表。位描述初值[6:4]報警定時器秒數(shù)據(jù)十位BCD碼值),范圍0~5。0[3:0]報警定時器秒數(shù)據(jù)個位BCD碼值,范圍0~9。0565.報警分數(shù)據(jù)寄存器(ALMMIN)寄存器ALMMIN是可/讀寫的,地址為0x57000058,初值為0x0。具體格式定義如下表。位描述初值[6:4]報警定時器分數(shù)據(jù)十位BCD碼值,范圍0~5。0[3:0]報警定時器分數(shù)據(jù)個位BCD碼值,范圍0~9。0576.報警時數(shù)據(jù)寄存器(ALMHOUR)寄存器ALMHOUR是可/讀寫的,地址為0x5700005C,初值為0x0。具體格式定義如下表。位描述初值[5:4]報警定時器時數(shù)據(jù)十位BCD碼值,范圍0~2。0[3:0]報警定時器時數(shù)據(jù)個位BCD碼值,范圍0~9。0587.報警日數(shù)據(jù)寄存器(ALMDATE)寄存器ALMDATE是可/讀寫的,地址為0x57000060,初值為0x01。具體格式定義如下表。位描述初值[5:4]報警定時器日數(shù)據(jù)十位BCD碼值,范圍0~3。0[3:0]報警定時器日數(shù)據(jù)個位BCD碼值,范圍0~9。0598.報警月數(shù)據(jù)寄存器(ALMMON)寄存器ALMMON是可/讀寫的,地址為0x57000064,初值為0x01。具體格式定義如下表。位描述初值[4]報警定時器月數(shù)據(jù)十位BCD碼值,范圍0~1。0[3:0]報警定時器月數(shù)據(jù)個位BCD碼值,范圍0~9。0609.報警年數(shù)據(jù)寄存器(ALMYEAR)寄存器ALMYEAR是可/讀寫的,地址為0x57000068,初值為0x0。具體格式定義如下表。位描述初值[7:0]報警定時器年數(shù)據(jù)BCD碼值,范圍0~99。06110.循環(huán)復位寄存器(RTCRST)寄存器RTCRST是可/讀寫的,地址為0x5700006C,初值為0x0。具體格式定義如下表。位描述初值[3]循環(huán)復位使能位(SRSTEN):1=使能;0=不使能0[2:0]秒循環(huán)進位周期:010=超過30s;100=超過40s;101=超過50s;其它組合不會發(fā)生進位,但是秒值可以復位。06211.秒數(shù)據(jù)寄存器(BCDSEC)寄存器BCDSEC是可/讀寫的,用來存儲當前時間的秒數(shù)據(jù),即合并的BCD碼格式。地址為0x57000070,初值不定。具體格式定義如下表。位描述初值[6:4]秒數(shù)據(jù)十位BCD碼值,范圍0~5。0[3:0]秒數(shù)據(jù)個位BCD碼值,范圍0~9。06312.分數(shù)據(jù)寄存器(BCDMIN)寄存器BCDMIN是可/讀寫的,用來存儲當前時間的分數(shù)據(jù),即合并的BCD碼格式。地址為0x57000074,初值不定。具體格式定義如下表。位描述初值[6:4]分數(shù)據(jù)十位BCD碼值,范圍0~5。0[3:0]分數(shù)據(jù)個位BCD碼值,范圍0~9。06413.時數(shù)據(jù)寄存器(BCDHOUR)寄存器BCDHOUR是可/讀寫的,用來存儲當前時間的時數(shù)據(jù),即合并的BCD碼格式。地址為0x57000078,初值不定。具體格式定義如下表。位描述初值[5:4]時數(shù)據(jù)十位BCD碼值,范圍0~2。0[3:0]時數(shù)據(jù)個位BCD碼值,范圍0~9。06514.日數(shù)據(jù)寄存器(BCDDATE)寄存器BCDDATE是可/讀寫的,用來存儲當前日期的日數(shù)據(jù),即合并的BCD碼格式。地址為0x5700007C,初值不定。具體格式定義如下表。位描述初值[5:4]日數(shù)據(jù)十位BCD碼值,范圍0~3。0[3:0]日數(shù)據(jù)個位BCD碼值,范圍0~9。06615.星期數(shù)據(jù)寄存器(BCDDAY)寄存器BCDDAY是可/讀寫的,用來存儲當前日期對應(yīng)的星期數(shù)據(jù),即合并的BCD碼格式。地址為0x57000080,初值不定。具體格式定義如下表。位描述初值[2:0]星期數(shù)據(jù)BCD碼值,范圍1~7。06716.月數(shù)據(jù)寄存器(BCDMON)寄存器BCDMON是可/讀寫的,用來存儲當前日期的月數(shù)據(jù),即合并的BCD碼格式。地址為0x57000084,初值不定。具體格式定義如下表。位描述初值[4]月數(shù)據(jù)十位BCD碼值,范圍0~1。0[3:0]月數(shù)據(jù)個位BCD碼值,范圍0~9。06817.年數(shù)據(jù)寄存器(BCDYEAR)寄存器BCDYEAR是可/讀寫的,用來存儲當前日期對應(yīng)的年數(shù)據(jù),即合并的BCD碼格式。地址為0x57000088,初值不定。具體格式定義如下表。位描述初值[7:0]年數(shù)據(jù)BCD碼值,范圍00~99。0699.4.3RTC編程舉例(應(yīng)用C語言編程)#definerRTCCON(*(volitaleunsigned*)0x57000040#definerTICNT(*(volitaleunsigned*)0x57000044#definerRTCALM(*(volitaleunsigned*)0x57000050#definerRTCRST(*(volitaleunsigned*)0x5700006C
………#defineuint8unsignedcharuint8year,month,day,wkday,hour,minute,second,flag;/*RTC初始化函數(shù).函數(shù)名:RTC_Init(void);
功能:初始化RTC,同時設(shè)置RTC的當前日期和時間*/voidRTC_Init(void){year=14;//2014month=11;day=18;wkday=4;//Thursday709.4.3RTC編程舉例(續(xù)1)hour=11,minute=18,second=00;rRTCCON=(uint8)(rRTCCON|0x01);//使能RTC讀寫操作
rRTCALM=(uint8)0x0;//關(guān)閉所有的報警
rRTCRST=(uint8)0x0;//關(guān)閉復位操作
rTICNT=(uint8)0x0;//關(guān)閉時間片中斷
rRTCCON=(uint8)(rRTCCON&0xfe);//關(guān)閉RTC讀寫操作}/*RTC寫函數(shù)。函數(shù)名RTC_Write(void);
功能:完成將初始化函數(shù)中設(shè)置的日期與時間參數(shù)寫到RTC中*/voidRTC_Write(void){uint8Y,MO,D,W,H,MI,S;/*以下完成將數(shù)據(jù)轉(zhuǎn)換為BCD碼*/if(year>1999)year=year-2000;Y=uint8(year/10*16+year%10);
719.4.3RTC編程舉例(續(xù)2)MO=uint8(month/10*16+month%10);D=uint8(day/10*16+day%10);W=uint8(wkday/10*16+wkday%10);H=uint8(hour/10*16+hour%10);MI=uint8(minute/10*16+minute%10);S=uint8(second/10*16+second%10);rRTCCON=(uint8)(rRTCCON|0x01);/*使能RTC讀寫操作*//*將當前日期與時間參數(shù)寫入各自的數(shù)據(jù)寄存器中*/rBCDYEAR=Y,rBCDMON=MO,rBCDDATE=D,rBCDDAY=W;rBCDHOUR=H,rBCDMIN=MI,rBCDSEC=S;rRTCCON=(uint8)(rRTCCON&0xfe);//關(guān)閉RTC讀寫操作}729.4.3RTC編程舉例(續(xù)3)
/*RTC讀函數(shù)。函數(shù)名RTC_Read(void);
功能:完成將RTC日期與時間的BCD碼參數(shù)值讀出*/voidRTC_Read(void){uint8Y,MO,D,W,H,MI,S;/*以下完成讀RTC各數(shù)據(jù)寄存器BCD碼*/rRTCCON=(uint8)(rRTCCON|0x01);/*使能RTC讀寫操作*/Y=rBCDYEAR,MO=rBCDMON,D=rBCDDATE,W=rBCDDAY;H=rBCDHOUR,MI=rBCDMIN,S=rBCDSEC;rRTCCON=(uint8)(rRTCCON&0xfe);/*關(guān)閉RTC讀寫操作*/
/*以下是將合并的BCD碼轉(zhuǎn)換為十進制數(shù),放入對應(yīng)的變量中*/739.4.3RTC編程舉例(續(xù)4)Year=Y&0x0f+Y&0xf0/16*10;month=MO&0x0f+MO&0xf0/16*10;day=D&0x0f+D&0xf0/16*10;wkday=W&0x0f+W&0xf0/16*10;hour=H&0x0f+H&0xf0/16*10;minute=MI&0x0f+MI&0xf0/16*10;second=S&0x0f+S&0xf0/16*10;}74第8章習題9-1何為定時/計數(shù)器?定時與計數(shù)有什么區(qū)別?9-2試述看門狗定時器的功能和主要控制寄存器的作用。9-3看門狗定時器的主要作用是什么?在程序的編寫工作中需要做什么工作?9-4S3C2410A的看門狗有那些工作方式。設(shè)計一個監(jiān)測系統(tǒng)程序周期不大于50us,在PCLK=100Mhz時的看門狗程序。9-5試述S3C2410A的TIMER部件組成及主要功能。9-6試述S3C2410A的TIMER部件的控制寄存器及主要功能。9-7使用TIMER部件的TIMER1定時/計數(shù)器,設(shè)計產(chǎn)生一個周期為1000ms,占空比為1/2的脈沖信號。已知系統(tǒng)的PCLK=66Mhz,編寫初始化程序。9-8論述S3C2410A芯片中RTC部件的主要功能、主要控制寄存器的作用。9-9編寫使用RTC部件的初始化程序、設(shè)置當前日期與時間程序和讀取RTC的當前日期和時間數(shù)據(jù)。
第10章Bootloader
設(shè)計基礎(chǔ)
7510.1Bootloader
概述
Bootloader,啟動引導程序,又叫引導加載程序,功能強大的Bootloader也就直接叫做板級支持包(BSP,BoardSupportPacket)或者固件(Firmware)。近年來,為了方便嵌入式產(chǎn)品的推廣,也有些直接將Bootloader叫做BIOS。BIOS是PC機的“基本輸入輸出系統(tǒng)”,燒錄在電腦主板上一塊專門的芯片中。一般BIOS由主板廠商或者專門的BIOS生產(chǎn)商提供,不是開源的,用戶不能修改其中的代碼進行定制。而嵌入式系統(tǒng)的開發(fā)則離不開Bootloader的開發(fā),它也是整個系統(tǒng)開發(fā)中的難點之一。
7610.1.1Bootloader
的作用
Bootloader是在嵌入式操作系統(tǒng)內(nèi)核運行之前運行的一段小程序,也是系統(tǒng)開機后執(zhí)行的第一段程序。通過這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間,從而將系統(tǒng)的軟硬件環(huán)境設(shè)置成一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。Bootloader是依賴于底層硬件而實現(xiàn)的,因此建立一個通用的嵌入式系統(tǒng)Bootloader幾乎是不可能的。在PC機中,主板的BIOS和位于硬盤0磁道上的主引導記錄(MasterBootRecord,MBR)中的引導程序(如LILO或GRUB等),兩者一起的作用就相當于Bootloader在嵌入式系統(tǒng)中的作用,即實現(xiàn)整個系統(tǒng)的啟動引導,并最終能引導操作系統(tǒng)的運行。7710.1.1Bootloader
的作用(續(xù)1)在嵌入式系統(tǒng)中,Bootloader對嵌入式設(shè)備中的主要部件如CPU、SDRAM、FLASH、串口等進行了初始化,這樣可以使用Bootloader通過串口下載各種文件到設(shè)備的SDRAM中或者燒錄Flash,然后將操作系統(tǒng)內(nèi)核讀入到內(nèi)存中來或者直接跳轉(zhuǎn)到內(nèi)核的入口點,從而實現(xiàn)操作系統(tǒng)的引導?,F(xiàn)在有些Bootloader也把對以太網(wǎng)的支持等功能也加進去了,這樣一個功能比較強大的Bootloader實際上就已經(jīng)相當于一個微型的操作系統(tǒng)了。7810.1.1Bootloader
的作用(續(xù)2)Bootloader從第一條指令跳轉(zhuǎn)后,就開始初始化各種最重要的硬件,比如CPU的工作頻率、定時器、中斷、看門狗、檢測RAM大小和Flash等。一般,硬件初始化的這段程序是用匯編語言編寫的,其后就用C語言編寫??傮w上Bootloader主要完成以下工作:
初始化CPU速度;初始化內(nèi)存,包括啟用內(nèi)存庫,初始化內(nèi)存配置寄存器等;初始化中斷控制器,在系統(tǒng)啟動時,關(guān)閉中斷,關(guān)閉看門狗;初始化串行端口(如果在目標上有的話);啟用指令/數(shù)據(jù)高速緩存;7910.1.1Bootloader
的作用(續(xù)3)
設(shè)置堆棧指針;設(shè)置參數(shù)區(qū)域并構(gòu)造參數(shù)結(jié)構(gòu)和標記,即引導參數(shù);執(zhí)行POST(上電自檢)來標識存在的設(shè)備并報告有何問題;為電源管理提供掛起/恢復支持;傳輸操作系統(tǒng)內(nèi)核鏡像文件到目標機。也可以將操作系統(tǒng)內(nèi)核鏡像文件事先存放在Flash中,這樣就不需要Bootloader和主機傳輸操作系統(tǒng)內(nèi)核鏡像文件,這通常是在做成產(chǎn)品的情況下使用。而一般在開發(fā)過程中,為了調(diào)試內(nèi)核的方便,不將操作系統(tǒng)內(nèi)核鏡像文件固化在Flash中,這就需要主機和目標機進行文件傳輸;跳轉(zhuǎn)到內(nèi)核的開始,在此又分為ROM啟動和RAM啟動。所謂ROM啟動就是用XIP技術(shù)直接在Flash中執(zhí)行操作系統(tǒng)鏡像文件;所謂RAM啟動就是指把內(nèi)核鏡像從Flash復制到RAM中,然后再將PC指針跳轉(zhuǎn)到RAM中的操作系統(tǒng)啟動地址。8010.1.1Bootloader
的作用(續(xù)4)
在嵌入式Linux軟件系統(tǒng)的開發(fā)中,一般將軟件分為啟動引導程序(Bootloader)、操作系統(tǒng)內(nèi)核(OSKernel)、根文件系統(tǒng)(FileSystem)、圖形窗口系統(tǒng)(GUI)和應(yīng)用程序(AP)等幾個部分,其中前三部分是一個可運行的嵌入式系統(tǒng)必不可少的,它們在開發(fā)的過程中,被分別獨立地編譯鏈接或打包為一個二進制目標文件,然后下載(燒錄)到嵌入式系統(tǒng)的ROM(一般是Flash)中。后兩部分如果有的話,通常也是和根文件系統(tǒng)一起打包后燒錄到Flash中。因此在Bootloader階段,也提供了對Flash設(shè)備的分區(qū)格式化的支持,其空間分配通常如圖所示。8110.1.2Bootloader
的工作模式
對于嵌入式系統(tǒng)的開發(fā)人員而言,Bootloader通常包含“啟動加載”和“下載”這兩種不同的工作模式。當然,這兩種工作模式的區(qū)別一般僅僅對于開發(fā)人員才有意義,而對最終用戶來說,Bootloader
的作用就是用來加載操作系統(tǒng),從而啟動整個嵌入式系統(tǒng)。
8210.1.2Bootloader
的工作模式(續(xù)1)啟動加載(Bootloading)模式--正常啟動模式下載(Downloading)模式--提供給開發(fā)人員或者技術(shù)支持人員使用8310.1.3Bootloader
的啟動流程
啟動流程分為stage1和stage2兩個階段一般依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,都放在stage1中,而且通常都用匯編語言來實現(xiàn),以達到短小精悍且啟動快的目的;而stage2則通常用C語言來實現(xiàn),這樣可以實現(xiàn)各種復雜的功能(比如串口、以太網(wǎng)接口的支持等)
841、Bootloader的第一階段
①硬件設(shè)備初始化。包括屏蔽所有中斷;關(guān)閉看門狗;設(shè)置CPU的速度與時鐘;RAM初始化;關(guān)閉CPU內(nèi)部指令/數(shù)據(jù)cache等。
②為加載Bootloader
的stage2準備RAM空間。
③拷貝
Bootloader的stage2到RAM空間中。
④設(shè)置好堆棧。
⑤跳轉(zhuǎn)到stage2的C入口點main()函數(shù)處。852、Bootloader的第二階段
①初始化本階段要使用到的硬件設(shè)備。②檢測系統(tǒng)內(nèi)存映射(memorymap)。③將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中。④為內(nèi)核設(shè)置啟動參數(shù)。⑤調(diào)用內(nèi)核。8610.2S3C2410平臺下Linux的BootloaderViviU-BOOT8710.2.1vivi1.vivi簡介
vivi是由韓國mizi公司為ARM處理器系列設(shè)計的一個bootloader。它同樣支持啟動加載模式和下載工作模式。在下載模式下,vivi為用戶提供一個命令行人機接口,通過這個人機接口可以使用vivi提供的一些命令。如果嵌入式系統(tǒng)沒有鍵盤和顯示,那么可以利用vivi中的串口,將其和宿主機連接起來,利用宿主機中的串口軟件(如windows中的超級終端或者Linux中的minicom)來控制。8810.2.1vivi(續(xù)1)vivi常用的命令Load命令:將二進制文件寫入Flash或RAM。例如:
Loadflashx表示向flash芯片中燒錄內(nèi)核映像zImage文件,與宿主機的通信采用xmodem協(xié)議。Part命令:操作MTD分區(qū)信息,比如顯示、增加、刪除、復位MTD分區(qū)等。例如partshowBon命令:用于NANDFlash的簡單分區(qū)。Param命令:用于設(shè)置參數(shù)。Boot命令:啟動系統(tǒng)。Flash命令:管理Flash.例如刪除Flash的數(shù)據(jù)。892.vivi文件結(jié)構(gòu)
Vivi的文件目錄包括arch,init,lib,drivers和include等幾個目錄,共200多條文件。
arch:包括vivi支持的所有目標板(CPU的類型)。
init:只包含main.c和version.c兩個文件,vivi將從main.c函數(shù)開始執(zhí)行。
lib:一些公共平臺接口代碼。
drivers:設(shè)備驅(qū)動程序代碼,其中包含引導內(nèi)核需要的設(shè)備驅(qū)動程序(mtd和串口),mtd目錄下又分為map,nand,nor這3個子目錄。
include:頭文件共用目錄。其中s3c2410.h定義了s3c2410CPU的所用寄存器,而platform/smdk2410.h則定義了開發(fā)板相關(guān)的資源配置參數(shù)等。903.vivi的配置和編譯vivi的配置和嵌入式Linux內(nèi)核一樣,可以采用菜單化的形式進行。其步驟主要如下:
①#makedistclean。清除一些早先生成的無用的目標文件。
②#makemenuconfig。然后可以根據(jù)菜單中的信息進行配置。
③編譯。菜單配置完畢后,保存退出。然后執(zhí)行“make”命令開始編譯。914.Vivi的第一階段分析
vivi的第一階段主要完成了依賴于CPU的體系結(jié)構(gòu)硬件初始化,包括禁止中斷、初始化串口、復制第二階段到RAM中等。由于這些代碼是和硬件緊密相關(guān)的,因此要求讀者在閱讀時對照S3C2410處理器的數(shù)據(jù)手冊,查閱相關(guān)的寄存器的描述,以便更好地理解。這些匯編代碼全部就集中在vivi\arch\s3c2410目錄下的head.S這一個匯編文件中,當然還有相關(guān)的頭文件。
程序代碼參見WORD文檔925.vivi第二階段的分析vivi的第二階段的入口就是init/main.c,按照源代碼的組織流程,根據(jù)模塊化劃分的原則,共分為8個功能模塊即八個步驟,在源代碼的注釋中以step非常清晰的給出了區(qū)分。935.vivi第二階段的分析(續(xù)1)第一步:vivi從main()函數(shù)開始執(zhí)行,函數(shù)開始通過putstr(vivi_bannner)打印出vivi的版本。第二步:主要是初始化GPIO,本的思路和方法就是在把握好整個系統(tǒng)硬件資源的前提下,根據(jù)芯片的數(shù)據(jù)手冊把所有的初始值設(shè)定,在這里利用set_gpios這個函數(shù)就可以完成初始化了。
第三步:進行內(nèi)存映射初始化和內(nèi)存管理單元(MM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025車輛保管合同書范文
- 2025保修工程合同范本
- 2025學校食堂承包合同書
- 2025關(guān)于試用期解除合同及案例
- 2025年度軍事電子對抗保密技術(shù)合同3篇
- 2025年度新能源充電設(shè)施建設(shè)公司合作協(xié)議書3篇
- 二零二五年度農(nóng)村房屋租賃合同(含農(nóng)業(yè)產(chǎn)業(yè)升級)
- 二零二五年度體育場館租賃合同及賽事運營協(xié)議3篇
- 2025年度農(nóng)村個人地基使用權(quán)轉(zhuǎn)讓及農(nóng)業(yè)現(xiàn)代化設(shè)施配套協(xié)議書3篇
- 2025年度教育信息化項目經(jīng)理合作協(xié)議2篇
- 國際視野開拓全球
- T-CARM 002-2023 康復醫(yī)院建設(shè)標準
- 工程機械租賃服務(wù)方案及保障措施范本
- 2024年不良資產(chǎn)處置相關(guān)項目投資計劃書
- 腸道支架植入術(shù)培訓課件
- 數(shù)字政府建設(shè)行業(yè)分析
- 關(guān)于調(diào)整縣人民醫(yī)院預算管理委員會成員的通知
- 《工程計量》課件
- 2024年度企業(yè)網(wǎng)絡(luò)搭建及應(yīng)用技能大賽方案
- 2024分娩鎮(zhèn)痛ppt課件完整版
- 教務(wù)處述職報告
評論
0/150
提交評論