1、中斷方式是在數據緩沖寄存區滿后,發中斷請求,CPU進行中斷處理。
2、DMA方式則是以數據塊為單位傳輸的,在所要求傳送的數據塊全部傳送結束時要求CPU進行中斷處理,這樣大大減少CPU進行中斷處理的次數。 DMA方式不需CPU干預傳送操作 ,不占用CPU任何資源, 整個數據傳輸操作在一個稱為"DMA控制器"的控制下進行的。CPU除了在數據傳輸開始和結束時做一點處理外,在傳輸過程中CPU可以進行其他的工作。這樣,在大部分時間里,CPU和輸入輸出都處于并行操作。因此,使整個計算機系統的效率大大提高。 中斷方式是程序切換,每次操作需要保護和恢復現場,中斷次數多,CPU需要花較多的時間處理中斷,中斷次數多也會導致數據丟失。 但是DMA是必須利用中斷的,否則CPU無法得到數據已經傳輸結束,當數據傳輸開始結束的時候,需要給CPU一個中斷信號,CPU進行處理.這個就大大的節約了CPU的資源。
3、中斷方式的數據傳送方向是由設備到CPU再到內存,或者相反。
DMA方式的數據傳送則是將所傳輸的數據由設備直接送入內存,或是由內存直接送到設備。
可以實現DMA控制的接口:

代碼實現 :
uint8_t SendBuff[SENDBUFF_SIZE];
uint8_t ReceiveBuff[RXBUFF_SIZE];
/**
* @brief USART1 TX DMA 配置,內存到內存
* @param 無
* @retval 無
*/
void DMA_Mem2Mem_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
/*開啟DMA時鐘*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/*設置DMA源地址*/
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff;
/*設置DMA目的地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ReceiveBuff;
/*方向:從內存SendBuff到內存ReceiveBuff*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
/*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
/*ReceiveBuff地址自增*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
/*SENDBUFF_SIZE地址自增*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
/*ReceiveBuff數據單位*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/*SENDBUFF_SIZE數據單位*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/*DMA模式:正常模式*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
/*優先級:中*/
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
/*使能內存到內存的傳輸 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
/*配置DMA1的4通道*/
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
/*失能DMA1的4通道,一旦使能就開始傳輸*/
DMA_Cmd (DMA1_Channel4,DISABLE);
}
DMA 中斷配置:
/**
* @brief DMA 中斷配置
* @param 無
* @retval 無
*/
void DMA_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置中斷源 */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 配置DMA發送完成后產生中斷 */
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
}
啟動傳輸:
DMA_Cmd (DMA1_Channel4,ENABLE);
審核編輯:湯梓紅
-
cpu
+關注
關注
68文章
11076瀏覽量
216998 -
中斷
+關注
關注
5文章
905瀏覽量
42780 -
dma
+關注
關注
3文章
576瀏覽量
103191
發布評論請先 登錄
求助關于DAQmx的中斷傳輸方式的例程
STM32 DMA方式和中斷方式查詢的區別 精選資料推薦
非中斷和非DMA方式
能否在audio-loopback例程中增加收發DMA,配置成雙緩沖方式或者半滿中斷方式?
STM32 | 串口空閑中斷接收不定長數據(DMA方式)

STM32中斷與DMA通信

STM32 串口使用IDLE中斷+DMA接收(HAL庫函數)

STM32 HAL庫開發學習筆記: USART1串口通訊(中斷方式) IDE-STM32CubeIDE

評論