資源描述:
《基于DMA的UART發(fā)送的使用.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、基于DMA的UARTn發(fā)送的使用UART的數(shù)據(jù)發(fā)送可由MCU控制UARTTX的內(nèi)部FIFO來完成,但是在應(yīng)用中,當(dāng)串口數(shù)據(jù)包量較大時(shí),UART的發(fā)送過程會(huì)占用MCU很長(zhǎng)時(shí)間,其中大多數(shù)時(shí)間是在等待數(shù)據(jù)的傳輸完成。有時(shí)為了節(jié)省這段時(shí)間,提高M(jìn)CU的使用效率,以完成更多的數(shù)據(jù)處理,將會(huì)用到DMA控制器。當(dāng)UART的使用DMA控制器控制發(fā)送過程時(shí),MCU會(huì)將發(fā)送的控制權(quán)交給DMA硬件,從而在數(shù)據(jù)發(fā)送的時(shí)間內(nèi)去處理其它的事務(wù)。ARM的Cortex-M3系列芯片LPC176X內(nèi)部帶用8通道的DMA控制器,下面將使用這些DMA通道來實(shí)現(xiàn)UART的數(shù)據(jù)發(fā)送過程。一、DMA控制器及鏈表項(xiàng)DMA控制器允許外設(shè)
2、到存儲(chǔ)器、存儲(chǔ)器到外設(shè)、外設(shè)到外設(shè)和存儲(chǔ)器到存儲(chǔ)器之間的傳輸。每個(gè)DMA流都可以為單個(gè)源和目的提供單向串行DMA傳輸。而且DMA使用鏈表來支持分散/聚集。源和目標(biāo)數(shù)據(jù)區(qū)由一連串的鏈表來定義,每個(gè)鏈表項(xiàng)控制著一個(gè)數(shù)據(jù)塊的傳輸,將這個(gè)數(shù)據(jù)塊傳輸完畢后,選擇并裝載另一個(gè)鏈表項(xiàng)來繼續(xù)DMA操作或停止DMA流。第一個(gè)鏈表項(xiàng)需要被編程到DMA控制器的對(duì)應(yīng)通道。鏈表項(xiàng)所描述的傳輸數(shù)據(jù)包通常需要進(jìn)行一次或多次DMA突發(fā)傳輸?shù)皆O(shè)定的源或目標(biāo)。如不需要鏈表項(xiàng)分散/聚集,那么鏈表地址寄存器須設(shè)置為零。一個(gè)鏈表項(xiàng)由4個(gè)字組成,依次為源地址、目標(biāo)地址、下個(gè)鏈表項(xiàng)地址及控制字。為了方便記錄DMA鏈表內(nèi)容,設(shè)計(jì)并定義一個(gè)
3、鏈表內(nèi)容結(jié)構(gòu)體,名字記作stDMALinkListInfor;定義如下:typedef_DMA_LINK_LIST_INFOR_{unsignedshortLinkList_SrcAddress;unsignedshortLinkList_DstAddress;unsignedshortLinkList_NextListAddress;unsignedshortLinkList_ControlValue;}stDMALinkListInfor,*pstDMALinkListInfor;二、寄存器配置(I)使能外設(shè)時(shí)鐘,將PCONP寄存器中的PCGPDAM位置1。此位在復(fù)位時(shí)為0,即默認(rèn)DMA
4、被禁止,所以在應(yīng)用DMA前須先將其使能。(II)使能UnFCR中的第3位。該位為UART的DMA功能使能位,置1時(shí)使能DMA,清0后禁用DMA功能;只有在該位使能后,UART的發(fā)送和接收過程才能由DMA控制完成。(III)將寄存器DMAReqSel的第0位清零。因?yàn)镈MA的UART0TX與定時(shí)器0匹配0復(fù)用,所以需先選擇到UART0TX上。第0位為0時(shí)DMA選擇UART0TX,為1時(shí)DMA選擇MAT0.0;其它串口也需做類似選擇。三、緩存區(qū)建立(I)建立UARTn的接口數(shù)據(jù)緩存區(qū),記作UARTn_BUF(n),用來存儲(chǔ)UART串口數(shù)據(jù)包。為數(shù)據(jù)緩存區(qū)設(shè)置空緩存地址的FIFO隊(duì)列UARTn_B
5、UF_FREE_TABLE,用來存放未被數(shù)據(jù)填充占用的空數(shù)據(jù)緩存分區(qū)地址;設(shè)置已占用緩存地址的FIFO隊(duì)列UARTn_BUF_FILL_TABLE,用來存放已經(jīng)被數(shù)據(jù)填充占用的數(shù)據(jù)緩存分區(qū)地址。(II)建立N個(gè)DMAx的鏈表內(nèi)容結(jié)構(gòu)體的緩存區(qū)DMAx_LINK_LIST_INFOR_INDEX(i)(i=1,2,3,..N-1),稱作DMAx_LINK_LIST_INFOR_CACHE(i)(i=1,2,3,..N-1)。其中DMAx_LINK_LIST_INFOR_CACHE(i)的地址為四字節(jié)對(duì)齊,必須為最低兩位是0的位置。(III)建立DMAx的可用空緩存FIFO隊(duì)列,稱作DMAx_L
6、INK_LIST_FREE_TABLE,用于存儲(chǔ)N個(gè)鏈表中的空緩存區(qū)地址。當(dāng)執(zhí)行出隊(duì)操作時(shí),返回一個(gè)非NULL空緩存區(qū)地址,若取回值為NULL則說明沒有可用緩存區(qū);而執(zhí)行入隊(duì)操作時(shí),會(huì)將一個(gè)非NULL空緩存區(qū)的地址加入FIFO隊(duì)列中,執(zhí)行讀取隊(duì)列長(zhǎng)度操作時(shí),返回隊(duì)列中可用空緩存地址的數(shù)量。(IV)建立DMAx的鏈表地址FIFO隊(duì)列,記作DMAx_LINK_LIST_FILL_TABLE,用來放置占用并填充了鏈表內(nèi)容的結(jié)構(gòu)體緩存區(qū)地址。當(dāng)執(zhí)行出隊(duì)操作時(shí),返回一個(gè)非NULL已占用緩存區(qū)地址,若取回值為NULL則說明沒有可用的已占用緩存區(qū)地址;而執(zhí)行入隊(duì)操作時(shí),會(huì)將一個(gè)非NULL已占用緩存區(qū)的地址
7、加入FIFO隊(duì)列中,執(zhí)行讀取隊(duì)列長(zhǎng)度操作時(shí),返回隊(duì)列中可用的已占用緩存地址數(shù)量。(V)建立UARTnTX的地址保存FIFO隊(duì)列UART_LINK_LIST_STORE_TABLE,用于保存一次DMA發(fā)送的時(shí)所用到的DMAx_LINK_LIST_INFOR_CACHE地址。隊(duì)列容量可與DMAx_LINK_LIST_FILL_TABLE的容量相同,或根據(jù)需求設(shè)置成更小。四、UARTn的DMA數(shù)據(jù)發(fā)送UARTn的D