GD32F303固件庫開發(fā)(9)----USART通過DMA收發(fā)
@TOC
概述
本章主要配置printf進行打印。 查閱手冊可以得知,PA9、PA10為串口0的輸出和輸入口。需要樣片的可以加Qun申請:615061293。?

視頻教學
https://www.bilibili.com/video/BV1QG411p7cw/

csdn課程
課程更加詳細。?https://download.csdn.net/course/detail/37144
樣品申請
https://www.wjx.top/vm/wFGhGPF.aspx#
硬件準備
這里準備了1塊開發(fā)板進行驗證,分別是GD32303C_START開發(fā)板。?

DMA
DMA 控制器提供了一種硬件的方式在外設和存儲器之間或者存儲器和存儲器之間傳輸數(shù)據(jù),而無需 CPU 的介入,從而使 CPU 可以專注在處理其他系統(tǒng)功能上。DMA 控制器有 12 個通道(DMA0 有 7 個通道,DMA1 有 5 個通道)。每個通道都是專門用來處理一個或多個外設的存儲器訪問請求的。DMA 控制器內(nèi)部實現(xiàn)了一個仲裁器,用來仲裁多個 DMA 請求的優(yōu)先級。 DMA 控制器和 Cortex?-M4 內(nèi)核共享系統(tǒng)總線。當 DMA 和 CPU 訪問同樣的地址空間時,DMA 訪問可能會阻擋 CPU 訪問系統(tǒng)總線幾個總線周期。總線矩陣中實現(xiàn)了循環(huán)仲裁算法來分配 DMA 與 CPU 的訪問權,它可以確保 CPU 得到至少一半的系統(tǒng)總線帶寬。 主要特性:
傳輸數(shù)據(jù)長度可編程配置,最大到 65536;
12 個通道,并且每個通道都可配置(DMA0 有 7 個通道,DMA1 有 5 個通道);
AHB 和 APB 外設,片上閃存和 SRAM 都可以作為訪問的源端和目的端;
每個通道連接固定的硬件 DMA 請求;
支持軟件優(yōu)先級(低、中、高、極高)和硬件優(yōu)先級(通道號越低,優(yōu)先級越高);
存儲器和外設的數(shù)據(jù)傳輸寬度可配置:字節(jié),半字,字;
存儲器和外設的數(shù)據(jù)傳輸支持固定尋址和增量式尋址;
支持循環(huán)傳輸模式;
支持外設到存儲器,存儲器到外設,存儲器到存儲器的數(shù)據(jù)傳輸;
每個通道有 3 種類型的事件標志和獨立的中斷;
支持中斷的使能和清除。?

?DMA0對應通道。?

DMA1對應通道。?

keil配置
microlib 進行了高度優(yōu)化以使代碼變得很小。 它的功能比缺省 C 庫少,并且根本不具備某些 ISO C 特性。 某些庫函數(shù)的運行速度也比較慢,如果要使用printf(),必須開啟。

定義發(fā)送數(shù)據(jù)
使能串口
串口重定向
串口重定向后就可以使用printf進行打印。
發(fā)送DMA初始化
在DMA初始化的時候,可以將需要發(fā)送的數(shù)據(jù)填充在memory_addr中,注意需要填上長度number。
使能DMA發(fā)送
開啟DMA0_3通道,這個通道位串口0的TX。
dma_flag_get()函數(shù)說明
dma_flag_get()函數(shù)功能是獲取DMAx通道y標志位狀態(tài)。 主要的輸入?yún)?shù)有4個。?

?在GD303固件庫中,使用DMA_INTF_FTFIF和DMA_FLAG_FTF是一樣的。?

DMA發(fā)送測試代碼
DMA發(fā)送測試結(jié)果

DMA循環(huán)發(fā)送
修改代碼。
修改為。
結(jié)果如下。

定義接收數(shù)組
接收DMA初始化
在DMA初始化的時候,可以將需要接收的數(shù)據(jù)填充在memory_addr中,注意需要填上長度number。
使能串口空閑中斷
當接收完數(shù)據(jù)之后,會進入空閑中斷。
USART0_IRQHandler()函數(shù)
定義串口的中斷服務函數(shù),當DMA接收完畢會進入。
最后
以上的代碼會在Q_qun里分享。Qqun:615061293。 或者關注『記帖』,持續(xù)更新文章和學習資料!?

DMA接收測試結(jié)果

?由于不是循環(huán)接收,當接收長度超過數(shù)組的長度,就會照成數(shù)據(jù)混亂。 解決辦法可以增加接受數(shù)組的長度或者設用循環(huán)接收,但是循環(huán)接收會覆蓋之前接收到的數(shù)據(jù)。
DMA循環(huán)接收
修改代碼。
修改為
結(jié)果如下。?
