STM32U575/585 微控制器(MCU)中嵌入的通用 DMA(GPDMA)相關(guān)。GPDMA 是一種系統(tǒng)外設(shè),是 AHB 總線上的雙端口主設(shè)備。它被用于通過(guò)鏈表在外設(shè)和/或存儲(chǔ)器之間傳輸數(shù)據(jù)。所有 GPDMA 可編程傳輸均在系統(tǒng)層面提供更高性能,并使 CPU 無(wú)需執(zhí)行這些數(shù)據(jù)傳輸任務(wù)。
本文檔的目的不是將現(xiàn)有的 GPDMA 專用章節(jié)重新編寫(xiě)到產(chǎn)品參考手冊(cè)中,而是為系統(tǒng)開(kāi)發(fā)人員提供一些以性能為導(dǎo)向的編程指南。
本文檔以 GPDMA 和可能受到 GPDMA 協(xié)助的外設(shè)的組合功能為基礎(chǔ)。本文檔聚焦于為了優(yōu)化系統(tǒng)性能和滿足應(yīng)用要求而需要考慮的所有關(guān)鍵點(diǎn)。
本應(yīng)用筆記包含關(guān)于以下內(nèi)容的原理闡述和建議:
? GPDMA 通道分配
? GPDMA 端口分配
– 對(duì)于始于存儲(chǔ)器映射源位置的傳輸
– 對(duì)于止于存儲(chǔ)器映射目標(biāo)位置的傳輸
? GPDMA 傳輸優(yōu)先級(jí)分配
? GPDMA 源/目標(biāo)突發(fā)編程,包含數(shù)據(jù)寬度和突發(fā)長(zhǎng)度
1 概述
本應(yīng)用筆記適用于 STM32U575/585 微控制器,這些微控制器是基于 Arm® Cortex®核心的器件。
提示 Arm 是 Arm Limited(或其子公司)在美國(guó)和/或其他地區(qū)的注冊(cè)商標(biāo)。
參考文檔
? 參考手冊(cè)基于 Arm®的 STM32U575/585 32 位 MCU(RM0456)
? STM32U585xx 數(shù)據(jù)手冊(cè)(DS13086)
? STM32U575xx 數(shù)據(jù)手冊(cè)(DS13737)
2 GPDMA 通用指南
2.1 GPDMA 概述
在減載 CPU 的控制下,GPDMA 控制器通過(guò)鏈表執(zhí)行存儲(chǔ)器映射外設(shè)和/或存儲(chǔ)器之間的可編程數(shù)據(jù)傳輸。
GPDMA 是雙端口 AHB 主設(shè)備和系統(tǒng)外設(shè)。大多數(shù)外設(shè)和存儲(chǔ)器都與之建立連接。在需要數(shù)據(jù)傳輸時(shí),這一點(diǎn)提供了很大的靈活性并提高了系統(tǒng)性能。鏈表是存儲(chǔ)器中程序化的數(shù)據(jù)結(jié)構(gòu),旨在讓每個(gè) GPDMA 通道為鏈接和安排DMA 數(shù)據(jù)傳輸做好準(zhǔn)備。GPDMA 有 16 個(gè)通道。
2.2 GPDMA 通道分配
用戶必須分配一個(gè)通道用于 GPDMA 傳輸。為了能夠同時(shí)處理來(lái)自源的 GPDMA 傳輸(讀訪問(wèn))和到達(dá)目標(biāo)的GPDMA 傳輸(寫(xiě)訪問(wèn)),GPDMA 對(duì)給定 GPDMA 通道使用專用 FIFO。
FIFO 單元的單位是一個(gè)字節(jié)。FIFO 的大小決定了通道能夠有效處理的最大 DMA 突發(fā)大小(突發(fā)長(zhǎng)度與數(shù)據(jù)寬度的乘積)。注意,通常突發(fā)越大,系統(tǒng)總體性能越好:更高吞吐率/帶寬傳輸,更低系統(tǒng)總線占用率。鑒于系統(tǒng)總線為 32 位字寬,建議將 DMA 源/目標(biāo)數(shù)據(jù)寬度設(shè)定為 32 位(GPDMA_CxTR1 中的 S/DDW_LOG2[1:0]),以便最大限度減少總線使用量。
如下表所示,有兩類通道,分別具有不同的 FIFO 大小和尋址模式:
? 通道 0 至 11:
– FIFO 大小為 8 字節(jié)(2 字)。
– 尋址限于線性模式:固定尋址(通常用于外設(shè)寄存器訪問(wèn))或連續(xù)數(shù)據(jù)增量尋址(通常用于存儲(chǔ)器訪問(wèn))。
? 通道 12 至 15:
– FIFO 大小為 32 字節(jié)(8 字)。
– 支持線性和二維尋址模式:二者均適用于源和目標(biāo),可設(shè)定兩個(gè)地址跳轉(zhuǎn)/偏移量:
? 每個(gè)編程突發(fā)后
? 每個(gè)編程塊后
建議將通道 0 至 11 分配用于從 AHB/APB 外設(shè)到 SRAM 的傳輸或從 SRAM 到 AHB/APB 外設(shè)的傳輸,除非存儲(chǔ)器需要二維尋址或外設(shè)是支持突發(fā)請(qǐng)求的 AHB 外設(shè)。然后,建議將突發(fā)設(shè)定為 1 字(FIFO 大小的一半),除非應(yīng)用需要處理 8 或 16 位數(shù)據(jù)寬度。
建議將通道 12 至 15 分配用于存儲(chǔ)器之間的傳輸。然后,出于性能方面的考慮,建議將突發(fā)設(shè)定為默認(rèn)的 4 字(FIFO 大小的一半)。
同樣地,將通道 12 至 15 優(yōu)先用于始于支持突發(fā)請(qǐng)求的 AHB 外設(shè),比如 OCTOSPI、HASH 和 ADC。然后,通常將始于/止于外設(shè)的半傳輸設(shè)定為突發(fā)。建議將始于/止于存儲(chǔ)器的(半)傳輸設(shè)定為 4 字突發(fā)。
對(duì)于具有更高帶寬要求的 AHB 外設(shè)的始于/止于一些外設(shè)的傳輸,同樣優(yōu)先選擇通道 12 至 15。建議將始于/止于存儲(chǔ)器的(半)傳輸也設(shè)定為 4 字突發(fā)。
2.3 GPDMA 端口選擇
用戶必須為始于源(GPDMA_CxTR1 中的 SAP)的傳輸分配一個(gè)端口,并且為止于目標(biāo)(GPDMA_CxTR1 中的DAP)的傳輸分配一個(gè)端口。在執(zhí)行下一次數(shù)據(jù)傳輸之前,會(huì)通過(guò)下一個(gè)鏈表項(xiàng)和數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)更新此分配。
關(guān)于 GPDMA 的總線拓?fù)淇煽偨Y(jié)如下(參見(jiàn)第 4 節(jié) 了解更多信息):
? GPDMA 端口 0 直接連接到 APB1 和 APB2 外設(shè),不穿過(guò) AHB 矩陣(參見(jiàn)圖 2 和圖 4)。
? AHB 矩陣的默認(rèn)從設(shè)備(參見(jiàn)圖 2 和第 4.3.2 節(jié) )為:
– GPDMA 端口 0 的 AHB1 外設(shè)(MDF、FMAC 和 CORDIC)
– GPDMA 端口 1 的 SRAM1
建議按照以下方式使用 GPDMA 的兩個(gè)主設(shè)備端口:
? 將端口 0 分配用于始于/止于外設(shè)的(半)傳輸,無(wú)論是 AHB 還是 APB 外設(shè)。將端口 1 分配用于其他(半)傳輸(分別止于/始于存儲(chǔ)器)。對(duì)于 APB1 和 APB2 外設(shè),端口 0 避免穿過(guò)互連矩陣,減少了相應(yīng)通道上的總體延遲。這也減少了互連總線矩陣包含的和之后的 AHB 總線活動(dòng)。
? 端口 1 被分配用于存儲(chǔ)器至存儲(chǔ)器的傳輸(特別是訪問(wèn) SRAM1 時(shí),但不僅限于此)。對(duì)外設(shè)使用端口 0 并對(duì)任何存儲(chǔ)器使用端口 1 的優(yōu)勢(shì)在于:
– 外設(shè)至存儲(chǔ)器和存儲(chǔ)器至外設(shè)的傳輸過(guò)程中兩個(gè)端口上的帶寬平衡
– 避免至存儲(chǔ)器的突發(fā)直接影響外設(shè)訪問(wèn)的延遲
這是針對(duì)性能的典型和推薦配置。當(dāng)然,用戶可以自由地選擇任何可以訪問(wèn)源位置的端口,以及任何可以訪問(wèn)目標(biāo)位置的端口。
當(dāng)通道未激活時(shí),GPDMA 為加載下一個(gè)鏈表項(xiàng)而分配的鏈接端口由用戶在通道層面進(jìn)行定義(GPDMA_CxCR 中的 LAP)。下一個(gè)鏈接列表項(xiàng)已準(zhǔn)備就緒并存儲(chǔ)在內(nèi)存中。然后,建議將端口 1 分配用于加載下一個(gè)鏈表項(xiàng)。
2.4 GPDMA 通道優(yōu)先級(jí)
為每個(gè)(半)傳輸分配一個(gè)優(yōu)先級(jí)值,用來(lái)與其他并發(fā)傳輸進(jìn)行競(jìng)爭(zhēng),從而使 GPDMA 仲裁器能夠在一個(gè)主設(shè)備端口上允許(半)傳輸并為其安排時(shí)間。在用戶層面,當(dāng)通道未激活時(shí),通過(guò) GPDMA_CxCR 中的 PRIO[1:0]在通道層面對(duì)此進(jìn)行準(zhǔn)備。
GPDMA 有兩個(gè)用于實(shí)現(xiàn) AHB 傳輸并行化的主設(shè)備端口??赏ㄟ^(guò)這兩個(gè)端口進(jìn)行同步傳輸。每個(gè)端口發(fā)生的GPDMA 仲裁如下:
? 16 個(gè)可能請(qǐng)求的基于 FIFO 的讀取突發(fā)之間基于優(yōu)先級(jí)的仲裁(參見(jiàn)圖 1)
? 16 個(gè)可能請(qǐng)求的基于 FIFO 的寫(xiě)入突發(fā)之間基于優(yōu)先級(jí)的仲裁(參見(jiàn)圖 1)
? 讀取和寫(xiě)入之間最終的 Round-Robin 仲裁階段
GPDMA 仲裁階段可能會(huì)為 GPDMA 引入 1 個(gè)周期的時(shí)鐘延遲,以便在分配的主端口上生成允許突發(fā)的 AHB 地址(參見(jiàn)第 2.5 節(jié) 了解更多信息)。
GPDMA 實(shí)現(xiàn)可編程仲裁邏輯,使用戶能夠根據(jù)下列規(guī)則調(diào)整通道帶寬和延遲:
? 請(qǐng)求的突發(fā)傳輸?shù)膬?yōu)先級(jí)可設(shè)定為 0 至 3。
? 用 Round-Robin 仲裁方案處理具有相同優(yōu)先級(jí)的請(qǐng)求。
? 對(duì)于時(shí)效性的請(qǐng)求,建議使用優(yōu)先級(jí) 3,因?yàn)樗酶哂?優(yōu)先級(jí) 0 至 2 的固定較高優(yōu)先級(jí)進(jìn)行處理。
? 對(duì)非時(shí)效性通道實(shí)施加權(quán) Round-Robin 分配,剩余帶寬由優(yōu)先級(jí)為 0 至 2 的請(qǐng)求共享。
? 不同的權(quán)重源自于設(shè)定的通道優(yōu)先級(jí)并呈單調(diào)性變化,隊(duì)列 0 的權(quán)重最低。
用戶需要為外設(shè)/存儲(chǔ)器連接的 GPDMA 通道分配正確的優(yōu)先級(jí),才能使該通道達(dá)到合格的服務(wù)質(zhì)量:
? 外設(shè)端無(wú)時(shí)序錯(cuò)誤(無(wú)外設(shè)寄存器下溢/上溢)
? 數(shù)據(jù)傳輸請(qǐng)求與此請(qǐng)求的履行之間的延遲可接受
? 對(duì)其他通道服務(wù)質(zhì)量的影響可接受
為了滿足應(yīng)用的時(shí)序要求,必須謹(jǐn)慎地分配通道優(yōu)先級(jí)。請(qǐng)求的基于 FIFO 的優(yōu)先級(jí) 0 到 2 的傳輸,已準(zhǔn)備好在主端口上再次調(diào)度,可能會(huì)因交換機(jī)的輪循機(jī)制仲裁服務(wù)器而延遲,并且執(zhí)行最多 15 個(gè)優(yōu)先級(jí)為 0 到 2 的并發(fā)(單/突發(fā))傳輸。這種請(qǐng)求也是任何時(shí)間敏感的請(qǐng)求所搶占的第一個(gè)請(qǐng)求。
使用來(lái)自關(guān)鍵定時(shí)器的請(qǐng)求映射的 GPDMA 通道通常會(huì)被分配給時(shí)效性隊(duì)列,因此能以最低延遲更新相關(guān)的TIMER 寄存器。相關(guān)人員可以為來(lái)自其他外設(shè)的 GPDMA 請(qǐng)求分配優(yōu)先級(jí) 2 或 1,最后可以為存儲(chǔ)器至存儲(chǔ)器的傳輸分配最低優(yōu)先級(jí) 0(盡最大努力流量)。通常可以為映射到通道 12 至 15 并具有突發(fā)功能的外設(shè)分配中間優(yōu)先級(jí)1。
為了滿足具體的應(yīng)用要求,可對(duì)這一關(guān)于通道優(yōu)先級(jí)的建議進(jìn)行調(diào)整(參見(jiàn)產(chǎn)品參考手冊(cè)了解更多關(guān)于仲裁和優(yōu)先級(jí)的信息)。
對(duì)于給定通道,在鏈表層面執(zhí)行數(shù)據(jù)傳輸。通過(guò)在存儲(chǔ)器中使用設(shè)定的鏈表數(shù)據(jù)結(jié)構(gòu),用戶可以將數(shù)據(jù)傳輸與同一通道的下一次數(shù)據(jù)傳輸串連起來(lái)。在給定鏈表項(xiàng)(LLI)的數(shù)據(jù)傳輸完成后,在執(zhí)行下一次數(shù)據(jù)傳輸之前,GPDMA自動(dòng)讀取/提取下一個(gè)鏈表數(shù)據(jù)結(jié)構(gòu),并進(jìn)行內(nèi)部的寄存器更新。與數(shù)據(jù)傳輸一樣,鏈接傳輸優(yōu)先級(jí)由其通道的分配優(yōu)先級(jí)給出。鏈接傳輸包含一系列的 32 位單次讀取(通道 0 至 11 最多 6 次單次讀取,通道 12 至 15 最多 8 次單次讀取)。在 LLI 更新的每個(gè) 32 位讀取之間,GPDMA 需要一個(gè)額外的時(shí)鐘周期用于仲裁階段。
2.5 GPDMA 突發(fā)
初步設(shè)定的數(shù)據(jù)傳輸為 GPDMA 突發(fā)(從源讀取的數(shù)據(jù)的突發(fā)或?qū)懭肽繕?biāo)的數(shù)據(jù)的突發(fā)),通過(guò)以下參數(shù)進(jìn)行定義:
? 設(shè)定的數(shù)據(jù)寬度:8、16 或 32 位(通過(guò) GPDMA_CxTR1 中的 S/DDW_LOG2[1:0])
? 設(shè)定的突發(fā)長(zhǎng)度:1 至 64(通過(guò) GPDMA_CxTR1 中的 S/DBL_1[5:0])
可以分別為源和目標(biāo)設(shè)定突發(fā)大小。
突發(fā)是一系列節(jié)拍(n = 1 至 64)。每一拍是一次數(shù)據(jù)傳輸,具有相同數(shù)據(jù)寬度。例如,4 字突發(fā)是四個(gè) 32 位字的突發(fā)。突發(fā)長(zhǎng)度為 1 的突發(fā)稱為單次。
GPDMA 發(fā)布具有設(shè)定數(shù)據(jù)寬度的節(jié)拍:GPDMA 實(shí)施永遠(yuǎn)不會(huì)修改設(shè)定數(shù)據(jù)寬度。
GPDMA 并非總是在分配的 AHB 主設(shè)備端口上發(fā)布具有設(shè)定突發(fā)長(zhǎng)度的突發(fā)。在硬件中以下列方式之一實(shí)現(xiàn)GPDMA 突發(fā):
? 在分配的主端口上具有相同的 AHB 事務(wù)
? 當(dāng)下列條件中的任何一個(gè)成立時(shí),通過(guò)一系列長(zhǎng)度更小的突發(fā)和/或單次:
– 突發(fā)大小 > FIFO 大小的一半。
– 塊大小(定義為源塊大小)不是源數(shù)據(jù)寬度的倍數(shù)。
– AHB 限制:
? 在 1 KB 地址邊界交叉點(diǎn)上
? 突發(fā)必須是 4、8 或 16 拍的增量突發(fā)
GPDMA 實(shí)施保證數(shù)據(jù)完整性(相比于編程尋址),并通過(guò)實(shí)現(xiàn)最大允許突發(fā)大小(相比于編程突發(fā))使性能最大化。
建議將 GPDMA 突發(fā)的大小設(shè)定為所分配 GPDMA 通道的 FIFO 大小的一半(通道 0 至 11 通常為 1 字突發(fā),通道12 至 15 通常為 4 字突發(fā))。
GPDMA 突發(fā)是數(shù)據(jù)的基本塊,位于固定地址或連續(xù)遞增地址。對(duì)于通道 12 至 15(支持二維尋址),可在突發(fā)后執(zhí)行第一次地址跳轉(zhuǎn)。為了獲得存儲(chǔ)器中的二維緩沖區(qū),用戶可能必須設(shè)定不同于典型 4 字突發(fā)的突發(fā)。GPDMA實(shí)現(xiàn)自動(dòng)優(yōu)化性能,并包含此設(shè)定限制。
在每個(gè)設(shè)定突發(fā)之前增加一個(gè) GPDMA 仲裁時(shí)鐘周期,前提是此突發(fā)大小小于 FIFO 大小的一半。每次數(shù)據(jù)傳輸既可以是單次數(shù)據(jù)傳輸(在每次 AHB 總線主設(shè)備上必須發(fā)送數(shù)據(jù)時(shí)執(zhí)行數(shù)據(jù)仲裁),也可以組合成突發(fā)數(shù)據(jù)傳輸以便背靠背發(fā)送少量數(shù)據(jù),在 GPDMA 單次仲裁階段后不可能發(fā)生任何 GPDMA 搶占。這樣可以最大限度縮短數(shù)據(jù)傳輸時(shí)間(總體延遲),并使吞吐率和總線效率最大化。
考慮突發(fā)(包含多個(gè)節(jié)拍/數(shù)據(jù))的傳輸?shù)闹饕獌?yōu)勢(shì)如下:
? 將 GPDMA 仲裁縮減到只有一個(gè)階段,該階段適用于按突發(fā)大小定義的所有數(shù)據(jù)。
? 突發(fā)在 GPDMA(仲裁)層面不可中斷,前提是其大小小于 FIFO 大小的一半。一組一定數(shù)量的讀取/寫(xiě)入數(shù)據(jù)的延遲縮短,可更早完成傳輸(第一拍除外)。
? 如果面向的源或目標(biāo)是內(nèi)部存儲(chǔ)器,則通過(guò) AHB 總線上的增量 AHB 突發(fā)來(lái)實(shí)現(xiàn)設(shè)定的尋址增量突發(fā)。這樣消耗的總線周期更少,還釋放了總線帶寬用于其他可能的并發(fā)主設(shè)備,或者能夠?yàn)榻o定流量/帶寬設(shè)定更低的總線頻率。
? 如果面向的源或目標(biāo)是位于固定地址并支持突發(fā)的外設(shè)寄存器(具有 FIFO 機(jī)制,如 ADC1、OCTOSPI 或哈希),由于發(fā)生過(guò)一次仲裁周期處罰,因此設(shè)定 GPDMA 4 字固定突發(fā)(在 GPDMA 仲裁后被分割成四個(gè)單次傳輸,以便與 AHB 兼容)以提高背靠背傳輸吞吐率。
如果 GPDMA 突發(fā)具有 AHB 突發(fā)事務(wù),則在執(zhí)行時(shí),會(huì)增加分配的同一 AHB 主設(shè)備端口上的其他并發(fā) GPDMA傳輸?shù)难舆t。在這段時(shí)間內(nèi),同一 GPDMA 端口上 GPDMA 請(qǐng)求的所有其他傳輸均掛起(以及所有其他計(jì)劃從同一目標(biāo)外設(shè)/存儲(chǔ)器讀取數(shù)據(jù)或向其寫(xiě)入數(shù)據(jù)的主設(shè)備)。建議通過(guò)設(shè)定通道優(yōu)先級(jí)來(lái)管理不同應(yīng)用要求,如第 2.4 節(jié) 所述。