2440嵌入式軟件_硬件常識(shí)_第1頁
2440嵌入式軟件_硬件常識(shí)_第2頁
2440嵌入式軟件_硬件常識(shí)_第3頁
2440嵌入式軟件_硬件常識(shí)_第4頁
2440嵌入式軟件_硬件常識(shí)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、嵌入式軟件開發(fā)人員,硬件常識(shí)底層的驅(qū)動(dòng)或內(nèi)核開發(fā)人員通常要跟硬件緊密的配合,協(xié)同完成工作.硬件電路的設(shè)計(jì)很大程度上決定驅(qū)動(dòng)代碼的代碼的編寫.一個(gè)熟練的底層開發(fā)人員具備硬件開發(fā)知識(shí)本節(jié)內(nèi)容.l 硬件開發(fā)流程l 硬件識(shí)圖l 軟件控制硬件方法l 嵌入式C語言硬件開發(fā)知識(shí)l 大致清楚硬件的設(shè)計(jì)和生產(chǎn)流程.l 清楚自已工作中常用的硬件器件的工作原理.l 要有看懂硬件原理圖的能力.主要涉及影響到編程的關(guān)鍵的連線和管腳的一定要看懂.l 要看懂硬件(主要是能編程控制的集成電路,簡稱IC)的編程資料,一般是稱為DataSheet的PDF文檔.主要各個(gè)寄存器的設(shè)置,和常見任務(wù)的處理流程軟件相關(guān)能力l 要知道如何用

2、編程語言(主要是C,和少量的匯編)去控制硬件.l 還要熟悉底層軟件與操作系統(tǒng)的接口.n 象同一款硬件,原始的控制代碼是基本上一樣的,但是各個(gè)操作系統(tǒng)對(duì)驅(qū)動(dòng)與OS的接口,完全不一樣.Windows系列的驅(qū)動(dòng)接口遠(yuǎn)比Linux復(fù)雜得多.各個(gè)操作系統(tǒng)也提供了不同底層函數(shù)接口用于開發(fā),這些都需要熟練掌握的.l 具有調(diào)試底層軟件的能力,除了常用的軟件調(diào)試手段,(如單步DEBUG,查看輸出信息.)有時(shí)可能需要?jiǎng)佑密浖?和硬件檢測設(shè)備來調(diào)試n 如網(wǎng)絡(luò)調(diào)試,可能需要抓包軟件,基于硬件的流量測試儀n 基于硬件的電路的儀器,如萬用電表,顯波器和邏輯分析儀n 基于無線的設(shè)備,可能需要無線信號(hào)發(fā)生器或基站模擬設(shè)備在底

3、層軟件開發(fā)領(lǐng)域,還有一些非標(biāo)準(zhǔn)CPU的分支開發(fā)領(lǐng)域,由于采用接近于CPU的復(fù)雜結(jié)構(gòu),因此必須用的編程語言去開發(fā),但又不是普通的gcc那樣的開發(fā)環(huán)境.而是自己獨(dú)立的開發(fā)環(huán)境.很多嵌入式工程師需要常握其中一種工具l 常用數(shù)據(jù)處理,如音頻,加密,視頻影像處理的DSP,都會(huì)有自已獨(dú)立的開發(fā)環(huán)境,有的是接近匯編級(jí)的語法代碼,更高級(jí)是類似于C的編程語言.常見的DSP開發(fā)環(huán)境有TI的CCP.l 在網(wǎng)絡(luò)流量很大的地方,如核心路由器,大型的防火墻,網(wǎng)關(guān),等,這一些設(shè)備有時(shí)用軟件已經(jīng)無法處理.往往采用基于網(wǎng)絡(luò)處理器的的方案,網(wǎng)絡(luò)處理器會(huì)在硬件直接處理網(wǎng)絡(luò)包,這些網(wǎng)絡(luò)處理器也有獨(dú)立的開發(fā)環(huán)境用于開發(fā).如Intel的

