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

STM32——DMA(十四) - 指南

一、简介

DMADirect Memory Access)直接存储器存取

DMA行提供外设寄存器和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源

12个独立可配置的通道:DMA17个通道), DMA25个通道)

每个通道都支持软件触发和特定的硬件触发,从存储器转运到存储器用软件触发,外设寄存器和存储器之间转运用硬件触发。

STM32F103C8T6DMA资源:DMA17个通道)

二、存储器映射

1. ROM 区域(只读存储区)
起始地址存储器类型用途解读
0x0800 0000程序存储器 Flash STM32 的主程序存储区,C 语言编译后的二进制代码、常量数据都会烧录在这里。系统上电后,CPU 会从该地址开始取指令执行。就是这
0x1FFF F000系统存储器该区域存储了 ST 官方供应的 BootLoader 程序,可通过串口等方式对主 Flash 进行软件下载,常用于芯片出厂后的首次烧录或固件升级。
0x1FFF F800选项字节存储芯片的调整参数,如读保护、写保护、电压监测阈值等,这些参数独立于用户程序,通常凭借专用指令修改。

2. RAM 区域(读写存储区)
起始地址存储器类型用途解读
0x2000 0000运行内存 SRAM程序运行时的临时资料、局部变量、堆栈等都存放在这里,掉电后数据会丢失。
0x4000 0000外设寄存器所有片上外设(如 GPIO、UART、SPI 等)的配置和状态寄存器都映射在此区域,依据读写这些寄存器可能控制外设工作。
0xE000 0000内核外设寄存器映射 Cortex-M 内核的专属外设寄存器,如嵌套向量中断控制器(NVIC)、环境定时器(SysTick)等,用于部署内核的核心功能。

地址映射本质:Cortex-M 内核将程序代码、数据、外设寄存器统一映射到 4GB 的线性地址空间,CPU 可以利用地址直接访问,无需额外的地址转换,简化了硬件设计和软件开发。

哈佛结构:该架构中,程序存储器(Flash)和数据存储器(SRAM)拥有独立的总线,CPU 可以同时取指令和访问数据,提升了执行效率。

三、DMA结构

框图

1.框图中的 DMA 子系统结构

从图中可以清晰看到 STM32 的 DMA 模块组成:

  • DMA1 与 DMA2:这是两个独立的 DMA 控制器,拥有各自的通道和仲裁器。

    • DMA1:包含 7 个通道,主要负责为挂载在 APB1 和部分 APB2 总线上的外设献出 DMA 请求,比如 UART、SPI、I2C、TIM 等。

    • DMA2:涵盖 5 个通道,主要服务于以太网 MAC、USB OTG FS 等高速外设,以及 ADC 等数据吞吐量较高的设备。

  • 仲裁器:当多个 DMA 通道同时发起请求时,仲裁器会根据通道优先级决定哪个请求先被响应。

  • AHB 从设备接口:DMA 控制器通过该接口连接到 AHB 总线,从而实现对 Flash、SRAM 等存储器的高速访问。

2. DMA 的工作流程

  1. 请求触发:当外设(如 UART、ADC)需要传输数据时,会向对应的 DMA 通道发出一个 “DMA 请求” 信号。

  2. 仲裁响应:DMA 控制器的仲裁器收到请求后,根据预设的优先级选择最高优先级的请求进行响应。

  3. 直接传输:获得响应的 DMA 通道会直接通过 AHB 总线,在源地址(如外设寄存器或 SRAM)和目标地址(如 SRAM 或外设寄存器)之间搬运数据,整个过程无需 CPU 干预。

  4. 完成中断:当数据传输完成后,DMA 会向 CPU 发送中断信号,通知 CPU 可能处理后续工作。

3. 与系统总线的关联

  • DMA 总线:DMA 控制器通过 DMA 总线与系统总线矩阵相连,能够访问 Flash、SRAM 以及挂载在 APB1/APB2 上的外设寄存器。

  • 总线桥(桥 1、桥 2):APB1 和 APB2 总线上的外设,利用桥 1、桥 2 连接到 AHB 总线,从而让 DMA 允许访问这些外设的寄存器。

