前言

DMA(直接存储器访问)主要用于外设与存储器之间以及存储器与存储器之间提高数据传输。

主要作用:

1:无需借助CPU操作,就可以通过DMA在两个外设或者存储器之间传递数据,速度较快。

2:解放CPU资源,使CPU可以 有时间做其他事情。

上图分别为有无DAM外设与存储器读写过程,无DMA数据流过程:外设->CPU->存储器,需要占用CPU资源软件读写。有DMA数据流过程:外设->DMA->存储器,不需要占用CPU资源,硬件自动读写。

STM32 DMA为芯片内部结构,无GPIO对外交互。

DMA介绍

STM32F4种 DMA挂接在AHB种, AHB总线为高速数据总线频率为168MHz,DMA需要以最快速率进行读写,性能才能达到最优,故DMA挂接在AHB中,示意图如下:

STM32F4 有两个DMA,每个DMA分别支持8个数据流,工可以控制16个数据流,DMA总体框图如下:

DMA框图可以将其划分为六个部分:

1:每个DMA共分为8个数据流,每个数据流又可以对应8个外设请求。在启动DMA传输之前,首先要为相应的数据流配置相应的通道,可以通过DMA_SxCR来配置,每个数据流的通道芯片硬件已经规定好,不可以随意配置:

DMA1 和DMA2的通道如上图所示。要根据相应的外设,查上述表设置相应通道。 每个外设占用一个数据流,有些外设分布在多个数据流中,使用时只能使用其中一个。

2:仲裁器:一个仲裁器对应8个数据流,按照优先级对8个DMA数据流请求进行管理。优先级管理分为两个阶段:

软件管理:每个数据流优先级都可以通过DMA_SxSR寄存器进行管理,划分为四个级别:非常高优先级,高优先级,中优先级以及低优先级。

硬件管理:如果两个请求设置成相同的优先级,则编号低的数据流优先于编号高的数据流。

3:FIFO:STM32F4 DMA每个数据流都独立拥有四级FIFO,用于缓存读取到的数据,拼装成所需要的字节。

DMA 传输具有FIFO模式和直接模式。

直接模式:每个DMA请求会立即启动对存储器的传输。当在直接模式(禁止FIFO)下将DMA请求配置为以存储器到外设模式传输数据时,DMA仅会将一个数据从存储器预加载到内部FIFO,从而确保一旦外设触发DMA请求时则立即传输数据。

FIFO模式在传输到目标之前进行临时存放,可以通过DMA_SxFCR 的 FTH[1:0]来控制其阈值。FIFO阈值必须与整个存储器突出传输完全匹配。如果不匹配,当使能数据流时将产生一个FIFO错误。

FIFO的主要作用就是当要求的源地址和目标地址数据宽度不一致时,比如源时间时字节数,而目标输出时4个字节,此时FIFO的功能就是把数据缓存起来,组装成目标输出所需要的字节数

4和5分别为存储器和外设端口,DMA1和DMA2两者外设总线如下图所示:

由上图中图1部分可知DMA1的存储器端口都直接链接到外设上,而DMA2时可以通过AHB2总线挂接到存储器中,所以 DMA2数据流能够执行存储器到存储器的传输,而DMA1不行。

6为编程接口,AHB从器件编程接口是连接到AHB2外设.AHB2外设在使用DMA传输时需要相关控制信息。

DMA中断

每个DMA数据流,可发生以下中断:

--->达到半传输

---->传输完成

---->传输错误

----->FIFO错误

----->直接模式错误

参考文档

《 零死角玩转STM32》
《STM32F4XX中文参考手册》

