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文章
11378浏览量
226489 -
中断
+关注
关注
5文章
922浏览量
43936 -
dma
+关注
关注
3文章
584浏览量
106410
发布评论请先 登录
相关推荐
热点推荐
串口DMA接收方式打开,为什么在开启IDLE中断的情况下还需要开启DMA中断呢?
如图,在以 RT_DEVICE_FLAG_DMA_RX 方式打开串口时,底层会配置串口IDLE中断,同时也会打开DMA中断,
发表于 09-29 08:30
STM32 DMA方式和中断方式查询的区别 精选资料推荐
CPU控制完成,如CPU程序查询或中断方式。利用中断进行数据传送,可以大大提高CPU的利用率。 2:中断传送是由CPU通过中断服务程序来传送
发表于 08-16 08:41
非中断和非DMA方式
非中断和非DMA方式可以用于特殊场景,比如其它外设占据DMA负担比较重而CPU又比较清闲的时候。1. STM32F429的AD转换最高12bit12位分辨率意味着我们采集电压的精度可以
发表于 08-17 08:26
STM32 | 串口空闲中断接收不定长数据(DMA方式)
在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来接收数据,常用的是RXNE。这里分享另一种接收数据的方式——IDLE中断(PS:本文的例子运行在STM32F103Z
发表于 11-20 12:51
•19次下载
STM32中断与DMA通信
结果Ⅲ-DMA向上位机发送数据DMA1.创建STM32CubeMX工程2.keil代码修改3.结果小结链接Ⅰ-中断方式点灯中断
发表于 11-26 19:21
•20次下载
STM32中断与DMA通信编程
开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。(2) 采用串口中断方式重做上周的串口通信作业。(3) STM32采用串口DMA
发表于 11-26 19:21
•11次下载
STM32 串口使用IDLE中断+DMA接收(HAL库函数)
1.9.0开发工具:MDK Keil 5.32二、原理过程在STM32上接9个串口,每个串口约收发50个字节数据每帧,若使用传统的按字节中断HAL_UART_Receive_IT()的方式,则会因中断响应过于频繁导致系统响应不
发表于 12-02 21:06
•42次下载
STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE
STM32串口通讯有三种方式,分别为阻塞(轮询)、中断、DMA。串口模式和配置 源代码编写
发表于 12-24 18:52
•19次下载
中断方式和DMA方式有什么不同
评论