精华内容
下载资源
问答
  • 对于stm32中dma的理解

    万次阅读 2017-02-27 18:51:33
    3.stm32中dma支持外设通道选择,并且可以用仲裁器配置adc对数据流的处理顺序。 4.dma带有一个被称为fifo的东西,主要配置fifo来实现对传输双方要求字长不匹配的调整。即所谓 FIFO 对于要求源地址和

    一.dma常识.
    1.作用:实现片内数据之间的高速传输。即是能够不占用cpu实现数据传输。
    2.模式:外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。
    3.stm32中的dma支持外设通道选择,并且可以用仲裁器配置adc对数据流的处理顺序。
    4.dma带有一个被称为fifo的东西,主要配置fifo来实现对传输双方要求字长不匹配的调整。即所谓

    FIFO 对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时同时把原来 4 个 8 位字节的数据拼凑成一个 32 位字数据。此时使用 FIFO 功能先把数据缓存起来,分别根据需要输出数据

    5.dma1不能实现储存器到储存器。
    6.dma还拥有流控制器,它能够实现的是可以传输一定数目的数据。对于不知道数据数量的,唯一的外设sdio是可以自己发出停止传输的信号的。
    7.dma传输有两种类型。一是单次传输,一是突发传输。后者必须使用fifo,并且要求 FIFO 阈值一定要是内存突发传输数据量的整数倍。但是疑问是单次传输有什么好处呢?
    8.直接模式在每个外设请求都立即启动对存储器传输的单次传输。直接模式要求源地址和目标地址的数据宽度必须一致。
    二.stm32f429中dma的具体配置方式。
    1.DMA_Channel:配置dma请求发出的通道。
    2.DMA_PeripheralBaseAddr:配置外设地址。
    3.DMA_Memory0BaseAddr:配置存储器零的地址。
    4.DMA_DIR:传输方向配置。
    5.DMA_BufferSize:设定待传输的数据数目。
    6.DMA_PeripheralInc:能控制外设地址是否递增。
    7.DMA_MemoryInc:能使存储器地址自动递增功能。常用。
    8.DMA_PeripheralDataSize: 外设数据宽度,可选字节(8 位)、半字(16 位)和字(32位)跟相应的外设有关系。看外设多少位数据有效。
    9.DMA_MemoryDataSize:存储器数据宽度
    10.DMA_Mode : DMA 传 输 模 式 选 择 , 可 选 一 次 传 输 或 者 循 环 传 输。
    11DMA_Priority:软件设置数据流的优先级.
    12DMA_FIFOMode: FIFO 模式使能.
    13.DMA_FIFOThreshold: FIFO 阈值选择。
    14.DMA_MemoryBurst:存储器突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式。
    15.DMA_PeripheralBurst:外设突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式。

    展开全文
  • STM32_DMA

    2020-05-30 10:50:13
    eg:STM32F407ZGT6 目录 1:DMA简介 2:DMA主要特征 3:DMA框图 ...STM32F4最多有2个DMA控制器(DMA2仅存在大容量产品),2个DMA控制器总共有16个数据流(每个控制器8个)。每个DMA控制器都用

    eg:STM32F407ZGT6

    目录

    1:DMA简介

    2:DMA主要特征

    3:DMA框图

    4:DMA配置参数


    1:DMA简介

    DMA:Direct Memory Access 直接存储器访问

    DMA传输将数据从一个地址空间复制到另一个地址空间,当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的 ,其作用,就是为CPU减负的

    STM32F4最多有2个DMA控制器(DMA2仅存在大容量产品中),2个DMA控制器总共有16个数据流(每个控制器8个)。每个DMA控制器都用于管理一个或多个外设的存储器访问请求,每个数据流总共有8个通道,每个通道都有一个仲裁器,用于处理DMA请求间的优先级

     

    2:DMA主要特征

    说几个重要的

    1. 每个数据流有单独的四级32位先进先出存储器缓冲区FIFO,可用于FIFO模式直接模式

                FIFO模式:可通过软件将阈值级别选择为FIFO大小的1/4、1/2、3/4

                直接模式:每个DMA请求会立即启动对存储器的传输。

        2.通过硬件可以将 每个数据流配置为:

             外设到存储器,存储器到外设,存储器到存储器

             也支持在存储器方双缓冲的双缓冲区通道

        3.DMA数据流请求之间的优先级可用软件编程(4个Level:非常高、高、中、低),在软件优先级相同的情况下可以通过硬件决定         优先级

        4.DMA2控制器下,每个数据流也支持通过软件触发存储器到存储器的传输

        5.要传输的数据项的数目可以由DMA控制器或外设管理

             DMA流控制器:要传输的数据项的数目是1到65535,可用软件编程

             外设流控制器:要传输的数据项的数目未知并由源或目标外设控制,这些外设通过硬件发出传输结束的信号

        6.独立的源和目标传输参数(字节,半字,字),源和目标的数据宽度不相同时,DMA自动封装/解封必要的传输数据来优化带宽       (FIFO模式下)

         7.5个事件标志(半传输、传输完成、传输错误、FIFO错误、直接错误)

    3:DMA框图

     

    剩下的一些DMA事务,存储器到外设,存储器到存储器的访问模式,仲裁器,指针递增,循环模式,中断啥的,太多了,可以去看数据手册。

    4:DMA配置参数

    1. 通道
    2. 优先级
    3. 数据传输方向
    4. 存储器/外设 数据宽度
    5. 存储器/外设 地址是否增量
    6. 循环模式
    7. 数据传输量

    (这几个点就是配置过程中要注意的地方)

      /* 配置 DMA Stream */
      DMA_InitStructure.DMA_Channel = chx;                   //通道选择
      DMA_InitStructure.DMA_PeripheralBaseAddr = par;        //DMA外设地址
      DMA_InitStructure.DMA_Memory0BaseAddr = mar;           //DMA 存储器0地址
      DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
      DMA_InitStructure.DMA_BufferSize = ndtr;              //数据传输量 
      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_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;        //存储器突发单次传输
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
      DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream

    上面存储器0地址就是源地址,要发送数据所处的地址

    展开全文
  • stm32-DMA简介

    2020-07-11 17:02:51
    本篇是我关于stm32中I2C的学习笔记,大部分参考的是《【野火®】零死角玩转STM32—F103-MINI》以及《STM32中文参考手册_V10》。推荐大家自己下去可以仔细阅读。 一、DMA 简介 DMA(Direct Memory Access)—直接...

    本篇是我关于stm32中I2C的学习笔记,大部分参考的是《【野火®】零死角玩转STM32—F103-MINI》以及《STM32中文参考手册_V10》。推荐大家自己下去可以仔细阅读。


    一、DMA 简介

    DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者是 FLASH。DMA 控制器包含了 DMA1 和 DMA2,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,这里的通道可以理解为传输数据的一种管道。要注意的是 DMA2 只存在于大容量的单片机中

    二、DMA 功能框图

    DMA 控制器独立于内核,属于一个单独的外设,结构比较简单,从编程的角度来看,我们只需掌握功能框图中的三部分内容即可,具体见下图DMA 控制器的框图
    在这里插入图片描述

    ①DMA 请求

    • 如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求,DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕。

    • DMA 有 DMA1 和 DMA2 两个控制器,DMA1 有 7 个通道,DMA2 有 5 个通道,不同 的 DMA 控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置, 具体见 DMA 请求映像表。

    • DMA1控制器
      在这里插入图片描述

    • 从外设(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3]) 产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见 图的DMA1请求映像。
    • 外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。
    • DMA2控制器
      在这里插入图片描述

    从外设(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,这意味着同时只能有一个请求有效。

    ②通道

    • DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个

    ③仲裁器

    • 当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在DMA_CCRx 寄存器中设置,有 4 个等级:非常高、高、中和低四个优先级。
    • 第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0 高于通道 1。在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。

    三、DMA 数据配置

    • 使用 DMA,最核心就是配置要传输的数据,包括数据从哪里来,要到哪里去,传输的数据的单位是什么,要传多少数据,是一次传输还是循环传输等等。

    1. 从哪里来到哪里去

    • 我们知道 DMA 传输数据的方向有三个:从外设到存储器,从存储器到外设,从存储器到存储器。具体的方向 DMA_CCR 位 4 DIR 配置:0 表示从外设到存储器,1 表示从存储器到外设。这里面涉及到的外设地址由 DMA_CPAR 配置,存储器地址DMA_CMAR配置。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 外设到存储器
      当我们使用从外设到存储器传输时,以 ADC 采集为例。DMA 外设寄存器的地址对应的就是 ADC 数据寄存器的地址,DMA 存储器的地址就是我们自定义的变量(用来接收存储 AD 采集的数据)的地址。方向我们设置外设为源地址。
    • 存储器到外设
      当我们使用从存储器到外设传输时,以串口向电脑端发送数据为例。DMA 外设寄存器的地址对应的就是串口数据寄存器的地址,DMA 存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储通过串口发送到电脑的数据)的地址。方向我们设置外设为目标地址。
    • 存储器到存储器
      当我们使用从存储器到存储器传输时,以内部 FLASH 向内部 SRAM 复制数据为例。DMA 外设寄存器的地址对应的就是内部 FLASH(我们这里把内部 FALSH 当作一个外设来看)的地址,DMA 存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部 FLASH 的数据)的地址。方向我们设置外设(即内部 FLASH)为源地址。跟上面两个不一样的是,这里需要把 DMA_CCR 位 14:MEM2MEM:存储器到存储器模式配置为 1,启动 M2M 模式
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    2. 要传多少,单位是什么

    • 当我们配置好数据要从哪里来到哪里去之后,我们还需要知道我们要传输的数据是多少,数据的单位是什么。

    • 以串口向电脑发送数据为例,我们可以一次性给电脑发送很多数据,具体多少由 DMA_CNDTR 配置,这是一个 32 位的寄存器,一次最多只能传输 65535 个数据。
      在这里插入图片描述

    • 要想数据传输正确,源和目标地址存储的数据宽度还必须一致,串口数据寄存器是 8 位的,所以我们定义的要发送的数据也必须是 8 位。外设的数据宽度由 DMA_CCRx 的 PSIZE[1:0]配置,可以是 8/16/32 位,存储器的数据宽度由 DMA_CCRx 的 MSIZE[1:0]配置,可以是 8/16/32 位。
      在这里插入图片描述

    • 在 DMA 控制器的控制下,数据要想有条不紊的从一个地方搬到另外一个地方,还必 须正确设置两边数据指针的增量模式。外设的地址指针由 DMA_CCRx 的 PINC 配置,存储器的地址指针由 MINC 配置。以串口向电脑发送数据为例,要发送的数据很多,每发送完一个,那么存储器的地址指针就应该加 1,而串口数据寄存器只有一个,那么外设的地址指针就固定不变。具体的数据指针的增量模式由实际情况决定
      在这里插入图片描述可编程的数据传输宽度、对齐方式和数据大小端

    当PSIZE和MSIZE不相同时,DMA模块按照下表进行数据对齐
    在这里插入图片描述

    两个简单的例子
    在这里插入图片描述

    3. 什么时候传输完成

    • 数据什么时候传输完成,我们可以通过查询标志位或者通过中断的方式来鉴别。每个 DMA 通道在 DMA 传输过半、传输完成和传输错误时都会有相应的标志位,如果使能了该类型的中断后,则会产生中断。有关各个标志位的详细描述请参考 DMA 中断状态寄存器DMA_ISR 的详细描述。
      在这里插入图片描述
      在这里插入图片描述
    • 传输完成还分两种模式,是一次传输还是循环传输,一次传输很好理解,即是传输一次之后就停止,要想再传输的话,必须关断 DMA 使能后再重新配置后才能继续传输。循环传输则是一次传输完成之后又恢复第一次传输时的配置循环传输,不断的重复。具体的由 DMA_CCRx 寄存器的 CIRC 循环模式位控制。
      在这里插入图片描述

    四、DMA 初始化结构体详解

    在这里插入图片描述

    1. 从哪里来到哪里去

    • DMA_PeripheralBaseAddr:外设地址,设定 DMA_CPAR 寄存器的值;一般设置为外设的数据寄存器地址,如果是存储器到存储器模式则设置为其中一个存储器地址。
    • DMA_Memory0BaseAddr:存储器地址,设定 DMA_CMAR 寄存器值;一般设置为我们自定义存储区的首地址。
    • DMA_DIR:传输方向选择,可选外设到存储器、存储器到外设。它设定- DMA_CCR 寄存器的 DIR[1:0]位的值。这里并没有存储器到存储器的方向选择,当使用存储器到存储器时,只需要把其中一个存储器当作外设使用即可。
    • DMA_M2M :存储器到存储器模式,使用存储器到存器时用到, 设定DMA_CCR 的位14 MEN2MEN 即可启动存储器到存储器模式。

    2. 要传多少,单位是什么

    • DMA_BufferSize:设定待传输数据数目,初始化设定 DMA_CNDTR 寄存器的值。
    • DMA_PeripheralInc:如果配置为 DMA_PeripheralInc_Enable,使能外设地址自动递增功能,它设定 DMA_CCR 寄存器的 PINC 位的值;一般外设都是只有一个数 据寄存器,所以一般不会使能该位。
    • DMA_MemoryInc:如果配置为 DMA_MemoryInc_Enable,使能存储器地址自动递增功能,它设定 DMA_CCR 寄存器的 MINC 位的值;我们自定义的存储区一般都是存放多个数据的,所以要使能存储器地址自动递增功能。
    • DMA_PeripheralDataSize:外设数据宽度,可选字节(8 位)、半字(16 位)和字(32位),它设定 DMA_CCR 寄存器的 PSIZE[1:0]位的值。
    • DMA_MemoryDataSize:存储器数据宽度,可选字节(8 位)、半字(16 位)和字(32位),它设定 DMA_CCR 寄存器的 MSIZE[1:0]位的值。当外设和存储器之间传数

    3. 什么时候传输完成

    • DMA_Mode:DMA 传输模式选择,可选一次传输或者循环传输,它设定DMA_CCR 寄存器的 CIRC 位的值。例程我们的 ADC 采集是持续循环进行的,所以使用循环传输模式。
    • DMA_Priority:软件设置通道的优先级,有 4 个可选优先级分别为非常高、高、中和低,它设定 DMA_CCR 寄存器的 PL[1:0]位的值。DMA 通道优先级只有在多个 DMA 通道同时使用时才有意义,如果是单个通道,优先级可以随便设置。

    五、实现例程

    我用原子精英板写了两个例程,一个是寄存器到寄存器、一个是存储器到外设,想要的可以从下面的链接下载。
    代码下载

    展开全文
  • STM32 UART DMA 收发数据

    2019-04-22 10:20:32
    该代码同时支持stm32 f1 系列 的 三路USART 通道, 全部采用 DMA 自动收发数据, 通过中断返回判断数据是否收发完成。 代码已经测试通过可以,可以直接使用。移植使用时需要注意,IO口 / 波特率 等信息
  • 上一篇文章《STM32使用DMA接收串口数据》讲解了如何使用DMA接收数据,使用DMA外设和...我们使用USART1串口外设,从数据手册可以查到,USART1的发送和接收都是支持DMA的,使用的是DMA2. 接下来就是撸代码的时刻了

    1、概述

    上一篇文章《STM32使用DMA接收串口数据》讲解了如何使用DMA接收数据,使用DMA外设和串口外设,使用的中断是串口空闲中断。本篇文章主要讲解使用DMA发送数据,不会讲解基础的串口和DMA知识,直接上代码,如果有同学对DMA和串口都不熟悉,建议看一下上篇文章《STM32使用DMA接收串口数据》。

    使用DMA发送数据,首先我们要确认使用的串口有没有DMA。

    我们使用USART1串口外设,从数据手册中可以查到,USART1的发送和接收都是支持DMA的,使用的是DMA2.

    图片

    接下来就是撸代码的时刻了

    02、代码

    DMA串口发送的代码是在上一篇文章DMA串口接收的基础上修改的。

    void UART_Init(void)
    {
      USART_InitTypeDef USART_InitStructure;
      GPIO_InitTypeDef GPIO_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
    
      /* Enable GPIO clock */
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
      /* Enable UART1 clock */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
      /* Connect PXx to USARTx_Tx*/
      GPIO_PinAFConfig(GPIOA, 9, GPIO_AF_USART1);
    
      /* Connect PXx to USARTx_Rx*/
      GPIO_PinAFConfig(GPIOA, 10, GPIO_AF_USART1);
    
      /* Configure USART Tx as alternate function  */
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    
      /* Configure USART Rx as alternate function  */
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    
      USART_InitStructure.USART_BaudRate = 115200;
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;
      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 configuration */
      USART_Init(USART1, &USART_InitStructure);
    
      USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
    
      /* Enable the USARTx Interrupt */
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
    
      /*使能串口DMA接收*/
      USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
      /*使能串口DMA发送*/
      USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
    
      /* Enable USART */
      USART_Cmd(USART1, ENABLE);
    }

    在这里除了常规的串口配置,我们需要配置串口的DMA发送,和串口DMA接收一样的API函数,参数修改为USART_DMAReq_Tx即可。

    串口DMA发送配置

    void Uart_Send_DMA_Config(void)
    {
      DMA_InitTypeDef  DMA_InitStructure;
    
      /* Enable DMA clock */
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
    
      /* Reset DMA Stream registers (for debug purpose) */
      DMA_DeInit(DMA2_Stream7);
    
      /* Check if the DMA Stream is disabled before enabling it.
         Note that this step is useful when the same Stream is used multiple times:
         enabled, then disabled then re-enabled... In this case, the DMA Stream disable
         will be effective only at the end of the ongoing data transfer and it will 
         not be possible to re-configure it before making sure that the Enable bit 
         has been cleared by hardware. If the Stream is used only once, this step might 
         be bypassed. */
      while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE)
      {
      }
    
      /* Configure DMA Stream */
      DMA_InitStructure.DMA_Channel = DMA_Channel_4;  //DMA请求发出通道
      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;//配置外设地址
      DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)UART_Buffer;//配置存储器地址
      DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//传输方向配置
      DMA_InitStructure.DMA_BufferSize = (uint32_t)UART_RX_LEN;//传输大小
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不变
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//memory地址自增
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设地址数据单位
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//memory地址数据单位
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA模式:正常模式
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;//优先级:高
      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//FIFO 模式不使能.          
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;// FIFO 阈值选择
      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式。
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式。
      DMA_Init(DMA2_Stream7, &DMA_InitStructure); 
    
      /* DMA Stream enable */
    //  DMA_Cmd(DMA2_Stream7, ENABLE);
    }

    这里也是常规的DMA配置流程,不明白的同学请看文章《STM32DMA详解》,这里值得注意的是,配置完成并没有使能DMA2_Stream7,使能了就会立即将UART_Buffer的数据发送出去。

    其他代码处理

    void USART1_IRQHandler(void)
    {
      uint8_t temp;
      if(USART_GetFlagStatus(USART1, USART_FLAG_IDLE) == SET)
      {
        DealWith_UartData();
    //    USART_ClearFlag(USART1, USART_FLAG_IDLE);
        temp = USART1->SR;  
        temp = USART1->DR; //清USART_IT_IDLE标志  
      }
    }
    
    void DealWith_UartData()
    {
      DMA_Cmd(DMA2_Stream2, DISABLE);
      UART_Receive_flg = 1;
      UART_Receive_len = UART_RX_LEN - DMA_GetCurrDataCounter(DMA2_Stream2);
      UART_Buffer[UART_Receive_len] = 0;
      DMA_SetCurrDataCounter(DMA2_Stream2,UART_RX_LEN); 
      DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2);
      DMA_Cmd(DMA2_Stream2, ENABLE);
    }
    
    int main(void)
    {
      UART_Receive_flg = 0;
    
      Uart_Reveice_DMA_Config();
      Uart_Send_DMA_Config();
      UART_Init();
    
      while (1)
      {
        if(UART_Receive_flg)
        {
          UART_Receive_flg = 0;
          Uart_Send_DMA_Start();
        }
      }
    }

    上面3个函数,简单逻辑就是,当串口使用DMA接收了一定量的数据,就会通过串口DMA发送出去,串口DMA发送的代码如下:

    void Uart_Send_DMA_Start(void)
    {
      DMA_SetCurrDataCounter(DMA2_Stream7,UART_Receive_len); 
      DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
      /* DMA Stream enable */
      DMA_Cmd(DMA2_Stream7, ENABLE);
    }

    03、后记

    这一篇很简单,就是DMA使用的一个延伸,上面说了这么多,也贴了很多代码,不可能将所有代码全部贴出来,作为软件工程师,还是在IDE里看代码方便,如果感兴趣的话,可以到下面github链接下载代码,KeilIAR的工程文件都有。

    PCB和工程代码开源地址:

    https://github.com/strongercjd/STM32F207VCT6

     

    点击查看本文所在的专辑,STM32F207教程

     

    关注公众号,第一时间收到文章更新

    展开全文
  • STM32 串口DMA收发(一)

    万次阅读 2018-07-28 11:16:31
    STM32 串口DMA收发数据 一、STM32 DMA简介与功能说明 1、STM32F4 DMA简介 DMA(Direct memory access),即直接存储器访问。用于外设与存储器之间以及存储器与存储器之间提供高速数据传输的一种方式。它...
  • STM32中文参考手册V10》-第10章 DMA控制器 DMA的基本介绍 DMA的基本定义 DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供外设和存储器之间...
  • 目前STM32家族有些系列支持DMA的双缓冲模式,比如STM32F2/STM32F4/STM32F7等系列。尤其随着人们对STM32F4/F7系列应用不断拓宽和加深,设计运用到DMA双缓冲的场合也越来越多。STM32芯片DMA又可分为两大类,...
  • STM32DMA原理,步骤超细详解,一文看懂DMA

    万次阅读 多人点赞 2020-03-19 21:50:24
    DMA传输将数据从一个地址空间复制到另一个地址空间,提供外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU, CPU无时不刻的...
  • STM32DMA详解

    2020-10-10 10:26:15
    DMA寄存器9.1 DMA 低中断状态寄存器 (DMA_LISR)9.2 DMA 高中断状态寄存器 (DMA_HISR)9.3 DMA 低中断标志清零寄存器 (DMA_LIFCR)9.4 DMA 高中断标志清零寄存器 (DMA_HIFCR)9.5 DMA 数据流 x 配置寄存器 (DMA_SxCR) ...
  • STM32高端MCU(F4、F7等)才支持DMA双缓冲,低端MCU(F1)不支持DMA双缓冲,不过有替代方案可实现类型效果。 一、MCU支持DMA双缓冲的情形 不再赘述,参见博客 STM32 串口DMA发送+DMA接收+硬件双缓冲区切换功能...
  • STM32DMA

    2019-06-28 20:12:05
    STM32DMA 一、DMA简介 1、DMA简介  DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。  CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移...
  • STM32 串口DMA收发(二)

    千次阅读 2018-08-23 16:32:52
    STM32 串口DMA收发数据 一、STM32 DMA简介与功能说明 1、STM32F4 DMA简介 DMA(Direct memory access),即直接存储器访问。用于外设与存储器之间以及存储器与存储器之间提供高速数据传输的一种方式。它...
  • STM32高速串口通信DMA收发实现 测试平台 平台 晶振 BSP库 串口 STM32F030C8T6 12MHz 标准库 UART1、UART2 STM32F103ZET6 8MHz 标准库 UART1、UART2 ... 实现功能 收/发环形缓冲区 不定长度接收处理 高速(1.5Mbps)...
  • 本文描述串口DMA收/发机制设计,及STM32串口DMA收/发实现。
  • STM32中,需要用串口接收数据,是使用串口中断来接收数据。但是用这种方法的话,就要频繁进入串口中断,然后处理,效率就比较低。于是就想到用DMA来接收串口数据,这个STM32也是支持的。但是关键的一点,怎么知道...
  • STM32DMA实验

    2020-02-28 17:02:55
    DM简介 DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接...STM32F767最多有2个DMA控制器(DMA1和DMA2),共16个数据流(每个控制器8个),每一个DMA控制器都用于一个或多个外设的存储器...
  • STM32中,需要用串口接收数据,是使用串口中断来接收数据。但是用这种方法的话,就要频繁进入串口中断,然后处理,效率就比较低。于是就想到用DMA来接收串口数据,这个STM32也是支持的。但是关键的一点,怎么知道...
  • 基于STM32DMA实验

    2020-10-24 11:20:24
    基于STM32DMA实验 DMA的功能 一个完整的微控制器(处理器)通常由CPU、存储器和外设等组件构成。这些组件一般结构和功能上都是独立的,即一个组件能持续正常工作并不一定建立另一个组件正常工作的前提上,而...
  • STM32 FFT DMA ADC THD

    千次阅读 2020-10-30 21:25:37
    利用STM32 FFT算法计算THD 一、设备准备 ——>粤嵌STM32F429IGT6开发板 1块 ——>串口调试助手 二、FFT算法意义 使用FFT算法,是为了获取信号频域的相关参数,即信号的频谱。包括信号频谱上各点的频率和该...
  • STM32-DMA

    2020-03-05 23:43:02
    是用来搬数据,但是不需要占用 CPU, 即传输数据的时候, CPU 可以干其他的事情,好 像是多线程一样。 数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以 是 SRAM 或者是 FLASH。 DMA 控制器包含了...
  • STM32_DMA原理特性

    2020-08-24 11:35:35
    STM32F4 最多有 2 个 DMA 控制器(DMA1 和 DMA2),共 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8个通道(或称请求)。每个数据流...
  • STM32_DMA再次研究总结

    2019-04-16 01:12:28
    title: STM32_DMA再次研究总结 tags: STM32 date: 2019-4-16 1:11:00 今天花了10分钟简单看了下STM32DMA DMA 直接存储器存取(DMA)用来提供外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须CPU...
  • 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/...
  • STM32DMA学习

    2020-08-16 17:32:02
    传统的DMA的概念是用于大批量数据的传输,但是我理解,在STM32中,它的概念被扩展了,也许更多的时候快速是其应用的重点。数据可以从1~65535个。 直接存储器存取(Direct Memory Access,DMA)是计算机科学中的一种...
  • STM32DMA使用记录

    2020-06-16 22:27:26
    DMA
  • 1 STM32微控制器介绍  STM32系列微控制器是ST公司基于Cortex-M3内核的高集成度的微控制器。...其低端型号仅包含DMA1,支持7个通道;高端型号还包括DMA2,支持5个通道。它的每个通道可任意指定工作

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,263
精华内容 1,705
关键字:

在stm32中的dma支持