1、中斷方式是在數(shù)據(jù)緩沖寄存區(qū)滿后,發(fā)中斷請(qǐng)求,CPU進(jìn)行中斷處理。
2、DMA方式則是以數(shù)據(jù)塊為單位傳輸?shù)?,在所要求傳送的?shù)據(jù)塊全部傳送結(jié)束時(shí)要求CPU進(jìn)行中斷處理,這樣大大減少CPU進(jìn)行中斷處理的次數(shù)。 DMA方式不需CPU干預(yù)傳送操作 ,不占用CPU任何資源, 整個(gè)數(shù)據(jù)傳輸操作在一個(gè)稱為"DMA控制器"的控制下進(jìn)行的。CPU除了在數(shù)據(jù)傳輸開(kāi)始和結(jié)束時(shí)做一點(diǎn)處理外,在傳輸過(guò)程中CPU可以進(jìn)行其他的工作。這樣,在大部分時(shí)間里,CPU和輸入輸出都處于并行操作。因此,使整個(gè)計(jì)算機(jī)系統(tǒng)的效率大大提高。 中斷方式是程序切換,每次操作需要保護(hù)和恢復(fù)現(xiàn)場(chǎng),中斷次數(shù)多,CPU需要花較多的時(shí)間處理中斷,中斷次數(shù)多也會(huì)導(dǎo)致數(shù)據(jù)丟失。 但是DMA是必須利用中斷的,否則CPU無(wú)法得到數(shù)據(jù)已經(jīng)傳輸結(jié)束,當(dāng)數(shù)據(jù)傳輸開(kāi)始結(jié)束的時(shí)候,需要給CPU一個(gè)中斷信號(hào),CPU進(jìn)行處理.這個(gè)就大大的節(jié)約了CPU的資源。
3、中斷方式的數(shù)據(jù)傳送方向是由設(shè)備到CPU再到內(nèi)存,或者相反。
DMA方式的數(shù)據(jù)傳送則是將所傳輸?shù)臄?shù)據(jù)由設(shè)備直接送入內(nèi)存,或是由內(nèi)存直接送到設(shè)備。
可以實(shí)現(xiàn)DMA控制的接口:代碼實(shí)現(xiàn) :
uint8_t SendBuff[SENDBUFF_SIZE];
uint8_t ReceiveBuff[RXBUFF_SIZE];
/**
* @brief USART1 TX DMA 配置,內(nèi)存到內(nèi)存
* @param 無(wú)
* @retval 無(wú)
*/
void DMA_Mem2Mem_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
/*開(kāi)啟DMA時(shí)鐘*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/*設(shè)置DMA源地址*/
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff;
/*設(shè)置DMA目的地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ReceiveBuff;
/*方向:從內(nèi)存SendBuff到內(nèi)存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數(shù)據(jù)單位*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/*SENDBUFF_SIZE數(shù)據(jù)單位*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/*DMA模式:正常模式*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
/*優(yōu)先級(jí):中*/
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
/*使能內(nèi)存到內(nèi)存的傳輸 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
/*配置DMA1的4通道*/
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
/*失能DMA1的4通道,一旦使能就開(kāi)始傳輸*/
DMA_Cmd (DMA1_Channel4,DISABLE);
}
DMA 中斷配置:
/**
* @brief DMA 中斷配置
* @param 無(wú)
* @retval 無(wú)
*/
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發(fā)送完成后產(chǎn)生中斷 */
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
}
啟動(dòng)傳輸:
DMA_Cmd (DMA1_Channel4,ENABLE);
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10918瀏覽量
213159 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41799 -
dma
+關(guān)注
關(guān)注
3文章
566瀏覽量
101035
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論