0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

中断方式和DMA方式有什么不同

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-06-10 11:44 次阅读

1、中断方式是在数据缓冲寄存区满后,发中断请求,CPU进行中断处理。

2、DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,这样大大减少CPU进行中断处理的次数。 DMA方式不需CPU干预传送操作 ,不占用CPU任何资源, 整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。 中断方式是程序切换,每次操作需要保护和恢复现场,中断次数多,CPU需要花较多的时间处理中断,中断次数多也会导致数据丢失。 但是DMA是必须利用中断的,否则CPU无法得到数据已经传输结束,当数据传输开始结束的时候,需要给CPU一个中断信号,CPU进行处理.这个就大大的节约了CPU的资源。

3、中断方式的数据传送方向是由设备到CPU再到内存,或者相反。

DMA方式的数据传送则是将所传输的数据由设备直接送入内存,或是由内存直接送到设备。

可以实现DMA控制的接口pYYBAGKirlaAGRKrAALiWqpP6fk519.png
pYYBAGKivamAI3nzAAIk_RBMy5w859.png

代码实现 :

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
    cpu
    +关注

    关注

    68

    文章

    10922

    浏览量

    213283
  • 中断
    +关注

    关注

    5

    文章

    900

    浏览量

    41838
  • dma
    dma
    +关注

    关注

    3

    文章

    566

    浏览量

    101102
收藏 人收藏

    评论

    相关推荐

    求助关于DAQmx的中断传输方式的例程

    本人接触LABVIEW才一周的时间,需要做个关于数据采集编码器脉冲测速的程序,T法。需要对脉冲的每个上升沿硬件触发中断。看了一些帖子后,知道DAQmx的数据传输方式分为DMA和IRQ(中断
    发表于 05-15 10:31

    STM32 DMA方式中断方式查询的区别 精选资料推荐

    CPU控制完成,如CPU程序查询或中断方式。利用中断进行数据传送,可以大大提高CPU的利用率。 2:中断传送是由CPU通过中断服务程序来传送
    发表于 08-16 08:41

    中断和非DMA方式

    中断和非DMA方式可以用于特殊场景,比如其它外设占据DMA负担比较重而CPU又比较清闲的时候。1. STM32F429的AD转换最高12bit12位分辨率意味着我们采集电压的精度可以
    发表于 08-17 08:26

    请问stm32f407 adc的dma中断方式是什么?

    请问stm32f407 adc的dma中断方式是什么?
    发表于 11-16 06:49

    请问STM32 DMA方式中断方式查询之间什么区别?

    请问STM32 DMA方式中断方式查询之间什么区别?
    发表于 11-16 08:10

    中断和非DMA方式可以用于哪些特殊场景?

    中断和非DMA方式可以用于哪些特殊场景?
    发表于 11-18 07:16

    DMA通信编程与STM32串口中断方式是什么

    目录DMA通信原理DMA的基本介绍DMA工作原理STM32的DMA结构DMA的主要特性DMA寄存
    发表于 12-10 06:04

    怎样使用IDLE中断+DMA接收的方式接收数据呢

    怎样使用IDLE中断+DMA接收的方式接收数据呢?怎样使用IDLE中断去判断串口线是否空闲呢?
    发表于 01-27 06:20

    能否在audio-loopback例程中增加收发DMA,配置成双缓冲方式或者半满中断方式

    能否在audio-loopback例程中增加收发DMA,配置成双缓冲方式或者半满中断方式
    发表于 05-26 06:50

    中断方式闪烁【汇编版】

    中断方式闪烁【汇编版】中断方式闪烁【汇编版】中断方式闪烁【汇编版】
    发表于 12-29 10:50 0次下载

    STM32 | 串口空闲中断接收不定长数据(DMA方式

    在使用STM32的串口接收数据的时候,我们常常会使用接收中断方式来接收数据,常用的是RXNE。这里分享另一种接收数据的方式——IDLE中断(PS:本文的例子运行在STM32F103Z
    发表于 11-20 12:51 17次下载
    STM32 | 串口空闲<b class='flag-5'>中断</b>接收不定长数据(<b class='flag-5'>DMA</b><b class='flag-5'>方式</b>)

    DMA通信编程与STM32串口中断方式

    目录DMA通信原理DMA的基本介绍DMA工作原理STM32的DMA结构DMA的主要特性DMA寄存
    发表于 11-26 19:21 13次下载
    <b class='flag-5'>DMA</b>通信编程与STM32串口<b class='flag-5'>中断</b><b class='flag-5'>方式</b>

    STM32中断DMA通信

    结果Ⅲ-DMA向上位机发送数据DMA1.创建STM32CubeMX工程2.keil代码修改3.结果小结链接Ⅰ-中断方式点灯中断
    发表于 11-26 19:21 20次下载
    STM32<b class='flag-5'>中断</b>与<b class='flag-5'>DMA</b>通信

    STM32 串口使用IDLE中断+DMA接收(HAL库函数)

    1.9.0开发工具:MDK Keil 5.32二、原理过程在STM32上接9个串口,每个串口约收发50个字节数据每帧,若使用传统的按字节中断HAL_UART_Receive_IT()的方式,则会因中断响应过于频繁导致系统响应不
    发表于 12-02 21:06 42次下载
    STM32 串口使用IDLE<b class='flag-5'>中断</b>+<b class='flag-5'>DMA</b>接收(HAL库函数)

    STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

    STM32串口通讯三种方式,分别为阻塞(轮询)、中断DMA。串口模式和配置 源代码编写
    发表于 12-24 18:52 19次下载
    STM32 HAL库开发学习笔记: USART1串口通讯(<b class='flag-5'>中断</b><b class='flag-5'>方式</b>) IDE-STM32CubeIDE