4、IXP系列.l FPGA,CPLD (VHDL)用類似于Basic 或C語言的開發(fā)語言去設(shè)計(jì)硬件,如MaxPlus IIl labView 虛擬儀器.硬件產(chǎn)品設(shè)計(jì)流程 與軟件不同,一個(gè)硬件產(chǎn)品的從最基本的器件到最終產(chǎn)品的出產(chǎn),是一個(gè)全球化高度合作的結(jié)果.牽涉一個(gè)完整的產(chǎn)業(yè)鏈的方方面面.因此必須需要高度工程化的管理和生產(chǎn)技術(shù).否則不可能生產(chǎn)出合格產(chǎn)品.以一臺(tái)手機(jī)生產(chǎn)而言.它的技術(shù)標(biāo)準(zhǔn)和研發(fā)可能是在歐美的大公司或大學(xué)的研究機(jī)制進(jìn)行.如Nokia和愛立信,高通等來進(jìn)行研發(fā)的.當(dāng)技術(shù)成熟后,可能在美國的IC設(shè)計(jì)公司(如TI)設(shè)計(jì)出可以滿足實(shí)際產(chǎn)品的集成電路,這個(gè)集成電路的生產(chǎn),出廠測試等流程可能是在臺(tái)

5、灣新竹的臺(tái)積電,聯(lián)電的IC生產(chǎn)工廠代工.單獨(dú)的IC并不能形成產(chǎn)品,必須要焊接在電路板上,和其它電件組成完整的電路.這是一個(gè)風(fēng)險(xiǎn)很高的設(shè)計(jì)過程.以前要由最終的產(chǎn)商完成這樣的工作,這樣會(huì)花費(fèi)很長的時(shí)間和資金,并且有可能失敗.現(xiàn)在流行的趨勢(shì)是由專業(yè)的設(shè)計(jì)公司負(fù)責(zé)完成硬件電路和底層軟件的設(shè)計(jì),甚至是應(yīng)用程序的開發(fā),這大大降低了生產(chǎn)廠家的門檻.象手機(jī)設(shè)計(jì)里最有名的是MTK(聯(lián)發(fā)科技),它提供底層的IC到硬件電路方案,+軟件方案的全套設(shè)計(jì).這樣很多小廠也能直接生產(chǎn)手機(jī).號(hào)稱是黑手機(jī)之父,這幾年的大量的手機(jī)上市,它功不可沒.也造就它成為臺(tái)灣股市的股王.在低端MP3,MP4領(lǐng)域里,采用相同策略是位于珠海的炬力

6、,它也推出MP3和MP4播放器從IC到硬件設(shè)計(jì)方案,軟件的全套設(shè)計(jì)方案.造成現(xiàn)在MP3,MP4市場大規(guī)模爆發(fā).如果是從元器件開始設(shè)計(jì)一個(gè)電子產(chǎn)品.第一階段是硬件工程師要根據(jù)參考方案和文檔,設(shè)計(jì)出一個(gè)硬件原理圖來.主要用來驗(yàn)證電路產(chǎn)否能正常正確,確定硬件的連線等工作.類似于產(chǎn)品硬件設(shè)計(jì)模型.這一項(xiàng)工作一般是由一個(gè)公司最有經(jīng)驗(yàn)的工程師來完成.原理圖都是一個(gè)邏輯表示,比如元器件用示意圖表示,連線也不會(huì)跟最終產(chǎn)品的走線一模一樣.IC是高度集成的精密器件,不可能象電氣設(shè)備一樣,直接拉線就行.通常會(huì)在一個(gè)縛有一層導(dǎo)電金屬層的絕緣板用化學(xué)方法”刻”一根一根的導(dǎo)線.然后再焊接上去.這種板就稱為PCB ( Pr

7、inter Circuit Board).這種方法有很多優(yōu)點(diǎn),節(jié)約空間,防止干擾,焊接點(diǎn)小,并且牢固.集成度高,因此現(xiàn)代的電子元件互聯(lián)完全采用PCB板來制作.因此硬件設(shè)計(jì)第二階段就要是把原理圖設(shè)計(jì)成供生產(chǎn)的PCB圖.類似于建筑施工圖,里面的設(shè)計(jì)布局將會(huì)跟實(shí)際產(chǎn)品開發(fā)一規(guī)一模.PCB也是取決于設(shè)計(jì)經(jīng)險(xiǎn),但很多是重復(fù)勞動(dòng),在很多小的公司往往采用外包的方式讓專業(yè)的PCB公司來代為設(shè)計(jì),深圳就有大量公司或工作室來代人完成PCB設(shè)計(jì).原理圖設(shè)計(jì),和PCB設(shè)計(jì)都需要專用軟件來完成.現(xiàn)在有設(shè)計(jì)軟件從幾十W到幾W的軟件都是,象常用的Prototel ,PowerLogic/PowerPCB是比較流行的硬件設(shè)計(jì)

