stm32DMA

news2024/12/24 15:08:51

DMA

文章目录

  • DMA
  • DMA简介
  • DMA功能框图
    • DMA请求
      • DMA请求通道
    • **仲裁器**
  • DMA 数据配置
    • 从哪里来到哪里去
      • 外设到存储器
      • 存储器到外设
      • 存储器到存储器
  • DMA初始化结构体讲解
    • 配置DMA TO P(外设)代码例子

DMA简介

DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,DMA 控制器独立于内核,属于一个单独的外设。

数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者是 FLASH。DMA 控制器包含了 DMA1 和 DMA2,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,这里的通道可以理解为传输数据的一种管道。要注意的是 DMA2 只存在于大容量产品和互联型产品中。

DMA功能框图

在这里插入图片描述

DMA请求

如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求,DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕

DMA请求通道

在这里插入图片描述

虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个

仲裁器

多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,分为两个阶段。

第一阶段属于软件阶段,可以在 DMA_CCRx 寄存器中设置,有 4 个等级:非常高、高、中和低四个优先级。

第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高。0>1.

DMA 数据配置

  1. 最核心就是配置要传输的数据,包括数据从哪里来,要到哪里去------------------------------传哪去
  2. 传输的数据的单位是什么,要传多少数据,是一次传输还是循环传输等等。--------------怎么传

从哪里来到哪里去

外设到存储器

以 ADC 采集为例。DMA 外设寄存器的地址对应的就是 ADC数据寄存器的地址,DMA 存储器的地址就是我们自定义的变量(用来接收存储 AD 采集的数据)的地址。方向我们设置外设为源地址。

存储器到外设

以串口向电脑端发送数据为例。DMA 外设寄存器的地址对应的就是串口数据寄存器的地址,DMA 存储器的地址就是我们自定义的变**量(相当于一个缓冲区,用来存储通过串口发送到电脑的数据)**的地址。方向我们设置外设为目标地址

存储器到存储器

以内部 FLASH 向内部 SRAM 复制数据为例。DMA 外设寄存器的地址对应的就是内部 FLASH(我们这里把内部 FALSH 当作一个外设来看)的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部 FLASH 的数据)的地址。方向我们设置外设(即内部 FLASH)为源地址。跟上面两个不一样的是,这里需要把DMA_CCR 位 14:MEM2MEM:存储器到存储器模式配置为 1,启动 M2M 模式。

DMA初始化结构体讲解

typedef struct
{
uint32_t DMA_PeripheralBaseAddr; // 外设地址
uint32_t DMA_MemoryBaseAddr; // 存储器地址
uint32_t DMA_DIR; // 传输方向
uint32_t DMA_BufferSize; // 传输数目
uint32_t DMA_PeripheralInc; // 外设地址增量模式
uint32_t DMA_MemoryInc; // 存储器地址增量模式
uint32_t DMA_PeripheralDataSize; // 外设数据宽度
uint32_t DMA_MemoryDataSize; // 存储器数据宽度
uint32_t DMA_Mode; // 模式选择
uint32_t DMA_Priority; // 通道优先级
uint32_t DMA_M2M; // 存储器到存储器模式
} DMA_InitTypeDef;
结构体成员功能选项
DMA_PeripheralBaseAddr设定 DMA_CPAR 寄存器的值
DMA_MemoryBaseAddr设定 DMA_CMAR 寄存器值
DMA_DIR传输方向选择,可选外设到存储器、存储器到外设。它设定 DMA_CCR 寄存器的DIR[1:0] 位的值。
DMA_BufferSize设定待传输数据数目,初始化设定 DMA_CNDTR 寄存器的值
DMA_PeripheralInc如果配置为 DMA_PeripheralInc_Enable,使能外设地址自动递增功能,它设定 DMA_CCR 寄存器的 PINC 位的值
DMA_MemoryInc如果配置为 DMA_MemoryInc_Enable,使能存储器地址自动递增功能,它 设定 DMA_CCR 寄存器的 MINC 位的值
DMA_PeripheralDataSize外设数据宽度,可选字节 (8 位)、半字 (16 位) 和字 (32 位)DMA_CCR 寄存器的 PSIZE[1:0] 位的值。
DMA_MemoryDataSize存储器数据宽度,可选字节 (8 位)、半字 (16 位) 和字 (32 位),DMA_CCR 寄存器的 MSIZE[1:0] 位的值。
DMA_ModeDMA 传输模式选择,可选一次传输或者循环传输,它设定 DMA_CCR 寄存器的CIRC 位的值。
DMA_Priority软件设置通道的优先级,有 4 个可选优先级分别为非常高、高、中和低,DMA_CCR 寄存器的 PL[1:0] 位的值。
DMA_M2M存储器到存储器模式,使用存储器到存储器时用到设定 DMA_CCR 的位 14MEN2MEN 即可启动存储器到存储器模式。

配置DMA TO P(外设)代码例子

void USARTx_DMA_Config(void)
{
  DMA_InitTypeDef DMA_InitStructure;
  
  // 启用 DMA1 时钟
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  
  // 设置 DMA_InitStructure 结构体的各项参数
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS; // USART 数据寄存器地址
  
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff; // 发送缓冲区的内存地址
  
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 数据传输方向为从外设到存储器
  
  DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; // 发送缓冲区大小
  
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 禁止外设地址增量
  
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 允许存储器地址增量
  
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据大小为字节
  
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 存储器数据大小为字节
  
  DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 设置 DMA 优先级为高
  
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // DMA 模式为正常模式
  
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁止存储器到存储器传输
  
  // 使用配置好的 DMA_InitStructure 结构体初始化 USART 的 DMA 通道
  DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);
  
  // 启动 USART 的 DMA 传输
  DMA_Cmd(USART_TX_DMA_CHANNEL, ENABLE);
}






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP/IP 传输层协议

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)。 TCP协议 TCP是一种面向连接的传输层协议&#…

2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会成功举办

12月16日,2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会于北京西郊宾馆成功举办。活动吸引了来自行业内众多一流专家、学者参与,共同探讨和展示了他们在智能运维领域的最新研究成果和技术应用,为智能运维技术的学术研究、生产实…

【计算机网络】TCP心跳机制、TCP粘包问题

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525; 给大家跳段…

低代码和纯代码:双向奔赴,共创未来ing……

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…

工业缺陷检测深度学习方法综述——学习笔记(评价:这篇华科大的文章错误百出,学术一点都不严谨,别误人子弟了好吧。。。)

文章目录 摘要1 引言2 问题定义与研究现状2.1 问题定义2.2 问题难点与挑战2.2.1 数据难点2.2.2 任务挑战 2.3 研究概述 3 检测算法3.1 缺陷模式已知3.1.1 传统方法简述3.1.2 深度学习方法 3.2 缺陷模式未知3.2.1 传统方法简述3.2.2 深度学习方法(1) 基于图像相似度的方法(i) 基…

芋道前端框架上线之后发现element-ui的icon图标全部乱码

前言 最近发现线上有人反映图标全部是乱码&#xff0c;登录上去看确实乱码&#xff0c;刷新就好最后一顿搜&#xff0c;发现是sass版本不兼容导致的图标乱码问题 解决办法 1.先把sass升级到1.39.0 2.来到vue.config.js文件配置代码-如果是芋道前端框架不用配置自带 css: {lo…

I.MX6ULL_Linux_驱动篇(48)linux I2C驱动

I2C 是很常用的一个串行通信接口&#xff0c;用于连接各种外设、传感器等器件。本章我们来学习一下如何在 Linux 下开发 I2C 接口器件驱动&#xff0c;重点是学习 Linux 下的 I2C 驱动框架&#xff0c;按照指定的框架去编写 I2C 设备驱动。本章同样以 I.MX6U-ALPHA 开发板上的 …

一些错误的集合

目录 第一章、1.1&#xff09;前端找不到图片1.2&#xff09;1.3&#xff09;1.4&#xff09; 第二章、2.1&#xff09;2.2&#xff09;2.3&#xff09; 第三章、3.1&#xff09;3.2&#xff09;3.3&#xff09; 第四章、4.1&#xff09;4.2&#xff09;4.3&#xff09; 友情提…

