基於DMA的UART通訊 for 44B0

來源:互聯網
上載者:User

文章首先介紹了UART通訊時常採用的查詢接收方式、中斷接收方式的缺點,介紹了S3C44B0X處理器中通過UART口,採用DMA方式接收資料的方法以及關鍵的代碼,並分析了採用DMA方式比採用中斷方式與查詢方式的優點。實驗證明,基於DMA的UART通訊,為CPU進一步減輕了負擔,提高了通訊的可靠性。

 

 

 

 High efficiency UART communication based on DMA controller in ARM processor and its application

               

Abstract: Compared with polling and interrupt mode used in UART communication, giving the disadvantage of them. The paper introduced the UART and DMA controller on the S3C44B0X processor ,and give the method of receiving 
data by communication based on UART and DMA. analyzing the benefit of DMA method compared with the interrupt and polling method. The experiment give the proof that the UART base on DMA saving much time for CPU and further increasing the communication efficiency.

 

 

1、引言

由於UART串列口的廣泛應用,在傳統的8位和16位的處理器以及32位處理器中,一般都帶有UART串列口。傳統的基於UART的資料通訊中,採用的方式一般有兩種,查詢式和中斷式。查詢方式下CPU的負擔較重,浪費了處理器的能力,不能夠很好的處理其他的事件;中斷方式可以在接收到資訊或需要發送資料時產生中斷,在中斷服務程式中完成資料的接收與發送。相對於查詢方式,中斷方式的CPU利用率要高。在CPU任務簡單的系統中,使用中斷方式確實是一種好方法。但是在複雜的系統中,比如移動機器人,處理器需要處理串列口通訊,多個感應器資料的採集以及處理,即時軌跡的產生,運動軌跡插補以及位置閉環控制等等任務,牽扯到多個中斷的優先順序分配問題。為了保證資料發送與接收的可靠性,需要把UART的中斷優先順序設計較高,但是系統可能還有其他的需要更高優先順序的中斷,必須保證其定時的準確,這樣就有可能造成串列通訊的中斷不能及時響應,從而造成資料丟失。為此,筆者在採用S3c44b0x設計移動機器人控制器時,為了保證串列通訊的資料及時可靠的接收,同時兼顧其它任務不受影響,採用了基於DMA和中斷方式相結合的UART串列通訊方式。DMA是Direct
Memory Access的縮寫,意思是“儲存空間直接存取”,它是一種高速的資料轉送操作,允許在外部裝置和儲存空間之間直接讀/寫資料,即不通過CPU,也不需要CPU幹預。整個資料轉送操作是在一個稱作DMA控制器的控制下進行的。CPU除了在資料轉送開始和結束時做一點處理外,在傳輸過程中可以進行其他的工作。這樣,在大部分時間裡,CPU和輸入/輸出裝置都處於並行的操作狀態。其基本原理可以查閱教科書,此處不贅述。這裡僅介紹S3c44c0x的DMA控制器。

 

2、S3c44b0x中的DMA控制器和UART的特性

S3c44b0x採用ARM7TDMI核,具有4 通道的DMA控制器,並且對應有4個中斷。其中兩個DMA通道稱做ZDMA(通用DMA),串連在SSB(系統匯流排)上,另外兩個DMA通道稱做BDMA(橋DMA),串連於SSB和SPB(外設匯流排)之間的介面層。串連於SSB上的ZDMA控制器可以用於從儲存空間到儲存空間,從儲存空間到固定目標的I/O儲存空間,和從I/O 裝置到儲存空間之間的資料轉送。另外的兩個BDMA 控制器主要作用是在外部儲存空間和內部外設之間傳輸資料,這裡的I內部外設包括SIO,IIS,TIMER和UART等。BDMA與ZDMA可以通過軟體啟動,也可以通過硬體啟動。此設計中我們使用UART0,與其對應的DMA通道為BDMA0。其控制器框圖1所示。

 S3c44b0x的UART單元提供2個獨立的非同步串列I/O口,每個口均可以工作於中斷模式或者DMA模式,即UART可以產生內部插斷要求或者DMA請求,在CPU的串列I/O口之間傳送資料,支援高達115.2KBPS的傳輸速率,每個UART通道包含2個16位的分別用於發送和接收的FIFO通道。                        

 

圖1  S3C44B0X的DMA控制器框圖

 

3、   硬體電路設計

由於S3c44b0x內建支援UART的DMA控制器,所以關於DMA硬體部分不需要作任何的工作。S3C44B0X的I/O口電壓為3.3V,而PC機一端的串口採用RS232電平,所以中間要經過電平轉換,在此採用SP3232E晶片。串連電路2所示。    

            圖2 S3c44b0x UART 電平轉換電路

 

4、基於DMA和中斷相結合的通訊軟體設計

在以S3C44B0X為核心組成的移動機器人中,採用3路PWM定時器驅動3個直流電機,通用的GPIO口和A/D口串連外部的紅外和超聲以及雷射感應器,使用UART0完成與上位機(PC)的資料交換,這些資料是單向的(從上位機發送給S3c44b0x),主要是上位機傳給機器人控制器的各種命令資訊,但是命令資訊的發送時間上是不具有規律性的,即間隔時間不定。為了充分的利用CPU,減少資料丟失的風險,我們利用UART的DMA模式來完成資料的接收。軟體部分主要是針對具體的應用,對DMA控制器以及UART作適當的初始化。UART的初始化比較簡單,主要是通訊資料格式、傳輸速率等的設定,這些與其他控制器相同,只要設定相關的寄存器即可。注意UART設定成不使用自動流量控制,不使用紅外線傳輸模式,關鍵要注意UART0設定成DMA模式而不是中斷模式,並且要使能FIFO緩衝區(根據需要,使用16位元組的接收緩衝區),這樣在接收緩衝區滿時,會產生DMA請求而不是插斷要求。限於篇幅,具體的寄存器定義以及串列口的初始化不做詳悉介紹,可以參考文獻[1][2]。

DMA控制器的初始化也比較簡單,主要是相關寄存器的設定。與BDMA0相關的在本系統中用到的寄存器以及相關定義見表1,具體寄存器的名稱定義以及物理地址見參考文獻[1][2]。

表1  S3c44b0x的BDMA相關寄存器的定義

BDMA0控制寄存器BDCON0

位[5:4],DMA通道的狀態,00=準備好 ;01=還沒有終止計數;10=終止計數 ;11=N/A

位[3:2]禁止/使能外部/內部DMA請求,00=使能;其他=禁止

位[1:0]軟體命令00:無命令,在寫入其他數值CMD位將被自動清0;01:保留;10:保留;11:取消DMA操作

BDMA0 的初始化時源地址BDISRC0,

位[31:30] ,傳輸資料的尺寸,00=位元組 01=半字;10=字 11=未用

位[29:28],載入地址的方向00=N/A 01=增加;10=減少 11=內部外設(固定地址)

位[27:0],BDMA的初始化源地址

BDMA0 的初始化時目標地址BDIDES0

位[31:30],傳輸方向模式設定:00=保留;01=M2IO(從外部儲存空間到內部裝置);10=IO2M(從內部裝置到外部儲存空間);11=IO2IO(從內部裝置到內部裝置)

位[29:28],儲存地址的方向

00=N/A 01=增加

10=減少 11=內部外設(固定地址)

位[27:0],BDMAn 的初始化目標地址

 

BDMA0 的初始化時計數器寄存器BDICNT0

位[31:30],DMA請求源選擇:00=N/A 01=IIS;10=UARTn ;11=SIO

位[23:22],中斷模式設定:00=輪流檢測模式 01=N/A;10=在傳輸時發生中斷;11=終止計數時發生中斷。

位[21],在DMA 計數器達到0時是否自動重載和自動啟動。0=禁止;1=使能

位[20],DMA的硬體使能/禁止。0=禁止DMA;1=使能DMA

位[19:0],BDMA0 的傳輸計數器

                 

 

在初始化時要正確設定目標(緩衝區的)首地址、資料轉送的方向、源寄存器的首地址、地址指標是否遞增以及遞增方向、DMA計數器等等。相關代碼以及注釋如下:

#define  RAM_ADDRESS  0xc200000  //定義接收資料的緩衝區,根據硬體而定。在我們的系統中擴充的SDRAM 儲存空間從0x0C00000~0x0C7fffff,佔用S3c44b0x的bank 6。

#define  size  16  //定義DMA的計數器,根據需要設定,可以選擇的選項是4、8、2和16

char *Buf;

Buf=(unsigned char*) RAM_ADDRESS;  //指標指向起始地址

BDISRC0=(11<<28)+(int)(rURxH0);    /*以位元組為單位傳送;因為DMA操作時是將UART的 寄存器中的資料讀出放置到設定的緩衝區,所以源寄存器的地址應該是固定到;UART的接收儲存寄存器rURxH0,同時位[29:28]應該設定成0b11。*/

BDIDES0=(10<<30)+(01<<28)+ Buf); /*傳輸方向模式設定為從內部裝置(UART口)到外部儲存空間(SDRAM),目標儲存空間(SDRAM)使用地址遞增的方向,將資料順次放置到緩衝區中*/

BDICNT0=(10<<30)+(1<<26)+(3<<22)+(1<<21)+(0<<20)+size;/*設定UART0使用BDMA0通道,在DMA計數到0時自動重載和自動啟動,計數結束產生中斷,每次DMA操作移動16位元組資料到設定地緩衝區(緩衝區需要另開闢,而非BDMA目的地址,這樣便有了釋放匯流排的時間,匯流排不會被一直在佔用)。*/若發非連續資料可不設自動重裝,因為接收FIFO(或接收緩衝區)不觸發DMA,這時是不佔用匯流排的。連續資料需要考慮匯流排的佔用問題。

BDICNT0 |= (1<<20);//使能DMA

BDCON0 = 0x0<<2;//允許外部DMA請求

資料接收:這一部分工作由初始化好後的DMA控制器依靠硬體來完成。接收資料不定時,初始化UART0的接收緩衝區為16位元組,當接收緩衝區滿時,會產生DMA請求,然後在DMA控制器的控制下,將UART的接收FIFO中的16位元組的資料轉移到指定的緩衝區中(SRAM),當資料轉移完畢(DMA計數到0)後,要做兩件事情:一是自動重載和自動啟動,即自動重新設定好目標(緩衝區)首地址和源地址(UART接收寄存器)以及DMA計數器,準備好下次DMA請求;另外產生DMA中斷。DMA中斷服務程式要做的工作很簡單,只要對全域標誌RECEIVE_FLAG置位,通知主程式有新的命令需要處理。這樣主程式可以直接處理RAM中的資料,而不需要花費時間去讀取UART的接收緩衝區。                                 

資料處理:當主程式通過查詢全域標誌RECEIVE_FLAG,如果為1,則知道有新的命令,可以直接讀取命令緩衝區,同時對RECEIVE_FLAG清零。然後按照一定的演算法對接收的資料做出解析,這部分內容不做重點討論。

 

5、實驗及結論                

為了驗證基於DMA的通訊的有效性,筆者做了對比實驗。把負責軌跡插補的定時中斷優先順序設計成最高(停機時間間隔50毫秒,中斷服務程式執行時間約需要30毫秒),然後一個機器人採用中斷方式接收上位機連續發送的100組命令,另一個採用基於DMA的方式接收上位機連續發送的100組命令。然後在機器人主程式中通過讀取UART的狀態寄存器判斷出現錯誤(主要是資料溢位錯誤,即緩衝區有接收資料而沒有及時讀取,被新的資料覆蓋)的次數。軟體採用C語言,用ADS1.2編譯調試。實驗結果如表2。實驗證明了第二種方式的有效性。

表2:對比實驗結果

實驗

第1組

第2組

第3組

採用DMA方式接收命令的機器人出現資料溢位錯誤的次數

0

0

0

採用中斷方式接收命令的機器人出現資料溢位錯誤的次數

6

4

6

 

本文作者的創新點在於:在UART通訊中,通過採取DMA方式,直接將UART接收的資料轉移到設定好的RAM區,然後設定相應的全域標誌,通知主程式資料可用就可以了。開發人員不需要到UART的緩衝區中讀取資料,直接讀RAM就可以了。與採用中斷方式或者查詢方式的串列口通訊方式相比較,不僅僅可以節省CPU通訊時用於接收資料的時間,同時可以防止UART接收的資料由於沒有及時被讀取而丟失,提高了通訊的可靠性。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.