STM32那点事(4)_DMA(上)相关推荐

  1. STM32那点事(5)_ADC(上)

    ADC介绍 ADC顾名思义为模数转换,与之相对的是DAC为数模转换,AD/DA为电子元器件中的重要模块,主要负责模拟信号和数字信号之间的转换,因为我们计算机中使用到的主要是数字信息010101等,而我 ...

  2. STM32那点事(4)_DMA(下)

    DMA按照其数据流传输可以分为存储器到外设.外设到存储器或者存储器到存储器的传输. 外设到存储器模式 这种模式可以通过DMA_SxCR寄存器中的EN置1,每次产生外设请求,数据流都会启动数据源到FIF ...

  3. STM32那点事(3)_中断(上)

    中断是STM32核心模块之一,几乎所有的模块都需要和中断打交道.了解STM32运作机制非常重要.在<STM32那点事(1)_STM32F40_41xx启动文件详解>中讲解启动流程中提到,中 ...

  4. Python爬虫入门教程 98-100 帮粉丝写 Python 爬虫之【2020秋季最难的事--约不上的疫苗】

    帮粉丝写爬虫系列的最后一篇博客了,剩下的两篇是爬虫百例课程的一个总结,本系列课程的加更篇后续会逐步编写,同时滚雪球学 Python 系列课程已经在构思中,希望得到大家的继续支持.这篇博客取名叫做202 ...

  5. STM32 Proteus仿真PT100温度测量串口上传LCD1602显示-0002

    Proteus仿真小实验: STM32 Proteus仿真PT100温度测量串口上传LCD1602显示-0002 功能: 硬件组成:STM32F103R6单片机 +LCD1602显示器+PT100温度 ...

  6. 【Rust日报】 2019-06-10:「嵌入式Rust」使用STM32 Blue Pill在Apache Mynewt上托管嵌入式Rust应用程序...

    「示例」使用静态链接的Rust可执行程序 #Linux #StaticallyLinked 运行于Linux内核之上 Read More Contrie: 无锁并发映射和集合库 #concurrent ...

  7. STM32那点事(6)_定时器(上)

    STM32定时器是CPU中的基本功能模块之一,最基本的功能是提供定时,STM32定时器共用16个定时器,主要分为两个基本定时器,10个通用定时器,2个高级定时器,以及两个看门狗定时器.看门狗定时器后面 ...

  8. STM32那点事(2)_时钟树(上)

    时钟树属于STM32内部资源,是整个芯片内部模块种最难看懂的一部分,相对于其他高性能CPU芯片,STM32时钟树相对没有那么复杂,了解STM32时钟树对熟悉整个芯片内部架构非常有帮助,进一步学习其他高 ...

  9. STM32 USB虚拟串口原理(上)

    USB虚拟串口是使用USB的CDC(CDC为communication device class(virtual port com))类实现的一种通讯接口.使用STM32自带的USB slave功能可 ...

最新文章

  1. 半世纪全球顶级学者迁移图(附视频、亿级学术信息)| 数据院科技大数据研究中心发布
  2. Different Layouts for Different Widths
  3. linux grub2 等待时间修改
  4. SpringBoot 集成 thumbnailator (图片缩放,区域裁剪,水印,旋转,保持比例)保姆级教程(含代码)
  5. OpenCV Laplace point/edge detection拉普拉斯点/边缘检测的实例(附完整代码)
  6. 清华大学梁宸计算机系,2015年广东高考高等学校自主招生录取考生名单公示(2)...
  7. Linux Apache php MySQL 安装配置(Centos 6.4 yum安装)
  8. java调用lingo_使用Lingo增强JMS
  9. php算法求出一个数可以被分解成多少个_最全的小学干货:34个数学重难点公式(三)...
  10. iOS  两张图片合并成一张。
  11. 浅谈soul网关架构图
  12. python人脸识别表情检测器(2):基本框架的制作
  13. 广州外贸童装批发市场
  14. QGC地面站中视频流配置及gstreamer安装
  15. python课件百度文库_python教-教学课件.doc
  16. Minecraft开服ipv6配置
  17. 【Python学习】Word文档重复字检测程序
  18. 016-第50周(12.13-12.19)
  19. 资讯丨Linux基金会一行到访腾讯参观交流
  20. CSS Float 浮动布局

热门文章

  1. easyui form 提交
  2. 架构设计 | 高并发流量削峰,共享资源加锁机制
  3. Django(四)数据库
  4. 利用samba服务为windows用户架设网盘的简单实践
  5. MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性
  6. 网络应用框架Netty快速入门
  7. mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例
  8. node.js用get方式获取网页中的链接
  9. hdu1251(统计难题)
  10. Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转......