嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第9、10章 微處理器S3C2410A定時(shí)計(jì)數(shù)器;Bootloader 設(shè)計(jì)基礎(chǔ)、A-D轉(zhuǎn)換、觸摸屏與LCD程序設(shè)計(jì)_第1頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第9、10章 微處理器S3C2410A定時(shí)計(jì)數(shù)器;Bootloader 設(shè)計(jì)基礎(chǔ)、A-D轉(zhuǎn)換、觸摸屏與LCD程序設(shè)計(jì)_第2頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第9、10章 微處理器S3C2410A定時(shí)計(jì)數(shù)器;Bootloader 設(shè)計(jì)基礎(chǔ)、A-D轉(zhuǎn)換、觸摸屏與LCD程序設(shè)計(jì)_第3頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第9、10章 微處理器S3C2410A定時(shí)計(jì)數(shù)器;Bootloader 設(shè)計(jì)基礎(chǔ)、A-D轉(zhuǎn)換、觸摸屏與LCD程序設(shè)計(jì)_第4頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第9、10章 微處理器S3C2410A定時(shí)計(jì)數(shù)器;Bootloader 設(shè)計(jì)基礎(chǔ)、A-D轉(zhuǎn)換、觸摸屏與LCD程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩156頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1第9章微處理器S3C2410A的定時(shí)/計(jì)數(shù)器定時(shí)器部件在實(shí)時(shí)控制系統(tǒng)中起著舉足輕重的作用,它可以實(shí)現(xiàn)對(duì)設(shè)備的周期性控制,同時(shí)使用定時(shí)器的PWM輸出功能可以實(shí)現(xiàn)設(shè)備功率的控制,用于恒溫控制系統(tǒng)等。S3C2410A芯片中的定時(shí)部件有多個(gè),不同的定時(shí)部件有不同的用途??撮T狗定時(shí)器(WATCHDOG)主要用來(lái)防止處理器的死機(jī),需要在看門狗定時(shí)器規(guī)定的時(shí)間內(nèi)喂狗,就是重新給看門狗定時(shí)器賦初值,否則時(shí)間到產(chǎn)生溢出復(fù)位信號(hào),使ARM系統(tǒng)復(fù)位而重新啟動(dòng);定時(shí)器(TIMER)主要用于定時(shí)或計(jì)數(shù),還可用于脈寬調(diào)制PWM(PulseWidthModulation)的控制;實(shí)時(shí)時(shí)鐘RTC(RealTimeClock)主要用于為系統(tǒng)提供日歷與實(shí)時(shí)鐘信號(hào)。定時(shí)部件雖然種類較多,但它們的工作原理基本相同。本章主要介紹各自的原理與應(yīng)用。29.1S3C2410A定時(shí)/計(jì)數(shù)器原理定時(shí)器或計(jì)數(shù)器的邏輯電路是相同的,它們的主要區(qū)別在用途上。在應(yīng)用時(shí),定時(shí)器的輸入信號(hào)來(lái)自于內(nèi)部,是周期信號(hào),從而通過(guò)計(jì)數(shù)實(shí)現(xiàn)了定時(shí)的功能;而計(jì)數(shù)器的輸入信號(hào)一般來(lái)自于外部,是非周期信號(hào),因而只能實(shí)現(xiàn)計(jì)數(shù)的功能。因此這樣的邏輯電路被稱為定時(shí)/計(jì)數(shù)器。圖9-1是一般定時(shí)/計(jì)數(shù)器內(nèi)部工作原理框圖,它是以一個(gè)N位計(jì)數(shù)器(加1或減1)為核心,計(jì)數(shù)器的初值在編程時(shí)設(shè)置。計(jì)數(shù)器的輸入脈沖分為2類:系統(tǒng)時(shí)鐘和外部事件脈沖。微處理器S3C2410A使用的是具有減法功能的定時(shí)/計(jì)數(shù)器。39.2看門狗定時(shí)器(WATCHDOG)

S3C2410A中看門狗定時(shí)器的作用是,當(dāng)系統(tǒng)程序出現(xiàn)功能錯(cuò)亂,引起系統(tǒng)程序出現(xiàn)死循環(huán)時(shí),是系統(tǒng)重新啟動(dòng)開(kāi)始工作。嵌入式系統(tǒng)由于使用環(huán)境的復(fù)雜,即使用環(huán)境中有較強(qiáng)的干擾信號(hào),或者系統(tǒng)程序本身的不完善,因而不能排除系統(tǒng)程序不會(huì)出現(xiàn)死循環(huán)現(xiàn)象。當(dāng)系統(tǒng)使用看門狗部件時(shí),如果系統(tǒng)出現(xiàn)了死循環(huán),看門狗定時(shí)器將產(chǎn)生一個(gè)具有一定寬度的復(fù)位信號(hào),強(qiáng)迫系統(tǒng)復(fù)位,恢復(fù)系統(tǒng)的正常運(yùn)行??撮T狗定時(shí)器必須在小于定時(shí)的時(shí)間周期內(nèi),對(duì)其重新賦初值(俗稱“喂狗”),使看門狗定時(shí)器不會(huì)產(chǎn)生復(fù)位信號(hào),系統(tǒng)正常運(yùn)行。當(dāng)系統(tǒng)程序出現(xiàn)死循環(huán)時(shí),無(wú)法給看門狗定時(shí)器喂狗或者說(shuō)不能執(zhí)行喂狗函數(shù),將會(huì)產(chǎn)生復(fù)位信號(hào)。49.2.1看門狗定時(shí)器的工作原理

S3C2410A看門狗定時(shí)器有2種工作模式:

①帶中斷請(qǐng)求信號(hào)的常規(guī)時(shí)隙定時(shí)器。

②產(chǎn)生內(nèi)部復(fù)位信號(hào)的定時(shí)器,即當(dāng)定時(shí)器的值為0時(shí),產(chǎn)生一個(gè)寬度為128PCLK(系統(tǒng)時(shí)鐘周期)的復(fù)位脈沖信號(hào)。圖9-2是看門狗定時(shí)器的邏輯功能圖??撮T狗定時(shí)器一旦啟動(dòng)工作,看門狗定時(shí)器的計(jì)數(shù)常數(shù)寄存器(WTDAT)就無(wú)法自動(dòng)地裝載到計(jì)數(shù)寄存器(WTCNT)中。因此應(yīng)該在看門狗定時(shí)器工作之前,通過(guò)初始化編程將計(jì)數(shù)常數(shù)寄存器(WTDAT)的值寫(xiě)入到計(jì)數(shù)寄存器(WTCNT)中。59.2.2看門狗特殊功能控制寄存器

S3C2410A芯片的看門狗定時(shí)器邏輯中有3個(gè)控制其操作的特殊功能寄存器:看門狗控制寄存器(WTCON);計(jì)數(shù)常數(shù)寄存器(WTDAT)和看門狗計(jì)數(shù)寄存器(WTCNT)。它們的屬性如表9-1。寄存器名占用地址讀寫(xiě)屬性描述初值WTCON0x53000000讀/寫(xiě)看門狗控制寄存器0x8021WTDAT0x53000004讀/寫(xiě)看門狗常數(shù)寄存器0x8000WTCNT0x53000008讀/寫(xiě)看門狗計(jì)數(shù)寄存器0x800061.看門狗控制寄存器(WTCON)比特位描述初值[15:8]預(yù)分頻值(PrescalerValue):范圍0~2550x80[7:6]保留,但取值必須為0000[5]看門狗定時(shí)器使能位:1=使能;0=不使能1[4:3]分割因子(Clockselect):00=16;01=32;10=64;11=12800[2]中斷請(qǐng)求使能位:1=允許中斷(看門狗作為一般定時(shí)器使用時(shí));0=不允許中斷0[1]保留位,取值為00[0]看門狗定時(shí)器復(fù)位信號(hào)輸出使能(ResetEnable/Disable):0=禁止看門狗定時(shí)器的復(fù)位功能;1=在看門狗定時(shí)器回0時(shí)復(fù)位信號(hào)有效。172.看門狗常數(shù)寄存器(WTDAT)看門狗常數(shù)寄存器WTDAT(WatchdogTimerDataRegister)用來(lái)存儲(chǔ)看門狗定時(shí)器的溢出時(shí)間間隔常數(shù)值??撮T狗計(jì)數(shù)寄存器從此值開(kāi)始做減法計(jì)數(shù),直到變?yōu)?為時(shí)間間隔。計(jì)數(shù)公式如下:

