秉火429笔记之十五 DMA--直接存储区访问

发布者:huanran最新更新时间:2019-09-12 来源: eefocus关键字:秉火  DMA  直接存储区访问 手机看文章 扫描二维码
随时随地手机看文章

1. 简介

直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传 输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可 供其它操作使用。


从硬件层次上来说,DMA控制器是独立于Cortex-M4内核的,有点类似GPIO、USART外设一般,只是DMA的功能是可以快速移动内存数据。


STM32F4xx系列的DMA支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内SRAM、外部存储器、片内Flash等等。


外设到存储器传输。比如进行ADC采集时我们可以利用DMA传输把AD转换数据转移到我们定义的存储区中,这样对于多通道采集、采样频率高、连续输出数据的AD采集是非常高效的处理方法。


存储器到存储器传输就是把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于C语言内存拷贝函数memcpy,利用DMA传输可以达到更高的传输效率,特别是DMA传输是不占用CPU的,可以节省很多CPU资源。


2. 功能

DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结 合在一起,优化了系统带宽。 


2.1 外设通道

两个DMA控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个DMA控制器具有8个数据流,每个数据流对应8个外设请求。每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。

2.2 仲裁器

简单讲,判别数据流具有优先传输的权利。


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


优先级管理分为两个阶段:


● 软件:每个数据流优先级都可以在 DMA_SxCR 寄存器中配置。分为四个级别:


— 非常高优先级


— 高优先级


— 中优先级


— 低优先级


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


2.3 FIFO

FIFO 用于在源数据传输到目标之前临时存储这些数据。


每个数据流都有一个独立的 4 字 FIFO,阈值级别可由软件配置为 1/4、1/2、3/4 或满。为了使能 FIFO 阈值级别,必须通过将 DMA_SxFCR 寄存器中的 DMDIS 位置 1 来禁止直接 模式。


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


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


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


FIFO另外一个作用使用于突发(burst)传输。

2.4 存储器端口和外设端口

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


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


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

2.5 编程接口

AHB从器件编程端口是连接至AHB2外设的。AHB2外设在使用DMA传输时需要相关控制信号


3. DMA数据配置

DMA 传输模式

DMA2支持全部三种传输模式,而DMA1只有外设到存储器和存储器到外设两种模式。


在DMA_SxCR寄存器的PSIZE[1:0]和MSIZE[1:0]位分别指定外设和存储器数据宽度大小,可以指定为字节(8位)、半字(16位)和字(32位),我们可以根据实际情况设置。直接模式要求外设和存储器数据宽度大小一样,实际上在这种模式下DMA数据流直接使用PSIZE,MSIZE不被使用。


源地址和目标地址

DMA数据流x外设地址DMA_SxPAR(x为0~7)寄存器用来指定外设地址,它是一个32位数据有效寄存器。DMA数据流x存储器0地址DMA_SxM0AR(x为0~7) 寄存器和DMA数据流x存储器1地址DMA_SxM1AR(x为0~7) 寄存器用来存放存储器地址,其中DMA_SxM1AR只用于双缓冲模式,DMA_SxM0AR和DMA_SxM1AR都是32位数据有效的。


当选择外设到存储器模式时,即设置DMA_SxCR寄存器的DIR[1:0] 位为“00”,DMA_SxPAR寄存器为外设地址,也是传输的源地址,DMA_SxM0AR寄存器为存储器地址,也是传输的目标地址。对于存储器到存储器传输模式,即设置DIR[1:0] 位为“10”时,采用与外设到存储器模式相同配置。而对于存储器到外设,即设置DIR[1:0]位为“01”时,DMA_SxM0AR寄存器作为为源地址,DMA_SxPAR寄存器作为目标地址。


流控制器

流控制器主要涉及到一个控制DMA传输停止问题。


。DMA传输在DMA_SxCR寄存器的EN位被置1后就进入准备传输状态,如果有外设请求DMA传输就可以进行数据传输。很多情况下,我们明确知道传输数据的数目,比如要传1000个或者2000个数据,这样我们就可以在传输之前设置DMA_SxNDTR寄存器为要传输数目值,DMA控制器在传输完这么多数目数据后就可以控制DMA停止传输。


