文章目录
前言
`
一、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在一些高速数据传输过程中作用是十分巨大的,像视频、图像的采集等等,还需要我们不断的去学习去掌握,这只是刚刚走进嵌入式的大门,需要我们沉下心来,不断学习,不断进步!