計(jì)數(shù)常數(shù)=所需時(shí)間間隔/計(jì)數(shù)時(shí)鐘周期T=所需時(shí)間間隔*(PCLK/(預(yù)分頻值+1)/分割因子)WTDAT是可讀寫(xiě)的,地址為0x53000004,復(fù)位初值為0x8000。其位功能如下表所示。比特位描述初值[15:0]看門狗計(jì)數(shù)常數(shù)寄存器值(CountReloadValue)0x800083.看門狗計(jì)數(shù)寄存器(WTCNT)

看門狗計(jì)數(shù)寄存器WTCNT(WatchdogTimerCounterRegister)是一個(gè)實(shí)時(shí)動(dòng)態(tài)變化的減法計(jì)數(shù)器,WTCNT工作時(shí)存儲(chǔ)當(dāng)前計(jì)數(shù)值。WTCNT是可讀寫(xiě)的,地址為0x53000008,復(fù)位后初值為0x8000??撮T狗計(jì)數(shù)寄存器的位功能描述如下表所示。比特位描述初值[15:0]看門狗計(jì)數(shù)器的當(dāng)前值(CountValue)0x800099.2.3看門狗定時(shí)器應(yīng)用示例

1.Bootloader中的看門狗定時(shí)器編程

在系統(tǒng)啟動(dòng)引導(dǎo)的Bootloader程序中,由于這時(shí)ARM系統(tǒng)的部件初始化需要進(jìn)行大量的工作,需要關(guān)閉看門狗定時(shí)器,就是設(shè)置看門狗控制寄存器WTCON的b5=0(看門狗定時(shí)器使能位無(wú)效),b0=0(禁止看門狗定時(shí)器的復(fù)位功能),與其它位無(wú)關(guān),因此控制字可為0x00,而且必須使用匯編語(yǔ)言編寫(xiě)程序。程序代碼如下:WTDOGEQU0x53000000;定義WTCON的地址 LDRR0,=WTCON;WTCON地址送R0 LDRR1,=0x00;控制字0x00送R1

STRR1,[R0]

;控制字寫(xiě)入R02.程序正常運(yùn)行時(shí)的看門狗定時(shí)器編程

看門狗可以實(shí)現(xiàn)ARM系統(tǒng)的復(fù)位,不需要外圍的控制電路。要實(shí)現(xiàn)看門狗的功能,需要對(duì)看門狗的特殊功能寄存器進(jìn)行配置操作。編程流程如下:①看門狗定時(shí)器作為一般定時(shí)器使用時(shí),需要設(shè)置看門狗的中斷操作,因?yàn)檫@是看門狗作為一般定時(shí)器使用時(shí)的唯一用法。除包括ARM系統(tǒng)的各個(gè)中斷寄存器的設(shè)置外,還要看門狗自身中斷使能有效。如果作為ARM系統(tǒng)的看門狗使用,這一步不用設(shè)置。②設(shè)置看門狗控制寄存器WTCON,主要包括預(yù)分頻值、分割因子,看門狗定時(shí)器復(fù)位信號(hào)輸出使能b0=1(在看門狗定時(shí)器回0時(shí)復(fù)位信號(hào)有效)。③在預(yù)估的預(yù)分頻值、分割因子的情況下,計(jì)算看門狗的定時(shí)常數(shù)。只要計(jì)算的結(jié)果不大于WTDAT的數(shù)值范圍即216-1均為有效數(shù)據(jù)。將定時(shí)常數(shù)賦給WTDAT寄存器和WTCNT寄存器。④啟動(dòng)看門狗定時(shí)器。使看門狗定時(shí)器使能位b5=1(使能有效電平信號(hào))。1011應(yīng)用實(shí)例使用看門狗功能時(shí),必須事先進(jìn)行初始化。初始化的主要工作就是設(shè)置WTCON寄存器和WTDAT寄存器。例如,實(shí)現(xiàn)S3C2410A芯片的看門狗功能,監(jiān)測(cè)系統(tǒng)的周期不大于40us,PCKL=50Mhz。首先計(jì)算賦給WTDAT寄存器的初值。初值=40us*(PCKL/(預(yù)分頻值+1)/分割系數(shù))注意:這里PCKL的單位是赫茲,預(yù)分頻值和分割系數(shù)必須事先有一個(gè)固定的值。本例中預(yù)分頻值=0,分割系數(shù)=16,即設(shè)置WTCON的值為0x0021,允許看門狗定時(shí)器工作,允許看門狗復(fù)位信號(hào)有效。初值計(jì)算過(guò)程如下:初值=40*10-6*(50*106/(0+1)/16)=125=0x7d

程序代碼如下:12匯編語(yǔ)言代碼段WTCONEQU0x53000000WTDATEQU0x53000004 AREAWatchdog_Ini,CODE,READONLY ENTRY CODE32ldrr0,=WTDAT;將WTDAT寄存器地址值賦給r0ldrr1,=0x7d;將計(jì)數(shù)器初值0x7d賦給r1strr1,[r0];將r1的內(nèi)容寫(xiě)到以r0內(nèi)容為地址的單元中

ldrr0,=WTCON;將WTCON寄存器地址值賦給r0ldrr1,=0x0021/*設(shè)啟動(dòng)看門狗??撮T狗復(fù)位使能、看門狗使能*/strr1,[r0]END C語(yǔ)言代碼段#definerWTCON=(*(volatileunsignedchar*)0x53000000)#definerWTDAT=(*(volatileunsignedchar*)0x53000004)#definerWTCNT=(*(volatileunsignedchar*)0x53000008)voidwatchdog40(void){rWTCON=(rWTCON&0x0000)|(1<<8)|(1<<3);/*設(shè)置預(yù)分頻值、分割因子*/rWTDAT=0x7d;rWTCNT=0x7d;rWTCON=rWTCON|(1<<5)|(1<<0);/*設(shè)啟動(dòng)看門狗??撮T狗復(fù)位使能、看門狗使能*/}13149.3具有脈寬調(diào)制(PWM)的定時(shí)器(TIMER)Timer部件主要用于提供定時(shí)功能,脈寬調(diào)制(PWM)功能,它的應(yīng)用比較靈活,對(duì)于需要一定頻率的脈沖信號(hào),一定時(shí)間間隔定時(shí)信號(hào)的應(yīng)用場(chǎng)合,都能提供支持。9.3.1定時(shí)器Timer概述

S3C2410A芯片中有5個(gè)16位的Timer部件,其中Timer0~Timer3具有PWM功能,Timer4僅用于定時(shí),不具有PWM功能,它沒(méi)有輸出引腳。Timer0是一個(gè)同時(shí)具有死區(qū)(dead-zone)發(fā)生器,通常用于控制大電流設(shè)備。15

9.3.2TIMER部件的操作每個(gè)定時(shí)/計(jì)數(shù)器都是16位的減法計(jì)數(shù)器,是通過(guò)定時(shí)器自己的時(shí)鐘驅(qū)動(dòng)的。當(dāng)計(jì)數(shù)器減到0時(shí),可產(chǎn)生定時(shí)器中斷請(qǐng)求信號(hào),通知CPU定時(shí)器的操作已經(jīng)完成了。此時(shí)定時(shí)/計(jì)數(shù)緩沖寄存器TCNTBn(TimerCounterBufferRegistern)的值將自動(dòng)裝載到遞減計(jì)數(shù)器,開(kāi)始下一輪的操作。但是,若定時(shí)器停止工作,則TCNTBn的值將不會(huì)重新裝載到計(jì)數(shù)器中。定時(shí)器比較緩沖寄存器TCMPBn(TimerCompareBufferRegistern)的值用于脈寬調(diào)制。當(dāng)計(jì)數(shù)器的值與比較寄存器的值相同時(shí),定時(shí)器的邏輯將改變輸出電平。因此TCMPBn確定脈寬調(diào)制信號(hào)輸出的上升時(shí)間(或下降時(shí)間)。每個(gè)定時(shí)器(TIMER4除外)均含有TCNTBn,TCNTn,TCMPBn和TCMPn四種計(jì)數(shù)緩沖寄存器,其中定時(shí)器計(jì)數(shù)寄存器TCNTn(TimerCounterRegistern)和定時(shí)器比較寄存器TCMPn(TimerCompareRegistern)是內(nèi)部寄存器(編程不可見(jiàn)),內(nèi)部寄存器TCNTn的值可以通過(guò)計(jì)數(shù)觀察寄存器讀取。16179.3.2TIMER部件操作(續(xù))

