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

視頻教學(xué)
https://www.bilibili.com/video/BV1QG411p7cw/

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

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

?DMA0對應(yīng)通道。?

DMA1對應(yīng)通道。?

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

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

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

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

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

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

DMA接收測試結(jié)果

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