STM32-F407入门学习专题(五) STM32外设之DMA

2023-05-16

目录

1 DMA

2 DMA功能框图

2.1 外设通道选择

2.2 仲裁器

2.3 FIFO

2.4存储器端口、外设端口

3 DMA传输配置


1 DMA

DMA(Direct Memory Access),即直接存储器访问,DMA提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,硬件系统主要由CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在存储器与外设直接转移、或是从外设A转移到外设B。在不适用DMA情况下,内核经总线矩阵协调,使用AHB将外设ADC采集的数据读取到内核,然后内核再通过总线矩阵协调,把数据存放到SRAM中;而由DMA控制器的DMA总线与总线矩阵协调,使用AHB把外设ADC的数据经由DMA通道存放到内存SRAM,使用DMA为多通道采集、采样频率高、连续输出数据的AD采集提供了更高效的方法,总结来说就是传输数据时使用DMA传输可以不占用CPU,让CPU有足够时间处理其它事情

2 DMA功能框图

STM32F407有2个DMA控制器(DMA1和DMA2),共16个数据流(每个控制器8个数据流),每个数据流都用来专门管理来自一个或多个外设请求的内存存取,每个数据流有8个通道可以选择。DMA可以工作在FIFO模式和直接模式两种模式下,且每个数据流可以通过硬件配置成常规通道来支持外设到内存、内存到外设、内存到内存的数据传输,也可以配置成双缓冲模式来内存与内存直接的数据传输

DMA的5个事件标志:DMA半传输、DMA传输完成、DMA传输错误、DMA FIFO错误、直接模式错误

5个标志分别对应:DMA_IT_HT、DMA_IT_TC、DMA_IT_TE、DMA_IT_FE、DMA_IT_DME

DMA可实现外设寄存器与存储器之间或者存储器与存储器之间直接传输的三种模式,这主要得益于DMA控制器是采用AHB主总线,它可以控制AHB总线矩阵来启动AHB事务,STM32F407功能框图如下

2.1 外设通道选择

 两个DMA控制器共有16个数据流,每个数据流对应8个外设请求,具体对应情况如下表

 在实现DMA传输之前,DMA控制器会通过DMA数据流x配置寄存器DMA_SxCR(x为0~7的8个DMA数据流)的SHSEL[2:0]位选择对应的通道作为数据流的目标外设,其中每个外设请求都占用一个数据流通道,相同外设请求可以占用不同的数据流通道

2.2 仲裁器

一个DMA控制器对应8个数据流,数据流包括数据传输的源地址、目标地址、数据等信息,在同时使用同一个DMA控制多个外设请求时,必然需要同时使用多个数据流,哪个数据流优先是由仲裁器选定的

仲裁器为两个AHB主端口(存储器和外设端口)提供基于请求优先级的8个DMA数据流请求管理,并启动外设/存储器访问序列,优先级的管理分为两个阶段:

1、软件。每个数据流优先级可以在DMA_SxCR寄存器中配置,分为四个级别:非常高优先级、高优先级、中优先级和低优先级

2、硬件。如若两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流,如数据流2的优先级高于数据流4

2.3 FIFO

每个数据流都独立拥有四级32位FIFO,DMA传输具有FIFO模式和直接模式

直接模式在每个外设请求都立即启动对存储器传输,在直接模式下,若DMA配置为存储器到外设传输,那DMA会将一个数据存放到FIFO内,外设启动DMA传输请求时就可以立即将数据传输过去

FIFO用于在源数据传输到目标之前临时存储这些数据,可以通过DMA数据流xFIFO控制寄存器DMA_SxFCR的FHT[1:0]位来控制FIFO的阈值,分别为1/4、1/2、3/4和满,在数据存储量大于阈值时,FIFO内容将传输至目标中

FIFO对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时将4个8位字节数据拼凑成一个32位字数据,此时可以使用FIFO功能先把数据缓冲起来,分别根据需要输出数据

2.4存储器端口、外设端口

DMA控制器实现双AHB主接口,更好利用总线矩阵和并行传输,DMA控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口,DMA控制器通过存储器端口和外设端口与存储器和外设进行数据传输,关系见下图

DMA2的存储器端口和外设端口均是连接到AHB总线矩阵的,可以使用AHB总线矩阵功能,DMA2存储器和外设端口可以访问相关的内存地址,包括内部Flash、内部SRAM、AHB1外设、AHB2外设、APB2外设和外部存储器空间

DMA1的存储器端口相比DMA2的要减少AHB2外设的访问权,同时DMA1外设端口是没有连接至总线矩阵的,只有连接到APB1外设,所以DMA1不能实现存储器到存储器传输

3 DMA传输配置

1、若使能了数据流,通过复位DMA_SxCR寄存器中的EN位将其禁止,然后读取此位以确认没有正在进行的数据流操作,将此位写0时不会立即生效,因为实际上只有所有当前传输都已完成时该位才会变为0,当所读取EN位的值为0时,才表示可以配置数据流了,因此在开始任何数据流配置前,需要等待EN位清0

2、在DMA_SxPAR寄存器中设置外设端口寄存器地址,外设事件发生后,数据会从此地址传输到外设端口或从外设端口传输到此地址

3、在DMA_SxMA0R寄存器(在双缓冲区模式下还有DMA_SxMA1R寄存器)中设置存储器地址,外设事件发生后,将从此存储器地址读取数据或将数据写入此存储器地址

4、在DMA_SxNDTR寄存器中配置要传输的数据项总数,每出现一次外设事件或每出现一个节拍的批量传输,该值都会递减

5、使用DMA_SxCR寄存器中的CHSEL[2:0]选择DMA通道

6、使用DMA_SxCR寄存器中的批量[1:0]位配置数据流优先级

7、配置FIFO使用情况(使能或禁止、以及发送和接收阈值)

8、在DMA_SxCR寄存器中配置数据传输方向、外设和存储器增量/固定模式、单次/批量传输、外设和存储器数据宽度、循环模式、双缓冲区模式和传输完成一半和/或全部完成、和/或错误中断

9、通过将DMA_SxCR寄存器中的EN位置1使能数据流,一旦使能了数据流,即可响应连接到该数据流的外设发出的任何DMA请求

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

