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);
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !