STM32下DMA


前言

`

一、DMA的基本定义

DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。

在这里插入图片描述

二、DMA的主要特征

  • 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发,这些功能通过软件来配置。
  • 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
  • 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
  • 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
  • 存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输。
  • 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)。

三、DMA的传输模式

1.外设到存储器模式

  • 使能此模式时(通过将DMA_SxCR寄存器中的EN位置1),每次发生外设请求时,数据流都会启动传输从数据源来填充到FIFO。当达到FIFO的阈值水平时,FIFO的内容被清空并存储到目标地址。
  • 当外设请求结束传输时(对于外设流控制器),或当DMA_SxNDTR寄存器达到零时或将DMA_SxNDTR寄存器中的EN位清零,则传输停止。
  • 当赢得了相应流的仲裁时,该数据流通道才可以访问AHB源或目标端口,使用DMA_SxCR寄存器中的PL [1:0]位,为每个数据流通道的优先级进行仲裁。

2.存储器到外设模式

  • 使能该模式时(通过将DMA_SxCR寄存器中的EN位置1),该数据流通道立即启动传输,以完全填充FIFO。每次发生外设请求时,FIFO的内容都会被清空并存储到目的地。当FIFO未满时,会从内存中重新加载数据。
  • 当外设请求结束传输时(对于外设流控制器),或者当DMA_SxNDTR寄存器达到零时或将DMA_SxNDTR寄存器中的EN位清零,则传输停止。
  • 当赢得了相应流的仲裁时,该数据流通道才可以访问AHB源或目标端口,使用DMA_SxCR寄存器中的PL [1:0]位,为每个数据流通道的优先级进行仲裁。

3.存储器到存储器模式

存储器到存储器模式跟上面那个模式的配置是差不多的,但是存储器到存储器模式是不能与循环模式同时使用的

4.循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如ADC扫描模式)。 可以使用DMA_SxCR寄存器中的CIRC位来启用此功能。使能循环模式后,将在数据流通道配置阶段使用初始值自动装载要传输的数据,并且DMA请求将继续。

四、用STM32CubeMX完成工程创建

  • 新建工程文件
    在这里插入图片描述
  • 选择对应芯片的型号
    在这里插入图片描述
  • 设置时钟RCC

在这里插入图片描述

  • 设置串口----USART1
    在这里插入图片描述

  • DMA的设置
    在这里插入图片描述

  • 记得使能串口中断
    在这里插入图片描述

  • 时钟树的配置

在这里插入图片描述

  • 创建工程文件并在keil中打开
    在这里插入图片描述
  • 在keil工程的主循环下添加下列代码
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)("hello!word!"),sizeof("hello!word!"));
HAL_Delay(500);
  • 连接硬件烧录程序,运行结果
    在这里插入图片描述

总结

本次学习的只是DMA的简单运用,其实DMA在一些高速数据传输过程中作用是十分巨大的,像视频、图像的采集等等,还需要我们不断的去学习去掌握,这只是刚刚走进嵌入式的大门,需要我们沉下心来,不断学习,不断进步!

猜你喜欢

转载自blog.csdn.net/wer4567/article/details/127473665