北京赛车pk10开奖

第21章 DMA—直接存储区访问—零死角玩转STM32-F429系列

2019-09-18来源: eefocus关键字:DMA  直接存储区访问  STM32-F429系列

本章参考资料:《STM32F4xx中文参考手册》DMA控制器章节。


北京赛车pk10开奖学习本章时,配合《STM32F4xx中文参考手册》DMA控制器章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容专业名称较多,内容丰富也较难理解,但非常有必要细读研究。


特别说明,本章内容是以STM32F42xxx系列资源讲解。


21。1 DMA简介

DMA(Direct Memory Access,直接存储区访问)为实现数据高速在外设寄存器与存储器之间或者存储器与存储器之间传输提供了高效的方法。之所以称之为高效,是因为DMA传输实现高速数据移动过程无需任何CPU操作控制。从硬件层次上来说,DMA控制器是独立于Cortex-M4内核的,有点类似GPIO、USART外设一般,只是DMA的功能是可以快速移动内存数据。


STM32F4xx系列的DMA功能齐全,工作模式众多,适合不同编程环境要求。STM32F4xx系列的DMA支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内SRAM、外部存储器、片内Flash等等。


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


存储区到外设传输就是把特定存储区内容转移至外设的数据寄存器中,这种多用于外设的发送通信。


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


21.2 DMA功能框图

STM32F4xx系列的DMA可以实现外设寄存器与存储器之间或者存储器与存储器之间传输三种模式,这要得益于DMA控制器是采样AHB主总线的,可以控制AHB总线矩阵来启动AHB事务。图 211为DMA控制器的框图。

图 211 DMA框图


1.    ①外设通道选择

STM32F4xx系列资源丰富,具有两个DMA控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个DMA控制器具有8个数据流,每个数据流对应8个外设请求。在实现DMA传输之前,DMA控制器会通过DMA数据流x配置寄存器DMA_SxCR(x为0~7,对应8个DMA数据流)的CHSEL[2:0]位选择对应的通道作为该数据流的目标外设。


外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。


DMA请求映射情况参考表 211和表 212。


表 211 DMA1请求映射

image.png


表 212 DMA2请求映射

image.png

北京赛车pk10开奖每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。比如SPI3_RX请求,即SPI3数据发送请求,占用DMA1的数据流0的通道0,因此当我们使用该请求时,我们需要在把DMA_S0CR寄存器的CHSEL[2:0]设置为"000",此时相同数据流的其他通道不被选择,处于不可用状态,比如此时不能使用数据流0的通道1即I2C1_RX请求等等。


查阅表 211可以发现SPI3_RX请求不仅仅在数据流0的通道0,同时数据流2的通道0也是SPI3_RX请求,实际上其他外设基本上都有两个对应数据流通道,这两个数据流通道都是可选的,这样设计是尽可能提供多个数据流同时使用情况选择。


2.    ②仲裁器

一个DMA控制器对应8个数据流,数据流包含要传输数据的源地址、目标地址、数据等等信息。如果我们需要同时使用同一个DMA控制器(DMA1或DMA2)多个外设请求时,那必然需要同时使用多个数据流,那究竟哪一个数据流具有优先传输的权利呢?这就需要仲裁器来管理判断了。


仲裁器管理数据流方法分为两个阶段。第一阶段属于软件阶段,我们在配置数据流时可以通过寄存器设定它的优先级别,具体配置DMA_SxCR寄存器PL[1:0]位,可以设置为非常高、高、中和低四个级别。第二阶段属于硬件阶段,如果两个或以上数据流软件设置优先级一样,则他们优先级取决于数据流编号,编号越低越具有优先权,比如数据流2优先级高于数据流3。


3.    ③FIFO

每个数据流都独立拥有四级32位FIFO(先进先出存储器缓冲区)。DMA传输具有FIFO模式和直接模式。


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


FIFO用于在源数据传输到目标地址之前临时存放这些数据。可以通过DMA数据流xFIFO控制寄存器DMA_SxFCR的FTH[1:0]位来控制FIFO的阈值,分别为1/4、1/2、3/4和满。如果数据存储量达到阈值级别时,FIFO内容将传输到目标中。


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


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


北京赛车pk10开奖4.    ④存储器端口、⑤外设端口

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


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


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

图 212 两个DMA控制器系统实现