每個(gè)定時(shí)器讀時(shí)都是16位的減法計(jì)數(shù)器,是通過(guò)定時(shí)器自己的時(shí)鐘驅(qū)動(dòng)的。當(dāng)計(jì)數(shù)器減到0時(shí),可產(chǎn)生定時(shí)器中斷請(qǐng)求信號(hào),通知CPU定時(shí)器的操作已經(jīng)完成了。此時(shí)TCNTBn的值將自動(dòng)裝載到遞減計(jì)數(shù)器,開(kāi)始下一輪的操作。但是,若定時(shí)器停止工作,則TCNTBn的值將不會(huì)重新裝載到計(jì)數(shù)器中。

TCMPBn的值用于脈寬調(diào)制。當(dāng)計(jì)數(shù)器的值與比較寄存器的值相同時(shí),定時(shí)器的邏輯將改變輸出電平。因此TCMPBn確定脈寬調(diào)制信號(hào)輸出的上升時(shí)間(或下降時(shí)間)。每個(gè)定時(shí)器(TIMER4除外)均含有TCNTBn,TCNTn,TCMPBn和TCMPn四種計(jì)數(shù)緩沖寄存器,其中TCNTn和TCMPn是內(nèi)部寄存器(編程不可見(jiàn)),內(nèi)部寄存器TCNTn的值可以通過(guò)計(jì)數(shù)觀察寄存器讀取。181.自動(dòng)重載和雙緩沖器S3C2410A處理器的定時(shí)器具有雙緩沖功能,即在不停止當(dāng)前定時(shí)器運(yùn)行的情況下,重載下次定時(shí)器運(yùn)行周期(或頻率)的參數(shù)、PWM波形的占空比。主要是指向TCNTBn,TCMPBn寄存器賦值。裝載新值之后,在按原參數(shù)運(yùn)行完前周期后,在下一個(gè)新的周期,按新的設(shè)置參數(shù)運(yùn)行。當(dāng)內(nèi)部寄存器TCNTn的值減到0時(shí)將自動(dòng)裝載TCNTBn的值到TCNTn中,并可重新開(kāi)始進(jìn)行減法計(jì)數(shù),前提條件是自動(dòng)重載允許。如果TCNTn=0,但自動(dòng)重載禁止,則定時(shí)器停止運(yùn)行。19雙緩沖功能編程圖例當(dāng)內(nèi)部寄存器TCNTn的值減到0時(shí)將自動(dòng)裝載TCNTBn的值到TCNTn中,并可重新開(kāi)始進(jìn)行減法計(jì)數(shù),前提條件是自動(dòng)裝載功能允許。如果TCNTn=0,但自動(dòng)裝載禁止,則定時(shí)器停止運(yùn)行。2.復(fù)雜的定時(shí)器設(shè)置示例定時(shí)器初始化時(shí),使用手動(dòng)裝載位和反轉(zhuǎn)位。因?yàn)槎〞r(shí)器的自動(dòng)操作發(fā)生在減法計(jì)數(shù)器為0和TCNTBn沒(méi)有預(yù)先賦值時(shí)。在這種情況下必須使用手動(dòng)裝載功能給TCNTBn賦初值。開(kāi)啟一個(gè)定時(shí)器的操作如下:①向TCNTBn和TCMPBn中寫(xiě)入初值;②定時(shí)器控制寄存器TCON(TimerControlRegister)相關(guān)的手動(dòng)裝載位置1,不管是否需要反轉(zhuǎn)位功能,都將反轉(zhuǎn)位的開(kāi)關(guān)打開(kāi);③設(shè)置定時(shí)器控制寄存器TCON的相關(guān)啟動(dòng)位,同時(shí)清除其手動(dòng)裝載位;④如果定時(shí)器被強(qiáng)行關(guān)閉,TCNTn就保持原有的計(jì)數(shù)值,且不從TCNTBn重新自動(dòng)裝載計(jì)數(shù)值。如果必須重新設(shè)置新值,則必須使用手動(dòng)裝載。定時(shí)器的操作示例如下,以圖9-5進(jìn)行敘述。201)允許自動(dòng)裝載功能,給TCNTBn和TCMPBn賦值,這里控制TOUTn周期的TCNTBn=250,控制高電平持續(xù)時(shí)間的TCMPBn=150;使能手動(dòng)裝載功能,TCNTBn和TCMPBn的值將被復(fù)制到TCNTn和TCMPn寄存器中;最后設(shè)置在TCNTBn和TCMPBn的值分別為300和100,作為下一個(gè)周期定時(shí)器的工作參數(shù)。2)設(shè)置相應(yīng)定時(shí)器的啟動(dòng)位為1,清除手動(dòng)裝載控制位為0,關(guān)閉反轉(zhuǎn)開(kāi)關(guān),自動(dòng)裝載開(kāi)始,定時(shí)器按照第一個(gè)設(shè)定的參數(shù)運(yùn)行工作。3)當(dāng)TCNTn的值等于TCMPBn的值時(shí),TOUTn從低電平跳變到高電平。4)當(dāng)TCNTn的值等于0時(shí),定時(shí)器產(chǎn)生中斷請(qǐng)求,同時(shí)TCNTBn=300和TCMPBn=100的值自動(dòng)裝載到TCNTn和TCMPn中,定時(shí)器使用這個(gè)參數(shù)將進(jìn)行下一個(gè)周期的工作。5)在響應(yīng)4)的中斷服務(wù)程序中,對(duì)TCNTBn和TCMPBn重新賦值,這里分別是130和80,用于下一個(gè)周期的工作參數(shù)。6)當(dāng)TCNTn的值等于TCMPBn的值時(shí),TOUTn又從低電平跳變到高電平。7)重復(fù)4)的操作。8)在這個(gè)中斷服務(wù)程序中,相應(yīng)定時(shí)器的中斷請(qǐng)求和自動(dòng)裝載功能被禁止,定時(shí)器將使用最后一個(gè)給定的參數(shù)工作完后,終止工作。9)同3)完成的操作相同。10)當(dāng)TCNTn的值等于0時(shí),由于自動(dòng)裝載被禁止,因此TCNTn將不再裝載計(jì)數(shù)值,定時(shí)器停止工作。11)不再產(chǎn)生中斷請(qǐng)求,工作過(guò)程徹底結(jié)束。21223.脈寬調(diào)制(PWM)

PWM的頻率由TCNTBn的值來(lái)確定,PWM的每個(gè)周期中高電平(或低電平)的持續(xù)時(shí)間由TCMPBn的值來(lái)確定。如果TCON中某定時(shí)器的輸出反轉(zhuǎn)位置0(不反轉(zhuǎn)),若要得到較高的PWM脈寬輸出值(高電平持續(xù)時(shí)間),則需要增加TCMPBn的值;若要得到較低的PWM脈寬輸出值,則需要減小TCMPBn的值。

如果TCON中某定時(shí)器的輸出反轉(zhuǎn)位置1(反轉(zhuǎn)器被使能),若要得到較高的PWM脈寬輸出值(高電平持續(xù)時(shí)間),則需要減小TCMPBn的值;若要得到較低的PWM脈寬輸出值,則需要增加TCMPBn的值?;陔p緩沖器的功能,下一周期TCMPBn的值,可以在中斷服務(wù)程序中,并且在當(dāng)前的PWM周期內(nèi)的任何時(shí)刻寫(xiě)入。23脈寬調(diào)制(PWM)設(shè)置圖例

