当前位置: 首页 > news >正文

数据搬运工-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));
http://www.jsqmd.com/news/330360/

相关文章:

  • AI技术点总结(2)
  • 深度解析Android系统开发工程师岗位:技术体系与实战指南(含面试题库)
  • VisionPro视觉检测软件之打包成安装包
  • 基于Simulink的A*算法自动驾驶路径规划仿真建模示例
  • 开发跨部门沟通话术生成器,按场景(需求对接/问题协调/资源申请),生成礼貌高效话术,兼顾立场和沟通效率,减少跨部门沟通矛盾。
  • 基于Simulink的超声波传感器障碍物检测仿真建模示例
  • 【游戏推荐】ServiceIT:你可以做IT (ServiceIT You can do IT)免安装中文版
  • 2002-2025年各省、地级市农业新质生产力数据
  • 【AI大模型舆情分析】微博舆情分析可视化系统(pytorch2+基于BERT大模型训练微调+flask+pandas+echarts) 实战(上)
  • 工作量证明机制的未来发展方向是什么?
  • 2月1号
  • 2026/2/1总结
  • 腾讯轻量云 Nacos 公网访问排查指南(适用于其他平台的ecs)
  • USB存储设备管理工具 启用或者禁用+usb修复
  • 基于javaweb的网上购物系统 开题报告
  • 【读书笔记】《演讲的本质》
  • 基于JavaWeb的实验室助教系统的设计与实现
  • 【读书笔记】《遇见莫扎特》
  • 如何搜集图片?超实用功能必看!
  • 基于JavaWeb的网上书城网站的设计与实现 开题报告(2)
  • 基于JavaWeb的企业门户网站的设计与实现 开题报告
  • AI技术点总结(1)
  • 智能AI色选机如何提升食品加工效率与品质
  • z-image整合包下载 ControlNet局部重绘整合包教程|Z_image CN控图v2.0完整实测
  • 连锁门店管理系统如何助力企业实现标准化运营与效率提升
  • 别只盯着快手可灵!Google Veo 才是 AIGC 视频的终极形态?底层技术架构全揭秘
  • autoware 使用 waypoint loader重规划路径
  • 本科毕业设计开题报告系列之五:本科毕业设计中研究方法与技术路线怎么写?
  • 安卓开发工程师核心能力体系深度解析与面试指南
  • 【claude】claude skills核心概念解读