當(dāng)前位置:首頁 > 工業(yè)控制 > 工業(yè)控制
[導(dǎo)讀]摘要:針對大數(shù)據(jù)量的串口間通信,在常規(guī)的UART串行數(shù)據(jù)通信的基礎(chǔ)上,結(jié)合Cortex-M3微控制器中DMA控制器的作用,實(shí)現(xiàn)DMA控制的UART串口數(shù)據(jù)包收發(fā)。設(shè)計(jì)鏈表項(xiàng)緩存,最終實(shí)現(xiàn)DMA的分散/聚集模式的數(shù)據(jù)傳輸過程,主

摘要:針對大數(shù)據(jù)量的串口間通信,在常規(guī)的UART串行數(shù)據(jù)通信的基礎(chǔ)上,結(jié)合Cortex-M3微控制器中DMA控制器的作用,實(shí)現(xiàn)DMA控制的UART串口數(shù)據(jù)包收發(fā)。設(shè)計(jì)鏈表項(xiàng)緩存,最終實(shí)現(xiàn)DMA的分散/聚集模式的數(shù)據(jù)傳輸過程,主要是發(fā)送過程。提高了串行數(shù)據(jù)通信過程的MCU獨(dú)立性和MCU利用的效率。
關(guān)鍵詞:DMA;UART;鏈表項(xiàng);分散/聚集

    常規(guī)下,UART的數(shù)據(jù)收發(fā)可由MCU控制UART的內(nèi)部FIFO來完成。但具體不論是以中斷還是以查詢的形式,過程中總是會(huì)占用到MCU的時(shí)間,即便在其FIFO的最大有效利用時(shí)。這樣,在實(shí)際應(yīng)用中,當(dāng)串口數(shù)據(jù)包量較大時(shí),UART的發(fā)送過程會(huì)占用MCU很長時(shí)間,其中大多數(shù)時(shí)間可能是在一次等待數(shù)據(jù)傳輸?shù)耐瓿?。為了?jié)省這段時(shí)間,提高M(jìn)CU的使用效率,以完成更多的數(shù)據(jù)處理,將會(huì)用到DMA控制器。DMA意思是直接內(nèi)存訪問,是指不經(jīng)由CPU而直接從內(nèi)存中存取數(shù)據(jù)的數(shù)據(jù)交換模式。當(dāng)UART的使用DMA控制器控制發(fā)送過程時(shí),MCU會(huì)將發(fā)送的控制權(quán)交給DMA硬件控制器,從而在數(shù)據(jù)發(fā)送的時(shí)間中去處理其它的事務(wù)。
    本文將結(jié)合ARM的Cortex-M3內(nèi)核處理器來設(shè)計(jì)UART的DMA控制過程。Cortex-M3內(nèi)核的處理器,是ARM公司最新一代的ARMv7架構(gòu)的32位處理器。其LPC176X系列的MCU處理器內(nèi)部帶有8通道的DMA控制器。下面將使用這些DMA控制器通道來實(shí)現(xiàn)UART的數(shù)據(jù)收發(fā)過程。

1 系統(tǒng)結(jié)構(gòu)及原理
1. 1 UART控制器
    LPC176X有4路UART控制器,通過設(shè)置其波特率、停止位、數(shù)據(jù)長度等參數(shù)來完成2個(gè)UART串行口的通信,當(dāng)然外部通過電平轉(zhuǎn)換可實(shí)現(xiàn)為RS232或RS485等接口類型,這里只系統(tǒng)地用內(nèi)的部UART接口。
    硬件的連線上采用交叉互連,即一個(gè)UART接口的TX接到另一個(gè)接口的RX。軟件上傳輸?shù)臄?shù)據(jù)報(bào)文格式可由不同應(yīng)用不同設(shè)定,這里只籠統(tǒng)的稱做數(shù)據(jù)包。
1.2 DMA控制器
    LPC176X的DMA控制器允許外設(shè)到存儲(chǔ)器,存儲(chǔ)器到外設(shè),外設(shè)到外設(shè)和存儲(chǔ)器到存儲(chǔ)器之間的傳輸。每個(gè)DMA流都可以為單個(gè)源和目的提供單向串行DMA傳輸。
1.3 鏈表項(xiàng)及其標(biāo)識(shí)
    DMA控制器使用鏈表項(xiàng)(LLI)來支持分散/聚集(Scatter-gather),分散/聚集是指DMA單次傳輸可以使用不必連續(xù)的內(nèi)存空間,它的效果相當(dāng)于若干個(gè)簡單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控制器的對應(yīng)通道。鏈表項(xiàng)所描述的傳輸數(shù)據(jù)包通常需要進(jìn)行一次或多次DMA突發(fā)傳輸?shù)皆O(shè)定的源或目標(biāo)。如不需要鏈表項(xiàng)分散/聚集,那么鏈表地址寄存器須設(shè)置為零。一個(gè)鏈表的最后一個(gè)鏈表項(xiàng)也須設(shè)置為零。
    一個(gè)鏈表項(xiàng)的內(nèi)容由4個(gè)字組成,依次為源地址、目標(biāo)地址、下個(gè)鏈表項(xiàng)地址及控制字。為了方便記錄DMA鏈表內(nèi)容,設(shè)計(jì)并定義一個(gè)鏈表內(nèi)容結(jié)構(gòu)體標(biāo)識(shí),標(biāo)識(shí)名稱記作stDMALinkListInfor,定義如下:
   