STM32-F407入门学习专题(五) STM32外设之DMA 的相关文章

  • 机器学习 深度学习 简介与区分

    文章目录 机器学习特征深度学习 机器学习 机器学习 xff08 Machine Learning xff09 是一门专门研究计算机怎样模拟或实现人类的学习行为 xff0c 以获取新的知识或技能 xff0c 重新组织已有的知识结构使之不断改善
  • docker重新打tag并删除原tag的镜像

    docker镜像id是唯一的 xff0c 可以物理性的标明一个镜像 xff0c repository xff1a tag可以有多个 xff0c 但是也不会重复 xff0c 也是唯一的 要重新打tag的话 xff0c 语法是 xff1a do
  • docker 部署prometheus系列2(完结)

    接着docker部署prometheus系列1 安装grafana 拉取镜像grafana镜像 docker pull grafana grafana 启动grafana 96 version 39 3 39 services grafan
  • 使用iftop命令查看各个连接的流量情况

    使用iftop命令查看各个连接的流量情况 iftop命令可以查看实时的网络流量 xff0c 监控TCP IP连接 xff0c 反向解析IP xff0c 显示端口信息等 安装iftop命令 关于Linux上安装iftop有两种方法 xff0c
  • Ubuntu更新报错: 无法下载 http://cn.mirrors.ustc.edu.cn/ubuntu/dists/bionic/InRelease 连接失败BUNTU

    Ubuntu执行apt get update报错 xff1a 解决方案 xff1a xff08 1 xff09 这是因为ubuntu的服务器在国外 xff0c 使用国内的软件源在软件下载速度方面相对比较快 输入 xff1a 以下命令 cd
  • 解决问题:输入git命令出现END命令,按住ctrl+c都没有不能退出,只能输入q才能退出

    出现的问题 当输入git命令时 xff0c 例如git branch xff0c 会直接出现END这种黑框 xff0c 按住ctrl 43 c都不能退出 xff0c 只能通过输入q才能退出的情况 解决办法 只需要输入以下的命令 xff0c
  • 虚拟现实技术(VR)

    1 简介 VR是Virtual Reality的缩写 xff0c 中文的意思就是虚拟现实 xff08 真实幻觉 灵境 幻真 xff09 xff0c 也称灵境技术或人工环境 概念是在20世纪80年代初提出来的 xff0c 其具体是指借助计算机
  • 不常用软件使用

    Markdown编辑器 1 Typora Typora也是非常用名 xff0c 非常好用的markdown编辑器 xff0c 它的设计理念很不一样 xff0c 是真正的即时预览型编辑器 xff0c 不同于左右两个窗口的编辑器 Typora的
  • Gazebo-Ros搭建小车和场景并运行slam算法进行建图3--给机器人的传感器添加插件并放入场景中

    Gazebo Ros搭建小车和场景并运行slam算法进行建图3 给机器人的传感器添加插件并放入场景中 1 添加标签 第1篇文章中创建的机器人模型虽然可以在rviz中显示 xff0c 但若要在gazebo中显示 xff0c 还需要给每一个部分
  • Gazebo-Ros搭建小车和场景并运行slam算法进行建图4--为机器人添加运动控制器控制其移动

    Gazebo Ros搭建小车和场景并运行slam算法进行建图4 为机器人添加运动控制器控制其移动 1 要想机器人小车在gazebo中运动还需要为其添加运动插件 在文章3中的my robot2 urdf 最下边 xff08 前边 xff09
  • keil 函数点击不能跳转到函数的定义之解决方案

    当右键点击一个函数名并点击Go To Definition Of xxx时 xff0c 没有达到我们预期的效果 显示如下 xff1a 那么解决方法一 xff1a 重新编译一遍整个工程 xff0c 再试试 xff1b 解决方法二 xff1a
  • “字符串的结束标志是‘\0‘,编译器自动在字符串末尾添加”

    字符串的结束标志是 0 xff0c 编译器自动在字符串末尾添加 探究 xff1a 字符串的结束标志是 0 xff0c 编译器自动在字符串末尾添加 编译器 xff1a 编译器就是将 一种语言 xff08 通常为高级语言 xff09 翻译为 另
  • PX4中MPU6000数据读取程序的实现过程

    MPU6000 measure 函数解析 MPU6000 measure mpu report 原始数据结构体对象 report 整合后数据结构体对象 interface gt read MPU6000 SET SPEED MPUREG I
  • 计算机网络(谢希仁 第七版) 数据链路层 个人笔记

    写此博文目的 xff1a 整理知识点方便自己以后复习和深入的学习 数据链路层 1 数据链路 xff1a 除了物理线路外 xff0c 还必须有通信协议来控制这些数据的传输 xff0c 若把这些协议的软件和硬件加到链路上 xff0c 就构成了数
  • 初始视觉里程计

    起因 临近大四的时候 xff0c 被告知毕业设计要做与机器人相关的题目 于是导师给了一个足球场上实现移动机器人视觉自定位的功能 拿到这个题目 xff0c 万般无奈 xff0c 毫无头绪 xff0c 身边的人也没有搞过这个的 xff0c 根本
  • 三相电机驱动电路详解

    最近又开始接触驱动这块儿的电路了 xff0c 好久没学 xff0c 又有点忘了 xff0c 特此记录 驱动MOSFET xff0c 可以选用专用MOSFET驱动IC完成电平转换和驱动 因为MOSFET的栅 源极之间存在寄生电容 xff0c
  • AD2S1210的使用总结

    目录 前言一 AD2S1210工作原理1 旋变信号2 旋变 数字转换3 TYPE II跟踪环路 二 程序设计部分1 初始化2 向AD2S1210中写入数据3 从AD2S1210中读取数据 总结2022年3月8日补充2022年3月31日补充
  • 永磁同步电机MTPA与id=0的控制原理

    目录 MTPA控制方式与id 61 0控制方式的区别 MTPA控制方式与id 61 0控制方式的区别 永磁同步电动机主要可分为 xff1a 表面式和内置式 在表贴式永磁同步电动机中 xff0c 永磁体通常呈瓦片形 xff0c 并位于转子铁心
  • ADB连接Android设备的三种方法

    ADB连接Android设备的三种方法 连接方式有三种方法 xff1a 一 WiFi连接 xff08 手机与pc同一个局域网下 xff09 与电脑在同一局域网内 xff0c Android设备连接WiFi xff0c 然后adb命令 adb
  • 关于电机转子初始位置检测的方法

    目录 电机转子检测的目的对位置的几种方法使用d轴电流吸合时的电角度解算使用q轴电流吸合时的电角度解算总结 电机转子检测的目的 电机实现闭环需要电机的转速和转子实际位置的反馈量 其中对于转子位置的反馈量最为麻烦 xff0c 因为电机的转子检测