DMA数据流x数据项数DMA_SxNDTR(x为0~7)寄存器用来记录当前仍需要传输数目,它是一个16位数据有效寄存器,即最大值为65535。这个值在程序设计是非常有用也是需要注意的地方。我们在编程时一般都会明确指定一个传输数量,在完成一次数目传输后DMA_SxNDTR计数值就会自减,当达到零时就说明传输完成。


如果某些情况下在传输之前我们无法确定数据的数目,那DMA就无法自动控制传输停止了,此时需要外设通过硬件通信向DMA控制器发送停止传输信号。这里有一个大前提就是外设必须是可以发出这个停止传输信号,只有SDIO才有这个功能,其他外设不具备此功能


循环模式

循环模式相对应于一次模式。一次模式就是传输一次就停止传输,下一次传输需要手动控制,而循环模式在传输一次后会自动按照相同配置重新传输,周而复始直至被控制停止或传输发生错误。


传输类型

DMA传输类型有单次(Single)传输和突发(Burst)传输。突发传输就是用非常短时间结合非常高数据信号率传输数据,相对正常传输速度,突发传输就是在传输阶段把速度瞬间提高,实现高速传输,在数据传输完成后恢复正常速度,有点类似达到数据块“秒传”效果。为达到这个效果突发传输过程要占用AHB总线,保证要求每个数据项在传输过程不被分割,这样一次性把数据全部传输完才释放AHB总线;而单次传输时必须通过AHB的总线仲裁多次控制才传输完成。


直接模式

默认情况下,DMA工作在直接模式,不使能FIFO阈值级别。


直接模式在每个外设请求都立即启动对存储器传输的单次传输。直接模式要求源地址和目标地址的数据宽度必须一致,所以只有PSIZE控制,而MSIZE值被忽略。突发传输是基于FIFO的所以直接模式不被支持。另外直接模式不能用于存储器到存储器传输(一旦配置存储器到存储器模式,则硬件自动配置为FIFO模式)。


在直接模式下,如果DMA配置为存储器到外设传输那DMA会见一个数据存放在FIFO内,如果外设启动DMA传输请求就可以马上将数据传输过去。


双缓存

设置DMA_SxCR寄存器的DBM位为1可启动双缓冲传输模式,并自动激活循环模式。双缓冲不应用与存储器到存储器的传输。双缓冲模式下,两个存储器地址指针都有效。


双缓冲模式应用在需要解码程序的地方是非常有效的。如MP3


DMA中断


达到半传输:DMA数据传输达到一半时HTIF标志位被置1,如果使能HTIE中断控制位将产生达到半传输中断;


传输完成:DMA数据传输完成时TCIF标志位被置1,如果使能TCIE中断控制位将产生传输完成中断;


传输错误:DMA访问总线发生错误或者在双缓冲模式下试图访问“受限”存储器地址寄存器时TEIF标志位被置1,如果使能TEIE中断控制位将产生传输错误中断;


FIFO错误:发生FIFO下溢或者上溢时FEIF标志位被置1,如果使能FEIE中断控制位将产生FIFO错误中断;


直接模式错误:在外设到存储器的直接模式下,因为存储器总线没得到授权,使得先前数据没有完成被传输到存储器空间上,此时DMEIF标志位被置1,如果使能DMEIE中断控制位将产生直接模式错误中断。


注: 实例见官方ADC DMA例程等


关键字:秉火  DMA  直接存储区访问 引用地址:秉火429笔记之十五 DMA--直接存储区访问

上一篇:秉火429笔记之十四 USART--串口通信
下一篇:秉火429笔记之十二 看门狗

推荐阅读最新更新时间:2024-11-08 05:30

