STM32那点事(4)_DMA(下)
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(下)相关推荐
- STM32那点事(5)_ADC(下)
官方SDK中提供了ADC操作的相关主要接口,极大方便了对ADC的配置 ADC数据结构 ADC的主要数据结构有两个ADC_InitTypeDef 和 ADC_CommonInitTypeDef ADC ...
- STM32那点事(4)_DMA(上)
前言 DMA(直接存储器访问)主要用于外设与存储器之间以及存储器与存储器之间提高数据传输. 主要作用: 1:无需借助CPU操作,就可以通过DMA在两个外设或者存储器之间传递数据,速度较快. 2:解放C ...
- STM32那点事(3)_中断(上)
中断是STM32核心模块之一,几乎所有的模块都需要和中断打交道.了解STM32运作机制非常重要.在<STM32那点事(1)_STM32F40_41xx启动文件详解>中讲解启动流程中提到,中 ...
- STM32那点事(3)_中断(下)
上节主要讲述了STM32 的中断基础知识以及一般配置过程.外部中断与其他模块中断相对要复杂一点.外部中断一般都是由GPIO触发,是在整个系统中需要经常用到. 介绍 STM32F4 有多达23个中断,每 ...
- STM32那点事(2)_时钟树(下)
上两篇主要讲述了系统时钟,APB1, APB2, AHB配置的整个过程,是系统启动的关键,剩余部门将单独介绍 独立看门狗(IWDGCLK) 独立看门够采用内部单独时钟LSIRC,用于与其他系统时钟隔离 ...
- STM32系统定时器SysTick(只能向下递减)延时闪烁灯
参考:stm32 系统定时器 SysTick 作者:点灯小哥 发布时间: 2021-03-10 13:46:00 网址:https://blog.csdn.net/weixin_46016743/ar ...
- STM32那点事(6)_定时器(上)
STM32定时器是CPU中的基本功能模块之一,最基本的功能是提供定时,STM32定时器共用16个定时器,主要分为两个基本定时器,10个通用定时器,2个高级定时器,以及两个看门狗定时器.看门狗定时器后面 ...
- STM32那点事(5)_ADC(中)
在上节得ADC转换规则中可以看到有两个规则:规则通道和注入通道,两个规则应用场景不太一样: 规则通道是比较常用的转换规则,支持连续循环自动采集,不需要人工进行干预,可以由硬件自动触发进行采集,在同一个 ...
- STM32那点事(5)_ADC(上)
ADC介绍 ADC顾名思义为模数转换,与之相对的是DAC为数模转换,AD/DA为电子元器件中的重要模块,主要负责模拟信号和数字信号之间的转换,因为我们计算机中使用到的主要是数字信息010101等,而我 ...
最新文章
- 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)
- 未来安防人工智能需要攻克的几大技术方向
- 辽宁鞍山与中国联通签订智慧城市大数据云计算中心项目
- 你有遇到过MySQL因大小写敏感导致的问题吗
- [Egret][文档]遮罩
- CTSC2017酱油记
- 2、网络编程之基于UDP示例
- STM32启动模式及API(转)
- 廖雪峰Python教程梳理
- python 文件转base64
- 近期EI收录的国际会议汇总(AI/CV/深度学习等领域)
- 开源java微博系统_ThinkSNS 开源微博系统 v4.6.0.0
- 无线路由也超频 刷机从TOMATO固件开始
- 独立版旺店助手源码在线持续更新
- 一些关于CV和deeplearning的干货链接(长期更新)
- MySQL异常java.sql.SQLSyntaxErrorException
- 知识图谱可视化vue.js + d3.js
- CAD二次开发——1.环境搭建
- 两个栈实现队列的push-pop操作---C++
- 解决所有人的痛点,禁止Win10强制更新,一键彻底关闭更新,Windows Update Blocker
热门文章
- 快速入门:使用 Docker 运行 SQL Server 容器映像
- vue.js 使用axios实现下载功能
- SpringCloud微服务:阿里开源组件Nacos,服务和配置管理
- 职责链模式(Chain of Responsibility Pattern)
- POI读取Excel内容格式化
- 怎么做最棒的有效外链
- New Currency Rate IOS APP 上线
- 魔兽争霸III 1.20, 1.21 1.22 需要特定语言版本之Window 解决办法
- 父亲节——女儿的礼物
- 我的测试生活感悟2 - Art Of Unit Testing