STM32 DMA的原理:寄存器配置數(shù)據(jù)搬運(yùn)的完整鏈路解析
以STM32F103為例,當(dāng)使用USART1以115200bps速率連續(xù)接收數(shù)據(jù)時(shí),若采用傳統(tǒng)輪詢方式,每接收1字節(jié)需至少5條指令(讀DR、寫內(nèi)存、增址、判數(shù)、跳轉(zhuǎn)),在72MHz主頻下耗時(shí)約200ns。表面看CPU仍有大量空閑時(shí)間,但當(dāng)需要同時(shí)處理多個(gè)高速外設(shè),如雙路ADC同步采樣、UART日志輸出、SPI Flash寫入時(shí),CPU在多個(gè)數(shù)據(jù)搬運(yùn)任務(wù)間頻繁切換,上下文保護(hù)/恢復(fù)開銷急劇上升,實(shí)時(shí)性保障徹底瓦解。而DMA(Direct Memory Access,直接存儲(chǔ)器訪問)技術(shù)的出現(xiàn),徹底改變了這一局面,它允許外設(shè)與存儲(chǔ)器之間直接進(jìn)行數(shù)據(jù)傳輸,無需CPU干預(yù),從而釋放CPU資源,提高系統(tǒng)整體效率。
DMA技術(shù)本質(zhì):從CPU卸載數(shù)據(jù)搬運(yùn)任務(wù)
DMA的核心思想是將“數(shù)據(jù)搬運(yùn)”這一確定性、重復(fù)性極強(qiáng)的任務(wù),從CPU軟件控制中剝離,交由專用硬件控制器獨(dú)立執(zhí)行。DMA控制器本質(zhì)上是一個(gè)狀態(tài)機(jī)+地址生成器+計(jì)數(shù)器+總線仲裁器的組合體。它不依賴CPU指令流,而是通過硬件邏輯直接接管AHB/APB總線,在內(nèi)存與外設(shè)之間建立直通通道。當(dāng)配置完成后,DMA僅需響應(yīng)外設(shè)發(fā)出的硬件請(qǐng)求信號(hào)(如USART_RXNE、ADC_EOC),即可自動(dòng)完成地址遞增、數(shù)據(jù)傳輸、計(jì)數(shù)減一、標(biāo)志置位等全部動(dòng)作。整個(gè)過程中CPU完全無需參與數(shù)據(jù)搬運(yùn),可專注執(zhí)行控制算法、協(xié)議解析、人機(jī)交互等高價(jià)值任務(wù)。
以STM32F107為例,當(dāng)USART1接收緩沖區(qū)滿時(shí),DMA控制器可直接從USART1_DR寄存器讀取數(shù)據(jù),并按預(yù)設(shè)步長(zhǎng)寫入SRAM指定區(qū)域,整個(gè)過程CPU僅需在傳輸完成時(shí)收到一次通知,而非每字節(jié)中斷一次。這種硬件級(jí)卸載使CPU得以專注算法處理、協(xié)議解析或用戶交互等高價(jià)值任務(wù),系統(tǒng)整體吞吐量與確定性顯著提升。據(jù)實(shí)測(cè)數(shù)據(jù)顯示,在STM32F103平臺(tái)上,使用DMA進(jìn)行USART數(shù)據(jù)接收時(shí),CPU占用率從傳統(tǒng)中斷方式的35%降低至5%以下,數(shù)據(jù)吞吐量提升3倍以上。
STM32 DMA控制器架構(gòu):雙控制器十二通道的資源組織
STM32系列MCU通常集成雙DMA控制器,以STM32F103為例,其包含DMA1(7通道)和DMA2(5通道)。這種設(shè)計(jì)并非簡(jiǎn)單的冗余堆砌,而是針對(duì)不同總線矩陣(AHB/APB)的外設(shè)訪問特性進(jìn)行的精細(xì)化分工。DMA1主要服務(wù)于APB1總線外設(shè),如USART2、I2C1、TIM2等,這些外設(shè)通常運(yùn)行在較低頻率(如36MHz),承載著對(duì)實(shí)時(shí)性要求相對(duì)寬松的通信與模擬外設(shè);DMA2則側(cè)重APB2總線外設(shè),如USART1、TIM1、ADC1等,以及部分AHB外設(shè)(如FSMC),這些外設(shè)通常運(yùn)行在系統(tǒng)主頻(如72MHz),連接著對(duì)帶寬和響應(yīng)速度要求更高的核心外設(shè)。
每個(gè)DMA通道都是完全獨(dú)立的,擁有自己的一套寄存器組,包括傳輸數(shù)量寄存器(CNDTRx)、外設(shè)地址寄存器(CPARx)、存儲(chǔ)器地址寄存器(CMARx)和控制寄存器(CCRx)。這種獨(dú)立性是實(shí)現(xiàn)多任務(wù)并發(fā)數(shù)據(jù)搬運(yùn)的前提。例如,在一個(gè)工業(yè)控制系統(tǒng)中,可以同時(shí)配置DMA1_Channel1負(fù)責(zé)ADC采樣數(shù)據(jù)的搬運(yùn),DMA1_Channel5負(fù)責(zé)USART1的數(shù)據(jù)發(fā)送,DMA2_Channel1負(fù)責(zé)SPI Flash的讀取,三者物理上同時(shí)運(yùn)行,互不搶占,從而顯著提高系統(tǒng)的實(shí)時(shí)性和數(shù)據(jù)吞吐能力。
寄存器配置:數(shù)據(jù)搬運(yùn)鏈路的精確控制
DMA的強(qiáng)大功能依賴于對(duì)寄存器的精確配置,這些寄存器共同定義了數(shù)據(jù)搬運(yùn)的完整鏈路。
地址管理:源與目標(biāo)的精準(zhǔn)定位
CPARx和CMARx寄存器分別存儲(chǔ)外設(shè)數(shù)據(jù)寄存器的物理地址和用戶數(shù)據(jù)緩沖區(qū)的起始地址。對(duì)于USART1接收,CPARx必須被設(shè)置為&USART1->DR(如0x40013804),因?yàn)檫@是外設(shè)產(chǎn)生數(shù)據(jù)的地方;而CMARx則應(yīng)指向預(yù)先在SRAM中開辟的接收緩沖區(qū),如&rx_buffer[0]。地址增量模式由CCRx寄存器中的MINC(存儲(chǔ)器增量)和PINC(外設(shè)增量)位控制。在USART接收?qǐng)鼍爸校ǔ⒂肕INC(存儲(chǔ)器地址自動(dòng)遞增),以便DMA每次傳輸后自動(dòng)更新目標(biāo)地址,實(shí)現(xiàn)連續(xù)填充緩沖區(qū);而PINC則禁用(外設(shè)地址保持不變),因?yàn)橥庠O(shè)數(shù)據(jù)寄存器(如USART1_DR)為固定地址,每次讀寫均操作同一物理位置。
數(shù)據(jù)寬度與傳輸數(shù)量:匹配外設(shè)特性
MSIZE(存儲(chǔ)器數(shù)據(jù)大小)和PSIZE(外設(shè)數(shù)據(jù)大小)位域定義了數(shù)據(jù)傳輸?shù)牧6?,支?位(Byte)、16位(Half-Word)、32位(Word)三種模式。參數(shù)選擇必須嚴(yán)格匹配外設(shè)數(shù)據(jù)寄存器的實(shí)際寬度。例如,USART_DR寄存器在8位數(shù)據(jù)格式下為8位寬,若錯(cuò)誤配置為32位傳輸,DMA將嘗試讀取4字節(jié),導(dǎo)致后續(xù)3字節(jié)被錯(cuò)誤解釋為無效數(shù)據(jù);反之,ADC規(guī)則通道數(shù)據(jù)寄存器(ADC_DR)為16位寬,配置為8位將造成高位數(shù)據(jù)丟失。傳輸數(shù)量由CNDTRx寄存器定義,其值范圍為1至65535。在傳輸過程中,該寄存器的值會(huì)隨著每一次數(shù)據(jù)項(xiàng)的成功搬運(yùn)而自動(dòng)遞減,當(dāng)其值減至0時(shí),標(biāo)志著本次傳輸?shù)耐瓿?,并可觸發(fā)相應(yīng)的中斷標(biāo)志。
傳輸模式與優(yōu)先級(jí):適應(yīng)不同應(yīng)用場(chǎng)景
DIR位選擇傳輸方向,包括外設(shè)到存儲(chǔ)器(Peripheral to Memory)、存儲(chǔ)器到外設(shè)(Memory to Peripheral)、存儲(chǔ)器到存儲(chǔ)器(Memory to Memory)三種模式。其中,“存儲(chǔ)器到存儲(chǔ)器”模式為特殊場(chǎng)景設(shè)計(jì),其啟動(dòng)不依賴外設(shè)請(qǐng)求信號(hào),而是由軟件置位EN位直接觸發(fā),常用于RAM數(shù)據(jù)塊拷貝、Flash編程前的數(shù)據(jù)預(yù)處理等場(chǎng)景。CIRC位啟用循環(huán)模式,使CNDTRx在減至0后自動(dòng)重載初始值,形成無限循環(huán)傳輸,典型應(yīng)用包括ADC連續(xù)掃描,可避免采樣丟失。優(yōu)先級(jí)配置分為軟件可編程優(yōu)先級(jí)(High/Medium/Low/Very Low)和硬件默認(rèn)優(yōu)先級(jí)(通道號(hào)越小,優(yōu)先級(jí)越高),工程師可根據(jù)系統(tǒng)實(shí)時(shí)性需求進(jìn)行精細(xì)化調(diào)控,例如將ADC采樣通道設(shè)為最高優(yōu)先級(jí)以保障數(shù)據(jù)不丟失。
實(shí)戰(zhàn)案例:USART接收的DMA配置
以STM32F103的USART1接收為例,完整的DMA配置流程如下:
時(shí)鐘使能:開啟DMA1和USART1的時(shí)鐘。
DMA通道配置:
設(shè)置CPARx為&USART1->DR,指定外設(shè)數(shù)據(jù)源。
設(shè)置CMARx為接收緩沖區(qū)地址,如&rx_buffer[0]。
配置CCRx寄存器:?jiǎn)⒂肕INC(存儲(chǔ)器地址遞增),禁用PINC(外設(shè)地址不變),設(shè)置MSIZE和PSIZE為8位(根據(jù)實(shí)際需求調(diào)整),選擇傳輸方向?yàn)橥庠O(shè)到存儲(chǔ)器,啟用傳輸完成中斷(TCIE)。
初始化CNDTRx為緩沖區(qū)大小,如100。
USART配置:?jiǎn)⒂肬SART接收DMA請(qǐng)求(DMAR位)。
啟動(dòng)DMA通道:置位CCRx中的EN位,使能通道。
配置完成后,當(dāng)USART1接收到數(shù)據(jù)時(shí),DMA控制器會(huì)自動(dòng)將數(shù)據(jù)從USART1_DR寄存器搬運(yùn)到接收緩沖區(qū),無需CPU干預(yù)。當(dāng)CNDTRx減至0時(shí),觸發(fā)傳輸完成中斷,通知CPU處理接收到的數(shù)據(jù)。
結(jié)語
DMA技術(shù)通過硬件化數(shù)據(jù)搬運(yùn)任務(wù),顯著提升了STM32系統(tǒng)的數(shù)據(jù)吞吐能力和實(shí)時(shí)性。其核心在于對(duì)寄存器的精確配置,包括地址管理、數(shù)據(jù)寬度、傳輸數(shù)量、傳輸模式和優(yōu)先級(jí)等關(guān)鍵參數(shù)。通過深入理解DMA的工作原理和寄存器配置方法,開發(fā)者可以充分利用DMA的優(yōu)勢(shì),設(shè)計(jì)出高效、可靠的嵌入式系統(tǒng),滿足各種復(fù)雜應(yīng)用場(chǎng)景的需求。