stm32F4 串口DMA+环形缓冲的实现
下面是串口DMA+环形缓冲区的实现,将读写接口抽象出来,实现不定长度的数据收发。 关于环形缓冲区参考: http://blog.csdn.net/jieffantfyan/article/details/53572103 /****************************************************************************** * Copyright (C) 2016, roger * All rights reserved. * * 文件名称: tty.h * 摘 要:控制台驱动 * * 当前版本: 3.0 * 作 者: roger *
[单片机]
STM32串口收发数据为什么要使用DMA?有哪些常见问题?
直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。因此,大量数据拷贝时,使用DMA可以释放CPU资源。 在STM32控制器中,芯片采用Cortex-M3架构,总线结构有了很大的优化,DMA占用另外的总线,并不会与CPU的系统总线发生冲突。也就是说,DMA的使用不会影响CPU的运行速度。 DMA数据拷贝过程,典型的有:(1)内存— 内存,内存间拷贝;(2)外设— 内存,如uart、spi、i2c等总线接收数据过程;(3)内存— 外设,如uart、spi、i2c等总线发送
[单片机]
STM32串口收发数据为什么要使用<font color='red'>DMA</font>?有哪些常见问题?
STM32 DMA理解
通道配置过程 1、 在DMA_CPARx寄存器总设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是传输的源或目标 2、 在DMA_CMARx寄存器中设置数据存取器的地址,发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址 3、 在DMA_CMARx寄存器中设置要传输的数据量,在每个数据传输后,这个数值递减。 4、 在DMA_CCRx寄存器的PL位中设置通道的优先级 5、 在DMA_CCRx寄存器中设置数据传输方向、循环模式、外设和寄存器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断 6、 设置DMA_CCRx寄存器的ENABLE位,启动该通道 一旦启动了DMA通道,它即可
[单片机]
关于DMA传输外设地址的说明
ADC1外设的DMA请求通道为DMA1的通道1,见下图1所示。DMA 传输的外设地址 ADC1_DR_Address是一个自定义的宏: #define ADC1_DR_Address ((u32)0x4001244C) ADC_DR数据寄存器保存了ADC转换后的数值,以它作为 DMA 的传输源地址。它的地址是由 ADC1 外设的基地址(0x4001 2400) 加上 ADC 数据寄存器(ADC_DR)的地址偏移 (0x4c)计算得到的,其值见下图2,3所示。 0x4001244C=0x40012400+0x4c 图1(摘自STM32技术手册147页) 图2(摘自STM32技术手册28页) 图3(摘自ST
[单片机]
关于<font color='red'>DMA</font>传输外设地址的说明
STM32_ADC+DMA
ADC+DMA 下面来讲一下STM32的ADC应用。 先闲扯一点其他事情,是我自己的理解。 STM32的优点在哪里? 除去宣传环节,细细分析。 STM32时钟不算快,72MHZ, 也不能扩展大容量的RAM FLASH, 同样没有DSP那样强大的指令集。 它的优势在哪里呢? ---就在快速采集数据,快速处理上。 ARM的特点就是方便。 这个快速采集,高性能的ADC就是一个很好的体现, 12位精度,最快1uS的转换速度,通常具备2个以上独立的ADC控制器, 这意味着, STM32可以同时对多个模拟量进行快速采集, 这个特性不是一般的MCU具有的。 以上高性能的ADC,配合相对比较块的指令集和一些特色的算法支持, 就构成了STM32在电
[单片机]
stm32的DMA空闲中断数据配置
对于串口2的示例: void USART2_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(
[单片机]
基于STM32单片机ADC连续采集和DMA循环转换
描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。 程序如下: #i nclude “stm32f10x.h” //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义 #i nclude “eval.h” //头文件(包括串口、按键、LED的函数声明) #i nclude “SysTickDelay.h” #i nclude “UART_INTERFACE.h” #i nclude #define N 50 //每通道
[单片机]
STM32之ADC_2(DMA实例)
实例分析:(采用DMA模式) mian函数: extern __IO u16 ADC_ConvertedValue;//ADC转换的电压值,是在ADC1_Init()所属的文本中定义的 float ADC_ConvertedValueLocal;//用来保存转换计算后的电压值 int main(void) { USART1_Config(); //串口配置 ADC1_Init(); //使能ADC1以及配置ADC1为DMA模式 while (1) { ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的 AD 值
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved