版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章ARM進(jìn)階開(kāi)發(fā)3.1Flash編程3.2UART
3.3USB
3.4DMA
3.5LCD3.6MMU
3.1Flash編程
3.1.1概述
Flash是一種非易失性(Non-Volatile)內(nèi)存,在沒(méi)有電流供應(yīng)的條件下也能夠長(zhǎng)久地保持?jǐn)?shù)據(jù),它在嵌入式系統(tǒng)中的地位與PC上的硬盤(pán)類(lèi)似,用于保存系統(tǒng)運(yùn)行所需要的操作系統(tǒng)、應(yīng)用程序等。
Flash存儲(chǔ)器具有以下幾個(gè)基本特點(diǎn):
非易失性,F(xiàn)lash存儲(chǔ)器不需要后備電源來(lái)保持?jǐn)?shù)據(jù),掉電后數(shù)據(jù)不丟失。
易更新性,F(xiàn)lash存儲(chǔ)器具有電可擦除的特點(diǎn),更新數(shù)據(jù)很方便。
成本低、密度高、可靠性好。
因此,嵌入式系統(tǒng)常用Flash來(lái)存儲(chǔ)程序和數(shù)據(jù)。
1.?NANDFlash和NORFlash
NORFlash與NANDFlash是在現(xiàn)在的市場(chǎng)上兩種主要的非易失閃存技術(shù)。Intel公司于1988年首先開(kāi)發(fā)出NORFlash技術(shù),徹底改變了原先由EPROM和EEPROM一統(tǒng)天下的局面。NANDFlash則是由Toshiba公司在1989年開(kāi)發(fā)的。
NORFlash帶有SRAM接口,支持ExecuteONChip技術(shù),即程序可以直接在Flash片內(nèi)執(zhí)行。NANDFlash屬于I/O設(shè)備,需要串行的讀取數(shù)據(jù),因此需要特殊的接口來(lái)訪(fǎng)問(wèn),對(duì)處理器的要求較高。
NANDFlash與NORFlash的主要性能比較如表3-1所示。表3-1NORFlash和NANDFlash性能比較
正是由于NORFlash和NANDFlash不能同時(shí)擁有對(duì)方的優(yōu)點(diǎn),這就使得在項(xiàng)目中,有時(shí)會(huì)采取NORFlash和NANDFlash兩者并存的程序存儲(chǔ)系統(tǒng)。本書(shū)所用開(kāi)發(fā)板只選取了NANDFlash,因此本節(jié)重點(diǎn)講解NANDFlash的應(yīng)用,關(guān)于NORFlash的應(yīng)用請(qǐng)參考相關(guān)資料。
2.系統(tǒng)啟動(dòng)方式若NORFlash和NANDFlash兩個(gè)設(shè)備并存,S3C2440在上電時(shí)首先需要選擇從哪個(gè)設(shè)備啟動(dòng)程序。具體選擇是通過(guò)外部模式引腳OM1和OM0的邏輯電平來(lái)配置的,如表3-2所示。
表3-2啟動(dòng)方式選擇表從表中可以看出,OM[1:0]所決定的啟動(dòng)方式有以下幾種:
OM[1:0]=00,處理器從NANDFlash啟動(dòng)。
OM[1:0]=01,處理器從16位NORFlash啟動(dòng)。
OM[1:0]=10,處理器從32位NORFlash啟動(dòng)。
OM[1:0]=11,處理器從TestMode(測(cè)試模式)啟動(dòng)。
NORFlash可以直接連接到BANK0上作為系統(tǒng)ROM,地址空間從0x00000000~0x08000000(0~128MB),因此可以用于啟動(dòng)系統(tǒng)(S3C2440上電后,是從0x00000000地址開(kāi)始執(zhí)行)。
NANDFlash是I/O設(shè)備,作為外部存儲(chǔ)器連接到S3C2440的NANDFlash控制器上。NANDFlash沒(méi)有被分配地址空間,只能作為程序或數(shù)據(jù)的存儲(chǔ)載體,因此不能在其中直接運(yùn)行程序,若要運(yùn)行程序,必須將存儲(chǔ)內(nèi)容拷貝到RAM中運(yùn)行。
3.從NANDFlash啟動(dòng)為了支持系統(tǒng)從NANDFlash啟動(dòng)系統(tǒng),S3C2440配備了一個(gè)內(nèi)置的被映射到BANK0的BootSRAM緩沖器,叫做“Stepping-stone(進(jìn)階石)”,其地址被映射到0x00000000。當(dāng)引導(dǎo)啟動(dòng)時(shí),NANDFlash存儲(chǔ)器的前4KB將被硬件系統(tǒng)自動(dòng)加載到Stepping-stone中并且運(yùn)行加載到“Stepping-stone”的啟動(dòng)程序中。
3.1.2NANDFlash控制器
S3C2440提供了一組特殊的接口對(duì)NANDFlash進(jìn)行讀寫(xiě)操作,并利用硬件機(jī)制實(shí)現(xiàn)從NANDFlash啟動(dòng)運(yùn)行,這組接口稱(chēng)為NANDFlash控制器。
NANDFlash控制器的特性如下:
引導(dǎo)啟動(dòng),程序在復(fù)位期間被傳送到4KB的Stepping-stone中,傳送完成后,程序在Stepping-stone中執(zhí)行。
NANDFlash存儲(chǔ)器接口支持256字節(jié)、512字節(jié)、1K字節(jié)和2K字節(jié)頁(yè)。
?用戶(hù)可以直接通過(guò)軟件訪(fǎng)問(wèn)NANDFlash存儲(chǔ)器。
具有8位/16位NANDFlash存儲(chǔ)器接口總線(xiàn)。
?支持小端模式,按字節(jié)、半字、字訪(fǎng)問(wèn)數(shù)據(jù)和ECC數(shù)據(jù)寄存器。
Stepping-stone接口,支持大、小端模式的按字節(jié)、半字、字訪(fǎng)問(wèn)。
Stepping-stone的4KB內(nèi)部SRAM可以在NANDFlash引導(dǎo)啟動(dòng)后用于其他用途。下面內(nèi)容從控制器的組成和數(shù)據(jù)校驗(yàn)兩個(gè)方面介紹NANDFlash控制器的工作原理。
1.?NANDFlash控制器組成
NANDFlash控制器組成如圖3-1所示。圖3-1NANDFlash控制器方框示意圖由圖可知NANDFlash控制器由NANDFlash接口、ECC生成器、控制和狀態(tài)機(jī)、Stepping-stone控制器以及Stepping-stone組成。其中,NANDFlash接口提供給NANDFlash存儲(chǔ)器各個(gè)控制信號(hào)和數(shù)據(jù)傳輸I/O信號(hào)。NANDFlash控制器的工作流程如下:
(1)當(dāng)系統(tǒng)復(fù)位且OM[1:0]?=?00時(shí),NANDFlash控制器將通過(guò)CPU四個(gè)外部輸入引腳(NCON、GPG13、GPG14、GPG15)來(lái)獲取連接的NANDFlash信息,如芯片ID、存儲(chǔ)容量等。各各引腳對(duì)應(yīng)的NANDFlash信息如表3-3所示。
表3-3NANDFlash控制引腳配置
(2)?NANDFlash控制器自動(dòng)加載NANDFlash內(nèi)前4KB的程序代碼到Stepping-stone。
(3)在加載完成后,Stepping-stone內(nèi)的程序代碼開(kāi)始執(zhí)行。
2.數(shù)據(jù)校驗(yàn)
NANDFlash控制器除了能進(jìn)行數(shù)據(jù)的訪(fǎng)問(wèn)操作外,還可以進(jìn)行訪(fǎng)問(wèn)數(shù)據(jù)的校驗(yàn),此項(xiàng)工作由控制器內(nèi)部的ECC生成器完成。
NANDFlash的ECC(錯(cuò)誤糾正碼)生成、檢測(cè)和指示均由NANDFlash控制器的硬件支持。NANDFlash控制器由4個(gè)ECC模塊組成,兩個(gè)用于2048B的ECC奇偶校驗(yàn)碼的生成,另兩個(gè)用于16BECC奇偶校驗(yàn)碼的生成。
在NANDFlash的每一頁(yè)中有兩個(gè)區(qū),main區(qū)和spare區(qū),main區(qū)用于存儲(chǔ)正常數(shù)據(jù),spare區(qū)存儲(chǔ)其他附加信息,其中包括ECC校驗(yàn)碼。在寫(xiě)入一頁(yè)時(shí),將main區(qū)數(shù)據(jù)的ECC校驗(yàn)碼存儲(chǔ)到spare區(qū)的特定區(qū)域。在下一次讀到這一頁(yè)時(shí),同時(shí)計(jì)算ECC校驗(yàn)碼并與存儲(chǔ)在spare區(qū)的ECC校驗(yàn)碼相比較,若相同,則說(shuō)明讀取數(shù)據(jù)正確;若不同,則說(shuō)明讀取數(shù)據(jù)錯(cuò)誤。3.1.3NANDFlash控制器寄存器
通過(guò)對(duì)NANDFlash寄存器組的配置可以實(shí)現(xiàn)NANDFlash的初始化操作與訪(fǎng)問(wèn)操作。NANDFlash控制器寄存器組按功能可以分為兩部分。
1.基本操作寄存器
1)?NANDFlash配置寄存器NFCONFNFCONF寄存器是用來(lái)設(shè)置NANDFlash的時(shí)序參數(shù)TACLS、TWRPH0、TWRPH1的。TACLS為CLE/ALE有效到nWE有效之間的持續(xù)時(shí)間;TWRPH0為nWE的有效持續(xù)時(shí)間;TWRPH1為nWE無(wú)效到CLE/ALE無(wú)效之間的持續(xù)時(shí)間,這些時(shí)間都是以HCLK為單位的。設(shè)置時(shí)只需要比Flash芯片的datasheet給出的最小時(shí)間大就可以。配置寄存器的[3:0]是只讀位,用來(lái)指示外部所接的NANDFlash的配置信息,它們是由配置引腳NCON、GPG13、GPG14和GPG15所決定的。NFCONF寄存器的詳細(xì)配置如表3-4所示。
表3-4NFCONF寄存器
2)?NANDFlash控制寄存器NFCONT
NFCONT用來(lái)使能/禁止NANDFlash控制器、使能/禁止控制引腳信號(hào)nFCE、初始化ECC。NFCONT寄存器的詳細(xì)配置如表3-5所示。表3-5NFCONT寄存器
3)?NANDFlash命令寄存器NFCMMD對(duì)于不同型號(hào)的Flash,操作命令一般不同,只用到低8位[7:0]。
4)?NANDFlash地址寄存器NFADDR當(dāng)寫(xiě)這個(gè)寄存器時(shí),它將對(duì)Flash發(fā)出地址信號(hào)。只用到低8位來(lái)傳輸?shù)刂沸盘?hào),所以需要分次寫(xiě)入一個(gè)完整的32位地址。
5)?NANDFlash數(shù)據(jù)寄存器NFDATA只用到低8位,讀、寫(xiě)此寄存器將啟動(dòng)對(duì)NANDFlash的讀數(shù)據(jù)、寫(xiě)數(shù)據(jù)操作。
6)?NANDFlash操作狀態(tài)寄存器NFSTAT只用到位0,用來(lái)檢測(cè)NANDFlash設(shè)備是否準(zhǔn)備好。NFSTAT寄存器如表3-6所示。表3-6NFSTAT寄存器
2.?ECC校驗(yàn)寄存器
NANDFlash控制器寄存器中還提供了諸多有關(guān)ECC校驗(yàn)寄存器,用于管理NANDFlash的ECC校驗(yàn),例如:
NANDFlash主數(shù)據(jù)區(qū)域ECC寄存器NFMECCD0/1。
NANDFlash空閑區(qū)域ECC寄存器NFSECCD。
NANDFlashECC0/1狀態(tài)寄存器NFMECC。
NANDFlash主數(shù)據(jù)區(qū)域ECC狀態(tài)寄存器NFMECC。
NANDFlash空閑區(qū)域ECC狀態(tài)寄存器NFSECC。
NANDFlash塊地址寄存器NFSBLK及NFEBLK。3.1.4NANDFlash實(shí)例本書(shū)所配備開(kāi)發(fā)板使用的NANDFlash存儲(chǔ)器為Samsung的K9F2G08U0A,下面以此型號(hào)的Flash為例講解NANDFlash的工作原理以及S3C2440對(duì)NANDFlash的操作過(guò)程。
1.?K9F2G08U0A物理結(jié)構(gòu)
K9F2G08U0A主要以Page(頁(yè))為單位進(jìn)行讀寫(xiě)操作,以Block(塊)為單位進(jìn)行擦除操作。每一頁(yè)中又分為main區(qū)和spare區(qū)。main區(qū)用于正常數(shù)據(jù)的存儲(chǔ),spare區(qū)用于存儲(chǔ)一些附加信息,如塊好壞的標(biāo)記、頁(yè)內(nèi)的ECC校驗(yàn)和等。K9F2G08U0A的存儲(chǔ)陣列如圖3-2所示。圖3-2K9F2G08U0A的存儲(chǔ)陣列由上圖可知,K9F2G08U0A的一頁(yè)為(2K?+?64)B,2KB表示的是main區(qū)容量,64B表示的是spare區(qū)容量,它的一塊為64頁(yè),而整個(gè)設(shè)備包括了2048個(gè)塊。這樣計(jì)算Flash一共有2112Mb容量,main區(qū)容量則有256MB(即256M?×?8b)。
2.?K9F2G08U0A與S3C2440的連接
K9F2G08U0A與S3C2440的連接如圖3-3所示。圖3-3S3C2440與K9F2G08U0A連接圖從圖中可知,S3C2440為K9F2G08U0A提供8個(gè)I/O引腳、5個(gè)使能引腳、1個(gè)狀態(tài)引腳,地址、數(shù)據(jù)和命令都是在這些使能信號(hào)的配合下,通過(guò)8個(gè)I/O引腳進(jìn)行傳輸?shù)摹8饕_的具體作用如下:
DATA0~DATA7:8個(gè)I/O口進(jìn)行命令、地址、數(shù)據(jù)的輸入/輸出。
?命令鎖存使能CLE:當(dāng)CLE為高和WE在上升沿時(shí),命令被鎖存在命令寄存器中。
?地址鎖存使能ALE:當(dāng)ALE為高和WE在上升沿時(shí),地址被鎖存在地址寄存器中。
?芯片使能nFCE與寫(xiě)使能nFWE:當(dāng)對(duì)設(shè)備寫(xiě)操作時(shí),nFCE與nFWE應(yīng)同時(shí)為低電平,數(shù)據(jù)在nFWE的上升沿被鎖存。
?讀使能nFRE信號(hào):對(duì)設(shè)備發(fā)出讀命令信號(hào)。
?就緒/忙信號(hào)RnB:判斷設(shè)備是就緒狀態(tài)還是忙狀態(tài)。K9F2G08U0A是先進(jìn)的8位NANDFlash,2K字節(jié)/頁(yè),需要5個(gè)地址周期,根據(jù)表3-3所述,S3C2440的外部引腳應(yīng)配置為NCON(高電平)、GPG13(高電平)、GPG14(高電平)、GPG15(低電平)、OM[1:0]=00。
3.?K9F2G08U0A操作訪(fǎng)問(wèn)NANDFlash時(shí),應(yīng)先傳命令,再傳地址,最后讀/寫(xiě)數(shù)據(jù),期間要檢查Flash的狀態(tài)。下面的內(nèi)容描述有關(guān)K9F2G08U0A的命令字與尋址方式。
1)命令字不同型號(hào)的Flash,操作命令各不一樣。K9F2G08U0A提供一個(gè)命令集來(lái)完成對(duì)Flash的各種操作,有的命令需要一個(gè)周期,有的需要兩個(gè)周期,如表3-7所示。表3-7K9F2G08U0A命令字在實(shí)際編程中,經(jīng)常用宏定義各個(gè)命令字,方便使用。示例代碼如下。
【示例3-1】宏定義常用命令字
#defineCMD_READ10x00//頁(yè)讀命令周期1
#defineCMD_READ20x30//頁(yè)讀命令周期2
#defineCMD_READID0x90//讀ID命令
#defineCMD_WRITE10x80//頁(yè)寫(xiě)命令周期1
#defineCMD_WRITE20x10//頁(yè)寫(xiě)命令周期2
#defineCMD_ERASE10x60//塊擦除命令周期1
2)存儲(chǔ)單元尋址
K9F2G08U0A總線(xiàn)寬度為8位,容量為256MB,需要地址線(xiàn)28根,S3C2440需要5個(gè)地址周期來(lái)訪(fǎng)問(wèn)存儲(chǔ)單元,如表3-8所示。
表3-8K9F2G08U0A地址序列由表中可以看出,前兩個(gè)地址周期訪(fǎng)問(wèn)的A0~A11為頁(yè)內(nèi)地址(0~2KB),后三個(gè)地址周期訪(fǎng)問(wèn)的A12~A28為頁(yè)地址。如果直接訪(fǎng)問(wèn)塊,地址需要從A18開(kāi)始。3)讀寫(xiě)操作
NFCMMD、NFADDR和NFDATA寄存器分別用于傳輸命令、地址和數(shù)據(jù),為了方便使用,利用宏定義實(shí)現(xiàn)Flash的讀寫(xiě)數(shù)據(jù)操作。用宏定義讀寫(xiě)32位數(shù)據(jù)和8位數(shù)據(jù)的代碼如下?!臼纠?-2】宏定義數(shù)據(jù)讀寫(xiě)#defineNF_RDDATA()(rNFDATA) //讀32位數(shù)據(jù)#defineNF_RDDATA8()(rNFDATA8) //讀8位數(shù)據(jù)#defineNF_WRDATA(data){rNFDATA=(data);} //寫(xiě)32位數(shù)據(jù)#defineNF_WRDATA8(data){rNFDATA8=(data);} //寫(xiě)8位數(shù)據(jù)
4.?K9F2G08U0A編程
S3C2440對(duì)NANDFlash只支持軟件模式的訪(fǎng)問(wèn),具體訪(fǎng)問(wèn)步驟如下:
(1)?NANDFlash初始化,設(shè)置NANDFlash配置寄存器NFCONF和控制寄存器NFCONT。
(2)若是第一次操作NANDFlash,需要復(fù)位NANDFlash(片選使能后發(fā)送命令字0xff),若不是第一次操作,直接執(zhí)行步驟3)。
(3)寫(xiě)命令字到命令寄存器NFCMMD。
(4)寫(xiě)地址到地址寄存器NFADDR。
(5)讀/寫(xiě)數(shù)據(jù)寄存器NFDATA之前,應(yīng)先通過(guò)寄存器NFSTAT[0](即RnB輸入引腳)來(lái)檢測(cè)NANDFlash是否準(zhǔn)備就緒。下述內(nèi)容用于實(shí)現(xiàn)任務(wù)描述3.D.1——實(shí)現(xiàn)NANDFlash的基本讀寫(xiě)操作,包括Flash的初始化、頁(yè)讀、頁(yè)寫(xiě)、塊擦除等。實(shí)現(xiàn)步驟如下:
1)編寫(xiě)項(xiàng)目所需要的頭文件
【描述3.D.1】include.h
#ifndef__INCLUDE_H_
#define__INCLUDE_H_
//NANDFlash控制器寄存器地址
#definerNFCONF(*(volatileunsigned*)0x4E000000)#definerNFCONT(*(volatileunsigned*)0x4E000004)#definerNFCMD(*(volatileunsigned*)0x4E000008)#definerNFADDR(*(volatileunsigned*)0x4E00000C)#definerNFCMMD(*(volatileunsigned*)0x4E000008)#definerNFDATA(*(volatileunsigned*)0x4E000010)#definerNFDATA8(*(volatileunsignedchar*)0x4E000010)#definerNFMECC0(*(volatileunsigned*)0x4E00002c)#definerNFSTAT(*(volatileunsigned*)0x4E000020)#definerNFESTAT0(*(volatileunsigned*)0x4E000024)#definerGPACON(*(volatileunsigned*)0x56000000)#definerNFMECCD0(*(volatileunsignedlong*)0x4E000014)#definerNFMECCD1(*(volatileunsignedlong*)0x4E000018)#definerNFSECCD(*(volatileunsignedlong*)0x4E00001C)#definerNFSECC(*(volatileunsignedlong*)0x4E000034)#defineTACLS 1//7 //1-clk(0ns)#defineTWRPH0 4//7 //3-clk(25ns)#defineTWRPH1 1//7 //1-clk(10ns)//TACLS+TWRPH0+TWRPH1>=50ns#defineU32unsignedint#defineU16unsignedshort#defineS32int#defineS16shortint#defineU8unsignedchar#define S8char#defineTRUE1#defineFALSE0#defineOK1#defineFAIL0#endif2)編寫(xiě)啟始代碼init.s【描述3.D.1】init.sIMPORTmainAREAReset,CODE,READONLYPRESERVE8ENTRYldrr13,=0x31000000bmain;進(jìn)入main函數(shù)ldrpc,=0x30000000END
3)編寫(xiě)NANDFlash功能子程序nand.c
nand.c子程序中實(shí)現(xiàn)了操作命令宏定義,實(shí)現(xiàn)了設(shè)備初始化函數(shù)NF_Init(?)、復(fù)位函數(shù)rNF_Reset(?)、讀設(shè)備ID函數(shù)rNF_ReadID(?)、整頁(yè)讀函數(shù)rNF_ReadPage(?)、整頁(yè)寫(xiě)函數(shù)rNF_WritePage()、塊擦除函數(shù)rNF_EraseBlock(?)、隨機(jī)寫(xiě)函數(shù)rNF_RamdomRead(?)、隨機(jī)讀函數(shù)rNF_RamdomWrite(?)。其具體代碼如下:【描述3.D.1】nand.c#include"include.h"#defineCMD_READ10x00//頁(yè)讀命令周期1#defineCMD_READ20x30 //頁(yè)讀命令周期2#defineCMD_READID0x90 //讀ID命令#defineCMD_WRITE10x80//頁(yè)寫(xiě)命令周期1#defineCMD_WRITE20x10//頁(yè)寫(xiě)命令周期2#defineCMD_ERASE10x60//塊擦除命令周期1#defineCMD_ERASE20xd0//塊擦除命令周期2#defineCMD_STATUS0x70//讀狀態(tài)命令#defineCMD_RESET0xff //復(fù)位#defineCMD_RANDOMREAD10x05//隨意讀命令周期1#defineCMD_RANDOMREAD20xE0//隨意讀命令周期2#defineCMD_RANDOMWRITE0x85 //隨意寫(xiě)命令#definerNFDATA8(*(volatileunsignedchar*)0x4E000010)#defineNF_CMD(data){rNFCMD=(data);}//傳輸命令#defineNF_ADDR(addr){rNFADDR=(addr);}//傳輸?shù)刂?defineNF_RDDATA()(rNFDATA) //讀32位數(shù)據(jù)#defineNF_RDDATA8()(rNFDATA8) //讀8位數(shù)據(jù)#defineNF_WRDATA(data){rNFDATA=(data);}//寫(xiě)32位數(shù)據(jù)#defineNF_WRDATA8(data){rNFDATA8=(data);}//寫(xiě)8位數(shù)據(jù)#defineNF_nFCE_L(){rNFCONT&=~(1<<1);}#defineNF_CE_L()NF_nFCE_L() //打開(kāi)NANDFlash片選#defineNF_nFCE_H(){rNFCONT|=(1<<1);}#defineNF_CE_H()NF_nFCE_H() //關(guān)閉NANDFlash片選#defineNF_RSTECC(){rNFCONT|=(1<<4);} //復(fù)位ECC#defineNF_MECC_UnLock(){rNFCONT&=~(1<<5);} //解鎖main區(qū)ECC#defineNF_MECC_Lock(){rNFCONT|=(1<<5);} //鎖定main區(qū)ECC#defineNF_SECC_UnLock(){rNFCONT&=~(1<<6);} //解鎖spare區(qū)ECC#defineNF_SECC_Lock(){rNFCONT|=(1<<6);} //鎖定spare區(qū)ECC#defineNF_WAITRB(){while(!(rNFSTAT&(1<<0)));} //等待NANDFlash不忙#defineNF_CLEAR_RB(){rNFSTAT|=(1<<2);} //清除RnB信號(hào)#defineNF_DETECT_RB(){while(!(rNFSTAT&(1<<2)));} //等待RnB信號(hào)變高,即不忙U8ECCBuf[20];U8rNF_IsBadBlock(U32block);U8rNF_MarkBadBlock(U32block);voiddelay(U32n){ U32i=0;
for(i=0;i<n;i++);}//初始化NANDFlash控制器voidNF_Init(void){//配置芯片引腳PIN17~22第二功能
rGPACON=(rGPACON&~(0x3f<<17))|(0x3f<<17);//TACLS=1、TWRPH0=2、TWRPH1=0,8位IO,
rNFCONF=(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
//非鎖定,屏蔽NANDFlash中斷,初始化ECC及鎖定main區(qū)和spare區(qū)ECC,使能NANDFlash //片選及控制器
rNFCONT=(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1) |(1<<0);}//復(fù)位操作,在NANDFlash第一次操作,首先要進(jìn)行復(fù)位操作,選中設(shè)備后,發(fā)送命令字0xFFstaticvoidrNF_Reset(){
NF_CE_L();//打開(kāi)NANDFlash片選
NF_CLEAR_RB();//清除RnB信號(hào)
NF_CMD(CMD_RESET); //寫(xiě)入復(fù)位命令
NF_DETECT_RB();//等待RnB信號(hào)變高,即不忙
NF_CE_H();//關(guān)閉NANDFlash片選}//讀取K9F2G08U0A芯片IDcharrNF_ReadID(){ charpMID=0;
charpDID;
charcyc3,cyc4,cyc5;
NF_nFCE_L(); //打開(kāi)NANDFlash片選
NF_CLEAR_RB(); //清RnB信號(hào)
NF_CMD(CMD_READID); //讀ID命令
NF_ADDR(0x0); //寫(xiě)0x00地址//讀5個(gè)周期的ID //pMID=NF_RDDATA(); //廠(chǎng)商ID:0xEC //pDID=NF_RDDATA(); //設(shè)備ID:0xDA //cyc3=NF_RDDATA(); //0x10 //cyc4=NF_RDDATA(); //0x95 //cyc5=NF_RDDATA(); //0x44 pMID=NF_RDDATA8(); //廠(chǎng)商ID:0xEC
pDID=NF_RDDATA8(); //設(shè)備ID:0xDA cyc3=NF_RDDATA8(); //0x10 cyc4=NF_RDDATA8(); //0x95 cyc5=NF_RDDATA8(); //0x44 NF_nFCE_H(); //關(guān)閉NANDFlash片選
return(pDID);}//整頁(yè)讀,讀操作是以頁(yè)為單位進(jìn)行的,在寫(xiě)入讀命令的兩個(gè)周期之間寫(xiě)入要讀取的頁(yè)地址,然后讀取數(shù)據(jù)U8rNF_ReadPage(U32page_number,U8*buf){ U32i,mecc0,secc;
NF_RSTECC(); //復(fù)位ECC NF_MECC_UnLock(); //解鎖main區(qū)ECC NF_nFCE_L(); //打開(kāi)NANDFlash片選
NF_CLEAR_RB(); //清RnB信號(hào)NF_CMD(CMD_READ1); //頁(yè)讀命令周期1 //寫(xiě)入5個(gè)地址周期
NF_ADDR(0x00); //列地址A0~A7 NF_ADDR(0x00); //列地址A8~A11 NF_ADDR((page_number)&0xff); //行地址A12~A19 NF_ADDR((page_number>>8)&0xff); //行地址A20~A27
NF_ADDR((page_number>>16)&0xff); //行地址A28 NF_CMD(CMD_READ2); //頁(yè)讀命令周期2 NF_DETECT_RB(); //等待RnB信號(hào)變高,即不忙
//讀取一頁(yè)數(shù)據(jù)內(nèi)容
for(i=0;i<2048;i++) {buf[i]=NF_RDDATA8();
} NF_MECC_Lock(); //鎖定main區(qū)ECC值
NF_SECC_UnLock(); //解鎖spare區(qū)ECC //讀spare區(qū)的前4個(gè)地址內(nèi)容,即第2048~2051地址,這4個(gè)字節(jié)為main區(qū)的ECC mecc0=NF_RDDATA();
//把讀取到的main區(qū)的ECC校驗(yàn)碼放入NFMECCD0/1的相應(yīng)位置內(nèi)
rNFMECCD0=((mecc0&0xff00)<<8)|(mecc0&0xff);
rNFMECCD1=((mecc0&0xff000000)>>8)|((mecc0&0xff0000)>>16);NF_SECC_Lock(); //鎖定spare區(qū)的ECC值
//繼續(xù)讀spare區(qū)的4個(gè)地址內(nèi)容,即第2052~2055地址,其中前2個(gè)字節(jié)為spare區(qū)的ECC值
secc=NF_RDDATA();
//把讀取到的spare區(qū)的ECC校驗(yàn)碼放入NFSECCD的相應(yīng)位置內(nèi)
rNFSECCD=((secc&0xff00)<<8)|(secc&0xff);
NF_nFCE_H(); //關(guān)閉NANDFlash片選
//判斷所讀取到的數(shù)據(jù)是否正確
if((rNFESTAT0&0xf)==0x0) return0x66; //正確
else return0x44; //錯(cuò)誤}//整頁(yè)寫(xiě),在兩個(gè)寫(xiě)命令周期之間分別寫(xiě)入頁(yè)地址和數(shù)據(jù)U8rNF_WritePage(U32page_number,U8*buf){ U32i,mecc0,secc;
U8stat,temp;
temp=rNF_IsBadBlock(page_number>>6); //判斷該塊是否為壞塊
if(temp==0x33) return0x42;
//是壞塊,返回
NF_RSTECC(); //復(fù)位ECC NF_MECC_UnLock(); //解鎖main區(qū)的ECC NF_nFCE_L(); //打開(kāi)NANDFlash片選
NF_CLEAR_RB(); //清RnB信號(hào)
NF_CMD(CMD_WRITE1); //頁(yè)寫(xiě)命令周期1 //寫(xiě)入5個(gè)地址周期
NF_ADDR(0x00); //列地址A0~A7 NF_ADDR(0x00); //列地址A8~A11
NF_ADDR((page_number)&0xff); //行地址A12~A19 NF_ADDR((page_number>>8)&0xff); //行地址A20~A27
NF_ADDR((page_number>>16)&0xff); //行地址A28//寫(xiě)入一頁(yè)數(shù)據(jù)
for(i=0;i<2048;i++) { //NF_WRDATA8((char)(i+6));
NF_WRDATA8(buf[i]);
} NF_MECC_Lock(); //鎖定main區(qū)的ECC值
mecc0=rNFMECC0; //讀取main區(qū)的ECC校驗(yàn)碼//把ECC校驗(yàn)碼由字型轉(zhuǎn)換為字節(jié)型,并保存到全局變量數(shù)組ECCBuf中
ECCBuf[0]=(U8)(mecc0&0xff);
ECCBuf[1]=(U8)((mecc0>>8)&0xff);
ECCBuf[2]=(U8)((mecc0>>16)&0xff);
ECCBuf[3]=(U8)((mecc0>>24)&0xff);NF_SECC_UnLock(); //解鎖spare區(qū)的ECC //把main區(qū)的ECC值寫(xiě)入到spare區(qū)的前4個(gè)字節(jié)地址內(nèi),即第2048~2051地址
for(i=0;i<4;i++) { NF_WRDATA8(ECCBuf[i]);
} NF_SECC_Lock(); //鎖定spare區(qū)的ECC值
secc=rNFSECC; //讀取spare區(qū)的ECC校驗(yàn)碼
//把ECC校驗(yàn)碼保存到全局變量數(shù)組ECCBuf中ECCBuf[4]=(U8)(secc&0xff);
ECCBuf[5]=(U8)((secc>>8)&0xff);
//把spare區(qū)的ECC值繼續(xù)寫(xiě)入到spare區(qū)的第2052~2053地址內(nèi)
for(i=4;i<6;i++) { NF_WRDATA8(ECCBuf[i]);
} NF_CMD(CMD_WRITE2); //頁(yè)寫(xiě)命令周期2 delay(1000); //延時(shí)一段時(shí)間,以等待寫(xiě)操作完成
NF_CMD(CMD_STATUS); //讀狀態(tài)命令
//判斷狀態(tài)值的第6位是否為1,即是否在忙,該語(yǔ)句的作用與NF_DETECT_RB();相同 do { stat=NF_RDDATA8();
}while(!(stat&0x40));
NF_nFCE_H(); //關(guān)閉NANDFlash片選
//判斷狀態(tài)值的第0位是否為0,為0則寫(xiě)操作正確,否則錯(cuò)誤
if(stat&0x1) { temp=rNF_MarkBadBlock(page_number>>6); //標(biāo)注該頁(yè)所在的塊為壞塊
if(temp==0x21) return0x43; //標(biāo)注壞塊失敗
else return0x44; //寫(xiě)操作失敗
} else return0x66; //寫(xiě)操作成功}//NANDFlash的擦除操作是以塊為單位進(jìn)行的,因此在寫(xiě)地址周期時(shí),只需要寫(xiě)3個(gè)行周期,從A18開(kāi)始寫(xiě)起U8rNF_EraseBlock(U32block_number){
charstat,temp;
temp=rNF_IsBadBlock(block_number); //判斷該塊是否為壞塊
if(temp==0x33) return0x42; //是壞塊,返回
NF_nFCE_L(); //打開(kāi)片選NF_CLEAR_RB(); //清RnB信號(hào)
NF_CMD(CMD_ERASE1); //擦除命令周期1 //寫(xiě)入3個(gè)地址周期,從A18開(kāi)始寫(xiě)起
NF_ADDR((block_number<<6)&0xff); //行地址A18~A19 NF_ADDR((block_number>>2)&0xff); //行地址A20~A27
NF_ADDR((block_number>>10)&0xff); //行地址A28
NF_CMD(CMD_ERASE2); //擦除命令周期2 delay(1000); //延時(shí)一段時(shí)間
NF_CMD(CMD_STATUS); //讀狀態(tài)命令
//判斷狀態(tài)值的第6位是否為1,即是否在忙,該語(yǔ)句的作用與NF_DETECT_RB();相同
do {
stat=NF_RDDATA8();
}while(!(stat&0x40));
NF_nFCE_H();//關(guān)閉NANDFlash片選
//判斷狀態(tài)值的第0位是否為0,為0則擦除操作正確,否則錯(cuò)誤
if(stat&0x1) { temp=rNF_MarkBadBlock(block_number>>6);//標(biāo)注該塊為壞塊
if(temp==0x21) return0x43;//標(biāo)注壞塊失敗
else return0x44;//擦除操作失敗
} else return0x66;//擦除操作成功}//隨機(jī)讀U8rNF_RamdomRead(U32page_number,U32add){ NF_nFCE_L();//打開(kāi)NANDFlash片選
NF_CLEAR_RB();//清RnB信號(hào)
NF_CMD(CMD_READ1);//頁(yè)讀命令周期1 //寫(xiě)入5個(gè)地址周期
NF_ADDR(0x00);//列地址A0~A7 NF_ADDR(0x00);//列地址A8~A11NF_ADDR((page_number)&0xff); //行地址A12~A19 NF_ADDR((page_number>>8)&0xff); //行地址A20~A27 NF_ADDR((page_number>>16)&0xff); //行地址A28 NF_CMD(CMD_READ2); //頁(yè)讀命令周期2 NF_DETECT_RB();//等待RnB信號(hào)變高,即不忙 NF_CMD(CMD_RANDOMREAD1); //隨意讀命令周期1 //頁(yè)內(nèi)地址
NF_ADDR((char)(add&0xff));//列地址A0~A7 NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11 NF_CMD(CMD_RANDOMREAD2); //隨意讀命令周期2 returnNF_RDDATA8();//讀取數(shù)據(jù)}//隨機(jī)寫(xiě)U8rNF_RamdomWrite(U32page_number,U32add,U8dat){ U8temp,stat;
NF_nFCE_L(); //打開(kāi)NANDFlash片選
NF_CLEAR_RB(); //清RnB信號(hào)
NF_CMD(CMD_WRITE1); //頁(yè)寫(xiě)命令周期1 //寫(xiě)入5個(gè)地址周期
NF_ADDR(0x00); //列地址A0~A7 NF_ADDR(0x00); //列地址A8~A11 NF_ADDR((page_number)&0xff); //行地址A12~A19
NF_ADDR((page_number>>8)&0xff); //行地址A20~A27 NF_ADDR((page_number>>16)&0xff); //行地址A28 NF_CMD(CMD_RANDOMWRITE); //隨意寫(xiě)命令
//頁(yè)內(nèi)地址
NF_ADDR((char)(add&0xff)); //列地址A0~A7 NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11 NF_WRDATA8(dat);//寫(xiě)入數(shù)據(jù)
NF_CMD(CMD_WRITE2);//頁(yè)寫(xiě)命令周期2 delay(1000);//延時(shí)一段時(shí)間
NF_CMD(CMD_STATUS); //讀狀態(tài)命令 //判斷狀態(tài)值的第6位是否為1,即是否在忙,該語(yǔ)句的作用與NF_DETECT_RB();相同
do{ stat=NF_RDDATA8();
}while(!(stat&0x40));
NF_nFCE_H();//關(guān)閉NANDFlash片選
//判斷狀態(tài)值的第0位是否為0,為0則寫(xiě)操作正確,否則錯(cuò)誤 if(stat&0x1) return0x44;//失敗
else return0x66; //成功}4)編寫(xiě)主函數(shù)主函數(shù)用于測(cè)試nand.c的設(shè)備操作的函數(shù)?!久枋?.D.1】main.cintmain(void){ U8*buf=(U8*)0x30001000;
U8stat;
NF_Init(); //初始化
NF_Reset(); //復(fù)位設(shè)備
rNF_ReadID(); //讀NANDFlashID rNF_writePage(64,buf);//寫(xiě)取0頁(yè)內(nèi)容到buf區(qū)
rNF_ReadPage(64,buf);//讀取0頁(yè)內(nèi)容到buf區(qū)
}在MDK下將程序編譯后運(yùn)行,在主函數(shù)的讀寫(xiě)函數(shù)中設(shè)置斷點(diǎn),可以實(shí)現(xiàn)將SDRAM中某一地址空間內(nèi)容寫(xiě)入到NANDFlash某一塊中,之后再讀出到SDRAM中的另一地址空間,查看兩部分?jǐn)?shù)據(jù)是否一致。3.2UART
在嵌入式系統(tǒng)中,經(jīng)常用UART來(lái)進(jìn)行CPU與外圍設(shè)備的通信,UART是一種異步串行通信,例如,工業(yè)中常用的RS-232、RS-485通信以及現(xiàn)在電子設(shè)備上常用的USB,在本質(zhì)上都是串行通信。本節(jié)將主要講解UART的原理以及S3C2440UART的使用方法。
3.2.1概述在計(jì)算機(jī)的數(shù)據(jù)通信中,經(jīng)常會(huì)用到以下幾個(gè)基本術(shù)語(yǔ):并行:數(shù)據(jù)各位同時(shí)進(jìn)行傳輸。串行:數(shù)據(jù)逐位進(jìn)行傳輸。全雙工:收/發(fā)可同時(shí)進(jìn)行(串行通信)。半雙工:收/發(fā)不可同時(shí)進(jìn)行(串行通信)。異步串行通信:以字符為單位進(jìn)行傳輸。同步串行通信:以數(shù)據(jù)塊為單位進(jìn)行傳輸。波特率:?jiǎn)挝粫r(shí)間內(nèi)傳輸?shù)奈粩?shù)。
UART,即通用異步收發(fā)傳輸器(UniversalAsynchronousReceive/Transmitter),是一種通用串行數(shù)據(jù)總線(xiàn),用于異步通信,可實(shí)現(xiàn)全雙工發(fā)送和接收。不僅可以實(shí)現(xiàn)嵌入式系統(tǒng)之間的通信,還可以實(shí)現(xiàn)與PC之間的通信。
UART以位傳輸,傳輸過(guò)程為,發(fā)送數(shù)據(jù)時(shí),CPU將并行數(shù)據(jù)先存放到UART發(fā)送寄存器中,再通過(guò)FIFO(先進(jìn)先出隊(duì)列)傳送到串行設(shè)備;接收數(shù)據(jù)時(shí),UART先將串行字符匯集到UART接收緩存區(qū)中,CPU再進(jìn)行讀取接收寄存器數(shù)據(jù)。兩個(gè)端口之間的通信,以幀為數(shù)據(jù)傳輸單位,一個(gè)幀由一組具有完整意義的位組成,例如開(kāi)始位、數(shù)據(jù)位、校驗(yàn)位、停止位。依據(jù)通信協(xié)議,比特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)位這幾個(gè)參數(shù)必須匹配。一個(gè)典型的UART傳輸數(shù)據(jù)幀(使用1個(gè)開(kāi)始位,7個(gè)數(shù)據(jù)位,1個(gè)校驗(yàn)位,2個(gè)停止位)如圖3-4所示。圖3-4典型UART傳輸數(shù)據(jù)幀兩個(gè)UART端口全雙工方式通信時(shí),最簡(jiǎn)單的三線(xiàn)連線(xiàn)方式如圖3-5所示。
圖3-5UART連線(xiàn)圖其中:
Txd用于發(fā)送數(shù)據(jù)。
Rxd用于接收數(shù)據(jù)。
Gnd用于為雙方提供參考電平。
UART為標(biāo)準(zhǔn)的TTL/CMOS邏輯電平(0~5V或0~3.3V等),為了增強(qiáng)數(shù)據(jù)的傳輸能力,增長(zhǎng)數(shù)據(jù)的傳輸長(zhǎng)度,通常把TTL/CMOS電平通過(guò)電平轉(zhuǎn)換芯片(例如Max232等)轉(zhuǎn)換為RS-232邏輯電平(3V~12V表示0,-3V~-12V表示1)。3.2.2S3C2440UART
S3C2440中的UART有3個(gè)獨(dú)立的UART通道,其主要特性如下:基于DMA或基于中斷操作的RxD0、TxD0、RxD1、TxD1、RxD2、TxD2。
UART通道0、通道1、通道2帶有IrDA1.0和64BFIFO。
UART通道0、通道1帶nRTS0、nCTS0、nRTS1、nCTS1。支持握手發(fā)送/接收功能。
UART由波特率發(fā)生器、發(fā)送器、接收器和控制單元組成。如圖3-6所示。圖3-6S3C2440UART組成圖其中:波特率發(fā)生器可以由PCLK、FCLK/n或UEXTCLK(外部輸入時(shí)鐘)時(shí)鐘驅(qū)動(dòng)。發(fā)送器和接收器各包含64BFIFO和數(shù)據(jù)移位器。在非FIFO模式下,傳輸數(shù)據(jù)不使用FIFO緩存,而是一個(gè)字節(jié)一個(gè)字節(jié)地傳輸,即FIFO深度為1。發(fā)送數(shù)據(jù),發(fā)送FIFO中數(shù)據(jù)時(shí),在發(fā)送前先復(fù)制數(shù)據(jù)到發(fā)送移位器,再通過(guò)TxDn發(fā)出。接收數(shù)據(jù),接收移位器接收RxDn上的數(shù)據(jù)并復(fù)制到接收FIFO中。
S3C2440UART的操作需要設(shè)置的參數(shù)有波特率、數(shù)據(jù)幀格式以及傳輸方式。
1.波特率每個(gè)UART的波特率發(fā)生器為發(fā)送器和接收器提供串行時(shí)鐘。波特率值根據(jù)UART波特率分頻寄存器UBRDIVn的分頻系數(shù)計(jì)算,時(shí)鐘源可以是S3C2440A的系統(tǒng)時(shí)鐘也可以是外部時(shí)鐘。計(jì)算公式如下:【示例3-3】波特率為115200b/s,UART時(shí)鐘為40MHz,計(jì)算UBRDIVn的值。
2.數(shù)據(jù)幀
S3C2440的每個(gè)UART在發(fā)送和接收數(shù)據(jù)時(shí),都支持可編程數(shù)據(jù)幀,即可由1個(gè)起始位,5個(gè)~8個(gè)數(shù)據(jù)位,1個(gè)可選奇偶位,1個(gè)~2個(gè)停止位組成。數(shù)據(jù)幀是由UART行控制寄存器ULCONn指定。
3.傳輸方式
UART可以通過(guò)查詢(xún)方式、中斷方式和DMA方式實(shí)現(xiàn)數(shù)據(jù)的傳輸。查詢(xún)方式,在主程序的循環(huán)體內(nèi)不斷查詢(xún)UART端口,當(dāng)有數(shù)據(jù)來(lái)時(shí),就接收數(shù)據(jù);當(dāng)有數(shù)據(jù)發(fā)送時(shí),就發(fā)送數(shù)據(jù)。其示例代碼如下?!臼纠?-4】查詢(xún)方式實(shí)現(xiàn)數(shù)據(jù)發(fā)送操作{ while(1){ if(發(fā)送狀態(tài)==可發(fā)送)
執(zhí)行數(shù)據(jù)發(fā)送操作;
}}【示例3-5】查詢(xún)方式實(shí)現(xiàn)數(shù)據(jù)接收操作{ while(1){ if(接收狀態(tài)==有數(shù)據(jù)到達(dá))
執(zhí)行數(shù)據(jù)接收操作;
}}
中斷方式,UART的發(fā)送和接收就是一個(gè)中斷源,在主程序循環(huán)體內(nèi)并不執(zhí)行數(shù)據(jù)傳輸程序,而只在中斷服務(wù)程序內(nèi)進(jìn)行。
DMA方式,DMA硬件自動(dòng)實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)移,CPU幾乎不用干涉。
4.?UART寄存器
UART傳輸數(shù)據(jù)時(shí),需要設(shè)置多個(gè)參數(shù),諸如波特率、數(shù)據(jù)幀格式等,這都通過(guò)UART相關(guān)寄存器的配置來(lái)實(shí)現(xiàn)。
1)?UART分頻寄存器UBRDIVn
UBRDIVn的[15:0]用來(lái)設(shè)置分頻值,從而計(jì)算出傳輸波特率。
2)?UART線(xiàn)路控制寄存器ULCONn
ULCONn寄存器用來(lái)設(shè)置數(shù)據(jù)幀格式、是否是紅外傳輸、奇偶檢驗(yàn)、停止位個(gè)數(shù)及字長(zhǎng)度等。寄存器配置如表3-9所示。
表3-9ULCONn寄存器
3)?UART控制寄存器UCONn
UCONn寄存器用來(lái)選擇UART時(shí)鐘源、設(shè)置UART中斷方式,寄存器的具體配置如表3-10所示。表3-10UCONn寄存器續(xù)表
4)?UARTTx/Rx狀態(tài)寄存器UTRSTATn
UTRSTATn寄存器用來(lái)描述數(shù)據(jù)是否已經(jīng)發(fā)送完畢、是否已經(jīng)接收到數(shù)據(jù)。寄存器內(nèi)容如表3-11所示。表3-11UTRSTATn寄存器
5)?UART錯(cuò)誤寄存器UERSTATn
UERSTATn寄存器用來(lái)表示在接收狀態(tài)時(shí),各種錯(cuò)誤是否發(fā)生。錯(cuò)誤狀態(tài)如表3-12所示。表3-12UERSTATn寄存器
6)?UART發(fā)送緩存寄存器UTXHn
CPU將數(shù)據(jù)寫(xiě)入這個(gè)寄存器,UART將會(huì)將它保存到緩沖區(qū)中并自動(dòng)發(fā)送出去。
7)?UART接收緩存寄存器URXHn當(dāng)UART接收到數(shù)據(jù)時(shí),CPU讀取此寄存器,即可獲得數(shù)據(jù)。
8)其他寄存器
UFCONn寄存器、UFSTATn寄存器,UFCONn寄存器用于設(shè)置是否使用FIFO,設(shè)置各FIFO的觸發(fā)閾值,即發(fā)送FIFO中有多少個(gè)數(shù)據(jù)時(shí)產(chǎn)生中斷、接收FIFO中有多少個(gè)數(shù)據(jù)時(shí)產(chǎn)生中斷,并且可以通過(guò)設(shè)置UFCONn寄存器來(lái)復(fù)位各個(gè)FIFO。讀取UFSTATn寄存器可以知道各個(gè)FIFO是否已滿(mǎn),以及其中有多少個(gè)數(shù)據(jù)。
UMCONn寄存器、UMSTATn寄存器,這兩類(lèi)寄存器用于流量控制,本書(shū)不做介紹。3.2.3UART編程
UART編程一般遵循以下步驟:
(1)?I/O初始化,即設(shè)置UART相應(yīng)的I/O功能為UART功能。
(2)?UART設(shè)備初始化,設(shè)置UBRDIVn、ULCONn、UCONn等寄存器,用于設(shè)置波特率、傳輸格式、選擇UART時(shí)鐘、中斷方式等。
(3)接收、發(fā)送數(shù)據(jù),進(jìn)行數(shù)據(jù)處理。下述內(nèi)容用于實(shí)現(xiàn)任務(wù)描述3.D.2——實(shí)現(xiàn)往串口寫(xiě)入1個(gè)字符,開(kāi)發(fā)板收到后再通過(guò)串口輸出。其實(shí)現(xiàn)步驟如下:
1)所需頭文件所需頭文件的源碼如下。
【描述3.D.2】s3c2440.h
/*WOTCHDOGregister*/
#defineWTCON (*(volatileunsignedlong*)0x53000000)
/*SDRAMregisers*/
#defineMEM_CTL_BASE 0x48000000
#defineSDRAM_BASE 0x30000000/*NANDFlashregisters*/#defineNFCONF (*(volatileunsignedint*)0x4e000000)#defineNFCMD (*(volatileunsignedchar*)0x4e000004)#defineNFADDR (*(volatileunsignedchar*)0x4e000008)#defineNFDATA (*(volatileunsignedchar*)0x4e00000c)#defineNFSTAT (*(volatileunsignedchar*)0x4e000010)/*GPIOregisters*/#defineGPBCON (*(volatileunsignedlong*)0x56000010)#defineGPBDAT
(*(volatileunsignedlong*)0x56000014)#defineGPFCON
(*(volatileunsignedlong*)0x56000050)#defineGPFDAT
(*(volatileunsignedlong*)0x56000054)#defineGPFUP
(*(volatileunsignedlong*)0x56000058)#defineGPGCON
(*(volatileunsignedlong*)0x56000060)#defineGPGDAT
(*(volatileunsignedlong*)0x56000064)#defineGPGUP
(*(volatileunsignedlong*)0x56000068)#defineGPHCON
(*(volatileunsignedlong*)0x56000070)#defineGPHDAT
(*(volatileunsignedlong*)0x56000074)#defineGPHUP
(*(volatileunsignedlong*)0x56000078)/*UARTregisters*/#defineULCON0
(*(volatileunsignedlong*)0x50000000)#defineUCON0
(*(volatileunsignedlong*)0x50000004)#defineUFCON0
(*(volatileunsignedlong*)0x50000008)#defineUMCON0
(*(volatileunsignedlong*)0x5000000c)#defineUTRSTAT0 (*(volatileunsignedlong*)0x50000010)#defineUTXH0
(*(volatileunsignedchar*)0x50000020)#defineURXH0
(*(volatileunsignedchar*)0x50000024)#defineUBRDIV0
(*(volatileunsignedlong*)0x50000028)#defineULCON1
(*(volatileunsignedlong*)0x50004000)#defineUCON1
(*(volatileunsignedlong*)0x50004004)#defineUFCON1
(*(volatileunsignedlong*)0x50004008)#defineUMCON1 (*(volatileunsignedlong*)0x5000400C)#defineUTRSTAT1
(*(volatileunsignedlong*)0x50004010)#defineUERSTAT1
(*(volatileunsignedlong*)0x50004014)#defineUFSTAT1
(*(volatileunsignedlong*)0x50004018)#defineUMSTAT1
(*(volatileunsignedlong*)0x5000401C)#defineUTXH1 (*(volatileunsignedchar*)0x50004020)#defineURXH1 (*(volatileunsignedchar*)0x50004024)#defineUBRDIV1
(*(volatileunsignedlong*)0x50004028)#defineULCON2
(*(volatileunsignedlong*)0x50008000)#defineUCON2
(*(volatileunsignedlong*)0x50008004)#defineUFCON2 (*(volatileunsignedlong*)0x50008008)#defineUMCON2 (*(volatileunsignedlong*)0x5000800C)#defineUTRSTAT2 (*(volatileunsignedlong*)0x50008010)#defineUERSTAT2 (*(volatileunsignedlong*)0x50008014)#defineUFSTAT2 (*(volatileunsignedlong*)0x50008018)#defineUTXH2 (*(volatileunsignedchar*)0x50008020)#defineURXH2 (*(volatileunsignedchar*)0x50008024)#defineUBRDIV2 (*(volatileunsignedlong*)0x50008028)/*interruptregistes*/#defineSRCPND (*(volatileunsignedlong*)0x4A000000)#defineINTMOD (*(volatileunsignedlong*)0x4A000004)#defineINTMSK (*(volatileunsignedlong*)0x4A000008)#definePRIORITY (*(volatileunsignedlong*)0x4A00000c)#defineINTPND (*(volatileunsignedlong*)0x4A000010)#defineINTOFFSET (*(volatileunsignedlong*)0x4A000014)#defineSUBSRCPND (*(volatileunsignedlong*)0x4A000018)#defineINTSUBMSK (*(volatileunsignedlong*)0x4A00001c)/*externalinterruptregisters*/#defineEINTMASK (*(volatileunsignedlong*)0x560000a4)#defineEINTPEND (*
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職(紡織技術(shù)基礎(chǔ))紡織工藝階段測(cè)試試題及答案
- 2025年高職烹調(diào)工藝與營(yíng)養(yǎng)(菜品研發(fā))試題及答案
- 2025年中職第一學(xué)年(會(huì)展禮儀)VIP客戶(hù)接待禮儀階段測(cè)試試題及答案
- 2025年高職衛(wèi)生檢驗(yàn)技術(shù)(衛(wèi)生檢驗(yàn)應(yīng)用)試題及答案
- 2025年中職中國(guó)影視作品鑒賞(國(guó)產(chǎn)劇賞析)試題及答案
- 2025年高職第二學(xué)年(會(huì)展策劃)活動(dòng)策劃專(zhuān)項(xiàng)測(cè)試試題及答案
- 2025年中職建設(shè)工程管理(工程安全管理)試題及答案
- 2025年大學(xué)生物(細(xì)胞結(jié)構(gòu)與功能)試題及答案
- 2025年高職編導(dǎo)(編導(dǎo)基礎(chǔ))試題及答案
- 2025年高職(旅游管理)旅游學(xué)基礎(chǔ)試題及答案
- 酒店物業(yè)管理合同范本
- 醫(yī)療質(zhì)量改進(jìn)中文書(shū)書(shū)寫(xiě)能力提升路徑
- 血乳酸在急危重癥應(yīng)用的專(zhuān)家共2026
- STM32G4入門(mén)與電機(jī)控制實(shí)戰(zhàn)
- 2025年中共深圳市龍華區(qū)委黨校博士后公開(kāi)招聘(廣東)筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- (12)普通高中技術(shù)與工程課程標(biāo)準(zhǔn)日常修訂版(2017年版2025年修訂)
- 2025年個(gè)人個(gè)人工作總結(jié)工作總結(jié)模版(2篇)
- (完整文本版)新概念英語(yǔ)第一冊(cè)單詞表默寫(xiě)版1-144
- 教育技術(shù)學(xué)課件
- 前列腺癌診治教學(xué)查房課件
- 《公路橋涵養(yǎng)護(hù)規(guī)范》(5120-2021)【可編輯】
評(píng)論
0/150
提交評(píng)論