ZKP Pasta Curves

Mina book[https://o1-labs.github.io/proof-systems/specs/pasta.html?highlightpasta#pasta-curves]学习笔记 Pasta Curves Pasta Curves is a fascinating innovation in cryptography designed by Zcash. What are the Pasta Curves The Pasta Curves are a pair of e…

走过的2023:在挑战中领悟,在仿徨中成长

转眼间就到了2023年的最后一个月&#xff0c;回顾这短暂而又有意义的一年&#xff0c;可以用12个字总结&#xff1a;在挑战中领悟&#xff0c;在仿徨中成长。这篇文章我会从技术成长、职场生活、读书感悟和个人生活等几个方面&#xff0c;总结一下过去的这一年&#xff0c;梳理…

视觉设计必备!这6款工具让你事半功倍!

视觉设计师是做什么的 不同类型的行业将聘请视觉设计师&#xff0c;工作内容可能涉及设计网站、游戏、电影和其他数字设计项目。通过以下关于视觉设计师的工作描述和薪酬描述&#xff0c;我们可以进一步了解视觉设计师。 视觉设计师职位描述&#xff1a; 遵循品牌指南&#…

WEB 3D技术 three.js rotation元素旋转控制

我们在官网中搜索 Euler 循环用的 就不是三维向量了 而是欧拉角对象 但欧拉角也是绕着某个轴进行旋转 我们有两个这样的元素 官网中的 order 比较特殊 它是先旋转完 x轴 然后旋转 y轴 最后旋转z轴 order也是它默认的值 一般来讲 我们用 就改 x y z就够了 order 一般不需要 …

基于Java+Vue+uniapp微信小程序大学生心理健康服务设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

DOM是什么?

1、概述 &#xff08;1&#xff09;DOM代表文档对象模型&#xff0c;是 HTML 和 XML 文档的接口&#xff08;API&#xff09; &#xff08;2&#xff09;当浏览器第一次读取&#xff08;解析&#xff09;HTML文档时&#xff0c;会创建一个基于 HTML 文档的大对象&#xff0c;…

js中的Array.from()和Array.of()方法的用法详情

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

获取请求体中json数据并解析到实体对象

目录 相关依赖 前端代码 后端代码 测试结果 相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version> </dependency> <dependency><groupId>comm…

[软件] Image2LCD v4.0

介绍 通过打开图片, 可以提取图片的像素特征, 生成.c文件, 或者二进制文件等, 提供人们根据需要选择. 16位真彩色 每一个像素点需要用16位来表示, 分别是RGB, R: 5位 G: 6位, B: 5位, 共两个字节. 配置 tftLCD180显示屏, 官方给的参考代码, 需要如下所示设置.

Python 输入输出, 标识符, import(保留字关键字) ,注释 , 缩进

1 Python简介输入print()标识符import关键字保留字(关键字)注释缩进 Python简介 python是一门解释性语言 解释性语言的特点:它不像java c一样先编译后执行,它是直接每一行的去执行,所以遇见错误时,它会把错误之前的执行完 输入print() print() 是一个让计算机在屏幕上进行输…

FPGA模块——以太网(1)MDIO读写

FPGA模块——以太网MDIO读写 MDIO接口介绍MDIO接口代码&#xff08;1&#xff09;MDIO接口驱动代码&#xff08;2&#xff09;使用MDIO驱动的代码 MDIO接口介绍 MDIO是串行管理接口。MAC 和 PHY 芯片有一个配置接口&#xff0c;即 MDIO 接口&#xff0c;可以配置 PHY 芯片的工…

前端手动部署与自动化部署

连接服务器 先购买服务器 安装vscode插件 连接服务器 连接成功 手动部署 安装nginx 启动nginx systemctl start nginx systemctl status nginx systemctl enable nginx启动 检查状态 开机就启动nginx 开始手动部署 配置nginx 成功