DMA按照其数据流传输可以分为存储器到外设、外设到存储器或者存储器到存储器的传输。

外设到存储器模式

这种模式可以通过DMA_SxCR寄存器中的EN置1,每次产生外设请求,数据流都会启动数据源到FIFO传输。当达到FIFO的阈值级别是,FIFO的内容移出并存储到目标中。

如果DMA中的计数器DMA_SxNDTR寄存器达到零、外设请求传输终止或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。

在直接模式下,不适用FIFO的阈值级别控制:每次完成一次外设到FIFO的数据传输后,相应的数据立即就会移出并存储到目标中。

只有赢得了数据流的仲裁后,相应数据流才有权访问 AHB 源或目标端口。系统使用在DMA_SxCR 寄存器 PL[1:0] 位中为每个数据流定义的优先级执行仲裁。

存储器到外设模式

使能这种模式(将 DMA_SxCR 寄存器中的 EN 位置 1)时,数据流会立即启动传输,从源完全填充 FIFO。

每次发生外设请求, FIFO 的内容都会移出并存储到目标中。当 FIFO 的级别小于或等于预定义的阈值级别时,将使用存储器中的数据完全重载 FIFO。

如果 DMA_SxNDTR 寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR 寄存器中的 EN 位由软件清零,传输即会停止。

在直接模式下(当 DMA_SxFCR 寄存器中的 DMDIS 值为“0”时),不使用 FIFO 的阈值级别。一旦使能了数据流, DMA 便会预装载第一个数据,将其传输到内部 FIFO。一旦外设请求数据传输, DMA 便会将预装载的值传输到配置的目标。然后,它会使用要传输的下一个数据再次重载内部空 FIFO。预装载的数据大小为 DMA_SxCR 寄存器中 PSIZE 位字段的值。

只有赢得了数据流的仲裁后,相应数据流才有权访问 AHB 源或目标端口。系统使用在DMA_SxCR 寄存器 PL[1:0] 位中为每个数据流定义的优先级执行仲裁。

存储器到存储器模式

通过将 DMA_SxCR 寄存器中的使能位 (EN) 置 1 来使能数据流时,数据流会立即开始填充FIFO,直至达到阈值级别。达到阈值级别后, FIFO 的内容便会移出,并存储到目标中。如果 DMA_SxNDTR 寄存器达到零或 DMA_SxCR 寄存器中的 EN 位由软件清零,传输即会停止。

只有赢得了数据流的仲裁后,相应数据流才有权访问 AHB 源或目标端口。系统使用在
DMA_SxCR 寄存器 PL[1:0] 位中为每个数据流定义的优先级执行仲裁。

注意: 使用存储器到存储器模式时,不允许循环模式和直接模式。只有 DMA2 控制器能够执行存储器到存储器的传输。

用例

以官方库提供的ADC用例为主:

  DMA_InitStructure.DMA_Channel = DMA_CHANNELx; //设置DMA channel DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CDR_ADDRESS; //ADC 地址DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADCDualConvertedValue; //内存DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //数据流方向 从外设到内存DMA_InitStructure.DMA_BufferSize = 1; //内存buffer大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设数据是否地址增长DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//内存禁止DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字节DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//半字节DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//FIFO DisableDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; //FIFO 阈值 DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //Burst 触发模式DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA_STREAMx, &DMA_InitStructure);//DMA init/* DMA2_Stream 0 enable */DMA_Cmd(DMA_STREAMx, ENABLE);//使能DMA

DMA看似很复杂,官方提供API库 使操作非常简单,一般只需要使使用DMA_Init即可,配置完DMA_init之后,还需要是使能

API列表

