這篇應(yīng)用筆記描述了怎么使用STM32F101xx和STM32F103xx的直接內(nèi)存訪問(wèn)(DMA)控制器。STM32F101xx和STM32F103xx DMA控制器、Cortex-M3內(nèi)核、先進(jìn)的微控制器總線架構(gòu)和存儲(chǔ)系統(tǒng),是為了提供一個(gè)高的數(shù)據(jù)帶寬,并開(kāi)發(fā)響應(yīng)時(shí)間非??斓能浖_@篇文檔也描述了怎樣充分利用這些特性,以及對(duì)于不同的外設(shè)和子系統(tǒng)怎樣保證正確的響應(yīng)時(shí)間。
在下文中STM32F101xx 和STM32F103xx都記作STM32F10xxx,DMA控制器都記作DMA。
1、DMA控制器
DMA是一個(gè)AMBA先進(jìn)的高性能總線(AHB),它的特點(diǎn)是它具有兩個(gè)AHB端口:一個(gè)從端口,用于DMA編程;一個(gè)是主端口,主端口允許DMA在不同的從模塊間發(fā)起數(shù)據(jù)傳輸。
DMA允許數(shù)據(jù)傳輸在后臺(tái)傳輸,而不需要Cortex-M3處理器的干預(yù)。在這個(gè)操作中,主處理器能夠執(zhí)行其他的任務(wù)。CPU僅僅在要處理的數(shù)據(jù)塊傳輸完畢后才被中斷。大量的數(shù)據(jù)傳輸?shù)耐瑫r(shí)不會(huì)對(duì)系統(tǒng)性能產(chǎn)生大的影響。
DMA主要用來(lái)為不同的外設(shè)模塊實(shí)現(xiàn)數(shù)據(jù)緩沖存儲(chǔ)(一般存儲(chǔ)在系統(tǒng)的主存儲(chǔ)器中)。這種解決方案和分布式解決方案(每個(gè)外設(shè)需要實(shí)現(xiàn)自己當(dāng)?shù)財(cái)?shù)據(jù)存儲(chǔ))相比,無(wú)論在硅的使用和功耗上都要更勝一籌。STM32F10XXXDMA控制器充分利用了Cortex-M3 Harvard架構(gòu)和多層的總線系統(tǒng)來(lái)保障非常低的DMA數(shù)據(jù)傳輸延時(shí)和CPU執(zhí)行/中斷事件檢測(cè)/服務(wù)。
1.1 DMA的主要特性
DMA具有以下的特性:
1、7個(gè)DMA通道(channel 1到7)支持單向的從源端到目的端的數(shù)據(jù)傳輸;
2、DMA通道優(yōu)先級(jí)可通過(guò)硬件和軟件編程;
3、支持存儲(chǔ)器到存儲(chǔ)器,存儲(chǔ)器到外設(shè),外設(shè)到存儲(chǔ)器,外設(shè)到外設(shè)的數(shù)據(jù)傳輸;
4、能夠?qū)τ布?軟件傳輸進(jìn)行控制;
5、傳輸時(shí)內(nèi)存和外設(shè)指針自動(dòng)增加;
6、傳輸數(shù)據(jù)的大小可編程;
7、總線錯(cuò)誤自動(dòng)管理;
8、循環(huán)模式/非循環(huán)模式;
9、可傳輸高達(dá)65536個(gè)數(shù)據(jù)。
DMA目標(biāo)是為所有外設(shè)提供相關(guān)的大的數(shù)據(jù)緩沖區(qū),這些緩沖區(qū)一般位于系統(tǒng)的SRAM中。每一個(gè)通道在特定的時(shí)間里分配給唯一的外設(shè),連接到同一個(gè)DMA通道的外設(shè)不能夠同時(shí)使用(在DMA活躍時(shí)),所有的
連接到給定的通道的外設(shè)中只有一個(gè)能夠擁有DMA功能。
支持DMA的外設(shè)如下表, DMA服務(wù)的外設(shè)和總線系統(tǒng)結(jié)構(gòu)也在下圖中:
2、性能考慮
STM32F10xxx有兩個(gè)主模塊Cortex-M3處理器和DMA。他們通過(guò)總線矩陣連接到從總線,F(xiàn)lash Memory總線,SRAM總線和AHB系統(tǒng)總線。從總線輪流連接到兩個(gè)APB總線以服務(wù)所有的嵌入的外設(shè)(參見(jiàn)上圖)??偩€矩陣有兩個(gè)主要的特性,實(shí)現(xiàn)系統(tǒng)性能的最大化和減少延時(shí):1、循環(huán)優(yōu)先級(jí)調(diào)度;2、多層結(jié)構(gòu)和總線挪用。
2.1 循環(huán)優(yōu)先級(jí)調(diào)度
NVIC和Cortex-M3處理器實(shí)現(xiàn)了高性能低延時(shí)中斷調(diào)度。所有的Cortex-M3指令既可以在單周期內(nèi)執(zhí)行,也可以在周期級(jí)上被中斷。為了在系統(tǒng)水平上保證這個(gè)特性,DMA和總線矩陣必須確保DMA不能夠長(zhǎng)時(shí)間占用總線。循環(huán)優(yōu)先級(jí)調(diào)度能夠確保CPU能夠在任何一個(gè)周期訪問(wèn)所有的從總線。因此,第一個(gè)數(shù)據(jù)最大總線系統(tǒng)延時(shí)在CPU看來(lái),就是一個(gè)總線周期(兩個(gè)APB時(shí)鐘周期的最大值)。
2.2 多層結(jié)構(gòu)和總線挪用
多層結(jié)構(gòu)允許兩個(gè)兩個(gè)主設(shè)備并發(fā)執(zhí)行數(shù)據(jù)傳輸,只要它們尋址到不同的設(shè)備。在Cortex-M3哈佛架構(gòu),這種結(jié)構(gòu)提高了數(shù)據(jù)的并行性,因此減少了執(zhí)行時(shí)間并且優(yōu)化了DMA效率。從Flash存儲(chǔ)器取指是通過(guò)完全獨(dú)立的總線,所以DMA和CPU只是在需要通過(guò)一個(gè)給定的從總線進(jìn)行數(shù)據(jù)訪問(wèn)時(shí)才會(huì)產(chǎn)生競(jìng)爭(zhēng)。當(dāng)其他DMA控制器工作在突發(fā)模式下,STM32F10xxx DMA的數(shù)據(jù)傳輸(總線挪用)只需要單個(gè)總線周期。當(dāng)使用總線挪用存取機(jī)制時(shí),CPU等待數(shù)據(jù)的最大時(shí)間是很短的(一個(gè)總線周期)。CPU訪問(wèn)SRAM和DMA存取就是自然地交叉存取。CPU訪問(wèn)和DMA通過(guò)APB總線存取外設(shè)就可以并行進(jìn)行。即使更多的數(shù)據(jù)訪問(wèn)使用突發(fā)模式DMA可能會(huì)更快些,CPU停止的那段長(zhǎng)時(shí)間很少被復(fù)原。下圖列出了總線挪用和突發(fā)機(jī)制的區(qū)別。
在極端的情況下(CPU從內(nèi)存的一個(gè)地方復(fù)制一塊數(shù)據(jù)到內(nèi)存中的另一個(gè)地方),軟件的執(zhí)行必須等到整個(gè)DMA傳輸完畢。當(dāng)然,CPU大部分時(shí)間完成的是數(shù)據(jù)處理,CPU和DMA交叉存取數(shù)據(jù)的頻率很低。STM32F10XXX總線結(jié)構(gòu)固有的并行性,加上DMA總線挪用機(jī)制保證了CPU不會(huì)長(zhǎng)時(shí)間地等待從SRAM中讀取數(shù)據(jù)??偩€挪用機(jī)制的DMA使總線使用效率更高,明顯地減少了軟件執(zhí)行時(shí)間。
2.3 DMA延遲
DMA完成從外設(shè)到SRAM 存儲(chǔ)器的數(shù)據(jù)傳輸有三個(gè)步驟:1、DMA請(qǐng)求仲裁;2、從外設(shè)中讀取數(shù)據(jù)(DMA源);3、將讀取的數(shù)據(jù)寫(xiě)入到SRAM中(DMA目的地)。
當(dāng)DMA把數(shù)據(jù)從內(nèi)存中傳輸?shù)酵庠O(shè)(例如SPI傳送),操作必須按照以下順序:1、DMA請(qǐng)求仲裁;2、從SRAM中讀取數(shù)據(jù);3、將讀取到的數(shù)據(jù)通過(guò)APB總線寫(xiě)入到外設(shè)中。
每個(gè)通道總的服務(wù)時(shí)間是總裁時(shí)間(1個(gè)AHB時(shí)鐘周期),外設(shè)訪問(wèn)時(shí)間(2個(gè)AHB時(shí)鐘周期)和SRAM讀/寫(xiě)訪問(wèn)時(shí)間(1個(gè)AHB時(shí)鐘周期用于單獨(dú)的讀/寫(xiě)操作,2個(gè)周期用于寫(xiě)操作后SRAM讀)的和。
當(dāng)DMA通道空閑或者是第三個(gè)操作完成后,DMA比較所有掛起的DMA請(qǐng)求的優(yōu)先級(jí),高優(yōu)先級(jí)的通道將會(huì)被服務(wù),DMA開(kāi)始執(zhí)行第二個(gè)操作。當(dāng)一個(gè)通道正在服務(wù)時(shí)(第二,三個(gè)操作正在進(jìn)行),沒(méi)有其他的通道能夠被服務(wù),而不管它的優(yōu)先級(jí)如何。
當(dāng)至少同時(shí)有兩個(gè)DMA通道使能時(shí),最高優(yōu)先級(jí)通道的DMA延遲時(shí)間為正在傳輸?shù)臅r(shí)間加上下個(gè)將被服務(wù)的DMA通道(掛起優(yōu)先級(jí)最高)。
2.4 數(shù)據(jù)總線帶寬限制
數(shù)據(jù)總線帶寬限制主要是因?yàn)锳PB總線比系統(tǒng)SRAM和AHB總線速度慢。對(duì)于最高優(yōu)先級(jí)通道,以下兩種情況是需要考慮的:
1、當(dāng)多余一個(gè)DMA通道使能時(shí),最高優(yōu)先級(jí)通道在APB總線上的請(qǐng)求數(shù)據(jù)帶寬必須比APB傳輸率低25%
2、盡管高速/高優(yōu)先級(jí)DMA傳輸通常發(fā)生在APB2上(更快的APB總線),但是CPU和其他DMA通道可以在APB1上訪問(wèn)外設(shè)。大約3/4的APB傳輸是在APB1上完成的,最小的APB2頻率依賴于最快的DMA通道數(shù)據(jù)帶寬,最大的APB時(shí)鐘分頻因子由下列的等式給出:
fAHB〉(2*N2+6*N1)*BMAX
如果N2< N1 則N1<( fAHB/ BMAX)/8
其中fAHB是AHB時(shí)鐘頻率;
N2和 N1是APB1和APB2的時(shí)鐘分頻因子;
Bmax是APB2上的最大并行數(shù)據(jù)帶寬。
2.5 通道優(yōu)先級(jí)選擇
為了實(shí)現(xiàn)外設(shè)數(shù)據(jù)的連續(xù)傳輸,相關(guān)的DMA通道必須能夠維持外設(shè)數(shù)據(jù)傳輸率和確保服務(wù)的延遲時(shí)間比兩個(gè)連續(xù)的數(shù)據(jù)之間的時(shí)間短。
高速/高帶寬外設(shè)必須擁有最高的DMA優(yōu)先級(jí),這確保了最大的數(shù)據(jù)延遲對(duì)于這些外設(shè)都是可以忍受的,而且可以避免over/under-run的情況。
在相等的帶寬需求的情況下,推薦給工作在從模式下(沒(méi)有數(shù)據(jù)傳輸速度控制)的外設(shè)分配的優(yōu)先級(jí)比工作在主模式(能夠控制數(shù)據(jù)流)下的外設(shè)分配的優(yōu)先級(jí)高。
缺省情況下,通道分配和硬件優(yōu)先級(jí)(從1到7)是按照最快的外設(shè)分配最高優(yōu)先級(jí)的順序來(lái)分配。
當(dāng)然,在某些運(yùn)用場(chǎng)合下也許不是按照這樣來(lái)分配的,在這種情況下,用戶能夠?yàn)槊恳粋€(gè)通道配置軟件優(yōu)先級(jí)(分4種,從非常高到低),軟件優(yōu)先級(jí)優(yōu)先于硬件優(yōu)先級(jí)。
當(dāng)幾個(gè)外設(shè)(不管有沒(méi)有使用DMA)并行使用時(shí),用戶必須確保內(nèi)部系統(tǒng)能夠維持運(yùn)用所要求的總的數(shù)據(jù)帶寬,必須從下列因素中選擇一個(gè)折中方案:1、每個(gè)外設(shè)的運(yùn)用需求;2、內(nèi)部數(shù)據(jù)帶寬。
2.5.1 運(yùn)用需求
以SPI接口為例,SPI接口數(shù)據(jù)帶寬是通過(guò)波特率除以SPI的數(shù)據(jù)字長(zhǎng)度而得到的(由于一個(gè)滿數(shù)據(jù)需要在每次發(fā)送之前/之后傳輸?shù)?傳輸自SPI),假設(shè)SPI的波特率是18M,數(shù)據(jù)是以8位傳輸?shù)?,操作配置在單一模?/p>
下,內(nèi)部數(shù)據(jù)帶寬需求是2.25M/s,如果SPI在16位模式下,則數(shù)據(jù)帶寬將是1.125M/s。
2.5.2 內(nèi)部數(shù)據(jù)帶寬
內(nèi)部數(shù)據(jù)帶寬依賴于以下兩個(gè)條件:1、總線頻率 可獲得的數(shù)據(jù)帶寬與總線時(shí)鐘頻率是成正比的;2、總線類型 AHB數(shù)據(jù)傳輸需要一個(gè)時(shí)鐘周期(除了SRAM寫(xiě)后讀訪問(wèn)需要2個(gè)周期),數(shù)據(jù)通過(guò)APB總線傳輸給外設(shè)需要花費(fèi)2個(gè)APB時(shí)鐘周期。
推薦DMA總線使用保持在2/3以下,這樣系統(tǒng)和CPU的性能就可在合理的水平。
3、DMA編程示例
所有的示例都使用STM32F10xxx固件庫(kù),可以參考AN2564 STM32F10XXX DMA運(yùn)用的例子。相關(guān)的固件庫(kù)可以在ST網(wǎng)站上下載,網(wǎng)址為www.st.com
3.1 使用SPI傳輸實(shí)現(xiàn)ADC連續(xù)數(shù)據(jù)的獲取
ADC配置為連續(xù)轉(zhuǎn)換模式,該模式下,它能夠?qū)⒁粋€(gè)輸入通道以最大速度進(jìn)行連續(xù)轉(zhuǎn)換。為了獲得最大的連續(xù)轉(zhuǎn)換速度,AHB總線頻率設(shè)置為56MHz,ADC預(yù)分頻為4,采樣速度為13.5周期。這些設(shè)置通過(guò)DMA通道1傳輸?shù)轿挥谙到y(tǒng)RAM中的緩沖區(qū),通道1的數(shù)據(jù)帶寬設(shè)置為0.54M/s。
當(dāng)ADC轉(zhuǎn)換后的數(shù)據(jù)填充了緩沖區(qū)的一半后,軟件計(jì)算出最大值并且是這些數(shù)字化的數(shù)據(jù)規(guī)格化(最大值設(shè)置為0xFF),ADC轉(zhuǎn)換的結(jié)果通過(guò)SPI接口傳輸?shù)酵獠?。ADC轉(zhuǎn)換結(jié)果是通過(guò)SPI1接口來(lái)傳輸?shù)?,使用DMA通道3把數(shù)據(jù)從SRAM緩沖區(qū)中傳輸?shù)絊PI1的數(shù)據(jù)寄存器。要達(dá)到最大的DMA傳輸?shù)乃俣?.875M/s,SPI1接口必須配置為16位主傳輸模式、14M波特率的傳輸速度。
可是,當(dāng)SPI1工作在主模式,SPI1有效的數(shù)據(jù)傳輸速度受數(shù)據(jù)的可用速率1M/S的限制時(shí),優(yōu)先級(jí)的配置如下:通道1(ADC):VeryHigh,通道3(SPI1_TX):High。
3.2 SPI直接傳輸實(shí)現(xiàn)ADC連續(xù)數(shù)據(jù)的獲取
這個(gè)示例完成的功能和前面一個(gè)幾乎相同,沒(méi)有數(shù)據(jù)的標(biāo)準(zhǔn)化。CPU內(nèi)部并沒(méi)有使用這些數(shù)據(jù),直接把ADC轉(zhuǎn)換結(jié)果傳輸?shù)絊RAM緩沖區(qū)可以較少一半的總線占用。所以,僅有DMA通道1被使用,該通道的目的存儲(chǔ)器地址設(shè)置為SPI數(shù)據(jù)寄存器,而不需要SRAM緩沖。
3.3 使用DMA實(shí)現(xiàn)GPIO快速數(shù)據(jù)傳輸
這個(gè)示例展示了如何將不同的外設(shè)用于DMA請(qǐng)求和數(shù)據(jù)傳輸。這個(gè)機(jī)制允許在沒(méi)有使用CPU的情況下實(shí)現(xiàn)簡(jiǎn)單的快速并行同步接口。Timer1和DMA通道4連接到TIM1_TRIG,用來(lái)實(shí)現(xiàn)獲取數(shù)據(jù)的接口,在GPIO的端口上可以獲取8位并行數(shù)據(jù),一個(gè)外部時(shí)鐘信號(hào)作用在Timer1的外部觸發(fā)器輸入端。在外部觸發(fā)器上升沿,定時(shí)器產(chǎn)生一個(gè)DMA請(qǐng)求,只要GPIO數(shù)據(jù)寄存器地址已設(shè)置到DMA通道4的外設(shè)地址,DMA控制器在每一次DMA請(qǐng)求時(shí)從GPIO端口讀取數(shù)據(jù),并把它存儲(chǔ)到SRAM的緩沖器中。
審核編輯:湯梓紅
評(píng)論