基本结构

  • 配置阶段:CPU 先配备好外设和存储器的地址、内容宽度、地址自增模式,以及传输方向和计数器值。
  • 触发传输:通过M2M(M to M 存储器到存储器)选择触发模式,由硬件事件或软件指令触发 DMA 开始工作。这里的软件触发是以最快的速度将计数器减到零,所以不能和自动重装同时工作,否则DMA会一直工作。
  • 自动搬运:DMA 控制器在无需 CPU 干预的情况下,按配置自动搬运数据,并递减传输计数器。
  • 循环或结束:如果开启自动重装,计数器归零后会自动重新加载并开始新一轮传输;否则传输结束后触发中断通知 CPU。
  • 开关控制:写传输计数器时,必须先关闭DMA。
DMA请求

EN位是数据选择器的使能位,每个通道的硬件触发源不同,所以硬件触发要选择对应的通道,软件触发可以任意选择通道。

数据宽度与对齐

当目标的素材宽度,比源端的数据宽度大,就在目标数据的前面补0

当目标的数据宽度,比源端的数据宽度小,就将目标数据的高位丢弃只读取低位

信息转换+DMA

外设的地址DataA[7]的首地址 、存储器的地址DataB[7]的首地址、数据宽度都是8位字节、两边都是地址自增模式、传输方向DataA[7]-->DataB[7]、计数器值为7、不要求自动重装、软件触发。

ADC扫描模式+DMA

DMA转运的时机,必须和ADC单个通道转换完成同步,所以DMA的触发要选择ADC的硬件触发。

ADC单个通道转换结束后不产生任何标志位和中断,但应该会产生DMA请求去触发DMA转换。

http://www.jsqmd.com/news/447011/

相关文章:

  • 如何为xh HTTP请求工具开发自定义功能:完整插件开发指南
  • 如何优雅处理Vuelidate异步验证:从API请求到数据验证的完整指南
  • 基于Docker的Kafka服务
  • 从0到1:使用Job Iteration重构长时运行的Rails后台任务
  • 基于物品的协同过滤算法简单实战应用
  • 南大通用数据库安装使用教程(GBase8s)
  • android-ndk-rs未来展望:新特性与社区发展路线图
  • 10个火宝短剧实用技巧:提升AI短剧制作效率的终极指南
  • 终极Cuttlefish邮件服务器常见问题解决方案:从安装到高级配置全指南
  • windows文件实时同步
  • Nano Stores在React Native中的终极应用指南:简单快速的状态管理解决方案
  • 突破Session隔离:GH-Injector-Library全方法通用绕过技巧
  • CSP-S 2024 提高级 第一轮(初赛) 完善程序(2)
  • 探索apm生态:发现10个改变Atom体验的精选插件
  • Git Quick Stats自动化部署终极指南:CI/CD流水线集成完整教程
  • 【linux】shell命令
  • 如何快速掌握DotNetCore微服务:从零开始的保险销售系统实战教程
  • 探索Veloren:如何体验这款开源像素RPG的无限魅力?
  • 如何用Vue和Vuex构建你的第一个俄罗斯方块游戏:完整指南
  • Lovefield跨浏览器兼容性终极指南:Chrome、Firefox、IE的完整解决方案
  • 如何使用Git Quick Stats实现高效仓库统计监控与自动化告警
  • Lovefield终极性能调优指南:10个技巧让你的Web数据库运行更快
  • 7步完美贡献StyleGAN3:官方PyTorch实现的高质量PR提交指南
  • 终极指南:5步开发prettier-plugin-tailwindcss自定义解析器
  • JS Confetti核心API解析:掌握addConfetti与位置控制
  • StyleGAN3终极指南:如何彻底消除生成图像伪影的完整技术解析
  • Flux v1与Kustomize集成:多环境配置管理的终极指南
  • 如何快速掌握Mogenerator:iOS/Mac开发必备的Core Data代码生成工具
  • Alpakka核心组件全解析:从AWS到Kafka的20+连接器实战
  • vue企业官网模板 企业门户网站源码 开箱即用 网站二改,省时省力