news 2026/6/12 3:29:38

数据搬运工-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/6/5 19:13:46

VisionPro视觉检测软件之打包成安装包

VisionPro视觉检测软件之打包成安装包 WinForm之打包项目为安装包 https://www.zamzar.com/ 第一步:右击解决方案,建立新项目(setup) 第二步:右击Application Folder选择Add,之后选择选择项目输出 第三步&…

作者头像 李华
网站建设 2026/6/8 9:03:07

【AI大模型舆情分析】微博舆情分析可视化系统(pytorch2+基于BERT大模型训练微调+flask+pandas+echarts) 实战(上)

大家好,我是锋哥。最近发布一条【AI大模型舆情分析】微博舆情分析可视化系统(pytorch2基于BERT大模型训练微调flaskpandasecharts)高级实战。分上下节。 实战简介: 前面的2026版【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpanda…

作者头像 李华
网站建设 2026/6/10 16:11:54

如何搜集图片?超实用功能必看!

🙋相册开启了多人上传,不知道图片是谁上传的,能否在上传前让上传人填个表单,好让管理员知道是谁上传的图片?👉支持的上传前表单填写:访客上传相册内容前,需要填写表单信息「可用于收…

作者头像 李华
网站建设 2026/6/7 10:12:17

安卓开发工程师核心能力体系深度解析与面试指南

华东计算技术研究所(中国电子科技集团公司第三十二研究所)安卓开发工程师 职位信息 岗位职责: 1.参与项目需求分析,进行APP相关的设计、开发、调试等; 2.按需求完成界面、逻辑功能、网络通信等设计; 3.配合其他开发人员、测试人员,完成产品设计和发布; 4.编写相关开发文…

作者头像 李华
网站建设 2026/6/9 22:16:32

自己平台接入国家网络身份认证公共服务接入

一、接入主体要求(谁能申请)必须是合法登记的企业 / 事业单位 / 政府机构,个人不能申请企业级接入。准入主体类型:企业法人(含国企、民企、外企)政府部门、事业单位金融机构、持牌支付机构、运营商互联网平…

作者头像 李华
网站建设 2026/6/5 3:34:27

花小钱取悦自己,才是最聪明的养生

别等花大钱看病才懂:花小钱取悦自己,是最划算的养生 目录 别等花大钱看病才懂:花小钱取悦自己,是最划算的养生一、先理清:观点的核心逻辑是什么?二、靠谱依据:情绪影响健康,有实打实…

作者头像 李华