DMA简介

DMA(Direct Memory Acess,直接存储区访问)
可以实现外设寄存器于存储器之间以及存储器与存储器之间的数据高速传输。DMA传输实现高速数据移动过程无需任何CPU操作控制。DMA控制器是独立于Cortex-M4内核的。
此处的外设一般指外设的数据寄存器,如ADC、SPI、I2C、等外设的数据寄存器。存储器一般是指SRAM、外部寄存器、片内Flash等

DMA功能框图

外设通道选择

STM32F4有两个DMA控制器,每个DMA控制器有8个数据流,每个数据流对应8个数据端口。
数据流包含要传输数据的源地址、目标地址、数据等信息。
外设通道主要解决的是决定哪一个外设作为数据流的源地址以及目标地址。
每一个外设请求都占用一个数据通道,相同数据请求可以占用不同数据通道。

仲裁器

如果要同时使用同一个DMA控制器的多个外设请求,需要决定哪一个数据流优先传输。
仲裁器管理数据流分为两个阶段。第一阶段属于软件阶段,主要是寄存器里面的配置,DMA_SxCR的PL[1:0]位。
第二阶段属于硬件阶段。如果有两个及以上的数据流配置的优先级一样,那么它们的优先级取决于编号,编号越低,优先级越高。如数据流2高于数据流3。

FIFO

每个数据流都独立拥有四级32位FIFO(先进先出存储器缓冲区)。
DMA传输具有直接模式以及FIFO模式,直接模式在每个外设请求DMA传输时会立即启动传输。FIFO用于在源数据传输到目标地址之前临时存放这些数据。
FIFO对于要求源地址和目标地址数据宽度不同时非常有用。

存储器以及外设端口

DMA1不能实现存储器到存储器传输。

DMA数据配置

DMA传输模式

DMA2支持全部三种传输模式,DMA1只有外设到存储器以及存储器到外设两种模式。
模式选择可以通过DMA_SxCR的DIR[1:0]位控制,进而将DMA_SxCR寄存器的EN位置1就可以使能DMA传输。
在DMA_SxCR寄存器的PSIZE[1:0]和MSIZE[1:0]分别指定外设和存储器数据宽度大小。可以指定为字节(8位)、半字(16位)、字(32位)。直接模式要求外设和存储器宽度一致,这种模式下,DMA数据流直接使用PSIZE,MSIZE不使用。

源地址和目标地址

DMA_SxPAR、DMA_SxM0AR、DMA_SxM1AR(x为0~7)都是用于存储地址的,都是32位数据有效。第一个用于存储外设地址,后面两个用来存放存储器地址。注意,DMA_SxM1AR只用于双缓冲模式。

模式 DMA_SxCR的DIR[1:0]配置 源地址 目标地址
外设到存储器 00 DMA_SxPAR DMA_SxM0AR
存储器到存储器 10 DMA_SxPAR DMA_SxM0AR
存储器到外设 01 DMA_SxM0AR DMA_SxPAR

流控制器

流控制器主要涉及控制DMA传输停止的问题。
如果我们知道传输数据的数目,那么我们在传输之前可以设置DMA_SxNDTR寄存器为传输数目值,DMA控制器在传输完这么多数据数目后就可以控制DMA停止传输。
DMA数据流x数据项数DMA_SxNDTR(x为0~7)寄存器用来记录当前仍需要传呼数目。16位数据有效,最大值65535,编程时一般明确指定一个传输数量,完成一次传输后DMA_SxNDTR就会自减,到零时表明传输完成。
如果在传输之前无法得知数据数目,DMA就无法自动控制传输停止了,此时需要硬件通信向DMA控制器发送停止信号,只有SDIO有这个功能。

循环模式

一次模式就是传输一次就停止传输,下一次传输需要手动控制。
循环模式在传输一次后会自动按照相同配置重新传输,一直往复知道被控制停止或传输发生错误。
通过DMA_SxCR寄存器的CIRC可以使能循环模式。

传输类型

突发传输就是在传输阶段吧速度瞬时提升,实现高速传输,需要占用AHB总线
单次传输必须通过AHB的总线仲裁多次控制才传输完成

直接模式

默认情况下,DMA工作在直接模式,不使能FIFO阈值级别。
直接模式要求源地址和目标地址的数据宽度必须一致。所以只有PSIZE控制,MSIZE被忽略。
直接模式不能用于存储器到存储器传输。
直接模式下,如果DMA配置为存储器到外设传输那DMA会将一个数据存放在FIFO内,如果外设启动DMA传输请求就可以马上将数据传输过去。

双缓冲模式

DMA中断

每个DMA数据流可以在一下事件时产生中断。
达到半传输、传输完成、传输错误、FIFO错误、直接模式错误

DMA结构体

typedef struct
{uint32_t DMA_Channel;              //通道选择uint32_t DMA_PeripheralBaseAddr;  //外设地址   一般设置外设的数据寄存器地址// 如ADC3的DR ((uint32_t) ADC3+0X4c)uint32_t DMA_Memory0BaseAddr;    //存储器0地址uint32_t DMA_DIR;                //传输方向uint32_t FMA_BufferSize;         //数据数目    初始化DMA_SxNDTR寄存器的值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_FIFOMode;          //FIFO模式uint32_t DMA_FIFOThreshold;      //FIFO阈值uint32_t DMA_MemoryBurst;        //存储器突发传输uint32_t DMA_PeripheralBurst;     //外设突发传输
}DMA_InitTypeDef;

DMA初始化配置大体流程

DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(xx,ENABLE);//开启DMA时钟DMA_DeInit(XXX,);//复位初始化DMA数据流
while(DMA_GetCmdStatus(XXX)!=DISABLE);//确保DMA数据流复位完成
···
···配置DMA结构体···
···
DMA_Init(XXX,&DMA_InitStructure);//配置数据流
DMA_Cmd(XXX,ENABLE);//使能DMAwhile(DMA_GetCmdStatus(XXX)!=ENABLE);//确保DMA数据流有效

STM32F4的DMA相关推荐

  1. STM32F4 串口DMA

    串口DMA方式收发 笔者使用的是STM32F407VET6,共包含6路串口,页尾处程序已将全部串口的DMA收发配置完成,本文仅以串口1为例进行讲解.(查看代码可直接跳至第二节或页尾处下载) 1 STM ...

  2. STM32F4 SPI DMA

    文章目录 STM32F4 SPI DMA 自己整理(存储器到外设模式) SPI结构体 SPI引脚编号 SPI配置 DMA结构体 DMA请求映射 DMA传输模式 SPI 发送DMA配置 DMA发送中断服 ...

  3. STM32F4基于DMA的多通道ADC采集——遇到的问题解决

    这几天在尝试用DMA实现规则通道多通道的ADC采集,遇到了不少问题,在这记录一下我遇到的问题,一方面理顺一下思路,也希望后人少走弯路. 一开始按照开发板资料中的程序源码编写,但无论如何配置,也无法实现 ...

  4. STM32F4 ADC+DMA单通道采集

    背景:对锂电池电压进行采集,由于电池电压为12V,已经提前对12V进行分压,保证ADC采集电压的范围为0~3.3V.对电池电压的采集不用太过频繁,循环模式下的ADC+DMA对一直采集电压浪费资源.于是 ...

  5. stm32f4 SPI DMA FLASH 传输调试

    来源:项目中需要用stm32对外部spi flash(m25p16  2MB)进行快速读取,主要是图像数据. 平台:stm32f407---168MHz,FreeRTOS V7.3.0 主要参考:ht ...

  6. stm32的串口DMA空闲中断接收不等长数据,stm32F4的usart2-DMA-IDLE收发

    1. 串口为什么要使用DMA?好处? 提高系统实时性:stm32单片机的串口没有FIFO,使用字节中断的方式去接收,会频繁进入中断,影响系统实时性.好在stm32的串口可以级联DMA使用,在大数据量连 ...

  7. 【STM32】DMA程序示例

    00. 目录 文章目录 00. 目录 01. DMA简介 02. 功能描述 03. 硬件设计 04. 程序设计 05. 结果验证 06. 附录 07. 声明 01. DMA简介 DMA,全称为:Dir ...

  8. stm32的串口DMA空闲中断接收不等长数据,stm32F1的usart1-DMA-IDLE收发

    stm32的DMA收发原理,和stm32F4 + USART2 +DMA +IDLE使用,见另一篇:https://blog.csdn.net/Mark_md/article/details/1072 ...

  9. 《STM32从零开始学习历程》——DMA直接存储区访问理论知识

    <STM32从零开始学习历程>@EnzoReventon DMA-直接存储区访问理论知识 本文主要介绍STM32F4 DMA直接存储区的理论知识部分,本文主要参考手册为: [野火Embed ...

最新文章

  1. 2021年大数据Spark(四十三):SparkStreaming整合Kafka 0.10 开发使用
  2. 通过注册表修改VC6.0的字体【转】
  3. spring实例教程
  4. AWS 日本出现大规模故障
  5. linux 内存管理优化,Linux性能优化实战 内存篇 阅读笔记
  6. 2 操作系统第一章 操作系统体系结构、中断和异常、系统调用
  7. go var 一个整数_Go语言学习基础-值、变量、常量
  8. 基于领域知识的Docker镜像自动构建方法
  9. 深度解析~iOS应用程序~生命周期
  10. 丹麦为NSA开绿灯 通过通信中心监控欧洲政客
  11. 基本的阿里云Linux服务器设置
  12. 镜像下载cudnn+tensorflow
  13. Oracle数据库SQL优化详解
  14. 关于visio 2007导入独立图库
  15. Day03 爬取京东商品信息+元素交互操作+BeautifulSoup4
  16. Maven传递依赖无法引入问题(The POM for xxx is invalid)
  17. 计算机主板启动显示器黑屏,电脑开机显示器黑屏怎么回事_开机显示器黑屏怎么解决...
  18. c1-02西班牙的语言,【图片】考试的同学看过来~DELE-C1两个月准备(实用经验+超详细流程)转【西班牙语吧】_百度贴吧...
  19. GPS 入门 1 —— 基础知识
  20. Q-Learning的学习及简单应用

热门文章

  1. 从向量空间的角度来理解方程组有无解的问题
  2. 2022年江西最新建筑八大员(质量员)模拟考试题库及答案解析
  3. 使用苹果发布证书打包好的ipa如何安装到ios手机上测试
  4. 百度地图根据经纬度获取该地点所在城市信息
  5. CSMA/CA基本原理
  6. 圣科鲁兹 计算机专业,加州大学圣克鲁兹分校计算机工程硕士专业 将发明创新融入到工业中!...
  7. 微信商户平台配置JSAPI支付目录,vue项目,好多坑呐
  8. JAVAEE工程师入门技术之第1课day01_Java基础语法HelloWorld
  9. 树莓派科学小实验4B--07_继电器
  10. Codeforces Round #700 (Div. 2)全部题解