精华内容
下载资源
问答
  • DMA与普通中断模式

    2020-08-10 10:55:43
    普通中断方式是在数据缓冲寄存器满后,发中断请求,CPU进行中断处理 DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,大大减少了CPU进行中断处理的次数 总结:DMA方式不需...

    普通中断方式是在数据缓冲寄存器满后,发中断请求,CPU进行中断处理
    DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,大大减少了CPU进行中断处理的次数

    总结:DMA方式不需CPU干预传送操作,仅仅是开始和结尾借用CPU一点时间,其余不占用CPU任何资源,中断方式是程序切换,每次操作需要保护和恢复现场

    中断控制方式虽然在某种程度上解决了上述问题,但由于中断次数多,因而CPU仍需要花较多的时间处理中断,而且能够并行操作的设备台数也受到中断处理时间的限制,中断次数增多导致数据丢失。

    DMA方式和通道方式较好地解决了上述问题。这两种方式采用了外设和内存直接交换数据的方式。只有在一段数据传送结束时,这两种方式才发出中断信号要求CPU做善后处理,从而大大减少了CPU的工作负担。中断控制方式虽然在某种程度上解决了上述问题,但由于中断次数多,因而CPU仍需要花较多的时间处理中断,而且能够并行操作的设备台数也受到中断处理时间的限制,中断次数增多导致数据丢失。DMA方式和通道方式较好地解决了上述问题。这两种方式采用了外设和内存直接交换数据的方式。只有在一段数据传送结束时,这两种方式才发出中断信号要求CPU做善后处理,从而大大减少了CPU的工作负担。

    展开全文
  • DMA与普通中断方式的区别

    万次阅读 2016-06-30 22:46:04
    普通中断方式是在数据缓冲寄存器满后,发中断请求,CPU进行中断处理 DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,大大减少了CPU进行中断处理的次数 总结:DMA方式不...
    普通中断方式是在数据缓冲寄存器满后,发中断请求,CPU进行中断处理
    DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,大大减少了CPU进行中断处理的次数

    总结:DMA方式不需CPU干预传送操作,仅仅是开始和结尾借用CPU一点时间,其余不占用CPU任何资源,中断方式是程序切换,每次操作需要保护和恢复现场

    中断控制方式虽然在某种程度上解决了上述问题,但由于中断次数多,因而CPU仍需要花较多的时间处理中断,而且能够并行操作的设备台数也受到中断处理时间的限制,中断次数增多导致数据丢失。

    DMA方式和通道方式较好地解决了上述问题。这两种方式采用了外设和内存直接交换数据的方式。只有在一段数据传送结束时,这两种方式才发出中断信号要求CPU做善后处理,从而大大减少了CPU的工作负担。中断控制方式虽然在某种程度上解决了上述问题,但由于中断次数多,因而CPU仍需要花较多的时间处理中断,而且能够并行操作的设备台数也受到中断处理时间的限制,中断次数增多导致数据丢失。DMA方式和通道方式较好地解决了上述问题。这两种方式采用了外设和内存直接交换数据的方式。只有在一段数据传送结束时,这两种方式才发出中断信号要求CPU做善后处理,从而大大减少了CPU的工作负担。

    展开全文
  • 2、串口空闲中断中,需要关闭串口的DMA请求,退出中断函数时再重新打开。在中断服务函数中。不再接收串口数据。 3、再中断服务函数中。再读一次数据寄存器。确保下次打开DMA请求时不引入错误的数据 #include &...

    一、设计

    目的:利用STM32的一组串口配合DMA实现不定长数据包收发。

    二、贴代码

    要点:

    1、DMA收发配置为单次触发。每次使用都需要重新设置一下计数值。

    2、串口空闲中断中,需要关闭串口的DMA请求,退出中断函数时再重新打开。在中断服务函数中。不再接收串口数据。

    3、再中断服务函数中。再读一次数据寄存器。确保下次打开DMA请求时不引入错误的数据

    #include "bsp_uart.h"
    #include "app.h"
    
    #define PACKSIZE    50
    u8 RxBuff[PACKSIZE];
    u8 TxBuff[PACKSIZE];
    u16  Usart1_Rec_Cnt=0;   
    
    void MYDMA_Config(void)
    {
    	DMA_InitTypeDef DMA_InitStructure;
     	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//使能DMA传输	
    	//Rx
        DMA_DeInit(DMA1_Channel5);   //将DMA的通道1寄存器重设为缺省值
    	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;  //DMA外设ADC基地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuff;  //DMA内存基地址
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从内存读取发送到外设
    	DMA_InitStructure.DMA_BufferSize = PACKSIZE;  //DMA通道的DMA缓存的大小
    	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
    	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
    	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
    	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
    	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
    	DMA_Init(DMA1_Channel5, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
    	DMA_Cmd(DMA1_Channel5, ENABLE);  
    
    	//Tx
    	DMA_DeInit(DMA1_Channel4);   //将DMA的通道1寄存器重设为缺省值
    	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;  //DMA外设ADC基地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)TxBuff;  //DMA内存基地址
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
    	DMA_InitStructure.DMA_BufferSize = PACKSIZE;  //DMA通道的DMA缓存的大小
    	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
    	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
    	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
    	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
    	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
    	DMA_Init(DMA1_Channel4, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
    	DMA_Cmd(DMA1_Channel4, DISABLE);
    } 
    
    void uart_init(u32 bound){
      //GPIO端口设置
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
    	USART_DeInit(USART1);
      
    	//USART1_TX   GPIOA.9 --> 对应从机的Rx
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
       
      //USART1_RX	  GPIOA.10初始化
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
      
       //USART 初始化设置
    	USART_InitStructure.USART_BaudRate = bound;//串口波特率
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    	USART_Init(USART1, &USART_InitStructure); //初始化串口1
    	
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);  //使能串口空闲中断
    	USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);    //使能串口接收DMA请求  
    	USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);    //使能串口发送DMA请求
    	USART_Cmd(USART1, ENABLE);                      //使能串口1 
    	    
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    	MYDMA_Config();
    }
    //通过DMA从串口1发送一组数据
    void Usart1_Send(u8 len, u8* buf)
    {
    	DMA_Cmd(DMA1_Channel4, DISABLE );    //通道14为发送通道
     	DMA_SetCurrDataCounter(DMA1_Channel4,len);
        memcpy(TxBuff,buf,len);
     	DMA_Cmd(DMA1_Channel4, ENABLE); 
    }
    
    //串口1中断服务程序
    void USART1_IRQHandler(void)                	
    {	
        void * pM; 
        if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  
        {
            USART_DMACmd(USART1,USART_DMAReq_Rx,DISABLE);    //使能串口接收DMA请求
            USART_ReceiveData(USART1);
            Usart1_Rec_Cnt = PACKSIZE-DMA_GetCurrDataCounter(DMA1_Channel5);	//算出本帧数据长度
            {
            		Usart1_Send(Usart1_Rec_Cnt,RxBuff);
            }
            USART_ClearITPendingBit(USART1, USART_IT_IDLE);         //清除中断标志
            DMA_Cmd(DMA1_Channel5, DISABLE );   
            DMA_SetCurrDataCounter(DMA1_Channel5,PACKSIZE);
            DMA_Cmd(DMA1_Channel5, ENABLE);
            USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);    //使能串口接收DMA请求         
         } 
    } 

    三、使用

    1、初始化

    uart_init(115200);

    2、发送

    Usart1_Send(len, Txbuf);

    3、接收:中断服务函数中,可以在中断服务函数中把数据从RxBuff缓冲区中copy出来。

    四、To be continue

     

    展开全文
  • 简述中断和 DMA 的区别。

    千次阅读 2020-04-17 21:07:53
    1、中断方式是在数据缓冲寄存区满后,发中断请求,CPU进行中断处理。 2、DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,这样大大减少CPU进行中断处理的次数。DMA方式不...

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

    原文链接:https://blog.csdn.net/guomutian911/article/details/46291635

    展开全文
  • 中断DMA

    2021-01-13 13:52:13
    硬件中断选择 (1)配置20个中断线的屏蔽位(EXTI_IMR) (2)配置所选中断线的触发选择位(EXTI_RTSREXTI_FTSR) (3) 配置对应到外部中断控制器(EXTI)的NVIC中断通道的...(2)设置软件中断寄存器的请求位(EXTI_SWIER)
  • CPU启动I/O后,不必查询I/O是否准备好,当I/O准备就绪后,发出DMA请求,此时CPU不直接参与I/O主存间的信心交换,只是把外部总线的使用权暂时交付DMA,仍然可以完成自身内部的操作,所以不必中断现行程序,只需暂停...
  • stm32 利用DMA+串口空闲中断接受任意长数据

    万次阅读 多人点赞 2018-10-14 06:50:21
    目录一、DMA1、简介2、使用场景3、主要特性4、DMA控制器结构5、DMA请求映射6、指针递增7、循环模式8、其他9、示例代码二、串口空闲中断1、常用的串口接收中断2、串口空闲中断 在进行stm32开发时,有时会遇到这种...
  • 中断I/O控制方式和DMA

    2018-11-29 15:49:00
    中断方式:要求为每个外设分配一个中断请求针对此设备的中断程序,此外还需要一个中断控制器来管理外设提出的各种中断请求,例如,能传送申请中断的设备的地址信息以识别需要服务的外设的类...
  • 零拷贝原理-数据的收发-软中断和DMA

    千次阅读 2017-07-04 14:20:16
    为何要懂零拷贝原理?因为rocketmq存储核心使用的就是零拷贝原理。...中断DMA 中断方式 中断方式的流程图如下: 用户进程发起数据读取请求系统调度为该进程分配cpucpu向io控制器(ide,scsi)发送io请求
  • 中断DMA区别

    千次阅读 多人点赞 2015-05-31 23:17:49
    1、中断方式是在数据缓冲寄存区满后,发中断请求,CPU进行中断处理。 2、DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,这样大大减少CPU进行中断处理的次数。DMA...
  • 程序中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点现场的处理,...
  • (1)程序查询、程序中断方式的数据传送主要依赖软件,DMA 主要依赖硬件。 (2)程序查询、程序中断传送数据的基本单位为字或字节,DMA 为数据块。...程序中断及 DMA 方式时CPU被动接受 I/O 中断请求
  • STM32F407+WM8978+LAN...关于问题的描述:在基本实现音频的录音播放时,将以太网功能加入工程中时,出现了I2S DMA 处理数据时,在DMA处理中断请求时总是进传输错误中断管理中,没有办法进行I2S DMA 的传输完成中断
  • DMA

    2016-04-19 22:33:33
    Direct Memory Access,直接内存存取 ...CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求 DMA响应 CPU执行完当前总线周期即释放总线控制权。DMA控制器通知I/O接口开始DMA传输 DMA传输 DMA控
  • 主机与外部设备的信息...程序中断方式是指:CPU在执行程序的过程中,如果因出现某种随机事件而收到中断请求,则暂时停止现行程序的执行,转去执行一段中断服务程序,以处理该事件,并在处理完毕后自动恢复程序的执行。
  • ARM中断源和中断过程分析

    千次阅读 2014-08-09 16:13:49
    中断源分析 中断分为两大类,由中断源来区分: 内部中断,其中断源由内部外设提供。如:DMA/UART等 ...外部中断,其中断源由...先来分析下59个中断源:35个内部中断24个外部请求中断源。(官方说是60个中断源)
  • STM32 DMA理解

    2021-04-04 15:34:45
    文章目录DMA简介DMA特性DMA处理DMA通道配置过程DMA中断请求各通道的DMA请求 DMA简介 用来提供在外设存储器之间或者存储器存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的...
  • 8237A DMA控制器简答

    千次阅读 2019-11-30 19:04:55
    (1)、比较中断和DMA两种传输方式的特点。 在中断模式下,外设需与主机传送数据时要请求主机给与...当外设与存储器之间需要传送数据时,外设向DMA控制器发出DMA请求,DMA控制器向CPU发出总线请求,取得总线控制权后...
  • IO操作和DMA、RDMA

    千次阅读 2020-02-03 22:11:07
    用户进程想要执行IO操作时(例如想要读磁盘数据、向磁盘写数据、读键盘的输入等等),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对应的系统调用请求操作系统帮忙完成这些操作。...
  • DMA(Direct Memory Access)直接存储器访问,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场恢复现场过程,通过硬件为RAMIO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。...
  • STM32-DMA基本概念

    2020-10-21 18:05:47
    DMA即直接存储器访问,无需CPU直接控制传输,也没有中断处理方式那样保留现场恢复现场的过程,他是通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,可以使得CPU的效率大大提高。 STM32F103有两个DMA控制器有12...
  • HAL库——UART的DMA接收中的一些问题

    千次阅读 多人点赞 2019-10-23 15:39:46
    上篇简单的说明了如何通过DMA的方式接收UART数据,看着这个UART的DMA接收很简单,为了弄明白DMA中断和UART中断之间的关系,还是要看一下程序是如何完成这些看似简单的操作。首先先说一下整个接收的过程: 启动UART...
  • 组原7_DMA 方式

    2020-08-27 12:50:39
    中断机构向 CPU 提出中断请求,这里的中断和中断方式中的中断是不一样的。中断方式的中断是为了让 CPU 来控制数据传送的过程。这个中断是告知 CPU 数据传送已经结束了,看一下还有没有其它事要做。 3....
  • 外部中断和事件的区别

    千次阅读 2018-01-08 15:27:04
    中断到达步骤5后向CPU产生中断请求,需要软件的中断服务函数才能完成中断后产生的结果;而事件到达步骤5后向起它功能模块发送脉冲触发信号,进而由硬件自动完成这个时间产生的结果,当然相应的硬件功能模块需要先...
  • stm32 DMA配置

    2017-07-21 14:17:00
    DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场恢复现场的过程,通过硬件为RAM与I/O设备直接传送数据,使CPU的效率大大的提高了。  stm一般有两个DMA控制器,DMA1有7通道。DMA2有5个通道。 ...
  • stm32.初学DMA

    2020-06-30 16:49:43
    DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。 STM32 最多有 2 个 DMA 控制器(DMA2 仅...
  • 简单点就是中断一定要有中断服务函数,...中断请求:当产生中断的时候,会执行对应的中断处理程序 事件请求:当产生事件的时候,会想向其他模块发送触发信号,对于其他模块如何处理这个信号,则由模块自己决定! ...
  • STM32_DMA原理特性

    2020-08-24 11:35:35
    DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。 STM32F4 最多有 2 个 DMA 控制器(DMA1 ...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 283
精华内容 113
关键字:

dma请求和中断请求