本文作者:Miler Shao
最近有人在STMCU社區(qū)網(wǎng)站咨詢?nèi)缦聠?wèn)題: 由于實(shí)驗(yàn)需要,要用到STM32F407的兩個(gè)DMA并用定時(shí)器觸發(fā),在使用過(guò)程中發(fā)現(xiàn)DMA1無(wú)法把GPIO的IDR上的數(shù)據(jù)傳輸?shù)絻?nèi)存,調(diào)試過(guò)程中出現(xiàn)DMA1的數(shù)據(jù)流傳輸錯(cuò)誤標(biāo)志,但是使用DMA2沒(méi)有問(wèn)題。然后我看了下參考手冊(cè)上兩個(gè)DMA的控制系統(tǒng)實(shí)現(xiàn)圖,DMA1的外設(shè)端口有一個(gè)橋接器把APB1和AHB1連起來(lái),不知道這個(gè)橋連器作用是什么?是把APB1和AHB1連起來(lái)互相訪問(wèn)嗎? 另外測(cè)試把GPIO的IDR改成APB1下的tim5的ARR,DMA1正常工作。請(qǐng)問(wèn)這是怎么回事? 咨詢者提到STM32F4系列中的兩個(gè)DMA,即DMA1與DMA2,AHB到APB橋接器;再就是兩個(gè)外設(shè),GPIO和TIM5 。為了弄清這個(gè)問(wèn)題,我們有必要先看看STM32F407的總線與存儲(chǔ)框架圖。 如下圖所示:  STM32F4系統(tǒng)存儲(chǔ)及總線框圖
整個(gè)系統(tǒng)架構(gòu)由多層32位AHB總線矩陣及主從總線構(gòu)成,并建立起各個(gè)主從模塊間的互聯(lián)訪問(wèn)。 圖中方框內(nèi)縱橫交錯(cuò)的矩陣線就是總線矩陣,猶如縱橫交錯(cuò)的公路,讓各類交通工具在里面同時(shí)運(yùn)行而互不干擾。只有在圖中紅色箭頭所指的地方,可能出現(xiàn)主控總線訪問(wèn)撞車的時(shí)刻,此時(shí)總線矩陣會(huì)按照一定規(guī)矩進(jìn)行仲裁,即誰(shuí)先誰(shuí)后而不會(huì)發(fā)生交通事故。 總線矩陣跟圖中上方的8條主控總線和右方的7條從控總線保持互聯(lián)。 八條主控總線: [主控總線簡(jiǎn)單點(diǎn)說(shuō)就是可以用來(lái)主動(dòng)訪問(wèn)別的外設(shè)的通路] —Cortex?-M4F 內(nèi)核 I 總線、D 總線和 S 總線 —DMA1 存儲(chǔ)器總線 —DMA2 存儲(chǔ)器總線 —DMA2 外設(shè)總線 — 以太網(wǎng) DMA 總線 —USB OTG HS DMA 總線 ● 七條被控總線: — 內(nèi)部 Flash ICode 總線 — 內(nèi)部 Flash DCode 總線 — 主要內(nèi)部 SRAM1 (112 KB) — 輔助內(nèi)部 SRAM2 (16 KB) — 輔助內(nèi)部 SRAM3 (64 KB)(僅適用于STM32F42xxx 和 STM32F43xxx 器件) —AHB1 外設(shè)(包括 AHB-APB 總線橋和 APB 外設(shè)) —AHB2 外設(shè) —FSMC 借助于總線矩陣,可以實(shí)現(xiàn)主控總線到被控總線的訪問(wèn),可以實(shí)現(xiàn)多個(gè)高速外設(shè)并發(fā)訪問(wèn)和高效運(yùn)行。[需要注意的是,對(duì)于STM32F4系列,圖中64K CCM并不經(jīng)過(guò)總線矩陣,只能被CPU訪問(wèn)。自然DMA是不能訪問(wèn)它的。] 好,我們接著看看STM32F407 的兩個(gè)通用DMA,即DMA1和DMA2。 這兩個(gè)DMA都具有雙AHB總線訪問(wèn)端口,一端用于存儲(chǔ)器訪問(wèn),另一端用于外設(shè)訪問(wèn)。同時(shí)它們各自都有一個(gè)AHB從編程接口,這個(gè)不難理解,對(duì)它配置編程控制總得有個(gè)接口。 
DMA總線訪問(wèn)框圖 我們結(jié)合這幅DMA總線訪問(wèn)框圖和上面的系統(tǒng)存儲(chǔ)總線框架圖可以明顯看出,2個(gè)DMA的外設(shè)訪問(wèn)端口的總線連接有點(diǎn)不一樣。 DMA2的外設(shè)訪問(wèn)端口既與總線矩陣相連,又與AHB-APB橋2相連,可以進(jìn)一步訪問(wèn)APB2外設(shè)。而DMA1卻沒(méi)有與總線矩陣相連,只是跟AHB-APB橋1相連,可以進(jìn)一步訪問(wèn)APB1外設(shè)。[紅色方框代表總線矩陣] 現(xiàn)在的問(wèn)題說(shuō)DMA1訪問(wèn)不了GPIO,但如果換成TIM5就可以。我們可以去芯片數(shù)據(jù)手冊(cè)的Device overview部分查看相關(guān)總線和外設(shè)分布圖。我截取STM32F40xblock diagram的部分如下: 
我們可以看出GPIO外設(shè)跟AHB1相連;TIM5跟APB1相連。而我們從DMA訪問(wèn)框圖看得清楚,DMA1的外設(shè)端口根本沒(méi)連接AHB1,自然沒(méi)法訪問(wèn)相應(yīng)外設(shè),比如GPIO,而DMA2 可以,因?yàn)樗梢越?jīng)過(guò)總線矩陣后去訪問(wèn)AHB1的外設(shè)。 那DMA1為什么能訪問(wèn)TIM5呢,因DMA1的AHB外設(shè)端口總線經(jīng)過(guò)AHB/APB1橋后就可以訪問(wèn)APB1各類外設(shè),比方TIM5等。 至于咨詢者問(wèn)到的兩個(gè)橋接器的作用,沒(méi)啥過(guò)多需要解釋的。橋嘛,連接第一;然后兩邊時(shí)鐘的同步和時(shí)鐘分頻,滿足不同外設(shè)的時(shí)鐘需求。 ST MCU的參考手冊(cè)里強(qiáng)調(diào)了只有DMA2能實(shí)現(xiàn)MEMORY到MEMORY的傳輸,DMA1是實(shí)現(xiàn)不了的,原理類似。因?yàn)橐獙?shí)現(xiàn)M to M 的傳輸,必須兩個(gè)端口都能實(shí)現(xiàn)對(duì)MEMORY的訪問(wèn),DMA1的AHB外設(shè)端口無(wú)法訪問(wèn)到內(nèi)部MEMORY。 咨詢者的問(wèn)題,基本上靠看上面幾幅圖可以得到答案。這些圖很重要,很多信息用圖描述也很直觀明了。各技術(shù)手冊(cè)里的插圖往往大有乾坤,不要視而不見(jiàn)。上面提到的都是基于STM32F4系列的總線架構(gòu),你也可以去看看STM32其它系列的系統(tǒng)總線框圖,相信你一定會(huì)另有發(fā)現(xiàn)和收獲 |