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