圖中上面的波形是減法計(jì)數(shù)器的計(jì)數(shù)過(guò)程示意圖,為畫(huà)圖方便,使用(216-計(jì)數(shù)器值)。兩條橫線代表TCMPB的取值,取值為(TCNTBn-TCMPBn)。圖例是在反轉(zhuǎn)器關(guān)閉的情況下繪制的。244.輸出電平控制輸出電平控制是通過(guò)定時(shí)器TCON中的輸出反轉(zhuǎn)位控制的。包括定時(shí)器輸出TOUTn的初值及工作過(guò)程的波形。在定時(shí)器的反轉(zhuǎn)器開(kāi)關(guān)關(guān)閉(即反轉(zhuǎn)位置0),可以控制TOUTn電平的高或低,方法如下。①關(guān)閉TCON自動(dòng)重載位之后,TOUTn變?yōu)楦唠娖?,并且定時(shí)器在TCNTn=0時(shí)停止;②通過(guò)對(duì)定時(shí)器的啟動(dòng)/停止位清0停止定時(shí)器工作。如果TCNTn不大于TCMPn,TOUTn輸出高電平;如果TCNTn大于TCMPn,TOUTn輸出低電平;③通過(guò)對(duì)TCON中的輸出反轉(zhuǎn)位置1控制TOUTn輸出反相。開(kāi)關(guān)。反轉(zhuǎn)位開(kāi)關(guān)控制TOUTn的波形如下。25定時(shí)器反轉(zhuǎn)位控制TOUTn圖例圖例如下:265.死區(qū)(DZDeadZone)發(fā)生器死區(qū)DZ(DeadZone)是當(dāng)定時(shí)器用于PWM,為大電流控制設(shè)備提供電能的時(shí)候,需要使用死區(qū)功能。這個(gè)功能允許在一個(gè)設(shè)備關(guān)閉和另一個(gè)設(shè)備開(kāi)啟之間插入一個(gè)時(shí)間間隔,可防止兩個(gè)設(shè)備同時(shí)動(dòng)作對(duì)電網(wǎng)及現(xiàn)場(chǎng)環(huán)境造成較大的危害。TOUT0是T0的PWM輸出,nTOUT0是TOUT0的反相輸出。如果允許死區(qū)功能,TOUT0和nTOUT0的輸出波形就變?yōu)門OUT0_DZ和nTOUT0_DZ,nTOUT0_DZ在TOUT1引腳輸出。定時(shí)器的死區(qū)功能使得TOUT0_DZ和nTOUT0_DZ不會(huì)同時(shí)發(fā)生變化。死區(qū)功能的波形圖9-8所示。27死區(qū)功能允許波形圖死區(qū)允許波形圖即在原波形圖上將上升沿延遲一個(gè)死區(qū)間隔時(shí)間,而其下降沿的時(shí)間與原波形圖相同。6.DMA請(qǐng)求模式與中斷

配置寄存器TCFG1中的DMA模式位可以用來(lái)控制定時(shí)器n產(chǎn)生DMA請(qǐng)求或中斷使能,一個(gè)定時(shí)器只能在DMA方式或中斷方式中選擇其一,且最多只有一個(gè)定時(shí)器可以設(shè)置為DMA方式?,F(xiàn)將TCFG1中的DMA方式位[23:20]設(shè)置如表9-5所示:28表9-5DMA模式字對(duì)應(yīng)表29DMA模式字DMA請(qǐng)求T0中斷T1中斷T2中斷T4中斷T4中斷0000未選擇允許允許允許允許允許0001定時(shí)器T0關(guān)閉允許允許允許允許0010定時(shí)器T1允許關(guān)閉允許允許允許0011定時(shí)器T2允許允許關(guān)閉允許允許0100定時(shí)器T3允許允許允許關(guān)閉允許0101定時(shí)器T4允許允許允許允許關(guān)閉309.3.3TIMER部件內(nèi)部功能寄存器控制TIMER控件的操作,需要編程設(shè)置TIMER內(nèi)部的許多功能寄存器。主要有:

●定時(shí)器配置寄存器0(TCFG0);

●定時(shí)器配置寄存器1(TCFG1);

●定時(shí)器控制寄存器(TCON);

●TIMER0計(jì)數(shù)緩沖寄存器和比較緩沖寄存器(TCNTB0/TCMPB0);

●TIMER0計(jì)數(shù)觀察寄存器(TCNTO0)。以下分別予以介紹。表9-6定時(shí)器主要功能寄存器屬性表31寄存器名占用地址讀寫(xiě)屬性描述初值TCFG00x51000000讀/寫(xiě)配置預(yù)分頻值0、預(yù)分頻值1和死區(qū)長(zhǎng)度0x00TCFG10x51000004讀/寫(xiě)配置Timer0~Timer4的分割系數(shù)0x00TCON0x51000008讀/寫(xiě)設(shè)置各定時(shí)器的自動(dòng)裝載、手動(dòng)裝載,啟動(dòng)/停止操作,反轉(zhuǎn)輸出等0x00TCNTBn0x510000××讀/寫(xiě)設(shè)置各定時(shí)器的輸出周期0x00TCMPBn0x510000××讀/寫(xiě)正常輸出,控制PWM輸出高電平持續(xù)時(shí)間0x00TCNTOn0x510000××只讀當(dāng)需要觀察當(dāng)前的定時(shí)器數(shù)值時(shí)使用0x00注意:表中的××,對(duì)于不同的定時(shí)器取不同的數(shù)值,排列從定時(shí)器0開(kāi)始到定時(shí)器3結(jié)束,按TCNTBn、TCMPBn、TCNTOn次序取值是0x0C、0x10、0x14、0x18…0x30、0x34、0x38。說(shuō)明數(shù)值序列是等差數(shù)列,等差為4。由于定時(shí)器4沒(méi)有PWM功能輸出,所以沒(méi)有TCMPB4,它的TCNTB4、TCNTO4最后2位取值是0x3C和0x40。321)

定時(shí)器配置寄存器0(TCFG0)TCFG0是可讀寫(xiě)的,主要用來(lái)設(shè)置預(yù)分頻系數(shù)的。其地址為0x51000000,復(fù)位初值是0x0。具體位定義如下:位描述初值[31:24]保留0x00[23:16]死區(qū)長(zhǎng)度控制。死區(qū)長(zhǎng)度的1個(gè)單位等于Timer0的定時(shí)間隔(dead-zonelength)0x00[15:8]Timer2-Timer4預(yù)分頻值設(shè)置(Prescaler1)0x00[7:0]Timer0、Timer1預(yù)分頻值設(shè)置(Prescaler0)0x00332)

定時(shí)器配置寄存器1(TCFG1)TCFG1是可讀寫(xiě)的,主要用來(lái)設(shè)置分割器值。其地址為0x51000004,復(fù)位初值是0x0。具體位定義如下:位描述初值[31:24]保留0x00[23:20]選擇DMA請(qǐng)求的定時(shí)器: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)合作用

通過(guò)TCFG0和TCFG1的設(shè)置,可以確定各定時(shí)器預(yù)分頻系數(shù)和分割器的值,最后通過(guò)以下公式計(jì)算定時(shí)器的輸入時(shí)鐘頻率。

定時(shí)器輸入時(shí)鐘頻率=PCLK/(預(yù)分頻值+1)/分割器值預(yù)分頻器系數(shù)范圍=0~255

分割器取值域={2,4,8,16}363.定時(shí)器控制寄存器(TCON)

定時(shí)器控制寄存器是可讀寫(xiě)的,地址是0x51000008,復(fù)位初值是0x0。具體位定義如下表。位功能初值[22]Timer4自動(dòng)裝載控制位:1=自動(dòng)裝載;0=否0[21]Timer4手動(dòng)更新控制位:1=更新TCNTB4;0=否0[20]Timer4啟動(dòng)/停止控制位:1=啟動(dòng);0=不操作0[19]Timer3自動(dòng)裝載控制位:1=自動(dòng)裝載;0=否0[18]Timer3輸出反轉(zhuǎn)位:1=TOUT3反轉(zhuǎn);0=不反轉(zhuǎn)0[17]Timer3手動(dòng)更新控制位:1=更新TCNTB3和TCMPB3;0=不操作0[16]Timer3啟動(dòng)/停止控制位:1=啟動(dòng);0=不操作037定時(shí)器控制寄存器(TCON)位定義(續(xù))位功能初值[15:8]Timer2與Timer1定時(shí)器控制位,各使用4bit。Timer2使用b15-b12,Timer1使用b11-b8。控制位的次序和功能與Timer3控制位的b19-b16相同。0[7:5]保留000[4]死區(qū)使能操作控制位:1=使能;0=否0[3]Timer0自動(dòng)裝載控制位:1=自動(dòng)裝載;0=否0[2]Timer0輸出反轉(zhuǎn)位:1=TOUT3反轉(zhuǎn);0=不反轉(zhuǎn)0[1]Timer0手動(dòng)更新控制位:1=更新TCNTB0和TCMPB0;0=不操作0[0]Timer0啟動(dòng)/停止控制位:1=啟動(dòng);0=不操作0384.TIMERn的三個(gè)計(jì)數(shù)寄存器TIMERn定時(shí)器的三個(gè)計(jì)數(shù)寄存器:有緩沖寄存器(TCNTBn)是可讀寫(xiě)的;比較緩沖寄存器(TCMPBn)也是可讀寫(xiě)的;和計(jì)數(shù)觀察寄存器(TCNTOn),它是只讀的。這里n=0~4,即指TIMER0~TIMER4。具體定義格式如下表。位描述初值TCNTBn[15:0]存放TIMERn計(jì)數(shù)寄存器初值0x0TCMPBn[15:0]存放TIMERn比較寄存器初值0x0TCNTOn[15:0]存放TIMERn的當(dāng)前計(jì)數(shù)值0x0394.TIMERn三個(gè)計(jì)數(shù)寄存器(續(xù))從TIMER0-TIMER4它們的三個(gè)計(jì)數(shù)寄存器有相同的格式位定義,但是TIMER4沒(méi)有比較計(jì)數(shù)寄存器。它們分別占用不同的物理地址,具體如下表。地址為。地址為。Timer0的它們的復(fù)位初值均為0x0。TCNTBTCMPTCNTOTIMER00x5100000c0x510000100x51000014TIMER10x510000180x5100001c0x51000020TIMER20x510000240x510000280x5100002cTIMER30x510000300x510000340x51000038TIMER40x5100003c-0x510000409.3.4定時(shí)器Timer應(yīng)用示例

定時(shí)器的應(yīng)用非常廣泛,也很靈活,不同的應(yīng)用需求,將決定定時(shí)器使用不同的編程方式。可歸結(jié)為以下幾種:

●一種是作為定時(shí)器使用,需要根據(jù)定時(shí)時(shí)間和ARM系統(tǒng)提供的PCLK時(shí)鐘,配置預(yù)分頻值,分割器值計(jì)算數(shù)據(jù)緩沖寄存器的值等;

●二種是作為計(jì)數(shù)器使用,分割器的值選TCLK0或TCLK1,將計(jì)數(shù)的初值賦給數(shù)據(jù)緩沖寄存器等,啟動(dòng)定時(shí)/計(jì)數(shù)器即可;

●三種是作為周期脈沖信號(hào)的輸出,即PWM輸出,這時(shí)除需要一種的工作外,還要設(shè)置比較緩沖寄存器的數(shù)值,以決定在反轉(zhuǎn)位=0時(shí)高電平的持續(xù)時(shí)間或反轉(zhuǎn)位=1時(shí)低電平的持續(xù)時(shí)間。這一功能也可以用于恒溫控制系統(tǒng)的功率調(diào)節(jié)(在一個(gè)周期內(nèi)高電平的持續(xù)時(shí)間越長(zhǎng),直流分量越大,對(duì)應(yīng)的平均功率越大),必要時(shí)可以使用死區(qū)這一功能。401.定時(shí)器的程序設(shè)計(jì)流程

1)設(shè)置配置寄存器0。內(nèi)容是設(shè)置預(yù)分頻器0或預(yù)分頻器1的值,以及Timer0的死區(qū)寬度。2)設(shè)置配置寄存器1。內(nèi)容是各個(gè)定時(shí)器的分割器值,DMA方式或中斷方式。3)根據(jù)前2項(xiàng)的設(shè)置、PCLK的時(shí)鐘,以及實(shí)際需要,計(jì)算計(jì)數(shù)緩沖寄存器TCNTBn和TCMPBn的初值并賦之。

4)設(shè)置定時(shí)器控制寄存器TCON。計(jì)數(shù)初值自動(dòng)裝載、手動(dòng)裝載位=1、設(shè)置反轉(zhuǎn)位=1等。

5)重新設(shè)置定時(shí)器控制寄存器TCON。清除手動(dòng)裝載位、設(shè)置反轉(zhuǎn)位=0,啟動(dòng)定時(shí)器。41422.應(yīng)用實(shí)例實(shí)例需要產(chǎn)生一個(gè)500ms的PWM脈沖周期信號(hào),高電平的持續(xù)時(shí)間占40%,系統(tǒng)的PCLK為66MHz。選用定時(shí)器TIMER0,要求從ARM的引腳TOUT0輸出。編程敘述如下。1)根據(jù)需要的脈沖信號(hào)周期500ms及系統(tǒng)PCLK=66MHz,確定預(yù)分頻系數(shù)和分割器值,并計(jì)算計(jì)數(shù)緩沖寄存器初值。本例預(yù)分頻值取31,分割器值取16,則計(jì)數(shù)緩沖寄存器的初值計(jì)算如下:

初值=定時(shí)間隔/(1/(PCLK/(預(yù)分頻系數(shù)+1)/分割器值))=500ms*(66MHz/32/16)=500*10-3*(66*106/32/16)=64453=0xfbc5

比較緩沖寄存器的初值=64453×40%=0x64b5432)編寫(xiě)定時(shí)器程序:先設(shè)置TCFG0、TCFG1寄存器,再設(shè)置TCNTB0寄存器,最后設(shè)置TCON寄存器啟動(dòng)定時(shí)器工作。3)編寫(xiě)程序#definerTCFG0(*(volitaleunsigned*)0x51000000/*定義定時(shí)器配置寄存器0地址*/#definerTCFG1(*(volitaleunsigned*)0x51000004/*定義定時(shí)器配置寄存器1地址*/#definerTCON(*(volitaleunsigned*)0x51000008

/*定義定時(shí)器控制寄存器地址*/#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預(yù)分頻系數(shù)31*/rTCFG1=(rTCFG1&0x00)|(3<<0);/*均工作在中斷方式,分割系數(shù)16*/rTCNTB0=0xfbc5;rTCMPB0=0x64b5;rTCON=rTCON|(1<<2)|(1<<1);

/*反轉(zhuǎn)位置1,手動(dòng)裝載TCNTB0和TCMPB0*/rTCON=rTCON&(~(1<<2))&(~(1<<1))|(1<<3)|(1<0);/*手動(dòng)裝載清0,自動(dòng)裝載置1,并啟動(dòng)*/}44459.4實(shí)時(shí)時(shí)鐘(RTC)S3C2410A提供RTC(RealTimeClock)實(shí)時(shí)時(shí)鐘單元,在系統(tǒng)掉電后由后備電池供電繼續(xù)工作。RTC是用于提供年、月、日、時(shí)、分、秒、星期等實(shí)時(shí)時(shí)間信息的定時(shí)部件。它由外部時(shí)鐘驅(qū)動(dòng)工作,時(shí)鐘頻率為32.768khz。

以下主要介紹它的工作原理、功能控制寄存器和編程方法。46479.4.1RTC概述

RTC部件可以將提供實(shí)時(shí)信息的8位數(shù)據(jù)以BCD碼的格式輸出,同時(shí)還具有各種報(bào)警功能。其主要特點(diǎn)有:

1.年、月、日、時(shí)、分、秒、星期等實(shí)時(shí)時(shí)間信息采用BCD碼表示;

2.閏年發(fā)生器;

3.具有報(bào)警功能,提供報(bào)警中斷或者系統(tǒng)在節(jié)電模式下的喚醒;

4.擁有獨(dú)立的電源引腳(RTCVDD);

5.支持RTOS內(nèi)核時(shí)間片所需的毫秒計(jì)時(shí)中斷;

6.進(jìn)位復(fù)位功能。489.4.1RTC概述(續(xù)1)RTC部件提供專門的電源引腳可以由備用電源供電。當(dāng)系統(tǒng)電源關(guān)閉時(shí),微處理器接口和RTC邏輯電路均是斷開(kāi)的,后備電池僅驅(qū)動(dòng)RTC部件的振蕩器和BCD碼計(jì)數(shù)器,以使功耗降到最低。在節(jié)電模式或正常運(yùn)行模式下,RTC可以在特定的時(shí)候觸發(fā)蜂鳴器。在正常運(yùn)行模式下,激活的是報(bào)警中斷信號(hào)(ARMINT)。在節(jié)電模式下,激活的是電源管理器部件的喚醒信號(hào)(PMWKUP)并同時(shí)激活報(bào)警中斷信號(hào)(ARMINT)。RTC內(nèi)部的報(bào)警寄存器(RTCALM)可以設(shè)置報(bào)警工作狀態(tài)的使能/不使能以及報(bào)警時(shí)間的條件。499.4.1RTC概述(續(xù)2)RTC的時(shí)間片計(jì)時(shí)器用于產(chǎn)生一個(gè)中斷請(qǐng)求,TICNT寄存器有一個(gè)中斷使能位,和計(jì)數(shù)器中的值一起用來(lái)控制中斷。當(dāng)計(jì)數(shù)器的值變?yōu)?時(shí),引起時(shí)間片計(jì)時(shí)中斷。中斷信號(hào)的周期計(jì)算如下:

周期s=(n+1)/128

