news 2026/5/1 7:54:19

数据搬运工-DMA(上)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据搬运工-DMA(上)
DMADirect Memory Access,直接存储器访问)提供在外设与内存存储器和存储器之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU,在这个时间中,CPU对于内存的工作来说就无法使用。

目录

三种搬运方式

工作方式

DMA控制器

DMA优先级管理

DMA传输方式

指针递增模式

DMA数据对齐方式

DMA寄存器及库函数介绍

函数使用说明

启用 DMA1 时钟

初始化 DMA

启动 DMA 传输

链接 DMA 到外设

UART DMA 传输

检查 DMA 标志

启用/禁用 DMA

示例代码片段

三种搬运方式

存储器存储器(例如:复制某特别大的数据buf
存储器外设 (例如:将某数据buf写入串口TDR寄存器)
外设存储器 (例如:将串口RDR寄存器写入某数据buf

工作方式

DMA控制器

STM32F1032DMA控制器,DMA17个通道,DMA 25个通道。
一个通道每次只能搬运一个外设的数据!!如果同时有多个外设的DMA请求,则按照优先级进行响应。
STM32F103C8T6只有DMA1

DMA优先级管理

优先级管理采用软件+硬件:
软件:每个通道的优先级可以在DMA_CCRx寄存器中设置,有4个等级
最高级>高级>中级>低级
硬件:如果2个请求,它们的软件优先级相同,则较低编号的通道比较高编号的通道有较高的优先权。
比如:如果软件优先级相同,通道2优先于通道4

DMA传输方式

DMA_Mode_Normal(正常模式)
一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
DMA_Mode_Circular(循环传输模式)
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式

指针递增模式

外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值


DMA数据对齐方式

源->目标

一般右对齐,多的高位补0

DMA寄存器及库函数介绍

常用库函数

__HAL_RCC_DMA1_

CLK_ENABLE(…)
HAL_DMA_Init(…)
HAL_DMA_Start(…)
__HAL_LINKDMA(…)
HAL_UART_Transmit_DMA(…)
HAL_UART_Receive_DMA(…)
__HAL_DMA_GET_FLAG(…)
__HAL_DMA_ENABLE(…)
__HAL_DMA_DISABLE(…)

函数使用说明

启用 DMA1 时钟

__HAL_RCC_DMA1_CLK_ENABLE()用于启用 DMA1 控制器的时钟。在使用 DMA 功能前必须调用此函数以确保 DMA 控制器正常工作。

初始化 DMA

HAL_DMA_Init()用于初始化 DMA 通道。需要传入一个DMA_HandleTypeDef结构体指针,该结构体包含 DMA 配置参数,如传输方向、数据宽度、源和目标地址等。

启动 DMA 传输

HAL_DMA_Start()启动 DMA 传输。需要指定源地址、目标地址和传输长度。通常在初始化 DMA 后调用此函数开始数据传输。

链接 DMA 到外设

__HAL_LINKDMA()用于将 DMA 通道与外设(如 UART)关联。通常传入外设句柄、DMA 句柄和 DMA 句柄的成员变量名。

UART DMA 传输

HAL_UART_Transmit_DMA()HAL_UART_Receive_DMA()分别用于通过 DMA 发送和接收 UART 数据。需要传入 UART 句柄、数据缓冲区指针和数据长度。

检查 DMA 标志

__HAL_DMA_GET_FLAG()用于检查 DMA 传输状态标志,如传输完成标志(TC)或半传输标志(HT)。通常用于轮询方式检查传输状态。

启用/禁用 DMA

__HAL_DMA_ENABLE()__HAL_DMA_DISABLE()分别用于启用或禁用 DMA 通道。可用于动态控制 DMA 传输的启停。

示例代码片段

以下是一个简单的 UART DMA 传输示例:

DMA_HandleTypeDef hdma_usart1_tx; UART_HandleTypeDef huart1; // 启用 DMA1 时钟 __HAL_RCC_DMA1_CLK_ENABLE(); // 初始化 DMA hdma_usart1_tx.Instance = DMA1_Channel4; hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart1_tx.Init.Mode = DMA_NORMAL; hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW; HAL_DMA_Init(&hdma_usart1_tx); // 链接 DMA 到 UART __HAL_LINKDMA(&huart1, hdmatx, hdma_usart1_tx); // 启动 UART DMA 传输 uint8_t data[] = "Hello DMA!"; HAL_UART_Transmit_DMA(&huart1, data, sizeof(data));
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:07:11

vue 插槽详解

在 Vue.js 中,插槽(Slots) 是一种极为强大且灵活的内容分发机制。它允许父组件向子组件“注入”模板片段,从而实现组件的高度可复用性和布局的动态定制。通过插槽,我们可以将组件的结构与内容解耦,让子组件…

作者头像 李华
网站建设 2026/5/1 6:18:30

当15岁成为“红线”,法国社交平台新规落地

欧洲互联网监管的网口正在进一步收紧。当地时间2026年1月27日,法国国民议会正式批准了一项针对未成年人使用社交平台的严格禁令。根据《世界报》及相关媒体报道,该法规明确将“数字成年年龄”划定为15岁,旨在通过立法手段限制青少年对社交平台…

作者头像 李华
网站建设 2026/5/1 6:03:54

IDEA 提示“未配置SpringBoot配置注解处理器“的解决方案

在Spring Boot项目中引入Redis配置类时,出现以下警告提示: 原因分析 坦白说,这个警告 不是代码错误,并不会影响程序的运行。 Spring Boot 提供了一个名为 spring-boot-configuration-processor 的工具。 它的作用是在编译时扫…

作者头像 李华