精华内容
下载资源
问答
  • STM32 DMA配置

    千次阅读 2019-04-28 17:24:49
    接下来,我们去STM32的程序中来分析下DMA配置的详细过程: 我们主要详细的讲解下两个配置函数:DMA_Configuration()和DMA_Init()这两个函数,来自: ## https://blog.csdn.net/u010280307/article/details/53334985 ...

    作个搬运工,以下内容均来自:
    https://blog.csdn.net/gdjason/article/details/51019219
    https://blog.csdn.net/u010280307/article/details/53334985
    https://blog.csdn.net/faihung/article/details/78748033
    https://blog.csdn.net/weixin_40709185/article/details/79867003
    仅供个人学习使用,并无他意

    首先来自:## https://blog.csdn.net/weixin_40709185/article/details/79867003

    **DMA涉及概念讲解:

    **
    ①:DMA即Direct Memory Access(直接存储器存取),是STM32特有的外设。大容量STM32产品集成了两个DMA,分别是DMA1和DMA2,。其中DMA1有7个通道,DMA2有5个通道,具体每个通道连接的外设可以参考STM32芯片的数据手册。
    ②:通过DMA可以将数据在两个不同的地址之间进行传递,如存储器到外设寄存器,外设寄存器到存储器,也可以从存储器到存储器之间。
    ③:当两个数据在不同的地址之间传递时,需要在程序配置中确定每次传输的字节数,确定是字节、半字还是字。
    ④:DMA的每个通道优先级是可变的。以DMA1为例,它有7个通道,可以配置每个通道的优先级为很高、高、中,低四种中的一种。若两个通道的优先级一样,当两个通道同时有DMA请求时,通道号小的优先级则高。
    ⑤:DMA每次传输的数据量是可变的,DMA中有一个专门的寄存器用于存储这个数据量值。这个寄存器是32位的,但高16位全部保留为0,实际上起作用的是低16位,所以每次传输的最大数据量值是65536。
    ⑥:⑤中所示,比如设置数据量值为100,若DMA传输设置为循环模式,则100个数据传输完成后,将自动进行下一轮传输。若设置成非循环模式,则需要先关闭DMA,再设置数据量值,再开启DMA,才能进行下一轮传输。
    ⑦:DMA在传输过程中,常用的有3种标志位–传输完成一半、传输全部完成,传输过程发生错误。可以在程序中设置开启对应标志位的中断,当标志位到来时,会执行中断服务程序。也可不开启相应标志位的中断。
    ⑧:确定好要传输的外设和存储器地址之后,需要在程序中设置传输方向,即传输方向是从外设到寄存器,还是从寄存器到外设。
    ⑨:DMA一般用来在外设和存储器之间进行数据传输,所以还要设置外设地址及存储器地址是否递增。例如定义一个数组,char data[100],外设地址为&UART->TX,若将数组中的100个数据传输到UART->TX中,则存储器地址需要每次递增,而外设地址不需要递增。

    DMA配置过程:

    ①:确定传输数据的外设和寄存器地址
    ②:确定传输方向
    ③:确定每次传输的数据量值
    ④:确定传输数据的字节数
    ⑤:配置通道优先级
    ⑥:确定传输是循环模式还是非循环模式
    ⑦:如若需要开启中断,则开启响应位中断
    注意:DMA也可以从存储器到存储器,但存储器到存储器过程只能为非循环模式。

    然后是来自https://blog.csdn.net/gdjason/article/details/51019219的形象解读:

    一、如何理解DMA
    对于DMA,打个比方就很好理解:
    角色预设: 淘宝店主 —- STM32 MCU
    快递员 —- 外设(如UART,SPI)
    发货室 —- DMA
    1、首先你是一个淘宝店主,如果每次发货收货都要跟快递沟通交涉会很浪费时间和精力。
    2、然后你就自己建了一个发货室,发货室里有好多个货柜箱子,每个箱子上都写着快递名字(如果申通快递,顺丰快递等)。
    3、每次发什么快递,你就找到对应的货柜箱子,把货物放进去即可,然后跟快递通知一声。
    4、快递取走快件。
    5、如果是收货,快递直接把快件放到对应的柜子,然后通知你一下。
    6、你过来提取货物。

    通过上面的方式,你可以不需要直接跟快递打交道,就可以轻松发货成功,DMA处理方式跟上面例子是一样的。如下图:
    在这里插入图片描述

    那么DMA在STM32上是具体怎么实现的呢? 我们先了解一下STM32关于DMA的相关配置。
    1、两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道)
    ps:对应我们例子,就是有两个大的发货室,一个有7个货柜,另个有5个货柜。
    2、在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)
    ps: 店主可以跟每个快递公司签订协议,可以在货柜前贴上加急(很高),很急(高),急(中),一般(低), 如果同时有几个快递员过来取货,优先根据上面的优先级先取件。
    3、独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
    ps: 指的是货件大小
    4、支持循环的缓冲器管理(会把原来的数据覆盖)
    5、每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
    ps: 送快递出现的异常情况(送到了一半,送完,快递出错)
    解释到这里,不知道大家能不能理解呢。后面是具体的配置。
    1、DMA 对应通道如下图
    DMA1:
    这里写图片描述


    DMA2:
    这里写图片描述

    2、DMA配置
    1)数据传输的目的地和来源
    这里写图片描述
    对应我的例子,就是送快递还是取快递。

    2)定义DMA通道的DMA缓存的大小
    ps: 即货柜大小,能存多少个快件

    3)外设地址寄存器递增与否
    这里写图片描述

    4)内存地址寄存器递增与否
    这里写图片描述

    5)设定了外设数据宽度
    这里写图片描述

    6)设定了内存数据宽度
    这里写图片描述

    7)设置了DMA的工作模式
    这里写图片描述

    8)DMA通道的软件优先级
    这里写图片描述

    9)使能或关闭DMA通道的内存到内存传输
    这里写图片描述

    2)初始化DMA

    u8 sendbuf[1024];
    u8 receivebuf[1024];
    static void _uart1_dma_configuration()
    {
      DMA_InitTypeDef DMA_InitStructure;
    
      /* DMA1 Channel6 (triggered by USART1 Rx event) Config */
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 ,
                            ENABLE);
    
      /* DMA1 Channel5 (triggered by USART1 Rx event) Config */
      DMA_DeInit(DMA1_Channel5);
      DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;// 初始化外设地址,相当于“哪家快递”  
      DMA_InitStructure.DMA_MemoryBaseAddr =(u32)receivebuf;// 内存地址,相当于几号柜
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设作为数据来源,即为收快递
      DMA_InitStructure.DMA_BufferSize = DMASIZE ;// 缓存容量,即柜子大小
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不递增,即柜子对应的快递不变
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 内存递增
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设字节宽度,即快递运输快件大小度量(按重量算,还是按体积算) 
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;// 内存字节宽度,即店主封装快递的度量(按重量,还是按体质进行封装)
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 正常模式,即满了就不在接收了,而不是循环存储
      DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;// 优先级很高,对应快递就是加急
      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 内存与外设通信,而非内存到内存 
      DMA_Init(DMA1_Channel5, &DMA_InitStructure);// 把参数初始化,即拟好与快递公司的协议
    
      DMA_Cmd(DMA1_Channel5, ENABLE);// 启动DMA,即与快递公司签订合同,正式生效
    
      /* DMA1 Channel4 (triggered by USART1 Tx event) Config */
      DMA_DeInit(DMA1_Channel4);
      DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;  // 外设地址,串口1, 即发件的快递
      DMA_InitStructure.DMA_MemoryBaseAddr =(u32)sendbuf;// 发送内存地址
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;// 外设为传送数据目的地,即发送数据,即快递是发件
      DMA_InitStructure.DMA_BufferSize = 0;  //发送长度为0,即未有快递需要发送
      DMA_Init(DMA1_Channel4, &DMA_InitStructure);//初始化
    
      USART_ITConfig(USART1, USART_IT_TC, ENABLE);// 使能串口发送完成中断
      USART_DMACmd(USART1, USART_DMAReq_Tx|USART_DMAReq_Rx, ENABLE);// 使能DMA串口发送和接受请求
    
    下面代码是一个标准DMA设置,当然实际应用中可根据实际情况进行裁减,来自:
    
    ## https://blog.csdn.net/faihung/article/details/78748033
    
    ```
    DMA_DeInit(DMA_Channel1);
    ```
    上面这句是给DMA配置通道,根据ST提供的资料,STM3210Fx中DMA包含7个通道(CH1~CH7),也就是说可以为外设或memory提供7座“桥梁”
    ```
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
    ```
    上面语句中的DMA_InitStructure是一个DMA结构体,在库中有声明了,当然使用时就要先定义 了;DMA_PeripheralBaseAddr是该结构体中一个数据成员,给DMA一个起始地址,好比是一个buffer起始地址,数据流程是:外设 寄存器à DMA_PeripheralBaseAddàmemory中变量空间(或flash中数据空间等),ADC1_DR_Address是我定义的一个地址 变量;
    ```
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;
    ```
    上面这句很显然是DMA要连接在Memory中变量的地址,ADC_ConvertedValue是我自己在memory中定义的一个变量;
    
         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    
    上面的这句是设置DMA的传输方向,就如前面我所说的,DMA可以双向传输,也可以单向传输,这里设置的是单向传输,如果需要双向传输:把DMA_DIR_PeripheralSRC改成DMA_DIR_PeripheralDST即可。
    
        DMA_InitStructure.DMA_BufferSize = 2;
    
    上面的这句是设置DMA在传输时缓冲区的长度,前面有定义过了buffer的起始地址:ADC1_DR_Address ,为了安全性和可靠性,一般需要给buffer定义一个储存片区,这个参数的单位有三种类型:Byte、HalfWord、word,我设置的2个 half-word(见下面的设置);32位的MCU中1个half-word占16 bits。
    
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    
    上面的这句是设置DMA的外设递增模式,如果DMA选用的通道(CHx)有多个外设连接,需要使用外设递增模式:DMA_PeripheralInc_Enable;我的例子里DMA只与ADC1建立了联系,所以选用DMA_PeripheralInc_Disable
    
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    
    上面的这句是设置DMA的内存递增模式,DMA访问多个内存参数时,需要使用DMA_MemoryInc_Enable,当DMA只访问一个内存参数时,可设置成:DMA_MemoryInc_Disable。
    
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    
    上面的这句是设置DMA在访问时每次操作的数据长度。有三种数据长度类型,前面已经讲过了,这里不在叙述。
    
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    
    与上面雷同。在此不再说明。
    
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    
    上面的这句是设置DMA的传输模式:连续不断的循环模式,若只想访问一次后就不要访问了(或按指令操作来反问,也就是想要它访问的时候就访问,不要它访问的时候就停止),可以设置成通用模式:DMA_Mode_Normal
    
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    
    上面的这句是设置DMA的优先级别:可以分为4级:VeryHigh,High,Medium,Low.
    
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    
    上面的这句是设置DMA的2个memory中的变量互相访问的
    
        DMA_Init(DMA_Channel1,&DMA_InitStructure);
    
    前面那些都是对DMA结构体成员的设置,在次再统一对DMA整个模块做一次初始化,使得DMA各成员与上面的参数一致。
    
        DMA_Cmd(DMA_Channel1,ENABLE);
    
    哈哈哈!这一句我想我就不罗嗦了,大家一看就明白。
    
    接下来,我们去STM32的程序中来分析下DMA配置的详细过程:
    我们主要详细的讲解下两个配置函数:DMA_Configuration()和DMA_Init()这两个函数,来自:
    ## https://blog.csdn.net/u010280307/article/details/53334985
    
    ```
    void DMA_Configuration(void)
    {
    	DMA_InitTypeDef DMA_InitStructure;
    	/* DMA channel1 configuration */ 
    	DMA_DeInit(DMA1_Channel1);//重置DMA的寄存器的值,配置为缺省值	
    	DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&ADC1->DR;	/*设置 DMA 外设基地址,即为转换结果的寄存器*/
    	DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&AD_Value;/*定义内存基地址*/
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;	/*定义AD外设作为数据传输的来源*/
    	DMA_InitStructure.DMA_BufferSize = N*M;/*指定DMA通道DMA缓存的大小,即需要开辟几个内存空间*/
    	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;	/*寄存器地址国定*/
    	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;	/*设定内存地址递增,即每次DMA都是将*/	
    	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;/* 定义外设和内存的数据宽度*/
    	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;/*设定DMA工作再循环缓存模式*/
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High;/*设定DMA选定的通道的软件优先级*/
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//关闭内存到内存的传输   
    	DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    	DMA_Cmd(DMA1_Channel1, ENABLE);/* Enable DMA channel1 */
    }
    
    ```
    
    ```
    void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct)
    {
      uint32_t tmpreg = 0;
    /*--------------------------- DMAy Channelx CCR Configuration -----------------*/
      /* Get the DMAy_Channelx CCR value */
      tmpreg = DMAy_Channelx->CCR;
      /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */
      tmpreg &= CCR_CLEAR_Mask;
      /* Configure DMAy Channelx: data transfer, data size, priority level and mode */
      /* Set DIR bit according to DMA_DIR value */
      /* Set CIRC bit according to DMA_Mode value */
      /* Set PINC bit according to DMA_PeripheralInc value */
      /* Set MINC bit according to DMA_MemoryInc value */
      /* Set PSIZE bits according to DMA_PeripheralDataSize value */
      /* Set MSIZE bits according to DMA_MemoryDataSize value */
      /* Set PL bits according to DMA_Priority value */
      /* Set the MEM2MEM bit according to DMA_M2M value */
      tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode |
                DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc |
                DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize |
                DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M;
     
      /* Write to DMAy Channelx CCR */
      DMAy_Channelx->CCR = tmpreg;
     
    /*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/
      /* Write to DMAy Channelx CNDTR */
      DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize;
     
    /*--------------------------- DMAy Channelx CPAR Configuration ----------------*/
      /* Write to DMAy Channelx CPAR */
      DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr;
     
    /*--------------------------- DMAy Channelx CMAR Configuration ----------------*/
      /* Write to DMAy Channelx CMAR */
      DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr;
    }
    
    ```
    将上面两个函数比较一下就可以知道,前者函数对于后者来说就相当于是一个中间量的过程,暂时的将需要的配置参数写入一个结构体DMA_InitTypeDef中,后面调用DMA_Init这个函数之后,重新配置物理地址中DMA的寄存器相应的位。下面附录上两个函数中的结构体参数组成
    
    ```
    typedef struct
    {
      __IO uint32_t CCR;
      __IO uint32_t CNDTR;
      __IO uint32_t CPAR;
      __IO uint32_t CMAR;
    } DMA_Channel_TypeDef;
    
    ```
    
    ```
    DMA_InitTypeDef  DMA_InitStructure;
    typedef struct
    {
      uint32_t DMA_PeripheralBaseAddr;
      uint32_t DMA_MemoryBaseAddr;   
      uint32_t DMA_DIR;  
      uint32_t DMA_BufferSize;   
      uint32_t DMA_PeripheralInc;   
      uint32_t DMA_MemoryInc;   
      uint32_t DMA_PeripheralDataSize; 
      uint32_t DMA_MemoryDataSize;    
      uint32_t DMA_Mode;    
      uint32_t DMA_Priority;      
      uint32_t DMA_M2M;                                                  
    }DMA_InitTypeDef;
    
    ```
    
    
    展开全文
  • stm32 DMA配置的详解

    2019-08-02 19:12:07
    http://www.51hei.com/stm32/3864.html
    展开全文
  • STM32 DMA配置参数

    千次阅读 2017-04-26 15:12:32
    DmaHandle.Instance ........................................... 通道选择 ... DMA工作模式 DmaHandle.Init.Priority ......................................... DMA优先级

    DmaHandle.Instance ........................................... 通道选择

    DmaHandle.Init.Direction .................................... 传输方向

    DmaHandle.Init.PeriphInc .................................... 外设地址增量方式

    DmaHandle.Init.MemInc ....................................... 内存地址增量方式

    DmaHandle.Init.PeriphDataAlignment ............... 外设数据长度

    DmaHandle.Init.MemDataAlignment .................. 内存数据长度

    DmaHandle.Init.Mode ........................................... DMA工作模式

    DmaHandle.Init.Priority ......................................... DMA优先级


    展开全文
  • Stm32 DMA配置(库函数笔记)

    千次阅读 2018-06-10 14:35:16
    1.简介<1>...:STM32最多有两个DMA的控制器,DMA1有7个通道,DMA2有5个通道,也存在一个仲裁器来判断优先级(共四级 很高 高 中 低)<3>:DMA的通道连接着专用硬件的...

    1.简介

    <1>:DMA,全称为:Direct Memory Access,即直接存储器访问。实际上,DMA作为一个硬件电路,实现在无CPU干预的情况下,内存(memory)和外设之间的联系

    <2>:STM32最多有两个DMA的控制器,DMA1有7个通道,DMA2有5个通道,也存在一个仲裁器来判断优先级(共四级 很高 高 中 低)

    <3>:DMA的通道连接着专用硬件的DMA请求,可以通过软件来配置

    <4>:在DMA中,每个通道存在着三个事件标志(半传输,传输完成,传输失败),通过读取其中的0/1判断是否配置成功

    <5>:可以实现外设(Peripheral)和内部存储器(Memory)之间的传输(单向,可相互转换)

    <6>:可以实现内存到内存之间的传输(M2M)


    2.配置过程

    1.实现DMA时钟使能

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1

    2.实现DMA的初始化

        
            DMA_InitTypeDef DMA_InitStruct;        
            DMA1_MEM_LEN=cndtr;//设置每一次的数据传输量
    	DMA_DeInit(DMA_CHx);//刷新设置
    	//开始初始化
    	DMA_InitStruct.DMA_BufferSize=cndtr;//数据传输量
    	DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;//director(目标)  DST(外设为目标) SRC(外设为源头)
    	DMA_InitStruct.DMA_M2M= DMA_M2M_Disable;//不采用存储器到存储器
    	DMA_InitStruct.DMA_MemoryBaseAddr=cmar;//设置存储器地址
    	DMA_InitStruct.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//8位
    	DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;//设置增量模式
    	DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;//设置循环模式
    	DMA_InitStruct.DMA_PeripheralBaseAddr=cpar;
    	DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//8位
    	DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
    	DMA_InitStruct.DMA_Priority=DMA_Priority_Medium;//设置优先级
    	
    	DMA_Init(DMA_CHx,&DMA_InitStruct);//设置结构体
    	
    } 

    3.开启传输过程(注意实现DMA数据值的刷新)

    void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
    { 
    	DMA_Cmd(DMA_CHx,DISABLE);//关闭通道,设置DMA的数据值
    	DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//设置传输数据
    	DMA_Cmd(DMA_CHx,ENABLE);//使能,产生数据传输
    }	  

    注:对于DMA初始化详解:

    typedef struct {   
    uint32_t DMA_PeripheralBaseAddr;   uint32_t DMA_MemoryBaseAddr;       uint32_t DMA_DIR;                uint32_t DMA_BufferSize;     
     uint32_t DMA_PeripheralInc;       uint32_t DMA_MemoryInc;        
    uint32_t DMA_PeripheralDataSize;   uint32_t DMA_MemoryDataSize;      uint32_t DMA_Mode;             
    uint32_t DMA_Priority;    
    uint32_t DMA_M2M;      }
    DMA_InitTypeDef; 

    1.第一个参数 DMA_PeripheralBaseAddr 用来设置 DMA 传输的外设基地址,比如要进行串口 DMA 传输,那么外设基地址为串口接受发送数据存储器 USART1->DR 的地址,表示方法为 &USART1->DR,在传输之前要设置外设和内存的地址,一般是以指针的形式

     第二个参数DMA_MemoryBaseAddr为内存基地址,也就是我们存放DMA传输数据的内存地址。

     第三个参数 DMA_DIR 设置数据传输方向,决定是从外设读取数据到内存还送从内存读取数 据发送到外设,也就是外设是源地还是目的地,DST(distraction 目标),SRE(source 源头)所以选择值为 DMA_DIR_PeripheralDST。

     第四个参数 DMA_BufferSize 设置一次传输数据量的大小,(不超过65535)

     第五个参数 DMA_PeripheralInc 设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 1

    第六个参数 DMA_MemoryInc 设置传输数据时候内存地址是否递增。这个参数和 DMA_PeripheralInc 意思接近,只不过针对的是内存。

    第七个参数 DMA_PeripheralDataSize 用来设置外设的的数据长度是为字节传输(8bits), 半字传输(16bits)还是字传输(32bits),这里我们是 8 位字节传输,所以值设置为 DMA_PeripheralDataSize_Byte。

     第八个参数 DMA_MemoryDataSize 是用来设置内存的数据长度,和第七个参数意思接近,这 里我们同样设置为字节传输 DMA_MemoryDataSize_Byte




    展开全文
  • 看了许多资料都没有讲如何配置DMA通道外设基地址 ADC 规则数据寄存器(ADC_DR)的地址偏移:4Ch #define ADC1_DR_Address ((u32)0x4001244C) 就是ADC1的外设基地址(0x4001 2400)加上ADC数据寄存器(ADC_DR)的...
  • STM32DMA ADC配置方法

    千次阅读 2018-10-10 10:07:42
    void Adc_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure;... DMA_InitTypeDef DMA_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GP...
  • STM32 DMA 的使用

    2015-07-09 20:22:01
    代码中有stm32DMA配置和使用,十分详细
  • STM32 DMA通道一览及其配置

    千次阅读 2019-10-12 17:04:21
    DMA通道一览 DMA1通道 DMA2通道 DMA内容详解 DMA的定义 直接存储器存取(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术。它允许某些电脑内部的硬体子系统(电脑外设),可以独立地直接读写系统...
  • STM32CubeMX配置STM32F407的ADC-DMA
  • STM32F4系列使用寄存器操作进行DMA配置流程,存储器到串口外设,学习时候的笔记,测试时要保证将串口先配置好
  • STM32CubeMX配置STM32F407的SDCard-DMA-FatFs
  • STM32 DMA

    2019-09-08 16:41:20
    函数说明参考 : stm32.cube(九)——HAL.DMA 本文链接:...DMA发送参考: STM32 使用CUBEMX配置 生成DMA+串口发送测试代码 精简 https://blog.csdn.net/ssmsky_2007/article/details/82690285...
  • STM32DMA实验

    千次阅读 2018-09-18 22:34:02
    1.1STM32F4 DMA简介 DMA,全称Direct Memory Access ,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送的同类,能使...
  • STM32 DMA详解

    千次阅读 2020-08-04 22:57:32
    本文根据STM32F207用户手册DMA章节翻译总结的DMA知识点
  • 关于STM32 DMA传输的理解

    千次阅读 2020-07-21 22:02:28
    参考了网上一些教程总结的STM32 DMA笔记,从原理到实例运用,希望对你有帮助!
  • STM32 DMA简述

    2018-08-14 18:47:00
    STM32 DMA简述 DMA (Direct Memory Access) 直接内存存储器,在做数据传输时能够大大减轻CPU的负担。 DMA的作用 DMA提供了一个关于数据的高数传输通道,这个通道不占用CPU的资源。换句话说,通过DMA通道,你在传输大...
  • STM32 DMA使用详解

    万次阅读 多人点赞 2017-12-08 09:17:19
    DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。 DMA的定义直接存储器存取(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术。它允许...
  • STM32 DMA传输 中断方式配置 源代码

    千次阅读 2018-06-20 10:39:45
    stm32单片机源程序:#include "pbdata.h"void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void USART_Configuration(void);void ADC_Configuration(void);...
  • STM32 DMA 自我学习 简单总结

    千次阅读 2014-11-03 22:00:45
    简单记录一下STM32DMA
  • STM32 DMA1 DMA2冲突???

    千次阅读 2020-02-15 17:14:14
    使用stm32F4的SPI2 DMA1更新LCD显示; 同时通过USART1 DMA2将显示数据发给上位机。 从stm32F4 总线矩阵看两者并无交叉(下图);但实际测试发现DMA2发送的串口数据乱码较多。 从图中标记看DMA2 DMA1 分别访问USART1...
  • stm32 DMA

    2014-10-11 19:12:54
    DMA配置 uc32 SRC_Const_Buffer[BufferSize ] = /* 定义外设数据,注意此处数据定义在FLASH中 */ {  0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,  0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,  0x...
  • 这几天从寄存器转战到HAL库,使能串口DMA时惊奇的发现,我的配置全部都正确,但是开始传输数据时,得到的永远都是一个错误传输位,百度无果,最后在Google找到了这么一篇文章,STM32H743Nucleo ADC使用DMA配置无法...
  • STM32 | DMA配置和使用如此简单(超详细)

    万次阅读 多人点赞 2020-04-26 09:42:01
    其实DMA配置和使用如此简单!本文让你无论在DMA认识和理解上(抽象不抽象都有)还是在DMA配置和使用上有个彻彻底底的认识。文章包括寄存器和库函数讲解,省去你自行翻阅使用手册和固件库手册,点到点教会你DMA的配置...
  • stm32CubeMX配置串口发送DMA

    千次阅读 2020-05-21 18:29:14
    stm32CubeMX 5.6.1 直接上配置图: 配置串口波特率,其他默认 添加发送DMA,也是使用默认值 使能中断 然后生成工程 这里有个需要注意的地方,就是函数调用顺序,MX_DMA_Init()函数需要在其他初始化前...
  • STM32 DMA 通信

    2014-06-12 17:03:19
    DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成。典型的例子就是移动一...
  • STM32 DMA学习

    2014-07-01 15:12:59
    最近接触了STM32的Chip,发现其优点不只是单单宣传的32bits的MCU的速度,而且在编程的风格上也有了较大的变化(与我原有的编程习惯);特别是有一个与CPU并行运行的模块:DMA,对它印象深刻。现在就和大家一起讨论...
  • STM32 DMA加串口空闲中断接收数据

    千次阅读 2019-12-27 10:42:47
    STM32使用DMA加串口空闲中断接收数据 STM32中,需要用串口接收数据,是使用串口中断来接收数据。但是用这种方法的话,就要频繁进入串口中断,然后处理,效率就比较低。于是就想到用DMA来接收串口数据,这个STM32...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,964
精华内容 3,585
关键字:

stm32dma配置