函数 功能
DMA_Init DMA初始化,配置DMA通道优先级
DMA_DeInit DMA去初始化
DMA_StructInit DMA数据结构初始化
DMA_Cmd DMA使能或者去使能
DMA_PeriphIncOffsetSizeConfig 配置DMA 外设地址增长模式
DMA_FlowControllerConfig 配置DMA流控制器
DMA_SetCurrDataCounter 设置当前数据计数
DMA_GetCurrDataCounter 获取当前数据计数
DMA_DoubleBufferModeConfig 设置双buffer
DMA_DoubleBufferModeCmd 使能双buffer
DMA_MemoryTargetConfig 配置双buffer 地址
DMA_GetCurrentMemoryTarget 获取双buffer,当前正在使用哪一个
DMA_GetCmdStatus 获取命令状态 使能或非使能
DMA_GetFIFOStatus 获取FIFO状态
DMA_GetFlagStatus 获取flag状态
DMA_ClearFlag 清楚flag状态
DMA_ITConfig 配置DMA中断
DMA_GetITStatus 获取中断状态
DMA_ClearITPendingBit 清除中断

参考文档

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

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

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

    官方SDK中提供了ADC操作的相关主要接口,极大方便了对ADC的配置 ADC数据结构 ADC的主要数据结构有两个ADC_InitTypeDef 和  ADC_CommonInitTypeDef ADC ...

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

    前言 DMA(直接存储器访问)主要用于外设与存储器之间以及存储器与存储器之间提高数据传输. 主要作用: 1:无需借助CPU操作,就可以通过DMA在两个外设或者存储器之间传递数据,速度较快. 2:解放C ...

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

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

  4. STM32那点事(3)_中断(下)

    上节主要讲述了STM32 的中断基础知识以及一般配置过程.外部中断与其他模块中断相对要复杂一点.外部中断一般都是由GPIO触发,是在整个系统中需要经常用到. 介绍 STM32F4 有多达23个中断,每 ...

  5. STM32那点事(2)_时钟树(下)

    上两篇主要讲述了系统时钟,APB1, APB2, AHB配置的整个过程,是系统启动的关键,剩余部门将单独介绍 独立看门狗(IWDGCLK) 独立看门够采用内部单独时钟LSIRC,用于与其他系统时钟隔离 ...

  6. STM32系统定时器SysTick(只能向下递减)延时闪烁灯

    参考:stm32 系统定时器 SysTick 作者:点灯小哥 发布时间: 2021-03-10 13:46:00 网址:https://blog.csdn.net/weixin_46016743/ar ...

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

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

  8. STM32那点事(5)_ADC(中)

    在上节得ADC转换规则中可以看到有两个规则:规则通道和注入通道,两个规则应用场景不太一样: 规则通道是比较常用的转换规则,支持连续循环自动采集,不需要人工进行干预,可以由硬件自动触发进行采集,在同一个 ...

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

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

最新文章

  1. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)
  2. 未来安防人工智能需要攻克的几大技术方向
  3. 辽宁鞍山与中国联通签订智慧城市大数据云计算中心项目
  4. 你有遇到过MySQL因大小写敏感导致的问题吗
  5. [Egret][文档]遮罩
  6. CTSC2017酱油记
  7. 2、网络编程之基于UDP示例
  8. STM32启动模式及API(转)
  9. 廖雪峰Python教程梳理
  10. python 文件转base64
  11. 近期EI收录的国际会议汇总(AI/CV/深度学习等领域)
  12. 开源java微博系统_ThinkSNS 开源微博系统 v4.6.0.0
  13. 无线路由也超频 刷机从TOMATO固件开始
  14. 独立版旺店助手源码在线持续更新
  15. 一些关于CV和deeplearning的干货链接(长期更新)
  16. MySQL异常java.sql.SQLSyntaxErrorException
  17. 知识图谱可视化vue.js + d3.js
  18. CAD二次开发——1.环境搭建
  19. 两个栈实现队列的push-pop操作---C++
  20. 解决所有人的痛点,禁止Win10强制更新,一键彻底关闭更新,Windows Update Blocker

热门文章

  1. 快速入门:使用 Docker 运行 SQL Server 容器映像
  2. vue.js 使用axios实现下载功能
  3. SpringCloud微服务:阿里开源组件Nacos,服务和配置管理
  4. 职责链模式(Chain of Responsibility Pattern)
  5. POI读取Excel内容格式化
  6. 怎么做最棒的有效外链
  7. New Currency Rate IOS APP 上线
  8. 魔兽争霸III 1.20, 1.21 1.22 需要特定语言版本之Window 解决办法
  9. 父亲节——女儿的礼物
  10. 我的测试生活感悟2 - Art Of Unit Testing