stm32f407 6个串口dma_STM32实例DMA 实验

2023-10-29

    在前面我们提到过 DMA,这一章我们就来学习 STM32F1 的DMA 使

用。要实现的功能是:通过 K_UP 按键控制 DMA 串口 1 数据的传送,在传送过程中让 D2 指示灯不断闪烁,直到数据传送完成。D1 指示灯闪烁提示系统正常运行。学习时可以参考《STM32F10x 中文参考手册》-10 DMA 控制器(DMA)章节。

DMA 简介

    DMA,全称是 Direct Memory Access,中文意思为直接存储器访问。DMA 可用于实现外设与存储器之间或者存储器与存储器之间数据传输的高效性。之所以称为高效, 是因为 DMA 传输数据移动过程无需 CPU 直接操作, 这样节省的 CPU 资源就可供其它操作使用。从硬件层面来理解,DMA 就好像是 RAM 与 I/O 设备间数据传输的通路, 外设与存储器之间或者存储器与存储器之间可以直接在这条通路上进行数据传输。这里说的外设一般指外设的数据寄存器, 比如 ADC、SPI、I2C、DCMI等外设的数据寄存器, 存储器一般是指片内 SRAM、 外部存储器、 片内 Flash等。

    STM32F1 最多有 2 个 DMA 控制器 ( DMA2 仅存在大容量产品中) ,DMA1 有7 个通道。DMA2 有 5 个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个 DMA 请求的优先权。

STM32F1 的 DMA 有以下主要特性:

● 12 个独立的可配置的通道(请求):DMA1 有 7 个通道, DMA2 有 5 个通

● 每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触

发。这些功能通过软件来配置。

● 在同一个 DMA 模块上, 多个请求间的优先权可以通过软件编程设置(共有

四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求 0 优先于请求1,依此类推) 。

● 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。

● 支持循环的缓冲器管理

● 每个通道都有 3 个事件标志(DMA 半传输、 DMA 传输完成和 DMA 传输出错),这3 个事件标志逻辑或成为一个单独的中断请求。

● 存储器和存储器间的传输

● 外设和存储器、存储器和外设之间的传输

● 闪存、 SRAM、外设的 SRAM、 APB1、 APB2 和 AHB 外设均可作为访问的源和目标。

● 可编程的数据传输数目:最大为 65535

DMA 结构框图

    DMA 控制器独立于内核,属于一个单独的外设,结构比较简单,从编程的角度来看,我们只需掌握结构框图中的三部分内容即可。如图所示(大家也可以查看《STM32F10x中文参考手册》-10 DMA 控制器(DMA)章节内容)。

feab303d5a5c3766c22ae4b3d6d187ea.png

    我们把 DMA 结构框图分成3个子模块,按照顺序依次进行简单介绍。

(1)标号 1:DMA 请求

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

    根据前面介绍我们知道,DMA 含有 DMA1 和 DMA2 两个控制器,其中 DMA1 含有 7个通道,DMA2 含有 5 个通道,不同的 DMA 控制器的通道对应着不同的外设请求。

    从DMA 请求映射图中可以知道各通道所对应的外设请求,如图分别是DMA1和DMA2请求映射图:

51b760f1afcb8336991d578e4fe4101f.png

075451d6e1c4bf18572fcc480eac3369.png

    DMA2 请求通道中 ADC3、 SDIO 和 TIM8 的 DMA 请求只在大容量产品中存在,这个在具体项目时要注意。

(2)标号 2:DAM 通道

    DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道, DMA2 有 5个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。

(3)标号 3:仲裁器

    当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在 DMA_CCRx 寄存器中设置,有 4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0高于通道 1。在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。

DMA 数据配置

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

(1)从哪里来到哪里去

    我们知道 DMA 传输数据的方向有三个:从外设到存储器,从存储器到外设,从存储器到存储器。具体的方向 DMA_CCR 位 4 DIR 配置:0 表示从外设到存储器, 1 表示从存储器到外设。这里面涉及到的外设地址由

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32f407 6个串口dma_STM32实例DMA 实验 的相关文章

