999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于DMA控制器的UART串行通信設計

2012-09-26 02:26:08胡曉楠
電子設計工程 2012年6期

張 為,胡曉楠,王 曄

(華北計算機系統工程研究所 北京 100083)

常規下,UART的數據收發可由MCU控制UART的內部FIFO來完成。但具體不論是以中斷還是以查詢的形式,過程中總是會占用到MCU的時間,即便在其FIFO的最大有效利用時。這樣,在實際應用中,當串口數據包量較大時,UART的發送過程會占用MCU很長時間,其中大多數時間可能是在一次等待數據傳輸的完成。為了節省這段時間,提高MCU的使用效率,以完成更多的數據處理,將會用到DMA控制器。DMA意思是直接內存訪問,是指不經由CPU而直接從內存中存取數據的數據交換模式。當UART的使用DMA控制器控制發送過程時,MCU會將發送的控制權交給DMA硬件控制器,從而在數據發送的時間中去處理其它的事務。

本文將結合ARM的Cortex-M3內核處理器來設計UART的DMA控制過程。Cortex-M3內核的處理器,是ARM公司最新一代的ARMv7架構的32位處理器。其LPC176X系列的MCU處理器內部帶有8通道的DMA控制器。下面將使用這些DMA控制器通道來實現UART的數據收發過程。

1 系統結構及原理

1.1 UART控制器

LPC176X有4路UART控制器,通過設置其波特率、停止位、數據長度等參數來完成2個UART串行口的通信,當然外部通過電平轉換可實現為RS232或RS485等接口類型,這里只系統地用內的部UART接口。

硬件的連線上采用交叉互連,即一個UART接口的TX接到另一個接口的RX。軟件上傳輸的數據報文格式可由不同應用不同設定,這里只籠統的稱做數據包。

1.2DMA控制器

LPC176X的DMA控制器允許外設到存儲器,存儲器到外設,外設到外設和存儲器到存儲器之間的傳輸。每個DMA流都可以為單個源和目的提供單向串行DMA傳輸[1]。

1.3 鏈表項及其標識

DMA控制器使用鏈表項(LLI)來支持分散/聚集(Scattergather),分散/聚集是指DMA單次傳輸可以使用不必連續的內存空間,它的效果相當于若干個簡單DMA過程的串連[2]。在分散/聚集模式下,源和目標數據區由一連串的鏈表來定義,每個鏈表項控制著一個數據塊的傳輸,將這個數據塊傳輸完畢后,選擇并裝載另一個鏈表項來繼續DMA操作或停止DMA流。第一個鏈表項需要被編程到DMA控制器的對應通道。鏈表項所描述的傳輸數據包通常需要進行一次或多次DMA突發傳輸到設定的源或目標。如不需要鏈表項分散/聚集,那么鏈表地址寄存器須設置為零。一個鏈表的最后一個鏈表項也須設置為零。

一個鏈表項的內容由4個字組成,依次為源地址、目標地址、下個鏈表項地址及控制字。為了方便記錄DMA鏈表內容,設計并定義一個鏈表內容結構體標識,標識名稱記作stDMALinkListInfor[3],定義如下:

2 緩存區的設計

2.1 串行數據緩存區的設計

建立UARTn的接口數據緩存區,記作UARTn_BUF(n),用來存儲UART串口數據包。為數據緩存區設置空緩存地址的FIFO隊列UARTn_BUF_FREE_TABLE,用來存放未被數據填充占用的空數據緩存分區地址;設置已占用緩存地址的FIFO隊列UARTn_BUF_FILL_TABLE,用來存放已經被數據填充占用的數據緩存分區地址[4]。

2.2 鏈表項緩存區的設計

建立N個DMAx的鏈表內容結構體的緩存區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)的地址為4字節對齊,必須為最低2位是0的位置。

2.3 空鏈表項地址隊列的設計

建立DMAx的可用空緩存FIFO隊列,稱作DMAx_LINK_LIST_FREE_TABLE,用于存儲N個鏈表中的空緩存區地址。當執行出隊操作時,返回一個非NULL空緩存區地址,若取回值為NULL則說明沒有可用緩存區;而執行入隊操作時,會將一個非NULL空緩存區的地址加入FIFO隊列中,執行讀取隊列長度操作時,返回隊列中可用空緩存地址的數量。

2.4 已占用鏈表項地址隊列的設計

