1、問題背景
客戶的 UI 應(yīng)用使用了橫屏,但在某個(gè)場景中需要使用豎屏顯示,因此客戶想通過逆時(shí)針 90 度旋轉(zhuǎn)圖形,即將 framebuffer 部分內(nèi)容進(jìn)行旋轉(zhuǎn)后顯示。目前客戶使用軟件來進(jìn)行旋轉(zhuǎn),但效率較低,希望借助 DMA 來完成旋轉(zhuǎn)操作。
2、解決辦法
客戶使用了 RGB565 格式,在 STM32H750 芯片上,用軟件方式,已經(jīng)通過兩層循環(huán)實(shí)現(xiàn)圖像的旋轉(zhuǎn):
原始像素?cái)?shù)據(jù)在內(nèi)存上是連續(xù)的,經(jīng)過旋轉(zhuǎn)后,原始像素?cái)?shù)據(jù)在目的內(nèi)存的位置已經(jīng)全部不連續(xù),因此即使使用 DMA 搬運(yùn)數(shù)據(jù),也只能每次傳輸少量數(shù)據(jù),無法有效利用DMA burst 傳輸提升效率,但能釋放 CPU 算力,讓 CPU 處理其它事務(wù)。
3、小結(jié)
經(jīng)過上述代碼的測試可知,STM32H7 MDMA 與 STM32U5 GPDMA 都能實(shí)現(xiàn)圖像旋轉(zhuǎn) 90 度的功能。而 H7 使用 MDMA+LinkedList 方式會根據(jù)圖像大小,使用不同LinkedList Node 數(shù)量,會占用一定的內(nèi)存資源。而 U5 GPMDA 擁有 2D 尋址能力,能較容易實(shí)現(xiàn)此功能,并且不會占用額外內(nèi)存。以上介紹的是通過 DMA 實(shí)現(xiàn)圖像旋轉(zhuǎn),如果 MCU 內(nèi)部有 GPU2D,如 STM32H7R/S,STM32U59/A/F/G 系列等,則可以通過GPU2D 實(shí)現(xiàn)圖像的硬件旋轉(zhuǎn)。