8、.可以完成二階段設(shè)計(jì).高端設(shè)計(jì)軟件有Cadence.當(dāng)完成PCB設(shè)計(jì)后,一方面準(zhǔn)備制作PCB板了.由于PCB的制作設(shè)備非常昂貴.一般是由專門PCB生產(chǎn)廠家來代工.深圳是中國以及世界上最集中PCB產(chǎn)業(yè)地,擁有大量PCB制作廠家.另一方面由PCB圖導(dǎo)出BOM(元器件清單)交由采購部門進(jìn)行采購.現(xiàn)代的IC的管腳已經(jīng)越來越復(fù)雜,采用手工焊接效率低,失敗高,往往需要專門焊接廠進(jìn)行全自動(dòng)的焊接.深圳擁有大量焊接工廠.往往是PCB制版廠業(yè)務(wù)之一.當(dāng)一個(gè)產(chǎn)品完成后,就要設(shè)計(jì)吸引人的產(chǎn)品外殼,這稱為結(jié)構(gòu)設(shè)計(jì).比較簡單的是用金屬?zèng)_壓件.如果電腦機(jī)箱,機(jī)柜之類.優(yōu)點(diǎn)設(shè)計(jì)成本低,可以快速實(shí)現(xiàn).缺點(diǎn)就是一般只能是帶直角

9、的設(shè)計(jì).外形過于簡單. 現(xiàn)在大部分電子產(chǎn)品采用塑料外殼.優(yōu)點(diǎn)可以做出非常復(fù)雜的外形.并且可以采用不同材質(zhì)進(jìn)行組合.缺點(diǎn)是設(shè)計(jì)復(fù)雜,并且要用設(shè)計(jì)專用模具來生產(chǎn).現(xiàn)在結(jié)構(gòu)設(shè)計(jì)軟件有 普遍采用Pro/E 或UG來進(jìn)行設(shè)計(jì).也有人使用AutoCAD來設(shè)計(jì).現(xiàn)在結(jié)構(gòu)設(shè)計(jì)一般也是外包給專業(yè)的設(shè)計(jì)公司進(jìn)行設(shè)計(jì).很多產(chǎn)商為了節(jié)約成本,往往采用模具廠預(yù)先做的好模具,這個(gè)稱為”公?!?歐美市場對(duì)環(huán)保有極為嚴(yán)格的要求,如果產(chǎn)品要銷往歐美市場,往往需要使用無鉛的焊錫,油漆.電磁輻射也有強(qiáng)制要求.以有其它的準(zhǔn)入門檻.如歐盟的CE認(rèn)證,美國的UL認(rèn)證,FCC認(rèn)證等,這一些都是強(qiáng)制標(biāo)準(zhǔn),必須先在先由認(rèn)證的代理機(jī)構(gòu)認(rèn)證后.才

10、能在上述市場銷售.這是必須一個(gè)環(huán)節(jié).電路圖的識(shí)圖能力常見電路圖有三大類框圖(BLOCK DIAGRAM),原理圖和PCB圖,時(shí)序圖框圖用于描述系統(tǒng)結(jié)構(gòu),一般用于文檔描述.原理圖用于系統(tǒng)原理設(shè)計(jì).同時(shí)進(jìn)行底層軟件編程時(shí)往往需要多次查閱原理圖的設(shè)計(jì).PCB圖用于實(shí)際生產(chǎn).軟件編程一般不需要查看PCB圖. 底層軟件人員往往需要了解是時(shí)序圖(Timing),用于反映多個(gè)信號(hào)源(或管腳)之間信號(hào)的相互關(guān)系。因?yàn)橐粋€(gè)硬件完成一項(xiàng)工作必須是多個(gè)管腳協(xié)同工作。而且往往有時(shí)間順序上的要求。而時(shí)序圖就是反應(yīng)這種時(shí)間上的信號(hào)之間相互關(guān)系的圖形,大量于IC的設(shè)計(jì)文檔,在實(shí)例運(yùn)行中,往往也可以用顯波器之類設(shè)備測量出這種

11、波形關(guān)系。用于協(xié)助軟件人員調(diào)試錯(cuò)誤。S3C2440的原理框圖QQ2440部分原理圖一個(gè)S3C2410開發(fā)板的PCB圖信號(hào)時(shí)序圖(Timing) SPI總線時(shí)序常用時(shí)序圖 NAND Flash 控制時(shí)序圖,有規(guī)則的波形(HCLK)一般用于表示時(shí)鐘信號(hào),用于不同信號(hào)計(jì)時(shí)。上例中,表示在第二個(gè)時(shí)鐘周期時(shí),CLE/ALE的必須由低平切換為高電平。在第三個(gè)時(shí)鐘周 期,new由高電平變?yōu)榈碗娖?。用雙線表示波形,即DATA,表示高低電平不確定,必須取決于當(dāng)時(shí)應(yīng)用的情況。比如在這個(gè)例子,DATA在有效的時(shí)鐘周期,傳輸是不同命令或地址。 一個(gè)復(fù)雜的時(shí)序圖內(nèi)存控制器的時(shí)序圖 軟件控制硬件方法作為一個(gè)嵌入式軟件開發(fā)

12、人員,必須熟悉如何控制硬件.首先從技術(shù)要確定項(xiàng)目開發(fā)采用哪種CPU.這取決項(xiàng)目人員技術(shù)背景,產(chǎn)品以前經(jīng)驗(yàn)以技術(shù)特點(diǎn)等.一般公司盡可能采用同一種CPU來開發(fā)不同產(chǎn)品.這樣可以最大可能節(jié)約成本,并且技術(shù)風(fēng)險(xiǎn)比較小.當(dāng)確定的CPU后,研發(fā)人員就要研究的CPU相關(guān)文件.指令集和測試程序.這一些都要在項(xiàng)目開始前完成.硬件IC的手機(jī)通常是PDF格式的.稱為DataSheet.CPU的datasheet是相當(dāng)于一本厚厚的技術(shù)詞典.如S3C2440的datasheet 有596頁.如果要控制比較復(fù)雜的外部設(shè)備,通常還要去閱讀相應(yīng)的手冊(cè).因此在開發(fā)前,最好盡可能閱讀盡可能多的手冊(cè). 以S3C2440 CPU為例

13、.首先要了解一下CPU的框圖,了解這一款CPU的大致部件.從這個(gè)框圖可以看到,這一款CPU具備的基本硬件包括內(nèi)存,LCD,串行端口.電源等.這幾個(gè)也是嵌入式系統(tǒng)中最常見到的幾項(xiàng)裝置.另外這個(gè)CPU還提供了許多的GPIO(General Purpose I/O)管腳,讓設(shè)計(jì)者可以根據(jù)自已的需求來控制這一些外圍設(shè)備,這是一個(gè)很典型的一種做法.如果這些外圍還是不夠的話,就要自已加控控制芯片,拉到地址線(address line)及總線(bus line)上,通過這些線來控制外圍,像是SDRAM或是Flash 就是通過地址線與總線來存取數(shù)據(jù).有三個(gè)概念要分清楚,存儲(chǔ)器,I/O端口,寄存器.寄存器是指C

14、PU和外設(shè)內(nèi)部的存儲(chǔ)單元,數(shù)量有限,但速度快,分通用寄存器和特殊功能寄存器(比如pc,sp等)。不同CPU寄存器寬度是不一樣的.8位單片機(jī)表示地址線和數(shù)據(jù)為8位大小.寄存器寬度也是8位,在C程序中正好可以用一個(gè)char 數(shù)據(jù)類型來操作.主流32位CPU的寄存器就是32位寬度.正好用一個(gè)32位,在程序中可以用一個(gè)unsigned int 來操作.CPU的寄存器或地址位的寬度稱為WORD(字)通常說的存儲(chǔ)器都是獨(dú)立于CPU之外的,比如內(nèi)存,硬盤,光盤等.CPU本身幾乎每一種外設(shè)都是通過讀寫設(shè)備上的寄存器來進(jìn)行操作的。外設(shè)寄存器也稱為“I/O端口”,通常包括:控制寄存器、狀態(tài)寄存器和數(shù)據(jù)寄存器三大類

15、,而且一個(gè)外設(shè)的寄存器通常被連續(xù)地編址。CPU對(duì)外設(shè)IO端口物理地址的編址方式 有兩種:一種是I/O映射方式(I/Omapped),另一種是存儲(chǔ)空間映射方式(Memorymapped)。而具體采用哪一種則取決于CPU的體系結(jié)構(gòu)。有些體系結(jié)構(gòu)的CPU(如,PowerPC、m68k等)通常只實(shí)現(xiàn)一個(gè)物理地址空間(RAM)。在這種情況下,外設(shè) I/O端口的物理地址就被映射到CPU的單一物理地址空間中,而成為存儲(chǔ)空間的一部分。此時(shí),CPU可以象訪問一個(gè)內(nèi)存單元那樣訪問外設(shè)I/O端口,而不需要 設(shè)立專門的外設(shè)I/O指令。這就是所謂的“存儲(chǔ)空間映射方式”(Memorymapped)。ARM體系的CPU均采

16、用這一模式.而另外一些體系結(jié)構(gòu)的CPU(典型地如X86)則為外設(shè)專門實(shí)現(xiàn)了一個(gè)單獨(dú)地地址空間,稱為“I/O地址空間”或者“I/O端口空間”。這是一個(gè) 與CPU的RAM物理地址空間不同的地址空間,所有外設(shè)的I/O端口均在這一空間中進(jìn)行編址。CPU通過設(shè)立專門的I/O指令(如X86的IN和OUT指 令)來訪問這一空間中的地址單元(也即 I/O端口)。這就是所謂的“I/O映射方式”(I/Omapped)。與RAM物理地址空間相比,I/O地址空間通常都比較小,如x86 CPU的I/O空間就只有64KB(00xffff)。這是“I/O映射方式”的一個(gè)主要缺點(diǎn)。而且必須要專門的匯編語言才能處理.Linux

17、 即在X86運(yùn)行,也在ARM之類運(yùn)行.為了簡化操作,Linux在所以CPU上都采用I/O端口概念.如果是象ARM這樣內(nèi)存映射.也被模擬成端口.在非操作系統(tǒng)模式下.一般直接采用內(nèi)存取讀模式.在ARM下,所有外設(shè)的寄存器都被映射到一個(gè)4G空間.并且是有固定的映射地址.(注意要與操作系統(tǒng)下的映射2G地址空間分開,那是操作系統(tǒng)給每個(gè)進(jìn)程模擬的空間,I/O地址實(shí)際映射物理地址空間)以下是在S3C 2440的Nand/Nor 在設(shè)備空間映射地址空間所有S3C2440寄存器地址映射表寫在手冊(cè) 55頁(1-32)如下例就是內(nèi)存控制器相關(guān)的寄存器地址設(shè)置一般的PC機(jī)和ARM板都帶有外接電池供電的RTC(REAL

18、 TIME CLOCK實(shí)時(shí)時(shí)鐘)芯片,即便是切斷的外接電源,RTC電路記錄的時(shí)間也會(huì)按真實(shí)時(shí)間流逝而做相應(yīng)變化.假設(shè)現(xiàn)在要使用RTC電路.即從RTC電路存儲(chǔ)的時(shí)間信息讀取出來.首先根據(jù)地址表找出RTC電路寄存器相關(guān)地址.(S3C2440芯片手冊(cè)P66)其中存儲(chǔ)年月日小時(shí)分鐘,秒的的寄存器分別是 BCDSEC,BCDMIN,BCDHOUR,BCDDATE,BCDDAY,BCDMON,BCDYEAR.地址從0x570000770x5700008B 地址.在C語言中為,方便程序編寫,往往把寄存器定義為宏,這樣當(dāng)CPU微調(diào)的寄存器定義,程序不需要重寫.參見2440addr.h的定義/ RTC#ifde