建立DMAx的鏈表地址FIFO隊列,記作DMAx_LINK_LIST_FILL_TABLE,用來放置占用并填充了鏈表內容的結構體緩存區地址。當執行出隊操作時,返回一個非NULL已占用緩存區地址,若取回值為NULL則說明沒有可用的已占用緩存區地址;而執行入隊操作時,會將一個非NULL已占用緩存區的地址加入FIFO隊列中,執行讀取隊列長度操作時,返回隊列中可用的已占用緩存地址數量。

2.5 發送用緩存地址保存隊列的設計

建立UARTnTX的地址保存FIFO隊列UART_LINK_LIST_STORE_TABLE,用于保存一次DMA發送的時所用到的DMAx_LINK_LIST_INFOR_CACHE地址。隊列容量可與DMAx_LINK_LIST_FILL_TABLE的容量相同,或根據需求設置成更小。

3 串行通信程實現

3.1 關鍵寄存器設置

1)使能外設時鐘,將PCONP寄存器中的PCGPDAM位置1。此位在復位時為0,即默認DMA被禁止,所以在應用DMA前須先將其使能。

2)使能UnFCR中的第3位。該位為UART的DMA功能使能位,置1時使能DMA,清0后禁用DMA功能;只有在該位使能后,UART的發送和接收過程才能由DMA控制完成。

3)將寄存器DMAReqSel的相應位清零。比如第0位,因為DMA的UART0 TX與定時器0匹配0復用,所以需先選擇到UART0 TX上。第0位為0時DMA選擇UART0 TX,為1時DMA選擇MAT0.0;其它串口也需做類似選擇。

3.2 串行數據發送過程實現

UARTn的DMA數據發送過程如下:

1)輪詢檢測是否有數據需要UARTn的發送,如果有則從UARTn_BUF_FREE_TABLE隊列中取出一個UARTn_BUF緩存,填充欲發送的數據,然后從DMAx_LINK_LIST_FREE_TABLE隊列中取出一個DMAx_LINK_LIST_INFOR_CACHE,將UARTn_BUF的地址賦給DMAx_LINK_LIST_INFOR_CACHE的LinkList_SrcAddress, 并 設 置 其LinkList_DstAddress為UnTHR的地址,LinkList_NextListAddress暫為 0、LinkList_Control Value為UARTn_BUF中數據大小、源和目的BURST SIZE為0、源和目的傳輸寬度的1字節、源地址自增、目標地址不自增和Terminal Count中斷使能。最后將該DMAx_LINK_LIST_INFOR_CACHE值入隊到DMAx_LINK_LIST_FILL_TABLE隊列中[5-6]。 流程如圖1所示。

圖1 輪詢檢測過程Fig.1 Polling detection process

2)設置定時器UART_DMA_TX_TIMER,定時值為Ts,即每T秒定時器UART_DMA_TX_TIMER發生一次中斷。中斷服務為檢查DMAx_LINK_LIST_FILL_TABLE的隊列長度L,判斷是否有可用的鏈表地址。如果有,則執行出隊操作取出一個緩存地址 FILL_CACHE_0,將 其入隊到UART_LINK_LIST_STORE_TABLE中。然后利用其中的源地址、目標地址和ControlValue值,將其分配給DMA通道x的相應寄存器。 若L>1, 則再取出一個地址, 入隊到UART_LINK_LIST_STORE_TABLE,將其值賦給 DMAx的LLI寄存器。如果仍有可用鏈表地址,則取出,入隊到UART_LINK_LIST_STORE_TABLE,將其值賦給上一個鏈表地址中的LinkList_NextListAddress,然后依次類似操作,直到最一個取出后,將其LinkList_Next-ListAddress賦為0。若L=1,則將DMAx的LLI寄存器的值置為0。最后設置DMAx的Config寄存器,設置內容有目標外設為UART_TX、傳送類型為MEMORY TO PERIPHERAL、不屏避Terminal Count中斷、DMAx通道使能,啟動DMAx傳輸。流程如圖2所示。

圖2 定時器發送過程Fig.2 Timer sending process

3)DMAx傳輸完成產生Terminal Count中斷,在其中斷服務程序中取出FIFO隊列UART_LINK_LIST_STORE_TABLE中保存的地址ADDR,將ADDR中的源地址入隊到UARTn空緩存隊列,然后將ADDR值填充到DMAx的可用空緩存FIFO隊列DMAx_LINK_LIST_FREE_TABLE中。流程如圖3所示。

