STM32中的DMA控制器是一種用于在外設(shè)和存儲(chǔ)器之間傳輸數(shù)據(jù)的專用硬件。DMA控制器的內(nèi)部結(jié)構(gòu)主要包括以下幾個(gè)關(guān)鍵部分:
通道: DMA控制器可以有多個(gè)通道,每個(gè)通道獨(dú)立管理一個(gè)數(shù)據(jù)傳輸任務(wù)。通道的數(shù)量取決于具體的STM32型號(hào),每個(gè)通道可以獨(dú)立配置,使得DMA可以同時(shí)執(zhí)行多個(gè)數(shù)據(jù)傳輸任務(wù)。
數(shù)據(jù)傳輸方向寄存器: 該寄存器用于配置數(shù)據(jù)傳輸?shù)姆较?,可以設(shè)置為從外設(shè)到存儲(chǔ)器(Memory-to-Memory)、從外設(shè)到存儲(chǔ)器(Peripheral-to-Memory)、從存儲(chǔ)器到外設(shè)(Memory-to-Peripheral)等不同方向。
地址寄存器: DMA控制器有兩個(gè)地址寄存器,一個(gè)用于配置外設(shè)地址,另一個(gè)用于配置存儲(chǔ)器地址。這些寄存器存儲(chǔ)了傳輸數(shù)據(jù)的源地址和目的地址。
傳輸計(jì)數(shù)寄存器: 該寄存器用于設(shè)置傳輸?shù)臄?shù)據(jù)量,即希望傳輸?shù)臄?shù)據(jù)的數(shù)量。傳輸計(jì)數(shù)寄存器的值遞減或遞增,直到傳輸完成。
傳輸模式寄存器: DMA控制器支持不同的傳輸模式,例如循環(huán)模式、塊傳輸模式、內(nèi)存自增/自減等。傳輸模式寄存器用于配置這些傳輸模式。
優(yōu)先級(jí)寄存器: 當(dāng)多個(gè)通道同時(shí)請(qǐng)求DMA服務(wù)時(shí),通過優(yōu)先級(jí)寄存器可以配置通道的優(yōu)先級(jí)。優(yōu)先級(jí)高的通道將獲得DMA控制權(quán)。
中斷和事件寄存器: DMA控制器支持中斷,用于在數(shù)據(jù)傳輸完成或發(fā)生錯(cuò)誤時(shí)通知CPU。相關(guān)寄存器用于配置和監(jiān)視中斷和事件狀態(tài)。
配置寄存器: DMA控制器有一些配置寄存器,用于配置DMA的工作模式、觸發(fā)條件、錯(cuò)誤處理等。
狀態(tài)寄存器: 用于存儲(chǔ)DMA通道的狀態(tài)信息,例如傳輸完成、半傳輸?shù)葼顟B(tài)。
2,DMA處理過程
DMA的處理過程涉及以下幾個(gè)關(guān)鍵步驟,這些步驟描述了DMA如何從源地址傳輸數(shù)據(jù)到目的地址,而無需CPU的干預(yù):
通道配置: DMA控制器可以有多個(gè)通道,每個(gè)通道獨(dú)立管理一個(gè)數(shù)據(jù)傳輸任務(wù)。首先,需要配置DMA通道,確定數(shù)據(jù)傳輸?shù)姆较?、源和目的地址、傳輸?shù)據(jù)量等參數(shù)。
源和目的地址設(shè)置: 配置DMA的源地址和目的地址,分別指定數(shù)據(jù)傳輸?shù)钠鹗键c(diǎn)和目標(biāo)存儲(chǔ)位置。
傳輸數(shù)量設(shè)置: 配置傳輸計(jì)數(shù)寄存器,確定要傳輸?shù)臄?shù)據(jù)的數(shù)量。這個(gè)值在傳輸過程中遞減或遞增,直到傳輸完成。
傳輸模式設(shè)置: 配置傳輸模式寄存器,選擇傳輸模式。常見的傳輸模式包括循環(huán)模式、塊傳輸模式、內(nèi)存自增/自減等。
啟動(dòng)DMA傳輸: 當(dāng)DMA的配置完成后,通過軟件或外部觸發(fā)信號(hào)啟動(dòng)DMA傳輸。DMA控制器將開始在指定通道上執(zhí)行數(shù)據(jù)傳輸任務(wù)。
數(shù)據(jù)傳輸: DMA控制器根據(jù)配置的參數(shù),從源地址讀取數(shù)據(jù),然后將數(shù)據(jù)寫入目的地址。這一過程在不需要CPU干預(yù)的情況下進(jìn)行。
中斷和事件處理: 如果配置了中斷,DMA在傳輸完成時(shí)可以生成中斷請(qǐng)求。CPU可以通過中斷服務(wù)例程處理傳輸完成事件,執(zhí)行相關(guān)的操作。另外,DMA還可以在傳輸完成或發(fā)生錯(cuò)誤時(shí)生成事件,用于觸發(fā)其他模塊的操作。
傳輸結(jié)束: DMA控制器監(jiān)視傳輸計(jì)數(shù)寄存器,當(dāng)傳輸計(jì)數(shù)達(dá)到零時(shí),傳輸完成。在某些情況下,可以在傳輸完成時(shí)產(chǎn)生傳輸完成事件,通知相關(guān)模塊傳輸已經(jīng)結(jié)束。
3,DMA中斷
DMA中斷是指在DMA(Direct Memory Access)傳輸過程中,當(dāng)數(shù)據(jù)傳輸完成或者發(fā)生錯(cuò)誤時(shí),DMA控制器產(chǎn)生中斷請(qǐng)求,通知CPU進(jìn)行相應(yīng)的處理。DMA中斷允許CPU在數(shù)據(jù)傳輸階段結(jié)束時(shí)或者在發(fā)生錯(cuò)誤時(shí)執(zhí)行特定的中斷服務(wù)例程,以便對(duì)數(shù)據(jù)傳輸?shù)耐瓿蔂顟B(tài)進(jìn)行處理或進(jìn)行錯(cuò)誤處理。
在使用DMA時(shí),可以配置DMA中斷,以便在以下情況之一發(fā)生時(shí)通知CPU:
傳輸完成中斷: 當(dāng)DMA傳輸?shù)臄?shù)據(jù)量達(dá)到設(shè)定值時(shí),DMA控制器產(chǎn)生傳輸完成中斷請(qǐng)求。這時(shí),CPU可以執(zhí)行相應(yīng)的中斷服務(wù)例程,處理傳輸完成后的操作,如數(shù)據(jù)處理、狀態(tài)更新等。
半傳輸中斷: 在一些DMA控制器中,還可以配置半傳輸中斷,即在傳輸完成一半數(shù)據(jù)時(shí)產(chǎn)生中斷請(qǐng)求。這對(duì)于一些特殊的數(shù)據(jù)傳輸場景可能會(huì)有用。
錯(cuò)誤中斷: 如果在DMA傳輸過程中發(fā)生錯(cuò)誤,例如總線錯(cuò)誤或存儲(chǔ)器溢出,DMA控制器可以產(chǎn)生錯(cuò)誤中斷請(qǐng)求。CPU可以通過錯(cuò)誤中斷服務(wù)例程來處理這些錯(cuò)誤,采取相應(yīng)的措施。
DMA中斷的使用可以提高系統(tǒng)的靈活性和可靠性。通過合理配置DMA中斷,可以在不占用CPU時(shí)間的情況下及時(shí)獲取數(shù)據(jù)傳輸?shù)臓顟B(tài),進(jìn)行相應(yīng)的處理。配置DMA中斷的具體步驟包括:
使能DMA中斷: 在DMA控制寄存器中,通常有一個(gè)使能中斷的位,設(shè)置為1表示允許產(chǎn)生中斷。
配置中斷優(yōu)先級(jí): 在中斷控制器中,配置DMA中斷的優(yōu)先級(jí),以確保在多個(gè)中斷同時(shí)發(fā)生時(shí),能夠按照優(yōu)先級(jí)順序進(jìn)行響應(yīng)。
編寫中斷服務(wù)例程: CPU需要編寫中斷服務(wù)例程,以定義在中斷發(fā)生時(shí)要執(zhí)行的操作。這可以包括數(shù)據(jù)處理、狀態(tài)更新、錯(cuò)誤處理等。
4,DMA映射
DMA中斷映射是指將DMA(Direct Memory Access)傳輸?shù)闹袛嗾?qǐng)求映射到特定的中斷線上,以便在中斷控制器中進(jìn)行管理和處理。在某些DMA控制器中,可以配置DMA中斷映射,以確定DMA傳輸完成或發(fā)生錯(cuò)誤時(shí)觸發(fā)的中斷是哪一個(gè)中斷線上的中斷。
為了更好地理解DMA中斷映射,以下是一些相關(guān)的概念:
中斷線: 中斷線是連接外設(shè)或模塊到中斷控制器的通道。每個(gè)中斷線上可以連接多個(gè)中斷源,中斷控制器可以通過中斷優(yōu)先級(jí)和中斷屏蔽來決定哪個(gè)中斷源獲得服務(wù)。
DMA通道: DMA控制器有多個(gè)通道,每個(gè)通道負(fù)責(zé)一個(gè)數(shù)據(jù)傳輸任務(wù)。當(dāng)數(shù)據(jù)傳輸完成或發(fā)生錯(cuò)誤時(shí),DMA通道可以產(chǎn)生中斷請(qǐng)求。
DMA中斷映射: DMA中斷映射允許將DMA通道的中斷請(qǐng)求映射到特定的中斷線上。這樣,CPU就可以通過中斷控制器管理和處理DMA通道產(chǎn)生的中斷。
中斷控制器配置: 在某些STM32系列微控制器中,中斷控制器(NVIC)提供了中斷線的配置和管理功能。通過配置中斷線,可以確定DMA中斷映射到哪個(gè)中斷線上,以及中斷線的優(yōu)先級(jí)等參數(shù)。
下面是一個(gè)簡化的例子,說明DMA中斷映射的可能配置:
#include"stm32f4xx_hal.h"
void DMA_Configuration(void) { // 初始化 DMA 結(jié)構(gòu)體 DMA_HandleTypeDef dma_handle; dma_handle.Instance = DMA1_Stream0; dma_handle.Init.Channel = DMA_CHANNEL_0; dma_handle.Init.Direction = DMA_MEMORY_TO_MEMORY; dma_handle.Init.PeriphInc = DMA_PINC_ENABLE; dma_handle.Init.MemInc = DMA_MINC_ENABLE; dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; dma_handle.Init.MemDataAlignment=DMA_MDATAALIGN_WORD; dma_handle.Init.Mode=DMA_NORMAL; dma_handle.Init.Priority=DMA_PRIORITY_HIGH; //關(guān)聯(lián)DMA句柄與DMA控制器 HAL_DMA_Init(&dma_handle); //關(guān)聯(lián)DMA句柄與源、目的地地址 HAL_DMA_Start(&dma_handle,(uint32_t)sourceBuffer,(uint32_t)destinationBuffer,BUFFER_SIZE); //配置DMA中斷映射 HAL_NVIC_SetPriority(DMA1_Stream0_IRQn,0,0); HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);}
-
控制器
+關(guān)注
關(guān)注
114文章
17109瀏覽量
184283 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
364914 -
dma
+關(guān)注
關(guān)注
3文章
576瀏覽量
103245
發(fā)布評(píng)論請(qǐng)先 登錄
STM32實(shí)例教程-DMA實(shí)驗(yàn)

2011年沙特吉達(dá)五大行業(yè)展|沙特建材展|吉達(dá)建材展|五大行業(yè)展|
【eBox生態(tài)圈】連載一:簡化STM32的編程之eBox,解決五大問題
STM32五大時(shí)鐘源有何關(guān)系
了解下五大嵌入式操作系統(tǒng)
STM32 DMA應(yīng)用與性能分析
串口服務(wù)器常見的五大問題是什么,如何解決
STM32 DMA傳輸?shù)膯栴}分析

評(píng)論