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

STM32--DMA

一、DMA简介

DMA ,全称为: Direct Memory Access ,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。
STM32F407 最多有 2 DMA 控制器 (DMA1 DMA2) ,两个 DMA 控制器总共有 16 个数据流。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个 DMA 请求的优先权。

二、配置步骤

1、使能DMA时钟
2、初始化DMA相关参数,连接DMA和外设
 
调用 HAL_DMA_Init 函数初始化 DMA 的相关参数,包括配置通道,外设地址,存储器地址,传输数据量等。
HAL 库为了处理各类外设的 DMA 请求,在调用相关函数之前,需要调用一个宏定义标识符,来连接 DMA 和外设句柄。例如要使用串口 DMA 发送,所以方式为:
__HAL_LINKDMA(&g_uart1_handle, hdmatx, g_dma_handle);

其中 g_uart1_handle 是串口初始化句柄,我们在 usart.c 中定义过了。g_dma_handle DMA 初始化句柄。hdmatx 是外设句柄结构体的成员变量,在这里实际就是 g_uart1_handle 的成员变 量。在 HAL 库中,任何一个可以使用 DMA 的外设,它的初始化结构体句柄都会有一个DMA_HandleTypeDef 指针类型的成员变量,是 HAL 库用来做相关指向的。hdmatx 就是DMA_HandleTypeDef 结构体指针类型。这句话的含义就是把 g_uart1_handle 句柄的成员变量 hdmatx DMA 句柄 g_dma_handle 连接起来,是纯软件处理,没有任何硬件操作。

HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);
形参 1 DMA_HandleTypeDef 结构体类型指针变量,其定义如下:
接下来我们重点介绍 Init ,它是 DMA_InitTypeDef 结构体类型变量,该结构体定义如下:
增量模式:
其实就是对外设\存储器的地址++,若设置为增量模式,在传输完低地址数据后会接着传输高地址数据。
模式选择:
循环模式---在DMA发送完指定字节数据后再次循环发送
外设流控模式---意味着数据传输的节奏由外设来控制,而不是由DMA控制器自行决定。这通常用于一些高吞吐量的外设,例如UART、SPI、I2C等,这些外设可以在需要的时候发起传输请求。
3、使能串口的DMA发送,启动传输,在这之中就设置好了源地址、目标地址和发送长度,调用该函数后会开启相应的 DMA 中断
4、查询传输状态,可以获取当前剩余数据量,通过检测DMA寄存器的相关位实现
5、使能中断、编写中断服务函数后就可以使用DMA中断
DMA 中断对于每个流都有一个中断服务函数,比如 DMA2_Stream7 的中断服务函数为 DMA2_Stream7_IRQHandler。 HAL 库提供了通用 DMA 中断处理函数 HAL_DMA_IRQHandler ,在该函数内部,会对 DMA 传输状态进行分析,然后调用相应的中断处理回调函数:

三、实验示例

相关文章:

  • Comfyui容器化部署与简介
  • mysql log_bin
  • Next.js 加载页面及流式渲染(Streaming)
  • 小公司要求真高
  • 247 H指数
  • DolphinScheduler 3.x 执行insert into SQL任务显示成功,但查不到数据
  • 网络仿真方法综述
  • 优质短视频素材下载网站有哪些?分享优质短视频素材下载资源
  • Git:从配置到合并冲突
  • 无人机遥感在农林信息提取中的实现方法与GIS融合应用
  • 基于实验的电动汽车动力电池SOC
  • 双非本科一年20w,已是人中龙凤了
  • 【问题解决】adb remount 失败或刷机无法连接设备(KaiOS)
  • 苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?
  • Web前端开发个人技能全面剖析:四维度深度理解,五能力实战展现,六要素构建优势,七步骤持续精进
  • [PHP内核探索]PHP中的哈希表
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • C++11: atomic 头文件
  • Java反射-动态类加载和重新加载
  • js中的正则表达式入门
  • Laravel 实践之路: 数据库迁移与数据填充
  • PAT A1050
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • tweak 支持第三方库
  • 搭建gitbook 和 访问权限认证
  • 给第三方使用接口的 URL 签名实现
  • 计算机在识别图像时“看到”了什么?
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 我与Jetbrains的这些年
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #微信小程序:微信小程序常见的配置传旨
  • (30)数组元素和与数字和的绝对差
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)linux文件内容查看
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net IOC框架入门之一 Unity
  • .NET 回调、接口回调、 委托
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net中间语言BeforeFieldInit
  • @WebService和@WebMethod注解的用法
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [20140403]查询是否产生日志
  • [Android Pro] Notification的使用
  • [Android] Implementation vs API dependency
  • [Android]竖直滑动选择器WheelView的实现
  • [Angular] 笔记 18:Angular Router
  • [Apio2012]dispatching 左偏树