5。    ⑥编程端口

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


21。3 DMA数据配置

北京赛车pk10开奖DMA工作模式多样,具有多种可能工作模式,具体可能配置见表 213。


表 213 DMA配置可能情况

image.png

1.    DMA传输模式

DMA2支持全部三种传输模式,而DMA1只有外设到存储器和存储器到外设两种模式。模式选择可以通过DMA_SxCR寄存器的DIR[1:0]位控制,进而将DMA_SxCR寄存器的EN位置1就可以使能DMA传输。


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


2.    源地址和目标地址

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寄存器作为目标地址。


3.    流控制器

流控制器主要涉及到一个控制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才有这个功能,其他外设不具备此功能。


4。    循环模式

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


通过DMA_SxCR寄存器的CIRC位可以使能循环模式。


5。    传输类型

DMA传输类型有单次(Single)传输和突发(Burst)传输。突发传输就是用非常

[1] [2] [3] [4]
关键字:DMA  直接存储区访问  STM32-F429系列 编辑:什么鱼 引用地址:http://news.2689mr.com/mcu/ic474886.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列
下一篇:第20章 USART—串口通讯—零死角玩转STM32-F429系列

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

DMAVR-L的USART串口发送与接收数据示例程序
;     主程序//*************************************************************************int main(void){  uchar i;  system_init();                             //系统初始化  usart_init();           
发表于 2019-10-15
DMA+ADC单通道转换、多通道转换
在stm32中,使用ADC时往往采用DMA传输方式,由DMA把转换的数据传输到SRAM,再进行处理。 一、单通道转换 本章节选用ADC1进行配置实验: ADC通道与GPIO对应表:  ADC结构体成员变量: typedef struct { uint32_t ADC_Mode; FunctionalState ADC_ScanConvMode; FunctionalState ADC_ContinuousConvMode; uint32_t ADC_ExternalTrigConv; uint32_t
发表于 2019-10-14
DMA+ADC单通道转换、多通道转换
stm32F4-----DMA的FIFO作用和用法
在STM32F4系列中DMA增加了个FIFO;这个FIFO的作用是什么?当我使能这个FIFO时(DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;),进仿真模式查看接收数组,他只更新16个字节(我在外边发进去20个字节);读取DMA接收数据个数寄存器显示DMA接收到了20个字节,我 第二次发送数据,接收缓冲又只更新了16个字节(包含上一次未更新的字节);当我把FIFO关闭时(DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;),我在外边不论发送多少字节都一次性更新到接收缓冲区中;这个FIFO的作用是什么?应该在何时使用
发表于 2019-10-11
MSP430程序库<十四>DMA程序库
直接存储器存取(DMADirect Memory Access)方式是用硬件实现存储器与存储器之间或存储器与IO设备之间直接进行高速数据传送,不需要CPU的干预。这种方式通常用来传送数据块。MSP430f16x系列单片机内部含有DMA模块,而且几乎内部所有外设都可以触发DMA开始存取数据。这里实现了这个模块的程序通用的函数库,方便使用。硬件介绍:MSP430F15X/16X 系列单片机具有DMA 控制器,从而能够为数据高速传输提供保证。例如,通过DMA控制器可以直接将ADC 转换存贮器的内容传到RAM 单元。MSP430系列单片机扩展的DMA具有来之所有外设的触发器,不需要CPU的干预即可提供先进的可配置的数据传输能力,从而加速
发表于 2019-10-09
MSP430程序库<十四>DMA程序库
STM32的AD用DMA方式时的请注意初始化顺序
我突然意识到我的数据好像一直没有错位,看到这个我又试验了一下,发现把DMA_Cmd(DMA1_Channel1, ENABLE);放置到哪儿都是一样的啊~~~这个是原帖部分:STM32的AD用DMA方式时的请注意初始化顺序    DMA_DeInit(DMA1_Channel1);  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_Result;  
发表于 2019-10-09
stm32F103 DMA通道
发表于 2019-10-09
stm32F103 DMA通道
小广播
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 2689mr.com, Inc. All rights reserved
北京赛车pk10计划 北京赛车pk10开奖 北京赛车pk10计划 北京赛车pk10计划 北京赛车pk10计划 北京赛车pk10计划 我赢彩票注册开户投注 天音彩票注册 北京赛车pk10开奖 北京赛车