STM32F0單片機(jī)快速入門(mén):聊聊Coolie DMA
1.苦力 DMA
世上本沒(méi)有路,走的人多了,便成了路。世上本沒(méi)有 DMA,需要搬運(yùn)的數(shù)據(jù)多了,便有了 DMA。大多數(shù)同學(xué)應(yīng)該沒(méi)有在項(xiàng)目中用過(guò)這個(gè)東西,因?yàn)橐话闱闆r下也真不需要這個(gè)東西。在早期的單片機(jī)中也不存在DMA模塊。再加上很多談 DMA 的文章,一上來(lái)就先來(lái)一個(gè)總線(xiàn)架構(gòu)圖,然后來(lái)一大堆讓人生畏的詞兒:共享總線(xiàn),仲裁器,指針增量,對(duì)齊,中斷 ... 好吧,每一個(gè)詞都能?chē)樑芤慌懶〉摹U娴男枰@么復(fù)雜嗎?就好比我們學(xué)開(kāi)車(chē)一樣,能不能先別去嘗試弄懂發(fā)動(dòng)機(jī)的原理,直接掛檔踩油門(mén)走起來(lái)呢?DMA是很簡(jiǎn)單的一個(gè)模塊,首先他的功能單一,就是把數(shù)據(jù)從一個(gè)地方搬運(yùn)到另一個(gè)地方,再一個(gè)它的用法也很簡(jiǎn)單,我們還是先從一個(gè)例子說(shuō)起:
我們用 Keil 打開(kāi)下面這個(gè)工程:
STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesDMADMA_FLASHToRAMMDK-ARMProject.uvprojx
如圖,有一些存儲(chǔ)在 Flash 的數(shù)據(jù)需要搬運(yùn)到 RAM 區(qū)的一個(gè)數(shù)組。通常我們可以用如下的代碼實(shí)現(xiàn):
for(i=0;i<buffer_size;i++)
aDST_Buffer[i] = aSRC_Const_Buffer[i];
上面這個(gè)操作是 CPU 親自完成的,首先把數(shù)據(jù)裝進(jìn)自己的寄存器,再把寄存器中的數(shù)據(jù)存放到目的地址。在例中所示這種數(shù)據(jù)比較少的情況下,這種搬運(yùn)工作可以說(shuō)瞬間就完成了。但如果數(shù)據(jù)量比較大,比如說(shuō)要往顯示屏刷新顯示數(shù)據(jù),就要占用 CPU 大量的時(shí)間了。這時(shí)候 CPU 就可以叫來(lái) DMA 來(lái)干這件苦差事。DMA 就是芯片中的苦力集中營(yíng)。跟苦力需要交代清楚的最基本的事情就是:從哪兒搬到哪兒,貨物有多少,搬一次還是有貨物源源不斷的到來(lái),需要循環(huán)不斷的搬。讓我們看一下代碼,主程序非常簡(jiǎn)單,調(diào)用 DMA_Config(); 進(jìn)行了一下配置后就自己該干嘛干嘛去了。2.代碼
像串口工程代碼聲明了串口類(lèi)型的 Handle一樣,這里聲明了一個(gè) DMA 類(lèi)型的 Handle 來(lái)負(fù)責(zé) DMA 模塊的處理。
DMA_HandleTypeDef DmaHandle;
需要注意的地方:
__HAL_RCC_DMA1_CLK_ENABLE();
使能模塊時(shí)鐘,使能模塊時(shí)鐘,使能模塊時(shí)鐘!重要的事情要說(shuō)3遍。在使用任何一個(gè)模塊之前首先要使能該模塊的時(shí)鐘,這是經(jīng)常被忘記的一件事兒。這個(gè)功能在老型號(hào)單片機(jī)里是沒(méi)有的。在不使用某模塊時(shí),徹底關(guān)斷其時(shí)鐘可以達(dá)到最大節(jié)省功耗的目的。
初始化參數(shù)(DmaHandle.Init.):
Direction 從外設(shè)到內(nèi)存,從內(nèi)存到內(nèi)存,還是從內(nèi)存到外設(shè)?PeriphInc 每傳完一個(gè)數(shù)后外設(shè)地址是否自增1MemInc 每傳完一個(gè)數(shù)后內(nèi)存地址是否自增1PeriphDataAlignment 外設(shè)地址對(duì)齊方式,Byte,Halfword or WordMemDataAlignment 內(nèi)存地址對(duì)齊方式,Byte,Halfword or WordMode 單次,還是循環(huán)模式Priority 優(yōu)先級(jí)初始化參數(shù)(DmaHandle.Instance):
DMA模塊中有多個(gè)通道,此參數(shù)指明使用哪一個(gè)通道。
這個(gè)代碼調(diào)用 HAL_DMA_Start_IT 這個(gè)函數(shù)啟動(dòng)了 DMA 傳輸,當(dāng)數(shù)據(jù)搬運(yùn)完后會(huì)產(chǎn)生一個(gè)完成中斷,并調(diào)用回調(diào)函數(shù) TransferComplete。在HAL層驅(qū)動(dòng)中,已經(jīng)完成了 DMA 中斷所要做的基本處理,比如根據(jù)中斷類(lèi)型清除相應(yīng)中斷標(biāo)志等。在回調(diào)函數(shù)中用戶(hù)可以什么都不做,也可以根據(jù)需要添加代碼,比如此例中用點(diǎn)亮 LED 燈的方式來(lái)標(biāo)志傳輸完成。
3.串口如何使用 DMA 傳輸前面的例子是用軟件的方式觸發(fā) DMA 傳輸,在應(yīng)用中經(jīng)常會(huì)用到由某個(gè)事件觸發(fā)的情況。比如通過(guò)串口發(fā)送,接收中斷來(lái)觸發(fā) DMA 傳輸。
我們打開(kāi)下面這個(gè)例子:
STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesUARTUART_TwoBoards_ComDMAMDK-ARM Project.uvprojx
在串口初始化的回調(diào)函數(shù) HAL_UART_M(jìn)spInit(UART_HandleTypeDef *huart)中:
a 聲明了兩個(gè) DMA 類(lèi)型的 Handle: hdmatx 和 hdmarxb 初始化這兩個(gè) Handlec 把這兩個(gè) Handle 和串口的 UartHandle 連接起來(lái)__HAL_LINKDMA(huart, hdmatx, hdma_tx);
__HAL_LINKDMA(huart, hdmarx, hdma_rx);
在串口及其關(guān)聯(lián) DMA 通道初始化完成后,既可以啟動(dòng)DMA方式的接收和發(fā)送。從下圖中可以看到接收 HAL_UART_Receive_DMA 的調(diào)用過(guò)程,發(fā)送調(diào)用過(guò)程類(lèi)似:
下圖是UART中斷,和DMA中斷的觸發(fā)調(diào)用過(guò)程。USART1模塊產(chǎn)生錯(cuò)誤時(shí)仍然進(jìn)USART1的中斷向量,DMA模塊傳輸完成或傳輸過(guò)程中產(chǎn)生錯(cuò)誤時(shí)進(jìn) DMA 中斷向量。
如果沒(méi)有迫切的需要,DMA 模塊了解一下就行了。沒(méi)有必要在細(xì)節(jié)上過(guò)多糾纏,即使現(xiàn)在搞懂了,過(guò)兩三個(gè)月估計(jì)也忘了。建議在真正用到大量數(shù)據(jù)傳輸時(shí)再仔細(xì)研究和優(yōu)化相關(guān)代碼。
參考資料:
PM0215 STM32F0xxx Cortex-M0 programming manualUM1785 Description of STM32F0 HAL and low-layer driversSTM32F030 Datasheet

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
最新活動(dòng)更多
-
8月5日立即報(bào)名>> 【在線(xiàn)會(huì)議】CAE優(yōu)化設(shè)計(jì):醫(yī)療器械設(shè)計(jì)的應(yīng)用案例與方案解析
-
8月14日立即報(bào)名>> 【在線(xiàn)研討會(huì)】解析安森美(onsemi)高精度與超低功耗CGM系統(tǒng)解決方案
-
精彩回顧立即查看>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
-
精彩回顧立即查看>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
-
精彩回顧立即查看>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
精彩回顧立即查看>> OFweek 2025 具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
推薦專(zhuān)題
- 1 AI產(chǎn)業(yè)的新高度!英偉達(dá)成為全球首家市值破4萬(wàn)億美元的公司
- 2 傳魏建軍與賈躍亭合作,長(zhǎng)城汽車(chē)出海美國(guó)
- 3 一文讀懂:到底什么是 “具身智能” ?
- 4 黃仁勛:與雷軍長(zhǎng)期合作,共探AI智駕
- 5 具身智能泡沫爭(zhēng)議下,華映資本尋找「穿越周期者」
- 6 中國(guó)平安們欲靠AI守“陣地”
- 7 官宣:智元機(jī)器人借殼上市,A股人形機(jī)器人第一股!
- 8 華為讓渡“三界”銷(xiāo)售主導(dǎo)權(quán),智界高管:終于能全力奔跑了
- 9 借仿生手實(shí)現(xiàn)突圍,國(guó)產(chǎn)靈巧手破局“不可能三角”
- 10 DeepSeek R2加持,中國(guó)AI與芯片產(chǎn)業(yè)迎來(lái)新一輪協(xié)同進(jìn)化