2 緩存區(qū)的設(shè)計(jì)
2.1 串行數(shù)據(jù)緩存區(qū)的設(shè)計(jì)
    建立UARTn的接口數(shù)據(jù)緩存區(qū),記作UARTn_BUF(n),用來存儲(chǔ)UART串口數(shù)據(jù)包。為數(shù)據(jù)緩存區(qū)設(shè)置空緩存地址的FIFO隊(duì)列UARTn_BUF_FR EE_TABLE,用來存放未被數(shù)據(jù)填充占用的空數(shù)據(jù)緩存分區(qū)地址;設(shè)置已占用緩存地址的FIFO隊(duì)列UARTn_BUF_FILL_TABLE,用來存放已經(jīng)被數(shù)據(jù)填充占用的數(shù)據(jù)緩存分區(qū)地址。
2.2 鏈表項(xiàng)緩存區(qū)的設(shè)計(jì)
    建立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,...N-1)。其中DMAx_LINK_LIST_INFOR_CACHE(i)的地址為4字節(jié)對齊,必須為最低2位是0的位置。
2.3 空鏈表項(xiàng)地址隊(duì)列的設(shè)計(jì)
    建立DMAx的可用空緩存FIFO隊(duì)列,稱作DMAx_LINK_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ì)列長度操作時(shí),返回隊(duì)列中可用空緩存地址的數(shù)量。
2.4 已占用鏈表項(xiàng)地址隊(duì)列的設(shè)計(jì)
    建立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ū)的地址加入FIFO隊(duì)列中,執(zhí)行讀取隊(duì)列長度操作時(shí),返回隊(duì)列中可用的已占用緩存地址數(shù)量。
2.5 發(fā)送用緩存地址保存隊(duì)列的設(shè)計(jì)
    建立UARTn TX的地址保存FIFO隊(duì)列UART_LINK_LIST_STORE_TABLE,用于保存一次DMA發(fā)送的時(shí)所用到的DMAxLINK_LIST_INFOR_CACHE地址。隊(duì)列容量可與DMAx_LINK_LIST_FILL_TABLE的容量相同,或根據(jù)需求設(shè)置成更小。

3 串行通信程實(shí)現(xiàn)
3.1 關(guān)鍵寄存器設(shè)置
    1)使能外設(shè)時(shí)鐘,將PCONP寄存器中的PCGPDAM位置1。此位在復(fù)位時(shí)為0,即默認(rèn)DMA被禁止,所以在應(yīng)用DMA前須先將其使能。
    2)使能UnFCR中的第3位。該位為UART的DMA功能使能位,置1時(shí)使能DMA,清0后禁用DMA功能;只有在該位使能后,UART的發(fā)送和接收過程才能由DMA控制完成。
    3)將寄存器DMAReqSel的相應(yīng)位清零。比如第0位,因?yàn)镈MA的UART0 TX與定時(shí)器0匹配0復(fù)用,所以需先選擇到UART0 TX上。第0位為0時(shí)DMA選擇UARTX,為1時(shí)DMA選擇MAT0.0;其它串口也需做類似選擇。
3.2 串行數(shù)據(jù)發(fā)送過程實(shí)現(xiàn)
    UARTn的DMA數(shù)據(jù)發(fā)送過程如下:
    1)輪詢檢測是否有數(shù)據(jù)需要UARTn的發(fā)送,如果有則從UARTn_BUF_FREE_TABLE隊(duì)列中取出一個(gè)UARTn_BUF緩存,填充欲發(fā)送的數(shù)據(jù),然后從DMAx_LINK_LIST_FREE_TABLE隊(duì)列中取出一個(gè)DMAx_LINK_LIST_INFOR_CACHE,將UARTn_BUF的地址賦給DMAx_LINK_LIST_INFOR_CACHE的Link List_SrcAddress,并設(shè)置其LinkList_DstAddress為UnTHR的地址LinkList_NextListAddress暫為0、LinkList_Control Value為UARTn_BUF中數(shù)據(jù)大小、源和目的BURST SIZE為0、源和目的傳輸寬度的1字節(jié)、源地址自增、目標(biāo)地址不自增和Terminal Count中斷使能。最后將該DMAx_ LINK_LISTINFOR_CACHE值入隊(duì)到DMAx_LINK_LIST_FILL_TABLE隊(duì)列中。流程如圖1所示。


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


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


3.3 串行數(shù)據(jù)接收過程實(shí)現(xiàn)
    UARTn的DMA數(shù)據(jù)發(fā)送過程相對于必送過程較為簡單,在配置好相應(yīng)的寄存器和目標(biāo)緩存地址后,使能相應(yīng)DMA通道。當(dāng)UART接收數(shù)據(jù)達(dá)到觸發(fā)點(diǎn)后,會(huì)觸發(fā)DMA相應(yīng)通道的突發(fā)請求進(jìn)行傳輸。傳輸結(jié)束后,在TerminalCount中斷服務(wù)中更換目標(biāo)緩存地址,使能一輪即可。當(dāng)然在
配置中,DMA通道的突發(fā)個(gè)數(shù)應(yīng)設(shè)置與UART接收FIFO觸發(fā)點(diǎn)數(shù)相同。

4 結(jié)束語
    在DMA發(fā)送進(jìn)行的過程中,UART_LINK_LIST_STORE_TABLE保存的地址值序列ADDRs中的地址所指空間不能被釋放或被其它程序占用,同樣的ADDRs中地址的源地址所指的UART緩存空間也不能被釋放或被其它程序占用。如果在這個(gè)過程中出現(xiàn)了不滿足上述要求的情況,則會(huì)出現(xiàn)不可預(yù)測的錯(cuò)誤。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