其中n是時(shí)間片計(jì)數(shù)器中的值,范圍在0-127之間。RTC的時(shí)間片計(jì)時(shí)器可以用來(lái)產(chǎn)生實(shí)時(shí)操作系統(tǒng)內(nèi)核所需的時(shí)間片。進(jìn)位復(fù)位功能可以由RTC的進(jìn)位復(fù)位寄存器(RTCRST)來(lái)控制。秒的進(jìn)位周期可以進(jìn)行選擇(30、40、50),在進(jìn)位復(fù)位發(fā)生后,秒的數(shù)值又循回到0。例如當(dāng)前時(shí)間是23:37:47,進(jìn)位周期選為40秒,則當(dāng)前時(shí)間將變?yōu)?3:38:00。509.4.2實(shí)時(shí)時(shí)鐘RTC控制寄存器RTC的內(nèi)部有許多用于控制操作的寄存器。通過(guò)程序?qū)@些寄存器進(jìn)行設(shè)置,用戶就可控制RTC部件的工作。以下介紹這些寄存器的功能及位定義。511.RTC控制寄存器(RTCCON)RTC控制寄存器(RTCCON)是可讀/寫(xiě)的,地址為0x57000040,初值是0x0。該寄存器僅使用4位,RTCEN控制BCD碼寄存器的讀寫(xiě)使能,同時(shí)控制微處理器和RTC間的所有接口的使能。因此,在系統(tǒng)復(fù)位后需要對(duì)RTC進(jìn)行操作時(shí),RTCEN=1。而在其它時(shí)間,RTCEN應(yīng)清0,以防數(shù)據(jù)無(wú)意地寫(xiě)入到RTC的寄存器中。52RTC控制寄存器RTCCON的位定義位描述初值[3]RTC時(shí)鐘計(jì)數(shù)器復(fù)位使能(RTCRST):0=不復(fù)位;1=復(fù)位0[2]BCD碼選擇位(CNTSEL):0=合并BCD碼;1=保留0[1]BCD碼時(shí)鐘選擇位(CLKSEL):0=2-16XTAL;1=保留0[0]RTC使能位(RTCEN):0=不使能;1=使能0532.時(shí)間片計(jì)數(shù)器(TICNT)計(jì)數(shù)器TICNT是可/讀寫(xiě)的,地址為0x57000044,初值為0x0。具體格式定義如下表。位描述初值[7]時(shí)間片計(jì)數(shù)器中斷使能(TICNTINTENABLE):1=使能;0=不使能0[6:0]時(shí)間片計(jì)數(shù)器的值(TICKTIMECOUNT)0x0543.報(bào)警控制寄存器(RTCALM)報(bào)警控制寄存器(RTCALM)是可讀/寫(xiě)的,地址為0x57000050,初值是0x0。RTCALM的組成格式如下所示。注意:在節(jié)電模式下,RTCALM寄存器通過(guò)ALMINT和PMWKUP來(lái)產(chǎn)生報(bào)警信號(hào);而在正常操作模式下,只通過(guò)ALMINT產(chǎn)生報(bào)警信號(hào)。位描述初值[6]全局報(bào)警使能位ALMEN:1=使能;0=不使能0[5]年報(bào)警使能位YEAREN:1=使能;0=不使能0[4]月報(bào)警使能位ALMEN:1=使能;0=不使能0[3]日?qǐng)?bào)警使能位ALMEN:1=使能;0=不使能0[2]時(shí)報(bào)警使能位ALMEN:1=使能;0=不使能0[1]分報(bào)警使能位ALMEN:1=使能;0=不使能0[0]秒報(bào)警使能位ALMEN:1=使能;0=不使能0554.報(bào)警秒數(shù)據(jù)寄存器(ALMSEC)寄存器ALMSEC是可/讀寫(xiě)的,地址為0x57000054,初值為0x0。具體格式定義如下表。位描述初值[6:4]報(bào)警定時(shí)器秒數(shù)據(jù)十位BCD碼值),范圍0~5。0[3:0]報(bào)警定時(shí)器秒數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。0565.報(bào)警分?jǐn)?shù)據(jù)寄存器(ALMMIN)寄存器ALMMIN是可/讀寫(xiě)的,地址為0x57000058,初值為0x0。具體格式定義如下表。位描述初值[6:4]報(bào)警定時(shí)器分?jǐn)?shù)據(jù)十位BCD碼值,范圍0~5。0[3:0]報(bào)警定時(shí)器分?jǐn)?shù)據(jù)個(gè)位BCD碼值,范圍0~9。0576.報(bào)警時(shí)數(shù)據(jù)寄存器(ALMHOUR)寄存器ALMHOUR是可/讀寫(xiě)的,地址為0x5700005C,初值為0x0。具體格式定義如下表。位描述初值[5:4]報(bào)警定時(shí)器時(shí)數(shù)據(jù)十位BCD碼值,范圍0~2。0[3:0]報(bào)警定時(shí)器時(shí)數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。0587.報(bào)警日數(shù)據(jù)寄存器(ALMDATE)寄存器ALMDATE是可/讀寫(xiě)的,地址為0x57000060,初值為0x01。具體格式定義如下表。位描述初值[5:4]報(bào)警定時(shí)器日數(shù)據(jù)十位BCD碼值,范圍0~3。0[3:0]報(bào)警定時(shí)器日數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。0598.報(bào)警月數(shù)據(jù)寄存器(ALMMON)寄存器ALMMON是可/讀寫(xiě)的,地址為0x57000064,初值為0x01。具體格式定義如下表。位描述初值[4]報(bào)警定時(shí)器月數(shù)據(jù)十位BCD碼值,范圍0~1。0[3:0]報(bào)警定時(shí)器月數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。0609.報(bào)警年數(shù)據(jù)寄存器(ALMYEAR)寄存器ALMYEAR是可/讀寫(xiě)的,地址為0x57000068,初值為0x0。具體格式定義如下表。位描述初值[7:0]報(bào)警定時(shí)器年數(shù)據(jù)BCD碼值,范圍0~99。06110.循環(huán)復(fù)位寄存器(RTCRST)寄存器RTCRST是可/讀寫(xiě)的,地址為0x5700006C,初值為0x0。具體格式定義如下表。位描述初值[3]循環(huán)復(fù)位使能位(SRSTEN):1=使能;0=不使能0[2:0]秒循環(huán)進(jìn)位周期:010=超過(guò)30s;100=超過(guò)40s;101=超過(guò)50s;其它組合不會(huì)發(fā)生進(jìn)位,但是秒值可以復(fù)位。06211.秒數(shù)據(jù)寄存器(BCDSEC)寄存器BCDSEC是可/讀寫(xiě)的,用來(lái)存儲(chǔ)當(dāng)前時(shí)間的秒數(shù)據(jù),即合并的BCD碼格式。地址為0x57000070,初值不定。具體格式定義如下表。位描述初值[6:4]秒數(shù)據(jù)十位BCD碼值,范圍0~5。0[3:0]秒數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。06312.分?jǐn)?shù)據(jù)寄存器(BCDMIN)寄存器BCDMIN是可/讀寫(xiě)的,用來(lái)存儲(chǔ)當(dāng)前時(shí)間的分?jǐn)?shù)據(jù),即合并的BCD碼格式。地址為0x57000074,初值不定。具體格式定義如下表。位描述初值[6:4]分?jǐn)?shù)據(jù)十位BCD碼值,范圍0~5。0[3:0]分?jǐn)?shù)據(jù)個(gè)位BCD碼值,范圍0~9。06413.時(shí)數(shù)據(jù)寄存器(BCDHOUR)寄存器BCDHOUR是可/讀寫(xiě)的,用來(lái)存儲(chǔ)當(dāng)前時(shí)間的時(shí)數(shù)據(jù),即合并的BCD碼格式。地址為0x57000078,初值不定。具體格式定義如下表。位描述初值[5:4]時(shí)數(shù)據(jù)十位BCD碼值,范圍0~2。0[3:0]時(shí)數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。06514.日數(shù)據(jù)寄存器(BCDDATE)寄存器BCDDATE是可/讀寫(xiě)的,用來(lái)存儲(chǔ)當(dāng)前日期的日數(shù)據(jù),即合并的BCD碼格式。地址為0x5700007C,初值不定。具體格式定義如下表。位描述初值[5:4]日數(shù)據(jù)十位BCD碼值,范圍0~3。0[3:0]日數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。06615.星期數(shù)據(jù)寄存器(BCDDAY)寄存器BCDDAY是可/讀寫(xiě)的,用來(lái)存儲(chǔ)當(dāng)前日期對(duì)應(yīng)的星期數(shù)據(jù),即合并的BCD碼格式。地址為0x57000080,初值不定。具體格式定義如下表。位描述初值[2:0]星期數(shù)據(jù)BCD碼值,范圍1~7。06716.月數(shù)據(jù)寄存器(BCDMON)寄存器BCDMON是可/讀寫(xiě)的,用來(lái)存儲(chǔ)當(dāng)前日期的月數(shù)據(jù),即合并的BCD碼格式。地址為0x57000084,初值不定。具體格式定義如下表。位描述初值[4]月數(shù)據(jù)十位BCD碼值,范圍0~1。0[3:0]月數(shù)據(jù)個(gè)位BCD碼值,范圍0~9。06817.年數(shù)據(jù)寄存器(BCDYEAR)寄存器BCDYEAR是可/讀寫(xiě)的,用來(lái)存儲(chǔ)當(dāng)前日期對(duì)應(yīng)的年數(shù)據(jù),即合并的BCD碼格式。地址為0x57000088,初值不定。具體格式定義如下表。位描述初值[7:0]年數(shù)據(jù)BCD碼值,范圍00~99。0699.4.3RTC編程舉例(應(yīng)用C語(yǔ)言編程)#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í)設(shè)置RTC的當(dāng)前日期和時(shí)間*/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讀寫(xiě)操作