19、f _BIG_ENDIAN#define rRTCCON (*(volatile unsigned char *)0x57000043)/RTC control#define rTICNT (*(volatile unsigned char *)0x57000047)/Tick time count#define rRTCALM (*(volatile unsigned char *)0x57000053)/RTC alarm control#define rALMSEC (*(volatile unsigned char *)0x57000057)/Alarm second#define r

20、ALMMIN (*(volatile unsigned char *)0x5700005b)/Alarm minute#define rALMHOUR (*(volatile unsigned char *)0x5700005f)/Alarm Hour#define rALMDATE (*(volatile unsigned char *)0x57000063)/Alarm date /edited by junon#define rALMMON (*(volatile unsigned char *)0x57000067)/Alarm month#define rALMYEAR (*(vol

21、atile unsigned char *)0x5700006b)/Alarm year#define rRTCRST (*(volatile unsigned char *)0x5700006f)/RTC round reset#define rBCDSEC (*(volatile unsigned char *)0x57000073)/BCD second#define rBCDMIN (*(volatile unsigned char *)0x57000077)/BCD minute#define rBCDHOUR (*(volatile unsigned char *)0x570000

22、7b)/BCD hour#define rBCDDATE (*(volatile unsigned char *)0x5700007f)/BCD date /edited by junon#define rBCDDAY (*(volatile unsigned char *)0x57000083)/BCD day /edited by junon#define rBCDMON (*(volatile unsigned char *)0x57000087)/BCD month#define rBCDYEAR (*(volatile unsigned char *)0x5700008b)/BCD

23、year#else /Little Endian#define rRTCCON (*(volatile unsigned char *)0x57000040)/RTC control#define rTICNT (*(volatile unsigned char *)0x57000044)/Tick time count#define rRTCALM (*(volatile unsigned char *)0x57000050)/RTC alarm control#define rALMSEC (*(volatile unsigned char *)0x57000054)/Alarm seco

24、nd#define rALMMIN (*(volatile unsigned char *)0x57000058)/Alarm minute#define rALMHOUR (*(volatile unsigned char *)0x5700005c)/Alarm Hour#define rALMDATE (*(volatile unsigned char *)0x57000060)/Alarm date / edited by junon#define rALMMON (*(volatile unsigned char *)0x57000064)/Alarm month#define rAL

25、MYEAR (*(volatile unsigned char *)0x57000068)/Alarm year#define rRTCRST (*(volatile unsigned char *)0x5700006c)/RTC round reset#define rBCDSEC (*(volatile unsigned char *)0x57000070)/BCD second#define rBCDMIN (*(volatile unsigned char *)0x57000074)/BCD minute#define rBCDHOUR (*(volatile unsigned cha

26、r *)0x57000078)/BCD hour#define rBCDDATE (*(volatile unsigned char *)0x5700007c)/BCD date /edited by junon#define rBCDDAY (*(volatile unsigned char *)0x57000080)/BCD day /edited by junon#define rBCDMON (*(volatile unsigned char *)0x57000084)/BCD month#define rBCDYEAR (*(volatile unsigned char *)0x57

27、000088)/BCD year#endif /RTCl 其中volatile 是C的保留字,通知編譯器,不要自動(dòng)優(yōu)化這個(gè)地址所對(duì)應(yīng)的變量值為0,因?yàn)榧拇嫫鞯闹低怯泻x的,并且是由硬件自動(dòng)來設(shè)置的.強(qiáng)制設(shè)為0可能會(huì)帶來錯(cuò)誤.l #define rRTCCON (*(volatile unsigned char *)0x57000043)/RTC control 表示取地址0x57000043對(duì)應(yīng)內(nèi)存的地址l volatile unsigned char *, volatile unsigned short *, volatile unsigned int * 表示處理對(duì)應(yīng)地址的寬度/范圍,

28、分別是1,2,4 Byte,在寄存器地址強(qiáng)制轉(zhuǎn)換成哪一種類型,取決于這一寄存器的有效位,如rRTCCON 只用到4位,轉(zhuǎn)換成一個(gè)char * 即可l 所有有寄存器用unsigned 來強(qiáng)制因?yàn)榧拇嫫骼锼形欢际怯行У臄?shù)據(jù)位.而有符號(hào)會(huì)把最高位看成符號(hào)位.這樣經(jīng)常容易產(chǎn)生錯(cuò)誤,l 用unsigned 另外要還要考慮到有符號(hào)右移位操作符號(hào)位不動(dòng),即算術(shù)右移.在底層編程往往是錯(cuò)誤的.接著可以參考CPU手冊(cè)的寄存器詳細(xì)定義(457頁),其中描述了每一位的格式.接著按程序初始化一個(gè)固定的年月日void RTC_Time_Set( void )rRTCCON = 1 ;/RTC read and writ

29、e enablerBCDYEAR = 0x05 ;/年 rBCDMON = 0x06 ;/月 rBCDDATE = 0x19 ;/日rBCDDAY = 0x02 ;/星期rBCDHOUR = 0x15 ;/小時(shí) rBCDMIN = 0x21 ;/分 rBCDSEC = 0x30 ;/秒 /1取反,表示0x11111110 ,與上rRTCCON表示把最低0位置0,其余位不變r(jià)RTCCON &= 1 ;/RTC read and write disable /置1采用或操作 /rRTCCON |= 1; 讀取時(shí)間電路void RTC_Display(void) U16 year ;U8 month

30、, day ;/ weekU8 hour, minute, second ;RTC_Time_Set() ; Uart_Printf( RTC TIME Display, press ESC key to exit !n ) ; while( Uart_GetKey() != ESC_KEY ) rRTCCON = 1 ;/RTC read and write enableyear = 0x2000+rBCDYEAR ;/年 month = rBCDMON ;/月 day = rBCDDATE ;/日/week = rBCDDAY ;/星期hour = rBCDHOUR ;/小時(shí) minute

31、 = rBCDMIN ;/分 second = rBCDSEC ;/秒rRTCCON &= 1 ;/RTC read and write disable Uart_Printf( RTC time : %04x-%02x-%02x %02x:%02x:%02xn, year, month, day, hour, minute, second );Delay( 900 ) ; 嵌入式C語言寄存器定義解釋參見寄存器定義#ifdef _BIG_ENDIAN#define rBCDSEC (*(volatile unsigned char *)0x57000070)#else從上述定義中,請(qǐng)思考,如下

32、問題l 為什么要分字節(jié)序符定義?l volatile表示什么含意?l 為什么要用無符號(hào)的數(shù)字?l 宏定義的最前面*表示什么含意?l 為什么要分字節(jié)序符定義?寄存器的地址位于一個(gè)線性空間上.但是不同字節(jié)序下,同一寄存器的地址會(huì)發(fā)生變化.這可參見CPU的手冊(cè),為了隱藏這個(gè)細(xì)節(jié),所以定義兩套.另外,我們已經(jīng)32位寄存器的各個(gè)位的固定的.不同的CPU字節(jié)序有不同結(jié)果,這樣進(jìn)行對(duì)位操作時(shí).同一個(gè)寄存值在不同字節(jié)序下,會(huì)產(chǎn)生不同位排列.因此為防止字節(jié)序?qū)拇嫫鬟M(jìn)行干擾.后面的ADS 的C代碼一般會(huì)直接采用大端字節(jié)序.在Linux下很多時(shí)候會(huì)采用移位來排除字節(jié)序的干擾.l volatile表示什么含意?vo

33、latile關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如操作系統(tǒng)、硬件或者其它線程等。遇到這個(gè)關(guān)鍵字聲明的變量,編譯器對(duì)訪問該變量的代碼就不再進(jìn)行優(yōu)化,從而可以提供對(duì)特殊地址的穩(wěn)定訪問。volatile區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。搞嵌入式的家伙們經(jīng)常同硬件、中斷、RTOS等等打交道,所有這些都要求用到volatile變量。不懂得volatile的內(nèi)容將會(huì)帶來災(zāi)難。當(dāng)要求使用volatile 聲明的變量的值時(shí),系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。如果一個(gè)變量沒有volatile

34、,編譯器會(huì)自動(dòng)進(jìn)行優(yōu)化,比如說自動(dòng)清0.如果這個(gè)整數(shù)是一個(gè)多線程,或硬件地址.這樣可能會(huì)帶來意想不到結(jié)果.Volatile的應(yīng)用場合l 存儲(chǔ)器映射的硬件寄存器通常也要加volatile說明,因?yàn)槊看螌?duì)它的讀寫都可能由不同意義,如并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)l 中斷服務(wù)程序中修改的供其它程序檢測的全局變量需要加volatile,如一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables)l 多任務(wù)環(huán)境下各任務(wù)間共享的數(shù)據(jù),如多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量 l 為什么要用無符號(hào)的數(shù)字?我們知道,數(shù)字有兩種移位,一種是算術(shù)移位,一種邏輯移位.其中前者在有符

35、號(hào)位的情況下,會(huì)對(duì)符號(hào)位做特殊處理.而且寄存器對(duì)應(yīng)就是原始位,最高位也有特定的含意.這種情況下,指定為無符號(hào)位數(shù)是了防止編譯器對(duì)最高位采用特殊算術(shù)移位.從而違反了設(shè)計(jì)者的本意.l 宏定義的最前面*表示什么含意?表示取指針的內(nèi)容,類似于 char *p=&a; *p=A,但這里不是一個(gè)變量,而且是一個(gè)常量地址.但效果是一樣的,相當(dāng)于取對(duì)應(yīng)地址的內(nèi)容.或者這個(gè)地址賦值寄存器操作因?yàn)槊總€(gè)寄存器都32位寬,因此在程序中可把寄存器的值看成一個(gè)無符號(hào)整數(shù),對(duì)寄存器的取值看成是取一個(gè)整數(shù)值,而對(duì)寄存器設(shè)置看成是對(duì)一個(gè)整數(shù)變量賦值.l 置某一位為01置第一位為0/1取反,表示0x11111110 ,與上rRT

36、CCON表示把最低0位置0,其余位不變r(jià)RTCCON &= 1 ;/RTC read and write disable 2.置第三位為0 /0x0100 取反。再與上相應(yīng)的寄存器地址 rRTCCON &= 0x4; 3假設(shè)置 12-13 bit的為0 ,則二進(jìn)制展開為 11000000000000,換算為 0x3000 rADCDAT0 &=0x3000; 4.置采用左移,或右移來置位,以置14bit為0例 rADCDAT0 &=(0x114);l 置某一位11置第一位為1/1取反,表示0x00000001 ,或上rRTCCON表示把最低0位置1,其余位不變r(jià)RTCCON |= 1 ;/RT

37、C read and write disable 2.置第三位為1 /0x0100,再或上相應(yīng)的寄存器地址 rRTCCON |= 0x4; 3假設(shè)置 12-13 bit的為1 ,則二進(jìn)制展開為 11000000000000 rADCDAT0 |=0x3000; 4.置采用左移,或右移來置位,以置14bit為1例 rADCDAT0 |=(0x114);l 取位操作。1. 假設(shè)是否判斷rADCDAT0的第14位的值。 if( rADCDAT0 & (0x0112; 以初始化一個(gè)Nand Flash 為例.#define TACLS 0x01rNFCONF = (TACLS12)|(TWRPH08)|(TWRPH14)|(00);rNFCONT = (013)|(012)|(010)|(09)|(08)|(16)|(15)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論