随机推荐

  • FreeRTOS的学习(三)——中断机制

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • 基于F28335的Simulink代码生成(七)——成果展示

    基于F28335的Simulink代码生成系列文章目录 基于F28335的Simulink代码生成 xff08 一 xff09 搞懂模型的运行逻辑 基于F28335的Simulink代码生成 xff08 二 xff09 EPWM模块同步设置
  • FreeRTOS的学习(五)——系统延时

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • FreeRTOS的学习(六)——系统时钟

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • FreeRTOS的学习(七)——2.队列入队源码分析

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • 温故知新(六)——状态观测器

    目录 1 什么是状态观测器 2 Luenberger状态观测器 1 什么是状态观测器 为了对系统实现状态反馈 xff0c 状态观测器应运而生 状态观测器是一种通过原受控系统的输入 输出量来重新构建一个与原系统相似的动态系统 它的输出信号的状
  • FreeRTOS的学习(八)——4.互斥信号量

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • FreeRTOS的学习(十三)——任务创建

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • FreeRTOS的学习(十四)——PendSV异常

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • adb命令大全

    目录 基本用法 命令语法 为命令指定目标设备 启动 停止 查看 adb 版本 以 root 权限运行 adbd 指定 adb server 的网络端口 设备连接管理 查询已连接设备 模拟器 USB 连接 无线连接 xff08 需要借助 US
  • Sallen-Key二阶低通滤波器——设计问题浅析

    目录 前言1 Sallen Key二阶低通滤波器结构2 截止频率3 结语 前言 这两天接了个简单的活 xff0c 关于设计一个Sallen Key二阶低通滤波器 xff0c 有一些体会 1 Sallen Key二阶低通滤波器结构 这个结构很
  • VsCode之常见操作01 修改背景颜色

    改变 Vscode的背景颜色 file 61 61 gt preferences 61 61 gt color theme 分别提供了亮色 xff0c 暗色主模版 也可以使用 快捷键 crtl 43 k crtl 43 t 61 61 gt
  • 学习Java一年的心得体会

    趁着这个时间 xff0c 写下我这一年来学习Java的总结 从17年的7月13号至今 xff0c 已经入坑一年了 xff0c 有汗水也有收获 最开始是在淘宝买了个五块钱的JAVA视频教程 xff0c 有基础 xff0c 进阶以及一些实战 说
  • 《Python数据结构与算法分析》读书笔记三——基本数据结构(一)

    文章目录 3 1 本章目标3 2 何谓线性数据结构3 3 栈3 3 1 何谓栈3 3 2 栈抽象数据类型3 3 3 用Python实现栈3 3 4 匹配括号3 3 5 普通情况 xff1a 匹配符号3 3 6 将十进制数转换成二进制数3 3
  • C++数据结构与算法——哈希表实现(链式法)

    解决散列冲突 文件结构字典类概念代码 哈希类概念代码 有序链表概念代码 哈希表实现概念代码 测试主函数代码输出 文件结构 字典类 概念 代码 span class token comment dictionary h span span c
  • Ubuntu编译安装LLVM(13.0.1)

    参考官方教程 xff1a https llvm org docs GettingStarted html 环境要求 我的电脑是Ubuntu 20 04虚拟机 xff0c 看一下官网的要求 xff1a 硬件要求 xff1a 软件要求 xff1
  • Ubuntu 20.04 安装docker报错

    在下载公钥后运行sudo apt update报错 xff0c 错误如图 xff1a 试了这两种方法都不好使 xff1a span class token function sudo span apt key adv keyserver k
  • 超声波传感器知识(第四部分):测量精度的影响

    摘要 xff1a 对于超声波传感器 xff0c 测量精度通常是指模拟输出的测量值的绝对精度 基于回波传输时间 xff0c 超声波传感器的测量精度依靠数个物理参数 这些参数通常与空气和内部偏差相关 对于超声波传感器 xff0c 测量精度通常是
  • STM32学习之旅④ USART串口和上位机通信

    STM32系列博客 xff1a STM32学习之旅 开发环境搭建STM32学习之旅 固件库的使用及工程模板的建立STM32学习之旅 从点灯到代码移植STM32学习之旅 USART串口和上位机通信STM32学习之旅 SPI控制TFT xff0
  • STM32-F407入门学习专题(五) STM32外设之DMA

    目录 1 DMA 2 DMA功能框图 2 1 外设通道选择 2 2 仲裁器 2 3 FIFO 2 4存储器端口 外设端口 3 DMA传输配置 1 DMA DMA xff08 Direct Memory Access xff09 xff0c