
我這里使用STM32H563開發板來簡單演示一下DMA2D模式的應用。所謂DMA 2D模式,個人理解是DMA可以通過事先設置塊內尋址偏移量和塊尋址偏移量來動態調整DMA的尋址方式及能力。換句話說,DMA在進行數據傳輸時,塊內尋址不再總是固定相鄰存放,而是可以通過編程決定相鄰兩次傳輸時訪問數據的地址間隔。對于重復性的塊傳輸,也不再是簡單的每次從同一位置再開始,而是可以根據塊地址的偏移量調整從新開始傳輸的起始地址。
描述起來有點抽象,不妨加點看圖說話?,F在假設針對同一DMA請求發起三次【三輪】傳輸,對應3個DMA傳輸塊。【注:手機模式下圖片可放大查看】
(資料圖片僅供參考)
如上圖所示,第一次傳輸了5個紅色標示的數據【即第1塊】,按圖示進行數據訪問。第二次、第三次也類似第一次分別傳輸了5個綠色數據【即第2塊】和5個藍色數據【即第3塊】。顯然每個傳輸塊內的數據訪問規則一樣,兩兩間隔2個存儲空間。同時當第1次傳輸完成后,開啟第2次傳輸時,或者說做完第2次傳輸后開啟第3次傳輸時,起始地址都相對當前位置往后退了14個地址空間再開始。
關于DMA 2D傳輸的原理大致說到這里,供參考理解。現在依然基于上面的圖示內容,使用STM32H563的USART來具體演示DMA 2D功能。
開發板使用STM32H563ZI Nucleo板,芯片的USART3與板載STLINK的VCP相連。借助PC端的串口調試助手分批發三組數據給MCU,內容分別是5個字符R、5個字符G和5個字符B。開啟USART3 接收的DMA 2D功能。
順便提醒下,STM32H5系列的GPDMA并非所有通道都支持DMA 2D尋址功能。DMA通道是否支持2D功能在CubeMx配置界面已經寫得很分明了。使用CubeMx配置的話,選擇合適的話即可。這里我選擇GPDMA1的DMA CH6,它支持DMA 2D功能。
使用STM32CubeMx的基本配置如下:
上面配置里的重點就是那個2D尋址的配置。其實開篇也大致介紹了,這里接著進一步具體解釋?,F在是USART3DMA接收,顯然源地址是固定的,即USART3接收數據寄存器,所以這里跟源地址有關的偏移都是0。DMA訪問的目的地址是內存,是可變的。在塊內每存放1個數據則向前偏移2個位置,對應下面的Destination Address Offset值。每1塊傳輸完成后開始下一輪傳輸時,起始地址剛好回退14個位置,對應下面的Block Destination Address Offset值,回退為負,前進為正。這里一共重復做了3次塊傳輸,對應下面的Repeat counter值。
實際上,經過3輪重復的DMA塊傳輸,接收到的數據就是下圖箭頭所指的圖案樣子。
使用STM32CubeMx完成配置,添加用戶代碼即可調試驗證。需手動添加的用戶代碼主要是下面兩行:
__HAL_LINKDMA(&huart3, hdmarx, handle_GPDMA1_Channel6);
HAL_UART_Receive_DMA(&huart3,(uint8_t *)aRxBuffer, 5); //每塊【輪】接收5個數據
下面就是基于調試得到結果。通過3次獨立的DMA接收,將數據有規律地按照RGB順序存儲起來??梢越Y合下方調試結果的截圖來理解。
OK,關于STM32H563芯片DMA 2D功能的應用演示就介紹到這里。拋磚引玉,具體應用時靈活使用即可。
審核編輯:湯梓紅
標簽: