news 2026/4/16 15:14:59

数据搬运工-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/4/16 13:44:34

图像算法优化常用方式-vivado hls设计

一、图像算法优化常用方式 1.双层for循环结构 对于灰度图像或者二值图像&#xff0c;一般使用双层循环 for(ap_uint<32> i0;i<height;i){ for(ap_uint<32> j0;j<height;j){ #pragma HLS pipeline II1 } } 然后对内存循环进行pipeline优化&#xff…

作者头像 李华
网站建设 2026/4/16 13:43:50

AI技术点总结(2)

Query Rewriting&#xff08;查询重写&#xff09; 是什么 一个在检索前对用户原始查询进行主动优化与修正的“预处理”步骤。 能做什么 将模糊、简短或不完整的查询&#xff0c;自动补全、分解或优化为更适合检索的清晰、结构化的形式&#xff0c;从而显著提升后续检索的准确…

作者头像 李华
网站建设 2026/4/15 19:46:50

AI技术点总结(1)

Firecracker是亚马逊开源的一款轻量级虚拟化监视器&#xff0c;专为运行短暂、无状态的微型虚拟机而设计。1. 它是什么&#xff1a;一种极简的虚拟化技术&#xff0c;用于创建和管理安全的隔离环境。 2. 它能做什么&#xff1a;在毫秒级内启动一个虚拟机&#xff0c;以接近裸机…

作者头像 李华
网站建设 2026/4/16 15:15:16

【读书笔记】《遇见莫扎特》

《遇见莫扎特》——天才音乐家的传奇人生 一、开场介绍 天才莫扎特的传奇一生 二、莫扎特的历史地位 2.1 从神童到大师 一般来说&#xff0c;神童长大后可能会荒疏&#xff0c;但莫扎特小时候是神童&#xff0c;长大后是大师&#xff0c;这样的音乐家称得上是伟大的。 2.2 全能…

作者头像 李华
网站建设 2026/4/16 13:39:10

本科毕业设计开题报告系列之五:本科毕业设计中研究方法与技术路线怎么写?

前言 在本科毕业设计开题报告中&#xff0c;研究方法和技术路线几乎是所有导师都会重点查看的两部分内容。很多同学在写这两节时都会遇到类似困惑&#xff1a;不知道该写多详细、担心和研究内容重复、分不清方法与路线的区别&#xff0c;甚至不知道老师到底想从这两部分看到什…

作者头像 李华