随机推荐

  • 理解inode

    inode是一个重要概念 是理解Unix Linux文件系统和硬盘储存的基础 我觉得 理解inode 不仅有助于提高系统操作水平 还有助于体会Unix设计哲学 即如何把底层的复杂性抽象成一个简单概念 从而大大简化用户接口 下面就是我的ino
  • 华为OD机试真题-基站维护最短距离 【2023.Q1】

    参考代码 小王是一名基站维护工程师 负责某区域的基站维护 某地方有n个基站 1
  • Android中的签名和签名文件的生成过程

    一 概述 二 还是从Key Store和keytool说起吧 三 数字签名和数字证书 四 apk的签名过程 五 签名中 MANIFEST MF CERT SF和 CERT RSA是怎么生成的 1 MANIFEST MF 2 CERT SF
  • QT日志系统创建,读取,修复

    一 内容简介 构建QT日志系统 遇到的问题以及结局办法 读取日志文件 用于检查程序运行情况 并且修复异常数据 二 软件环境 2 1 QT 5 14 1 新版QT6 4 6 5在线安装经常失败 而5 9版本又无法编译64位程序 所以就采用5
  • 巧用千寻位置GNSS软件

    千寻位置GNSS软件中的CAD功能 用于已有 CAD的图形的导入和编辑 并且可以对 CAD图形已有线条进行线放样 在日常测绘工作中十分常见 下面向各位介绍CAD功能的使用技巧 点击 测量 gt CAD 进入 CAD功能如图 5 3 1所示
  • 显卡无法为此计算机,如何解决win10系统电脑中无法安装intel显卡驱动的问题

    如何解决win10系统电脑中无法安装intel显卡驱动的问题 腾讯视频 爱奇艺 优酷 外卖 充值4折起 在使用win10系统电脑的时候 如果我们想要安装intel显卡驱动 却提示无法安装的话 应如何处理呢 接下来就由小编来告诉大家 一 手动
  • CentOS7(Linux)安装总结

    主要参考以下文章 CentOS7 Linux 详细安装教程 图文详解 缄默 給 傷的博客 CSDN博客 linuxcentos7安装步骤https blog csdn net weixin 43849575 article details
  • Mutex内核同步机制详解

    一 Mutex锁简介 在linux内核中 互斥量 mutex 即mutual exclusion 是一种保证串行化的睡眠锁机制 和spinlock的语义类似 都是允许一个执行线索进入临界区 不同的是当无法获得锁的时候 spinlock原地自
  • 使用VNC远程桌面Ubuntu【内网穿透实现公网远程】

    文章目录 前言 1 ubuntu安装VNC 2 设置vnc开机启动 3 windows 安装VNC viewer连接工具 4 内网穿透 4 1 安装cpolar 支持使用一键脚本命令安装 4 2 创建隧道映射 4 3 测试公网远程访问 5
  • 【深度学习】 Python 和 NumPy 系列教程(十五):Matplotlib详解:2、3d绘图类型(1):线框图(Wireframe Plot)

    目录 一 前言 二 实验环境 三 Matplotlib详解 1 2d绘图类型 2 3d绘图类型 0 设置中文字体 1 线框图 Wireframe Plot 一 前言 Python是一种高级编程语言 由Guido van Rossum于199
  • Qt事件过滤器

    有时候 对象需要查看 甚至要拦截发送到另外对象的事件 例如 对话框可能想要拦截按键事件 不让别的组件接收到 或者要修改回车键的默认处理 通过前面的章节 我们已经知道 Qt 创建了 QEvent 事件对象之后 会调用 QObject 的 ev
  • dll 导出函数名的那些事

    经常使用VC6的Dependency查看DLL导出函数的名字 会发现有DLL导出函数的名字有时大不相同 导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系 VC 支持两种语言 即C C 这也是造成DLL导出函数差异的根源
  • 2019年,iOS开发的你准备何时跳槽?

    序言 我相信很多人都在说 iOS行业不好了 iOS现在行情越来越难了 失业的人比找工作的人还要多 失业即相当于转行 跳槽即相当于降低自己的身价 那么做iOS开发的你 你是否在时刻准备着跳槽或者转行了 我们先看一下现在iOS行业 iOS程序员
  • 人脸修复祛马赛克算法CodeFormer——C++与Python模型部署

    一 人脸修复算法 1 算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型 由南洋理工大学和商汤科技联合研究中心联合开发 它能够接收模糊或马赛克图像作为输入 并生成更清晰的原始图像 算法源码地址 https github
  • Qt5 项目文件.pro参数详解

    qmake的概念 qmake是用来为不同的平台的开发项目创建makefile的一个工具 qmake简化了makefile的生成 因此创建一个makefile只需要几行信息的文件 qmake可以供任何一个软件项目使用 而不用管他是不是使用Qt
  • C/C++Java生成指定长度随机字符串的三种方法

    学习 实验记录 也是方便自己以后查找 目录 两种实现思路 第一种实现思路 随机数转char 第二种思路 随机数取字符 C语言 使用char数组 C语言 使用char C 使用string类 Java通过字符数组或字符串方式 两种实现思路 C
  • Android OnTouchListener自定义 onTouch完全解析

    做android开发对touch事件是要清晰明了的 如果心存疑问 那么本博客 可以帮你清晰的屡清楚源码是如果实现 onLongClickListener onDoubleClickListener onClickListener 并且再次基
  • Python遍历多个列表:ValueError: too many values to unpack (expected 2)

    项目场景 在进行列表遍历的时候 希望同时遍历多个列表 问题描述 在使用循环遍历两个列表时 希望x y各自获取到数组a b里全部的元素 却产生了意料之外的报错 ValueError too many values to unpack expe
  • vue-introjs实现网站引导功能

    文章目录 说明 效果展示 静态 动态演示 相关技术 intro js 的一分钟入门说明 在 vue 项目中使用 intro js 安装 配置 使用 一些问题 只首次进入的时候显示引导 如果是 v for 循环出来的元素 我们咋显示引导内容呢
  • stm32f407 6个串口dma_STM32实例DMA 实验

    在前面我们提到过 DMA 这一章我们就来学习 STM32F1 的DMA 使 用 要实现的功能是 通过 K UP 按键控制 DMA 串口 1 数据的传送 在传送过程中让 D2 指示灯不断闪烁 直到数据传送完成 D1 指示灯闪烁提示系统正常运行