3.3 串行數據接收過程實現

圖3 DMA結束過程Fig.3 DMA finishing process

UARTn的DMA數據發送過程相對于必送過程較為間單,在配置好相應的寄存器和目標緩存地址后,使能相應DMA通道。當UART接收數據達到觸發點后,會觸發DMA相應通道的突發請求進行傳輸。傳輸結束后,在Terminal Count中斷服務中更換目標緩存地址,使能一輪即可。當然在配置中,DMA通道的突發個數應設置與UART接收FIFO觸發點數相同。

4 結束語

在DMA發送進行的過程中,UART_LINK_LIST_STORE_TABLE保存的地址值序列ADDRs中的地址所指空間不能被釋放或被其它程序占用,同樣的ADDRs中地址的源地址所指的UART緩存空間也不能被釋放或被其它程序占用。如果在這個過程中出現了不滿足上述要求的情況,則會出現不可預測的錯誤。

[1]宋巖.ARM Cortex-M3權威指南[M].北京:北京航空航天大學出版社,2009.

[2]NXP Semiconductors.LPC17XX User manual[EB/OL].[2010-08].http://www.nxp.com.

[3]譚浩強.C程序設計[M].北京:清華大學出版社,1991.

[4]Reek K A.C和指針[M].北京:人民郵電出版社,2008.

[5]沈建華.ARM嵌入式系統開發-軟件設計與優化[M].北京:北京航空航天大學出版社,2005.

[6]趙亮,候國銳.單片機C語言編程與實例[M].北京:人民郵電出版社,2003.

主站蜘蛛池模板: 欧美另类第一页| 一区二区无码在线视频| a级毛片一区二区免费视频| 色欲色欲久久综合网| 亚洲综合国产一区二区三区| 一区二区三区国产精品视频| 一本大道香蕉中文日本不卡高清二区 | 国产小视频免费观看| 91成人在线观看| 蝌蚪国产精品视频第一页| 狼友视频国产精品首页| 91亚洲视频下载| 欧美日韩国产在线观看一区二区三区| 一级毛片在线免费视频| 国产乱人伦精品一区二区| 国产在线无码av完整版在线观看| 18禁不卡免费网站| 国产免费人成视频网| 亚洲av无码片一区二区三区| 粉嫩国产白浆在线观看| 人人看人人鲁狠狠高清| av手机版在线播放| 欧美三級片黃色三級片黃色1| 国产日韩精品欧美一区喷| 97视频精品全国在线观看| 亚洲青涩在线| 亚洲一区二区约美女探花| 亚洲国产欧洲精品路线久久| 最新无码专区超级碰碰碰| 久草网视频在线| 欧美日本在线观看| 一区二区三区四区日韩| 制服丝袜一区| 91久久国产成人免费观看| 在线观看免费黄色网址| 国产乱子伦视频在线播放| 亚洲色欲色欲www网| 午夜视频在线观看区二区| 亚洲精品福利视频| 最新午夜男女福利片视频| 99热这里只有精品国产99| 国产亚洲精| 青草娱乐极品免费视频| 三区在线视频| 国产精品视频导航| 一级成人a毛片免费播放| 亚洲福利一区二区三区| 亚洲最大福利网站| AV片亚洲国产男人的天堂| 一边摸一边做爽的视频17国产 | 中国国产一级毛片| 国产女人18毛片水真多1| 98超碰在线观看| 久久a级片| 91久久偷偷做嫩草影院免费看| 午夜毛片免费观看视频 | 国产亚洲现在一区二区中文| 日韩 欧美 小说 综合网 另类| 亚洲一级色| 2020久久国产综合精品swag| 日韩精品视频久久| 国产一区免费在线观看| 国产av剧情无码精品色午夜| 中文字幕亚洲精品2页| 国产情精品嫩草影院88av| 国产成人精品视频一区二区电影 | 免费一级全黄少妇性色生活片| 一本视频精品中文字幕| 精品国产一区二区三区在线观看 | 欧美一区中文字幕| 国产成人精品亚洲日本对白优播| 成人毛片在线播放| 欧美成人看片一区二区三区| 午夜天堂视频| 在线国产91| 在线观看亚洲天堂| 中文成人在线视频| 色综合天天视频在线观看| 中文字幕在线一区二区在线| 伊人久久婷婷| 国产一在线观看| 久久精品国产国语对白|