rRTCALM=(uint8)0x0;//關(guān)閉所有的報(bào)警

rRTCRST=(uint8)0x0;//關(guān)閉復(fù)位操作

rTICNT=(uint8)0x0;//關(guān)閉時(shí)間片中斷

rRTCCON=(uint8)(rRTCCON&0xfe);//關(guān)閉RTC讀寫(xiě)操作}/*RTC寫(xiě)函數(shù)。函數(shù)名RTC_Write(void);

功能:完成將初始化函數(shù)中設(shè)置的日期與時(shí)間參數(shù)寫(xiě)到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讀寫(xiě)操作*//*將當(dāng)前日期與時(shí)間參數(shù)寫(xiě)入各自的數(shù)據(jù)寄存器中*/rBCDYEAR=Y,rBCDMON=MO,rBCDDATE=D,rBCDDAY=W;rBCDHOUR=H,rBCDMIN=MI,rBCDSEC=S;rRTCCON=(uint8)(rRTCCON&0xfe);//關(guān)閉RTC讀寫(xiě)操作}729.4.3RTC編程舉例(續(xù)3)

/*RTC讀函數(shù)。函數(shù)名RTC_Read(void);

功能:完成將RTC日期與時(shí)間的BCD碼參數(shù)值讀出*/voidRTC_Read(void){uint8Y,MO,D,W,H,MI,S;/*以下完成讀RTC各數(shù)據(jù)寄存器BCD碼*/rRTCCON=(uint8)(rRTCCON|0x01);/*使能RTC讀寫(xiě)操作*/Y=rBCDYEAR,MO=rBCDMON,D=rBCDDATE,W=rBCDDAY;H=rBCDHOUR,MI=rBCDMIN,S=rBCDSEC;rRTCCON=(uint8)(rRTCCON&0xfe);/*關(guān)閉RTC讀寫(xiě)操作*/

/*以下是將合并的BCD碼轉(zhuǎn)換為十進(jìn)制數(shù),放入對(duì)應(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章習(xí)題9-1何為定時(shí)/計(jì)數(shù)器?定時(shí)與計(jì)數(shù)有什么區(qū)別?9-2試述看門狗定時(shí)器的功能和主要控制寄存器的作用。9-3看門狗定時(shí)器的主要作用是什么?在程序的編寫(xiě)工作中需要做什么工作?9-4S3C2410A的看門狗有那些工作方式。設(shè)計(jì)一個(gè)監(jiān)測(cè)系統(tǒng)程序周期不大于50us,在PCLK=100Mhz時(shí)的看門狗程序。9-5試述S3C2410A的TIMER部件組成及主要功能。9-6試述S3C2410A的TIMER部件的控制寄存器及主要功能。9-7使用TIMER部件的TIMER1定時(shí)/計(jì)數(shù)器,設(shè)計(jì)產(chǎn)生一個(gè)周期為1000ms,占空比為1/2的脈沖信號(hào)。已知系統(tǒng)的PCLK=66Mhz,編寫(xiě)初始化程序。9-8論述S3C2410A芯片中RTC部件的主要功能、主要控制寄存器的作用。9-9編寫(xiě)使用RTC部件的初始化程序、設(shè)置當(dāng)前日期與時(shí)間程序和讀取RTC的當(dāng)前日期和時(shí)間數(shù)據(jù)。

第10章Bootloader

設(shè)計(jì)基礎(chǔ)

7510.1Bootloader

概述

Bootloader,啟動(dòng)引導(dǎo)程序,又叫引導(dǎo)加載程序,功能強(qiáng)大的Bootloader也就直接叫做板級(jí)支持包(BSP,BoardSupportPacket)或者固件(Firmware)。近年來(lái),為了方便嵌入式產(chǎn)品的推廣,也有些直接將Bootloader叫做BIOS。BIOS是PC機(jī)的“基本輸入輸出系統(tǒng)”,燒錄在電腦主板上一塊專門的芯片中。一般BIOS由主板廠商或者專門的BIOS生產(chǎn)商提供,不是開(kāi)源的,用戶不能修改其中的代碼進(jìn)行定制。而嵌入式系統(tǒng)的開(kāi)發(fā)則離不開(kāi)Bootloader的開(kāi)發(fā),它也是整個(gè)系統(tǒng)開(kāi)發(fā)中的難點(diǎn)之一。

7610.1.1Bootloader

的作用

Bootloader是在嵌入式操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序,也是系統(tǒng)開(kāi)機(jī)后執(zhí)行的第一段程序。通過(guò)這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間,從而將系統(tǒng)的軟硬件環(huán)境設(shè)置成一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。Bootloader是依賴于底層硬件而實(shí)現(xiàn)的,因此建立一個(gè)通用的嵌入式系統(tǒng)Bootloader幾乎是不可能的。在PC機(jī)中,主板的BIOS和位于硬盤0磁道上的主引導(dǎo)記錄(MasterBootRecord,MBR)中的引導(dǎo)程序(如LILO或GRUB等),兩者一起的作用就相當(dāng)于Bootloader在嵌入式系統(tǒng)中的作用,即實(shí)現(xiàn)整個(gè)系統(tǒng)的啟動(dòng)引導(dǎo),并最終能引導(dǎo)操作系統(tǒng)的運(yùn)行。7710.1.1Bootloader

的作用(續(xù)1)在嵌入式系統(tǒng)中,Bootloader對(duì)嵌入式設(shè)備中的主要部件如CPU、SDRAM、FLASH、串口等進(jìn)行了初始化,這樣可以使用Bootloader通過(guò)串口下載各種文件到設(shè)備的SDRAM中或者燒錄Flash,然后將操作系統(tǒng)內(nèi)核讀入到內(nèi)存中來(lái)或者直接跳轉(zhuǎn)到內(nèi)核的入口點(diǎn),從而實(shí)現(xiàn)操作系統(tǒng)的引導(dǎo)?,F(xiàn)在有些Bootloader也把對(duì)以太網(wǎng)的支持等功能也加進(jìn)去了,這樣一個(gè)功能比較強(qiáng)大的Bootloader實(shí)際上就已經(jīng)相當(dāng)于一個(gè)微型的操作系統(tǒng)了。7810.1.1Bootloader

的作用(續(xù)2)Bootloader從第一條指令跳轉(zhuǎn)后,就開(kāi)始初始化各種最重要的硬件,比如CPU的工作頻率、定時(shí)器、中斷、看門狗、檢測(cè)RAM大小和Flash等。一般,硬件初始化的這段程序是用匯編語(yǔ)言編寫(xiě)的,其后就用C語(yǔ)言編寫(xiě)??傮w上Bootloader主要完成以下工作:

初始化CPU速度;初始化內(nèi)存,包括啟用內(nèi)存庫(kù),初始化內(nèi)存配置寄存器等;初始化中斷控制器,在系統(tǒng)啟動(dòng)時(shí),關(guān)閉中斷,關(guān)閉看門狗;初始化串行端口(如果在目標(biāo)上有的話);啟用指令/數(shù)據(jù)高速緩存;7910.1.1Bootloader

的作用(續(xù)3)

設(shè)置堆棧指針;設(shè)置參數(shù)區(qū)域并構(gòu)造參數(shù)結(jié)構(gòu)和標(biāo)記,即引導(dǎo)參數(shù);執(zhí)行POST(上電自檢)來(lái)標(biāo)識(shí)存在的設(shè)備并報(bào)告有何問(wèn)題;為電源管理提供掛起/恢復(fù)支持;傳輸操作系統(tǒng)內(nèi)核鏡像文件到目標(biāo)機(jī)。也可以將操作系統(tǒng)內(nèi)核鏡像文件事先存放在Flash中,這樣就不需要Bootloader和主機(jī)傳輸操作系統(tǒng)內(nèi)核鏡像文件,這通常是在做成產(chǎn)品的情況下使用。而一般在開(kāi)發(fā)過(guò)程中,為了調(diào)試內(nèi)核的方便,不將操作系統(tǒng)內(nèi)核鏡像文件固化在Flash中,這就需要主機(jī)和目標(biāo)機(jī)進(jìn)行文件傳輸;跳轉(zhuǎn)到內(nèi)核的開(kāi)始,在此又分為ROM啟動(dòng)和RAM啟動(dòng)。所謂ROM啟動(dòng)就是用XIP技術(shù)直接在Flash中執(zhí)行操作系統(tǒng)鏡像文件;所謂RAM啟動(dòng)就是指把內(nèi)核鏡像從Flash復(fù)制到RAM中,然后再將PC指針跳轉(zhuǎn)到RAM中的操作系統(tǒng)啟動(dòng)地址。8010.1.1Bootloader

的作用(續(xù)4)

在嵌入式Linux軟件系統(tǒng)的開(kāi)發(fā)中,一般將軟件分為啟動(dòng)引導(dǎo)程序(Bootloader)、操作系統(tǒng)內(nèi)核(OSKernel)、根文件系統(tǒng)(FileSystem)、圖形窗口系統(tǒng)(GUI)和應(yīng)用程序(AP)等幾個(gè)部分,其中前三部分是一個(gè)可運(yùn)行的嵌入式系統(tǒng)必不可少的,它們?cè)陂_(kāi)發(fā)的過(guò)程中,被分別獨(dú)立地編譯鏈接或打包為一個(gè)二進(jìn)制目標(biāo)文件,然后下載(燒錄)到嵌入式系統(tǒng)的ROM(一般是Flash)中。后兩部分如果有的話,通常也是和根文件系統(tǒng)一起打包后燒錄到Flash中。因此在Bootloader階段,也提供了對(duì)Flash設(shè)備的分區(qū)格式化的支持,其空間分配通常如圖所示。8110.1.2Bootloader

的工作模式

對(duì)于嵌入式系統(tǒng)的開(kāi)發(fā)人員而言,Bootloader通常包含“啟動(dòng)加載”和“下載”這兩種不同的工作模式。當(dāng)然,這兩種工作模式的區(qū)別一般僅僅對(duì)于開(kāi)發(fā)人員才有意義,而對(duì)最終用戶來(lái)說(shuō),Bootloader

的作用就是用來(lái)加載操作系統(tǒng),從而啟動(dòng)整個(gè)嵌入式系統(tǒng)。

8210.1.2Bootloader

的工作模式(續(xù)1)啟動(dòng)加載(Bootloading)模式--正常啟動(dòng)模式下載(Downloading)模式--提供給開(kāi)發(fā)人員或者技術(shù)支持人員使用8310.1.3Bootloader

的啟動(dòng)流程

啟動(dòng)流程分為stage1和stage2兩個(gè)階段一般依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,都放在stage1中,而且通常都用匯編語(yǔ)言來(lái)實(shí)現(xiàn),以達(dá)到短小精悍且啟動(dòng)快的目的;而stage2則通常用C語(yǔ)言來(lái)實(shí)現(xiàn),這樣可以實(shí)現(xiàn)各種復(fù)雜的功能(比如串口、以太網(wǎng)接口的支持等)

841、Bootloader的第一階段

①硬件設(shè)備初始化。包括屏蔽所有中斷;關(guān)閉看門狗;設(shè)置CPU的速度與時(shí)鐘;RAM初始化;關(guān)閉CPU內(nèi)部指令/數(shù)據(jù)cache等。

②為加載Bootloader

的stage2準(zhǔn)備RAM空間。

③拷貝

Bootloader的stage2到RAM空間中。

④設(shè)置好堆棧。

⑤跳轉(zhuǎn)到stage2的C入口點(diǎn)main()函數(shù)處。852、Bootloader的第二階段

①初始化本階段要使用到的硬件設(shè)備。②檢測(cè)系統(tǒng)內(nèi)存映射(memorymap)。③將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中。④為內(nèi)核設(shè)置啟動(dòng)參數(shù)。⑤調(diào)用內(nèi)核。8610.2S3C2410平臺(tái)下Linux的BootloaderViviU-BOOT8710.2.1vivi1.vivi簡(jiǎn)介

vivi是由韓國(guó)mizi公司為ARM處理器系列設(shè)計(jì)的一個(gè)bootloader。它同樣支持啟動(dòng)加載模式和下載工作模式。在下載模式下,vivi為用戶提供一個(gè)命令行人機(jī)接口,通過(guò)這個(gè)人機(jī)接口可以使用vivi提供的一些命令。如果嵌入式系統(tǒng)沒(méi)有鍵盤和顯示,那么可以利用vivi中的串口,將其和宿主機(jī)連接起來(lái),利用宿主機(jī)中的串口軟件(如windows中的超級(jí)終端或者Linux中的minicom)來(lái)控制。8810.2.1vivi(續(xù)1)vivi常用的命令Load命令:將二進(jìn)制文件寫(xiě)入Flash或RAM。例如:

Loadflashx表示向flash芯片中燒錄內(nèi)核映像zImage文件,與宿主機(jī)的通信采用xmodem協(xié)議。Part命令:操作MTD分區(qū)信息,比如顯示、增加、刪除、復(fù)位MTD分區(qū)等。例如partshowBon命令:用于NANDFlash的簡(jiǎn)單分區(qū)。Param命令:用于設(shè)置參數(shù)。Boot命令:?jiǎn)?dòng)系統(tǒng)。Flash命令:管理Flash.例如刪除Flash的數(shù)據(jù)。892.vivi文件結(jié)構(gòu)

Vivi的文件目錄包括arch,init,lib,drivers和include等幾個(gè)目錄,共200多條文件。

arch:包括vivi支持的所有目標(biāo)板(CPU的類型)。

init:只包含main.c和version.c兩個(gè)文件,vivi將從main.c函數(shù)開(kāi)始執(zhí)行。

lib:一些公共平臺(tái)接口代碼。

drivers:設(shè)備驅(qū)動(dòng)程序代碼,其中包含引導(dǎo)內(nèi)核需要的設(shè)備驅(qū)動(dòng)程序(mtd和串口),mtd目錄下又分為map,nand,nor這3個(gè)子目錄。

include:頭文件共用目錄。其中s3c2410.h定義了s3c2410CPU的所用寄存器,而platform/smdk2410.h則定義了開(kāi)發(fā)板相關(guān)的資源配置參數(shù)等。903.vivi的配置和編譯vivi的配置和嵌入式Linux內(nèi)核一樣,可以采用菜單化的形式進(jìn)行。其步驟主要如下:

①#makedistclean。清除一些早先生成的無(wú)用的目標(biāo)文件。

②#makemenuconfig。然后可以根據(jù)菜單中的信息進(jìn)行配置。

③編譯。菜單配置完畢后,保存退出。然后執(zhí)行“make”命令開(kāi)始編譯。914.Vivi的第一階段分析

vivi的第一階段主要完成了依賴于CPU的體系結(jié)構(gòu)硬件初始化,包括禁止中斷、初始化串口、復(fù)制第二階段到RAM中等。由于這些代碼是和硬件緊密相關(guān)的,因此要求讀者在閱讀時(shí)對(duì)照S3C2410處理器的數(shù)據(jù)手冊(cè),查閱相關(guān)的寄存器的描述,以便更好地理解。這些匯編代碼全部就集中在vivi\arch\s3c2410目錄下的head.S這一個(gè)匯編文件中,當(dāng)然還有相關(guān)的頭文件。

程序代碼參見(jiàn)WORD文檔925.vivi第二階段的分析vivi的第二階段的入口就是init/main.c,按照源代碼的組織流程,根據(jù)模塊化劃分的原則,共分為8個(gè)功能模塊即八個(gè)步驟,在源代碼的注釋中以step非常清晰的給出了區(qū)分。935.vivi第二階段的分析(續(xù)1)第一步:vivi從main()函數(shù)開(kāi)始執(zhí)行,函數(shù)開(kāi)始通過(guò)putstr(vivi_bannner)打印出vivi的版本。第二步:主要是初始化GPIO,本的思路和方法就是在把握好整個(gè)系統(tǒng)硬件資源的前提下,根據(jù)芯片的數(shù)據(jù)手冊(cè)把所有的初始值設(shè)定,在這里利用set_gpios這個(gè)函數(shù)就可以完成初始化了。

第三步:進(jìn)行內(nèi)存映射初始化和內(nèi)存管理單元(MM

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論