tokenpocket官网最新版下载|dma
一文彻底理解DMA - 知乎
一文彻底理解DMA - 知乎首发于嵌入式职场切换模式写文章登录/注册一文彻底理解DMA嵌入式电子1.什么是DMA,有什么作用?DMA用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。我们用一个现实例子来做个类比。有一家冶炼公司,每天要不断的从矿场拉矿石进入厂区冶炼,以前通过公路运送的,但是这个公路除了他家的货运车以外,还有其他车,所以一般堵车严重,交通事故频发,影响工厂生产,货运成为该公司提高产能的一大瓶颈。公司思量再三,决定出资在矿场和公司间修建一条专用铁路来运矿石。虽然修建这条铁路价格昂贵,但是修好后,运送矿石的效率大大提高,公司迅速扩大产能,很快得到回报。同时原来运送矿石这条公路,也不堵车了。这条铁路的作用其实和DMA类似。本文通过STM32F4对DMA相关原理做个介绍。STM32F4共有2个 DMA 控制器,每个控制器均有8个数据流,每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。2.DMA传输过程简述DMA传输过程说起来很简单,每个DMA有2个端口:外设端口和存储器端口,通过这两个端口可以单向传输数据。DMA1外设端口通过AHB总线连接到外设,存储器端口通过AHB总线连接到存储器, DMA1传输方向有二种:从外设向存储器传输数据,从存储器向外设传输数据。DMA2外设端口通过AHB总线连接到外设以及存储器,存储器端口通过AHB总线连接到存储器。DMA2传输方向有三种:从外设向存储器传输数据,从存储器向外设传输数据,存储器向存储器传输数据。ARM Cortex-M 处理器的存储系统使用32位寻址,共有4GB地址空间。ROM、RAM、外设以及处理器内的调试支持部件的地址均映射在这4GB存储空间内。所以不论哪种传输方向,DMA数据传输的本质是将数据从4GB空间内的一个地址传输到另一个地址上。两个DMA各有1个4字(1字=4字节)大小的缓冲区(FIFO),用于数据在传输到目标之前,临时存储这些数据。缓冲区有一个可配置的阈值(可配置为1/4、1/2、3/4 或满),用来决定何时将缓冲区(FIFO)中数据发送到存储器(当从外设向存储器传输数据)或何时将存储器内的数据发送到缓冲区(FIFO)(从存储器向外设传输数据)。当从外设向存储器传输数据时,缓冲区(FIFO)内数据量达到阈值时,会将缓冲区(FIFO)数据发送到目标地址上。当从存储器向外设传输数据时,缓冲区内的数据量小于等于缓冲区(FIFO)阈值时,会使用存储器内的数据填充满FIFO。通过DMA传输数据,需要以下信息:DMA外设端口和存储器端口的数据宽度。所谓数据宽度是指从端口发送或从端口接收的数据是多少位的。我们在编写程序时,有时候有这样的需求(特别是在外设与存储器间传输数据),从一个地址将A个N位的数据传输到另一个地址,重合组合成B个M位的数据。用DMA传输数据时,通过配置其外设端口和存储器端口的数据宽度可完美解决此问题。DMA中数据宽度可配置为字节、半字(2字节)和字(4字节)。通过DMA_SxCR寄存器的 PSIZE(配置外设端口数据宽度) 和 MSIZE(配置内存端口数据宽度) 位配置。传输的数据量。所谓数据量是指具体要传输多少个数据。有两种控制传输数据量的方法:(1)连接外设并且要传输的数据数据量未知时,可通过外设发送数据传输的结束信号停止传输,但此种方法需要外设具有SDIO接口。(2) 在已知需要传输的数据量时,通过设置需要传输的数据量。要传输的数据量在使能DMA数据流之前写入DMA_SxNDTR 寄存器。在两边数据宽度不一致情况下,DMA_SxNDTR中的数据量等于外设端的数据量。每传输一次后,DMA_SxNDTR中值递减1,递减为0时,DMA停止传输。通常情况下,使用第2中方法来控制数据量。数据传输地址。所谓数据传输地址是指从什么地址发送数据,从什么地址接收数据。外设端口和存储器端口各自有自己的数据传输地址,分别通过寄存器DMA_SxPAR 和DMA_SxM0AR/ DMA_SxM1A(DMA_SxM1AR仅在双缓冲区模式下有效)来设置数据传输地址。2.1.DMA普通传输过程DMA有一个使能信号,通过使能信号来控制DMA工作,在使用DMA时,首先需要使能DMA。针对于不同的传输方向,其传输过程略有不同。从外设向存储器传输数据DMA使能后,等待外设发出DMA请求信号,DMA收到请求,数据从外设端口数据传输地址(DMA_SxPAR)存储到DMA缓冲区(FIFO)内,当缓冲区(FIFO)内数据量达到缓冲区(FIFO)阈值后,缓冲区(FIFO)内数据移出到内存端口数据传输地址(DMA_SxM0AR)指定的存储器地址中,同时每传输一个数据,DMA_SxNDTR内的值会减1,DMA_SxNDTR值递减为0,DMA传输停止。从存储器向外设传输数据DMA使能后,立即会将内存端口数据传输地址(DMA_SxM0AR)指定的数据移动到DMA缓冲区(FIFO)内,完全填满DMA缓冲区(FIFO),等待外设端口DMA请求信号,每次发生外设请求,缓冲区内的数据以外设端口宽度指定的数据量移出到外设端数据传输地址(DMA_SxPAR)指定的目标地址上,同时每传输一个数据,DMA_SxNDTR内的值会减1,DMA_SxNDTR值递减为0,DMA停止传输。当DMA缓冲区(FIFO)内数据量小于等于缓冲区阈值时,会使用存储器内的数据再次填充满FIFO。2.2.DMA指针递增传输过程DMA的外设端口和内存端口各自有一个指针递增参数,可以单独设置是否启用。如果启用了指针递增,则每传输一次,相应端口的数据传输地址递增(递增数等于相应端口地址宽度的字节数),指向下一个地址,下次DMA传输会使用这个新地址来发送或接收数据。2.3.DMA循环传输过程DMA还有一个循环模式参数用来设置是否启用循环模式。在循环模式下,当DMA_SxNDTR递减为0后,外设端口、存储器端口的数据传输地址以及DMA_SxNDTR中的值会自动加载初始值后,开始新一轮的循环传输。2.4.DMA双缓冲区传输过程DMA在循环模式下,还可以设置为双缓冲区模式。在双缓冲区模式下,存储器端口可以利用DMA_SxM0AR和 DMA_SxM1AR 2个寄存器设置两个数据传输地址。DMA可以利用两个数据传输地址交替传输数据。我们使能指针递增情况下,将两个缓冲区首地址分别装入DMA_SxM0AR和 DMA_SxM1AR,这样在一个缓冲区传输数据的时候,可以对另一个缓冲区内的数据进行处理。以上只是粗略简述整个传输过程,具体详细信息,后面具体描述。3.STM32F4 DMA的主要特性双 AHB 主总线架构,一个用于存储器访问,另一个用于外设访问。每个 DMA 控制器有 8 个数据流,每个数据流有多达8个通道(或称请求)每个数据流有单独的四级32位先进先出存储器缓冲区 (FIFO),可用于 FIFO 模式或直接模式:—— FIFO 模式下,可通过软件将阈值级别选取为 FIFO 大小的 1/4、1/2 或 3/4。当FIFO中的数据量达到FIFO阈值时,才会将FIFO中的数据送出FIFO,进入外设或储存器端口。—— 直接模式下,FIFO失去作用,不对数据进行缓存,每个 DMA 请求会立即启动对数据的传输。当在直接模式(禁止 FIFO)下将 DMA请求配置为以存储器向外设传输数据时,DMA 仅会将一个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据。通过硬件可以将每个数据流配置为:—— 支持外设到存储器、存储器到外设和存储器到存储器传输的常规通道—— 也支持在存储器方双缓冲的双缓冲区通道DMA 数据流请求之间的优先级可用软件编程(4 个级别:非常高、高、中、低),在软件优先级相同的情况下可以通过硬件决定优先级(例如,请求 0 的优先级高于请求 1)要传输的数据项的数目可以由 DMA 控制器或外设管理:—— DMA 流控制器下,要传输的数据项的数目是 1 到 65535,可用软件编程—— 外设流控制器下,要传输的数据项的数目未知并由源或目标外设控制,外设通过硬件发出传输结束的信号独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时,DMA 自动封装/解封必要的传输数据来优化带宽。这个特性仅在 FIFO 模式下可用,在直接模式下,数据宽度必须相等。对源和目标的增量或非增量寻址支持 4 个、8 个和 16 个节拍的增量突发传输。突发增量的大小可由软件配置,通常等于外设 FIFO 大小的一半每个数据流都支持循环缓冲区管理 5 个事件标志(DMA 半传输、DMA 传输完成、DMA 传输错误、DMA FIFO 错误、直接模式错误),进行逻辑或运算,从而产生每个数据流的单个中断请求4.DMA功能说明4.1.DMA框图4.2.传输端口每个DMA均有两个传输端口:存储器传输端口和外设传输端口,这两个端口间可以单向传输数据,任何一方均可作为发送方,另一方作为接收方。DMA2的外设端口还可连接存储器,实现存储器到存储器的传输。DMA_SxCR 寄存器中的 DIR[1:0]控制传输方向。源传输和目标传输在整个 4 GB 区域(地址在 0x0000 0000 和 0xFFFF FFFF 之间)都可以寻址外设和存储器。源和目标端口数据宽度可配置。通过DMA_SxCR 寄存器的 PSIZE 和 MSIZE 位可分别控制外设端口和存储器端口宽度,可配置为字节、半字(2字节)和字(4字节)。当数据宽度分别是半字或字时,写入DMA_SxPAR 或 DMA_SxM0AR/M1AR 寄存器的外设或存储器地址必须分别在字或半字地址边界对齐。例如当数据宽度为字时,写入 DMA_SxPAR 或 DMA_SxM0AR/M1AR地址必须是4的倍数。DMA_SxPAR (外设地址配置寄存器)或 DMA_SxM0AR(内存地址配置寄存器0)/ DMA_SxM1AR(内存地址寄存器1——只在双缓冲区模式下有效)用来存放外设或内存数据传输地址。DMA_SxPAR 寄存器中设置外设端口寄存器地址,外设事件发生后,数据会从此地址移动到外设端口或从外设端口移动到此地址。在 DMA_SxMA0R 寄存器(在双缓冲区模式的情况下还有 DMA_SxMA1R 寄存器)中设置存储器地址。外设事件发生后,将从此存储器读取数据或将数据写入此存储器。4.3.通道选择——DMA_SxCR 寄存器中的 CHSEL[2:0]控制每个数据流都与1个 DMA 请求相关联,此 DMA 请求可以从 8 个可能的通道请求中选出。来自外设的 8 个请求(TIM、ADC、SPI、I2C 等)独立连接到每个通道,具体的连接取决于产品实现情况。如下图,选择DMA1的数据流6的通道5,则意味着UART8_RX外设请求。如果我们需要通过TIM3_CH2通道发出DMA请求,则应选择数据流5的通道5。则在TIM2定时器中使能捕获/比较DMA请求使能(寄存器TIM2_DIER中断使能寄位CC2DE置1),则在发生输入捕获事件或者输出比较事件时,会通过DMA1数据流5通道5发出请求DMA请求。4.4.仲裁器仲裁器有两个功能:(1)为两个 AHB 主端口(存储器和外设端口)提供基于请求优先级的 8 个 DMA 数据流请求管理。(2)启动外设/存储器访问序列。优先级管理分为两个阶段:● 软件:每个数据流优先级都可以在DMA_SxCR寄存器中PL位配置。分为四个级别:非常高、高、中、低优先级● 硬件:如果两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流。例如,数据流 2 的优先级高于数据流 4。4.5.FIFO——DMA_SxFCR 寄存器DMDIS位置0启用FIFOFIFO 用于在源数据传输到目标之前临时存储这些数据。每个数据流都有一个独立的 4 字 FIFO,阈值级别可由软件配置为 1/4、1/2、3/4 或满(由DMA_SxFCR 寄存器的位 FTH[1:0]设置)。将 DMA_SxFCR 寄存器中的 DMDIS 位置 1 可禁止直接模式,使能FIFO。FIFO 的结构随源与目标数据宽度而不同。在开启FIFO时,源端口数据宽度和目的端口数据宽度可不同,FIFO会自动封装/解封数据,以匹配端口数据宽度;不开启FIFO时,源宽度和目的宽度必须相同。4.6.DMA事务DMA 事务由给定数目的数据传输序列组成。要传输的数据项的数目及其宽度(8 位、16 位或 32 位)可用软件编程。每个 DMA 传输包含三项操作:(1)通过 DMA_SxPAR (外设地址配置寄存器)或 DMA_SxM0AR(内存地址配置寄存器0)寻址,从外设数据寄存器或存储器单元中加载数据。(2) 通过 DMA_SxPAR (外设地址配置寄存器)或 DMA_SxM0AR(内存地址配置寄存器0)寻址,将加载的数据存储到外设数据寄存器或存储器单元。(3) DMA_SxNDTR 计数器在数据存储结束后递减,该计数器中包含仍需执行的事务数。DMA_SxNDTR中的事务数等于AHB外设端口上要传输的数据项的数目(传送的总字节数=DMA_SxNDTR * PSIZE定义的字节数(外设端口数据宽度))。在外设产生事件后,外设会向 DMA 控制器发送请求信号。DMA 控制器根据通道优先级处理该请求。只要 DMA 控制器访问外设,DMA 控制器就会向外设发送确认信号。外设获得 DMA 控制器的确认信号后,便会立即释放其请求。一旦外设使请求失效,DMA 控制器就会释放确认信号。如果有更多请求,外设可以启动下一个事务。4.7.传输模式(1)外设到存储器模式A.FIFO模式下使能这种模式时,每次产生外设请求,数据流都会启动数据源到 FIFO 的传输。达到 FIFO 的阈值级别时,FIFO 的内容移出并存储到目标中。B.直接模式下每完成一次从外设到 FIFO 的数据传输后,相应的数据立即就会移出并存储到目标中。如果 DMA_SxNDTR 寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR 寄存器中的 EN 位由软件清零,传输即会停止。(2)存储器到外设模式A.FIFO模式下使能这种模式时,数据流会立即启动传输,从源完全填充 FIFO。每次发生外设请求,FIFO 的内容都会按外设端口宽度移出并存储到目标中。当 FIFO 的数据量小于或等于预定义的阈值级别时,将使用存储器中的数据完全填满FIFO。B.直接模式下一旦使能了数据流,DMA 便会预装载第一个数据,将其传输到内部 FIFO。一旦外设请求数据传输,DMA 便会将预装载的值传输到配置的目标。然后,它会使用要传输的下一个数据再次重载内部空 FIFO。预装载的数据大小为 DMA_SxCR 寄存器中 PSIZE 位字段的值。(3)存储器到存储器模式该模式必须启用FIFO,不允许在循环模式和直接模式下运行。只有 DMA2 控制器能够执行存储器到存储器的传输。DMA 通道在没有外设请求触发的情况下同样可以工作。通过将 DMA_SxCR 寄存器中的使能位 (EN) 置 1 来使能数据流时,数据流会立即开始填充FIFO,直至达到阈值级别。达到阈值级别后,FIFO 的内容便会移出,并存储到目标中。如果 DMA_SxNDTR 寄存器达到零或 DMA_SxCR 寄存器中的 EN 位由软件清零,传输即会停止。4.8.指针递增通过DMA传输数据的时候,很多情况下需要传输数据序列。例如,通过SPI控制ADC来连续采集数据,采集的数据存入缓冲区内,如果我们将缓冲区首地址放入DMA_SxM0AR寄存器内,数据连续传输的时候,DMA自动递增缓冲区地址,则数据会连续的存入缓冲区内,不需要CPU干预,这就是所谓的指针递增。当然外设端口的指针也可以递增,例如我们连续访问多个外设寄存器时,就可以使用指针递增功能。DMA_SxCR 寄存器中 PINC 和 MINC 位分别控制外设和存储器指针在每次传输后是否自动向后递增。一般通过单个寄存器访问外设源或目标数据时,禁止递增模式。地址递增多少个字节是相应端口的数据宽度决定的。根据DMA_SxCR 寄存器 PSIZE 或 MSIZE 位中定义的数据宽度,下一次传输的地址将是前一次传输的地址递增 1(对于字节)、2(对于半字)或 4(对于字)。另外,对于AHB外设端口,可以不管外设端口上传输的数据的大小,将外设端口地址增量大小固定下来。DMA_SxCR 寄存器中的 PINCOS 位等于1时,地址偏移大小32 位地址(此时地址递增 4)上的数据大小对齐,PINCOS 位等于0时与外设 AHB 端口数据宽度对齐。内存端口无此功能。4.9.单次传输和突发传输所谓突发传输是指传输一个数据序列期间,为确保数据一致性, AHB 传输被会锁定,并且 AHB 总线矩阵的仲裁器不解除对 DMA 主总线的授权。整个序列是一个不可分割的整体,传输过程中不可被打断或者禁止。DMA 控制器可以产生单次传输或 4 个、8 个和 16 个节拍的增量突发传输。突发传输大小通过软件针对两个 AHB 端口独立配置,配置时使用 DMA_SxCR 寄存器中的MBURST[1:0] 和 PBURST[1:0] 位。根据单次或突发配置的情况,每个 DMA 请求在 AHB 外设端口上相应地启动不同数量的传输。●单次传输:根据 DMA_SxCR 寄存器 PSIZE[1:0] 位的值,每个 DMA 请求产生一次字节、半字或字的数据传输。●突发传输:根据 DMA_SxCR 寄存器 PBURST[1:0] 和PSIZE[1:0] 位的值,每个 DMA 请求相应地生成 4 个、8 个或 16 个节拍的字节、半字或字的传输。对于需要配置 MBURST 和 MSIZE 位的 AHB 存储器端口,必须考虑与上述相同的内容。在直接模式下,数据流只能生成单次传输,而 MBURST[1:0] 和 PBURST[1:0] 位由硬件强制配置。仅在使能指针递增模式时允许突发模式:—— 当 PINC 位为“ 0 ”时,也应将 PBURST 位清为“ 00 ”—— 当 MINC 位为“ 0 ”时,也应将 MBURST 位清为“ 00 ”指针递增通过DMA传输数据的时候,大多时候传输的数据都是多个数据。例如需要通过SPI控制ADC来连续采集数据,采集的数据4.10.循环模式所谓循环模式就是传输一组数据完成(DMA_SxNDTR中值递减为0)后,重新将端口传输地址填充为初始化时的值,DMA_SxNDTR值恢复为初始值,自动进行连续传输。如果是在非循环模式下配置数据流,传输结束后(DMA_SxNDTR中值递减为0),除非软件重新对数据流编程并重新使能数据流(通过将 DMA_SxCR 寄存器中的 EN 位置 1),否则DMA 即会停止传输(通过硬件将 DMA_SxCR 寄存器中的 EN 位清零)并且不再响应任何DMA 请求。DMA_SxCR寄存器中的 CIRC 位控制循环模式使能。在循环模式下,如果为存储器配置了突发模式,必须遵循下列规则:DMA_SxNDTR = ((Mburst 的节拍值 ) × (Msize)/(Psize)) 的倍数,即DMA_SxNDTR 值等于外设端口上要传输的数据项的数目。DMA_SxNDTR 值设计为等于外设端口数据项的数目而不是内存端口的值是因为具体外设的数据宽度是固定的,需要DMA去适配,而内存端口数据宽度可随意设置。DMA_SxNDTR还必须是外设突发大小与外设数据大小乘积的倍数,否则会导致错误的 DMA行为。4.11.双缓冲区模式使用存储器的两个存储器指针(DMA_SxM0AR和DMA_SxM1AR)可以双缓冲区方式传输数据,其好处是DMA正在对一个缓冲区操作时,应用程序可以对另一个其它缓冲区操作。通过将 DMA_SxCR 寄存器中的 DBM 位置 1,即可使能双缓冲区模式。除了有两个存储器指针之外,双缓冲区数据流的工作方式与常规单缓冲区数据流一样。使能双缓冲区模式时,将自动使能循环模式(DMA_SxCR 中的 CIRC 位的状态是“无关”),并在每次事务结束(DMA_SxNDTR中值递减为0)时交换存储器指针。在双缓冲区模式下使能数据流时,可遵循下列条件,实时更新 AHB存储器的基址( DMA_SxM0AR 或 DMA_SxM1AR ):● 当 DMA_SxCR 寄存器中的 CT 位为“ 0 ”时,可以写入 DMA_SxM1AR 寄存器。当 CT= “ 1 ”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1 ,并自动禁止数据流。● 当 DMA_SxCR 寄存器中的 CT 位为“ 1 ”时,可以写入 DMA_SxM0AR 寄存器。当 CT= “ 0 ”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1 ,并自动禁止数据流。为避免出现任何错误状态,建议在 TCIF 标志位置位时立即更改基址。因为此时根据上述两个条件之一,目标存储器依据 DMA_SxCR 寄存器中 CT 值的情况,已从存储器 0更改为存储器 1 (或从存储器 1 更改为存储器 0 )。4.12.FIFO阈值与突发配置选择FIFO 阈值(DMA_SxFCR 寄存器的位 FTH[1:0])和存储器突发大小(DMA_SxCR 寄存器的 MBURST[1:0] 位)时需要小心:FIFO 阈值指向的内容必须与整数个存储器突发传输完全匹配,也就是说实际使用的FIFO容量刚好应该是突发传输的倍数。FIFO容量至少要容纳一次突发传输的字节数。如果FIFO容量如果不是突发传输的整数倍,当使能数据流时将生成一个 FIFO 错误(DMA_HISR 或 DMA_LISR寄存器的标志 FEIFx),然后将自动禁止数据流。允许的和禁止的配置如下表所示。如果发生下列一种情况,会导致 DMA 传输结束时出现不完整的突发传输:● 对于 AHB 外设端口配置:数据项总数(在 DMA_SxNDTR 寄存器中设置)不是突发大小与数据大小乘积的倍数。● 对于 AHB 存储器端口配置:要传输到存储器的 FIFO 中的剩余数据项的数目不是突发大小与数据大小乘积的倍数。在这些情况下,即使在 DMA 数据流配置期间请求突发事务,要传输的剩余数据也将由 DMA在单独模式下管理。4.13.FIFO刷新所谓FIFO刷新就是指禁止DMA 数据流以后,仍有某些数据留存在FIFO中,则DMA控制器会将剩余的数据继续传输到目标(即使已经禁止了数据流),刷新完成后,会将 DMA_LISR 或 DMA_HISR 寄存器中的传输完成状态位 (TCIFx) 置 1指示所有数据传输完成。在这种情况下,剩余数据计数器 DMA_SxNDTR 保持的值指示在目标存储器现有多少可用数据项。在 FIFO 刷新操作期间,如果 FIFO 中要传输到存储器的剩余数据项的数目(以字节为单位)小于存储器数据宽度(例如在 MSIZE 配置为字时 FIFO 中为 2 个字节),则会使用在 DMA_SxCR 寄存器中的 MSIZE 位设置的数据宽度发送数据。这意味着将使用非预期值写入存储器。软件可以读取 DMA_SxNDTR 寄存器来确定包含良好数据的存储器区域(起始地址和最后地址)。如果 FIFO 中剩余数据项的数目小于突发大小,并且数据流通过将 DMA_SxCR 寄存器MBURST 位置 1 进行配置来管理在 AHB 存储器端口上的突发传输,则使用单次传输来完成FIFO 的刷新。4.14.DMA 传输完成以下各种事件均可以结束传输过程,并将 DMA_LISR 或 DMA_HISR 状态寄存器中的 TCIFx位置 1:● 在 DMA流控制器模式下:—— 存储器到外设模式:传输结束前禁止了数据流(通过将 DMA_SxCR 寄存器中的 EN 位清零)或者DMA_SxNDTR 计数器已达到零—— 外设到存储器模式或者存储器到存储器模式:传输结束前禁止了数据流(通过将 DMA_SxCR 寄存器中的 EN 位清零),并所有的剩余数据均已从 FIFO 刷新到存储器● 在外设流控制器模式下:—— 存储器到外设模式:已从外设生成最后的外部突发请求或单独请求或者数据流由软件禁止—— 外设到存储器模式:已从外设生成最后的外部突发请求或单独请求或者数据流由软件禁止,而剩余数据已从 FIFO 传输到存储器4.15.传输暂停数据流禁止传输后,不从停止点重新开始。这种情况下,要禁止数据流,除了将 DMA_SxCR 寄存器中的 EN 位清零外,不需要做任何其他操作。禁止数据流可能要花费一些时间(需要首先完成正在进行的传输)。需要将传输完成中断标志(DMA_LISR 或DMA_HISR 寄存器中的 TCIF)置 1 来指示传输结束。可通过DMA_SxCR 中的 EN 位的值是否是“0”,确认数据流已经终止传输。DMA_SxNDTR 寄存器包含数据流停止时剩余数据项的数目,这样软件便可以确定数据流中断前已传输了多少数据项。数据流在 DMA_SxNDTR 寄存器中要传输的剩余数据项数目达到 0 之前暂停传输,以后通过重新使能数据流重新开始传输。为了在传输停止点重新开始传输,软件必须在通过写入 DMA_SxCR 寄存器中的 EN 位(然后检查确认该位为‘0’)禁止数据流之后,首先读取 DMA_SxNDTR 寄存器来了解已经收集的数据项的数目。然后更新外设和/或存储器地址以调整地址指针,使用要传输的剩余数据项的数目(禁止数据流时读取的值)更新 SxNDTR 寄存器,重新使能数据流,从停止点重新开始传输4.16.流控制器流控制器是用来控制要传输的数据数目。其可以是DMA控制器、外设源或目标。● DMA 控制器:要传输的数据项的数目在使能 DMA 数据流之前由软件编程到 DMA_SxNDTR 寄存器。● 外设源或目标:当要传输的数据项的数目未知时属于这种情况。当所传输的是最后的数据时,外设通过硬件向 DMA 控制器发出指示。仅限能够发出传输结束信号的外设支持此功能,也就是:SDIO。在这种情况下,写入 DMA_SxNDTR 的值对 DMA 传输没有作用。实际上,不论写入什么值,一旦使能数据流,硬件即会将该值强制置为 0xFFFF。传输过程中,DMA_SxNDTR会递减,传输结束后,实际传输的数据数目 = 0xFFFF — DMA_SxNDTR。若DMA_SxNDTR 寄存器递减到0时,状态寄存器中相应数据流的 TCIFx 标志置 1 以指示强制的 DMA 传输完成。即使尚未置位最后的数据硬件信号(单独或突发),也会自动关闭数据流。已传输的数据不会丢失。这意味着即使在外设流控制模式下,DMA 在单独的事务中最多处理 65535 个数据项。在外设流控制器模式下禁止循环模式。4.17.流配置过程配置 DMA 数据流 x(其中 x 是数据流编号)时应遵守下面的顺序:如果已使能数据流,则先通过重置 DMA_SxCR 寄存器中的 EN 位将其禁止,然后读取此位以确认没有正在进行的数据流操作。将此位写为 0 不会立即生效,因为实际上只有所有当前传输都已完成时才会将其写为 0。当所读取 EN 位的值为 0 时,才表示可以配置数据流。因此在开始任何数据流配置之前,需要等待 EN 位置 0。应将先前的数据块 DMA传输中在状态寄存器(DMA_LISR 和 DMA_HISR)中置 1 的所有数据流专用的位置 0,然后才可重新使能数据流。在DMA_SxPAR 寄存器中设置外设端口寄存器地址。外设事件发生后,数据会从此地址移动到外设端口或从外设端口移动到此地址。在 DMA_SxMA0R 寄存器(在双缓冲区模式的情况下还有 DMA_SxMA1R 寄存器)中设置存储器地址。外设事件发生后,将从此存储器读取数据或将数据写入此存储器。在 DMA_SxNDTR 寄存器中配置要传输的数据项的总数。每出现一次外设事件或每出现一个节拍的突发传输,该值都会递减。使用 DMA_SxCR 寄存器中的 CHSEL[2:0] 选择 DMA 通道(请求)。如果外设用作流控制器而且支持此功能,请将 DMA_SxCR 寄存器中的 PFCTRL 位置 1。使用 DMA_SxCR 寄存器中的 PL[1:0] 位配置数据流优先级。配置 FIFO 的使用情况(使能或禁止,发送和接收阈值)。配置数据传输方向、外设和存储器增量 / 固定模式、单独或突发事务、外设和存储器数据宽度、循环模式、双缓冲区模式和传输完成一半和/或全部完成,和/或 DMA_SxCR寄存器中错误的中断。通过将 DMA_SxCR 寄存器中的 EN 位置 1 激活数据流。4.18.错误管理DMA 控制器可以检测到以下错误:● 传输错误:当发生下列情况时,传输错误中断标志 (TEIFx) 将置 1:—— DMA 读或写访问期间发生总线错误—— 软件请求在双缓冲区模式下写访问存储器地址寄存器,但是,已使能数据流,并且当前目标存储器是受写入存储器地址寄存器操作影响的存储器● FIFO 错误:如果发生下列情况,FIFO 错误中断标志 (FEIFx) 将置 1:—— 检测到 FIFO 下溢情况—— 检测到 FIFO 上溢情况(在存储器到存储器模式下由 DMA 内部管理请求和传输,所以在此模式下不检测溢出情况)—— 当 FIFO 阈值级别与存储器突发大小不兼容时使能流(请参见 表 41 :FIFO 阈值配置 )● 直接模式错误:只有当在直接模式下工作并且已将 DMA_SxCR 寄存器中的 MINC 位清零时,才能在外设到存储器模式下将直接模式错误中断标志 (DMEIFx) 置 1。当在先前数据未完全传输到存储器(因为存储器总线未得到授权)的情况下发生 DMA 请求时,该标志将置 1。在这种情况下,该标志指示有两个数据项相继传输到相同的目标地址,如果目标不能管理这种情况,会发生问题。4.19.DMA 中断一旦在 AHB 目标端口上传输了一半数据,传输一半标志 (HTIF) 便会置 1,如果传输一半中断使能位 (HTIE) 置 1,还会生成中断。传输结束时,传输完成标志 (TCIF) 便会置 1,如果传输完成中断使能位 (TCIE) 置 1,还会生成中断。可以使用单独的中断使能位以实现灵活性。在将使能控制位置‘1’前,应将相应的事件标志清零,否则会立即产生中断。定期以通俗易懂的方式分享嵌入式知识,关注公众号,加星标,每天进步一点点。发布于 2023-08-24 14:55・IP 属地湖北DMA技术赞同 162 条评论分享喜欢收藏申请转载文章被以下专栏收录嵌入式职场分享嵌入式行业动态、技能知识、职
为何今年量化私募DMA产品非常火爆? - 知乎
为何今年量化私募DMA产品非常火爆? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册量化程序化交易量化研究量化交易数量化交易者为何今年量化私募DMA产品非常火爆?我今年已经遇到很多人来咨询了解了~显示全部 关注者72被浏览211,317关注问题写回答邀请回答好问题 21 条评论分享18 个回答默认排序私募finder【私募FOF,唯一账号|VX:simufinder】 关注全文3000字,从超额环境、对冲环境、融资成本和市场情况四个方面回答一波吧,我尽可能讲的通俗易懂一些。一、DMA科普首先简单科普一下,所谓DMA,本质上就是对冲策略(中性、多空策略)加杠杆,一些人出优先资金,一些人出劣后资金:优先资金:一般券商出优先资金,券商拿固定利息,说白了,无论产品赚了还是亏了,优先方都是拿固定利息,比如4%;劣后资金:投资人/管理人自己出劣后资金,现在大家只要买DMA,肯定就是充当的劣后方。简单来说,DMA其实就是劣后方【借钱】来做对冲策略,跟借钱炒股一个道理,既然是借钱就要给人家利息。DMA的杠杆一般在2-4.5倍,可能有人会有疑问“DMA最多不是1:3,也就是4倍杠杆吗?怎么还能做到4.5倍呢?”也很简单,因为保证金可以复用,所以一般最高可以做到4.5倍。对冲策略大家应该都比较熟悉了,在之前的文章里我已经提过非常多次了。简单来说,对冲策略的收益就相当于:指增的超额alpha*0.8-对冲成本。关于中性策略的原理可以看我之前写的这篇文章,不多做赘述了。因此,想要分析今年的DMA为什么火爆,那就需要从4个方面来分析:多头端alpha、对冲成本、融资成本和市场情况。二、DMA火爆的原因1.多头端alpha今年的超额环境比较友好,Alpha相对好做,像今年500指增和1000指增的平均超额基本都在两位数,而且越偏向小票,超额越好做。今年绝大多数做DMA的产品,底层都是对标中证1000,都比较偏小票,甚至在小票、微盘股上还有2个点以上标准差的暴露。今年的Alpha好做,这是其一。2.对冲成本低对冲策略的对冲端无非就是股指期货(IC、IM、IF、IH)或者融券,大多数还是使用股指做对冲,毕竟融券属于【资源型】,很难做大。先解释一下为什么叫对冲【成本】吧。以用股指期货做对冲的中性策略为例。中性策略的多头端一般会对标某个指数,比如对标中证1000,那我多头端的目的就是要跑赢中证1000指数的涨幅,中证1000的涨幅就是beta,跑赢的部分也就是所谓的超额Alpha,比如今年中证1000指数涨了5%,但我做了15%,那我的超额alpha就是:15-5=10%。为了获得纯Alpha,那我要想办法把beta对冲掉,而IM(1000股指期货)与中证1000指数同涨同跌,毕竟二者是期货与现货的关系,到期日两者一定相等。所以为了对冲,管理人需要做空IM,而IM自带杠杆,基本20%的仓位就可以完全对冲掉多头端的beta,所以在上面那个公式里面要✖️0.8。正常来说,IM是要低于对应的股指现货,低的那部分也就是我们所说的贴水,比如现在贴水年化7%,因为等到期日IM与现货价格一致,所以IM会涨到与现货价格一致,而管理人为了对冲beta本身是做空IM,所以是要付出一定的成本。不知道大家有没有听说过“滚贴水”,其实滚贴水赚的钱,有一部分就是中性策略管理人贡献的,像前些年贴水能有两位数,仅靠吃贴水,就能轻轻松松年化10几个点。而今年的对冲环境是怎样的呢?我贴张图大家感受一下:IM的贴水情况,来源:火富牛今年对冲环境很友好,如上图所示,今年5-10月份IM的对冲成本大概就2%左右,甚至在八九月份还有短暂的升水(对冲成本为负)情况。这与前几年两位数的对冲成本相比,今年的对冲成本是相当低的了,全年综合下来也就在3%左右。大家想想,今年DMA最火爆的时期是不是基本也是在5-10月份。所以今年的对冲成本低,是其二。3.融资成本低文章开头我有提到,DMA需要优先资金,要付出【借款利息】,而这里的利息就是DMA的融资成本。今年的经济环境大家都清楚,银行利息一降再降,整个社会的融资成本也都在下降,像今年DMA的融资成本甚至都降到了3.5%,平均成本应该在4%左右。融资成本低,就使得加杠杆变得非常划算,这是其三。4.市场环境恶劣前天在朋友圈有朋友分享了一张图,很好笑也很心酸:注:侵删A股市场从去年到现在一直下跌,而且在今年各种利好政策(比如降印花税等)的刺激下,竟然还在3000点附近挣扎,并且现在也看不到市场好转的迹象,所以很多专业投资者都放弃了市场beta,转而去赚纯Alpha,而中性策略恰好就是赚纯Alpha,同时又不甘心中性策略这么低的收益,所以大都选择加杠杆,也就是DMA。另外,商品市场从去年六七月份到现在,也没啥太大的行情,所以对股市也没产生虹吸效应。这是其四。【总结】总结来说,今年DMA火爆主要有四方面的原因:第一,今年的超额环境比较友好,Alpha容易做,今年500指增和1000指增的平均超额基本都在两位数;第二,今年的对冲环境很好,虽然这两个月基差走扩,但10月份之前,对冲成本也就在2个点左右,前些年可是到过两位数;第三,券商融资成本低,今年券商提供的优先成本大概在3.5-4%左右,这就使得加杠杆变得非常划算;第四,市场beta处于下行\震荡空间状态,大家转而选择纯alpha策略。但是,站在当下时点,大家就不要再追DMA了,12月4日我刚在下面这篇文章做了提醒:没想到上周就应验了,上周DMA普遍回撤5-8%,而且还有继续回撤的风险,估计这一波要回调12-15个点左右。另外,明年的DMA未必好做,还是从上述四方面做个简析:第一,明年的超额可能不如今年好做,会有风格切换的风险,最近就在切换;第二,目前对冲成本已经来到了7个多点,而且下降趋势还未结束,平层要想再赚10个点以上的收益,超额至少要做到20以上,这是很难的;第三,券商融资成本开始有上升趋势,前段时间最低3.5%,现在大概在3.8%-4%左右。第四,beta后面会不会有机会?先打个问号。关于DMA就说这么多,希望对大家有所帮助。注:大家如果觉得有帮助,还希望帮忙点个赞(双击屏幕),点赞量才是粉丝数的三分之一,这数据太不正常了……更多文章:私募finder:怎么借私募通道发产品?关于DMA喊停、融券受限,做个反馈私募finder:买私募的【三种境界】(3000字个人思考)私募finder:为什么近两年出现了很多小而美的量化私募?关于主观多头的一些个人看法私募finder:提高融券保证金比例,对哪些私募有影响?私募finder:关于私募DMA的几个问题私募finder:中性策略最近适合配置吗?私募finder:套利策略真没你想象中的那么安全!私募finder:为什么量化策略规模大了收益就会下降?800万如何投资能确保年化6%的收益?私募finder:2023上半年私募投资总结分析(所推私募全红)。我的私募尽调笔记:私募finder:【12.01】私募尽调笔记——“公奔私”私募finder:【11.14】私募尽调笔记——5年平均年化15%的中性策略私募finder:【11.13】私募尽调笔记——百亿私募出身的PM!私募finder:【11.9】私募尽调笔记——回撤低于0.3%的卖权私募finder:【10.9】私募尽调笔记——基本面量化私募finder:【10.1】私募尽调笔记——“全天候”套利策略私募finder:【9.26】私募尽调笔记——日内卖权策略私募finder:【9.20】私募尽调笔记——今年收益近40%!私募finder:【9.12】私募尽调笔记——纯机器学习私募finder:【8.25】私募尽调笔记——今年的黑马!私募finder:【8.19】私募尽调笔记——期权策略(偏卖权)私募finder:【8.18】私募尽调笔记——量化趋势CTA(偏高频)私募finder:【8.2】私募尽调笔记——中性策略(含T0)编辑于 2023-12-12 15:02赞同 16241 条评论分享收藏喜欢收起大白量化量化QMT、PTrade(需求请留言) 关注DMA=中性*杠杆;在2023年12月份的时候,已经异常火爆,有朋友找券商问,还没有额度:影响DMA盈亏的因素有:券商融资利息成本,股指期货基差(对冲成本),量化多头端超额收益(alpha),杠杆率(一般最高4-5倍)。DMA是各家券商去年重点研究和发展的衍生品业务之一,券商在这其中赚取的是:1、融资利息;2、交易佣金。同时一些券商还提供了QMT量化交易软件,可以同时做股票+期货,做对冲非常便利。一,中性策略为什么很火?中性策略一般做法是买入指数增强的同时,卖空对应规模的股指期货。指数上涨时,指数beta收益可抵消股指期货部分的亏损;指数下跌时,股指期货收益可抵消指数beta部分的亏损。这样一来,指数端的风险被对冲,只留下了超额收益(即alpha收益)。但卖空股指期货时一般需要付出一定的成本,因此,中性策略收益=Alpha收益-对冲所花费的成本。(对冲成本有可能为正-升水,有可能为负-贴水)二,DMA业务模式:去年,市场小票风格起舞,叠加对冲成本较低,中性策略产品整体表现优越,DMA由于加杠杆也获得更为亮眼的收益。你可能不敢相信的一件事情,那就是2023年,盈利表现好的机构,竟然有券商自营盘。但是牛B到极致,还是出现了意外,在2024年1-2月份初,DMA快速崩盘,当然,根本原因是限制它开空单,对冲难度(成本)增大。很好的策略,只能偷偷做,人尽皆知了,就该撤退啦。编辑于 2024-02-20 10:11赞同 5添加评论分享收藏喜欢
DMA原理介绍 - 知乎
DMA原理介绍 - 知乎首发于嵌入式系统知识总结切换模式写文章登录/注册DMA原理介绍不撑了不撑了DMA的基本定义DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。DMA的主要特征·每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发,这些功能通过软件来配置。·在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)。·独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。·支持循环的缓冲器管理。·每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。·存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输。·闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。·可编程的数据传输数目:最大为65535(0xFFFF)。STM32F411x系列芯片DMA控制器DMA的工作框图如下图所示。DMA控制器和Cortex™-M4核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。DMA控制器传输作为AHB主设备操作直接存储器,它可以控制AHB总线的控制矩阵以启动AHB传送。它可以执行以下信息交换:•外设到内存•内存到外设•内存到内存DMA控制器提供两个AHB主端口:AHB内存端口(用于连接到内存)和AHB外设端口(用于连接到外设)。 但是,为了允许内存到内存的传输,AHB外设端口也必须可以访问内存。AHB从端口用于对DMA控制器的编程控制(仅支持32位访问)。DMA处理对于两个DMA控制器的系统实现如下图所示。DMA1控制器AHB外设端口没有像DMA2控制器那样连接到总线矩阵,所以只有DMA2能够执行内存到内存的数据传输。DMA事务由给定数量的数据传输序列组成,可以传输的数据项的数量及其宽度(8位,16位或32位)可以通过软件编程实现。每个DMA传输都包含三个操作步骤:·从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;·存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;·执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。通道选择事件发生后,外设向DMA控制器发送请求信号,DMA控制器根据通道优先级来处理请求。当DMA控制器访问外围设备时,确认信号即由DMA控制器发送到外围设备,一旦外围设备从DMA控制器收到确认信号,它就会释放其请求,当外设取消了该请求后,DMA控制器将释放确认信号。 如果外设还有更多请求,它可以启动下一轮请求操作。每个数据流流都与一个DMA请求相关,该DMA请求可以从8个可能的通道请求中选择,由DMA_SxCR寄存器中的CHSEL [2:0]位控制。来自外设(TIM,ADC,SPI,I2C等)的8个请求独立连接到每个通道如下图所示:仲裁器仲裁器根据通道请求的优先级来启动外设/存储器的访问。优先权管理分2个阶段:·软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:最高优先级、高优先级、中等优先级、低优先级;·硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。比如:如果软件优先级相同,通道2优先于通道4。 注意: 在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。DMA通道数据量每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据量是可编程的,最大达到65535(0xFFFF)。包含要传输的数据项数量的寄存器,在每次传输后递减。外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程得到。DMA传输模式数据传输源和目的地都可以寻址整个4 GB区域中的外围设备和存储器,其地址介于0x0000 0000和0xFFFF FFFF之间。传输方向使用DMA_SxCR寄存器中的DIR [1:0]位进行配置,并提供三种可能性:存储器到外围设备,外围设备到存储器或存储器到存储器的传输。外设到存储器模式使能此模式时(通过将DMA_SxCR寄存器中的EN位置1),每次发生外设请求时,数据流都会启动传输从数据源来填充到FIFO。当达到FIFO的阈值水平时,FIFO的内容被清空并存储到目标地址。当外设请求结束传输时(对于外设流控制器),或当DMA_SxNDTR寄存器达到零时或将DMA_SxNDTR寄存器中的EN位清零,则传输停止。当赢得了相应流的仲裁时,该数据流通道才可以访问AHB源或目标端口,使用DMA_SxCR寄存器中的PL [1:0]位,为每个数据流通道的优先级进行仲裁。存储器到外设模式使能该模式时(通过将DMA_SxCR寄存器中的EN位置1),该数据流通道立即启动传输,以完全填充FIFO。每次发生外设请求时,FIFO的内容都会被清空并存储到目的地。当FIFO未满时,会从内存中重新加载数据。当外设请求结束传输时(对于外设流控制器),或者当DMA_SxNDTR寄存器达到零时或将DMA_SxNDTR寄存器中的EN位清零,则传输停止。当赢得了相应流的仲裁时,该数据流通道才可以访问AHB源或目标端口,使用DMA_SxCR寄存器中的PL [1:0]位,为每个数据流通道的优先级进行仲裁。存储器到存储器模式配置同上。存储器到存储器模式不能与循环模式同时使用。循环模式循环模式可用于处理循环缓冲区和连续数据流(例如ADC扫描模式)。 可以使用DMA_SxCR寄存器中的CIRC位来启用此功能。使能循环模式后,将在数据流通道配置阶段使用初始值自动装载要传输的数据,并且DMA请求将继续。中断每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。对于每个DMA数据流通道,可以在以下事件上产生中断:•达到半转移•转移完成•传输错误•FIFO错误(溢出,欠载或FIFO内存错误)•直接模式错误使用STM32CubeMX配置UART的DMA使能,得到以下初始化代码:/* USART2 DMA Init */
/* USART2_RX Init */
hdma_usart2_rx.Instance = DMA1_Stream5;
hdma_usart2_rx.Init.Channel = DMA_CHANNEL_4;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
/* USART2_TX Init */
hdma_usart2_tx.Instance = DMA1_Stream6;
hdma_usart2_tx.Init.Channel = DMA_CHANNEL_4;
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_usart2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);下面是配置DMA通道x的普遍过程(x代表通道号):·在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标;·在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址;·在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减;·在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级;·在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断;·设置DMA_CCRx寄存器的ENABLE位,启动该通道。一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。当传输一半的数据后,半传输标志(HTIF)被置1,当设置了允许半传输中断位(HTIE)时,将产生一个中断请求。在数据传输结束后,传输完成标志(TCIF)被置1,当设置了允许传输完成中断位(TCIE)时,将产生一个中断请求。编辑于 2020-05-06 21:11嵌入式系统嵌入式开发STM32赞同 27913 条评论分享喜欢收藏申请转载文章被以下专栏收录嵌入式系统知识总结嵌入式/处理器架构/C&C++编程嵌入式那些事分享嵌入式开发和自动化的经验与心得材料表征仪器介绍专业基
关于私募DMA的几个问题 - 知乎
关于私募DMA的几个问题 - 知乎首发于投资科普切换模式写文章登录/注册关于私募DMA的几个问题私募finder【私募FOF,唯一账号|VX:simufinder】经过最近一年多的熊市洗礼后,越来越多的人开始追求“稳稳的幸福”,但其中有不少人又不甘心于每年七八个点的“微薄”收益(尽管回撤也低),于是想去寻找“低风险、高收益”的策略。于是DMA模式便进入大家的视野,很多人搞不懂什么是DMA,通俗来说,DMA就是加了杠杆的中性策略。举个例子,假设A有1000万,买了一个传统的中性产品,费后年化10%,回撤5%,那么年到手大概100万;但是A想赚的更多一些,想加杠杆,比如想加3倍杠杆,私募管理人为了满足A的要求,于是便找到券商B“借钱”,谈妥后A出1000万,B出3000万,总共4000万让私募管理人来管理,券商B拿一个固定利息,之后投资人再跟管理人分收益。“懂的人“在宣传DMA的时候很聪明,会让投资人听下来产生一种DMA具有“中性产品的安全性+高杠杆的高收益性”,换句话说DMA是一种“低风险、高收益”的策略;再加上今年发行DMA的私募运气都非常不错,基本都发行在今年三四月份,然后五六月份刚好有一波利于中性策略的行情,所以很多DMA产品都获得了极高的收益,年化大几十、年化过百的DMA产品有很多,而且回撤也非常低,也就一两个点。如此高的收益回撤比,再加上当下屎一般的行情,一下子就把DMA点爆了,我只是在下面这篇文章中提了一下DMA,就有几十个人来咨询我,实话说我之前也让朋友买过DMA,但转了一波钱后很快就让他们减仓了,不是因为不看好DMA,而是在投资领域,经常会出现“大热必死”的现象,越热的策略或产品越容易“死”,这就是大家常说的“盈亏同源”。这不很快就迎来了中性策略难受的行情,七八月份利好政策频出,股指贴水收敛甚至转为升水,中性策略的空头端大亏,另外,权重股猛拉,分化严重,多头端也非常难做,两头打脸导致中性产品都产生了一定的回撤,DMA自然也不会好到哪里去。我估计绝大多数想投DMA的投资人可能都不知道DMA是什么,只有很少一部分的人能理解到我上面说的那个例子的层面,但这还远远不够。关于DMA,我以问答的形式再补充几点,这也是大家问我的一些问题,这样方便大家理解。1.DMA模式是不是只有大私募才能做?答:不是,只要有做中性策略(广义上的中性,期货或期权对冲都可以),能过券商风控即可,5亿以内的私募也有很多家在做DMA,而且换手越高的越容易过券商风控,毕竟换手越高、券商赚的手续费就越多。2.DMA模式下,私募规模会不会增长的很快?答:不会,虽然DMA模式比较容易推广,而且做的每一笔金额都很大,但DMA不能算作私募规模,这也是很多私募有能力做但又不愿意做DMA的原因之一,另外一个不愿意做的重要原因是,下单必须通过券商才能下。3.DMA模式下,风险和收益是不是等比例放大了?答:很多人选择DMA,就是觉得DMA是加杠杆,虽然回撤放大了,但收益也等比例扩大了,但真的是这样吗?如果你也这样想的话,我猜你应该是没有仔细计算过。我给大家简单计算一下:就按一般的情况来说,中性产品一般收费“1+20%”,但DMA模式下可能是“1+30%到40%”,我还见过“1+45%”的,券商固定利息4%,以1000万,3倍杠杆,中性产品年化10%、回撤5%,为例:(1)传统中性产品收益:1000*10%=100万管理费:1000*1%=10万业绩报酬:100*20%=20万投资人到手:100-10-20=70万需要承担的最大回撤:5%(2)DMA模式(按照1+30%计提)收益:4000*10%=400万管理费:4000*1%=40万(券商那部分的管理费会在价内扣除,所以不会显示出来)券商利息:3000*4%=120万业绩报酬:(400-120)*30%=84万投资人到手:400-40-120-84=156万需要承担的最大回撤:15%收益是原来的156/70=2.23倍,需要承担的回撤提高3倍。抛开策略本身不谈,只计算这个收益回撤放大的倍数,大家心里应该也清楚。4.都说DMA属于稀缺资源,真的是这样吗?答:具体要看底层策略,如果底层策略收益回撤比高、偏自营不对外的话,那可能相对稀缺一些(不过这种策略不太可能会到普通投资者的手里),除此以外并不稀缺,如果这玩意儿真的稀缺,也不太可能卖那么长时间。5.普通人如何购买DMA类产品?答:直接联系私募,只要他们有DMA并且对外的话,走直销就可以了。6.DMA到底值不值得投?答:这个问题很难回答,具体要看你的风险承受能力以及你对底层策略的了解程度,如果你的风险承担能力高并且对DMA的底层策略很熟悉的话,那可以投,否则不如自己买买指增类(包括空气指增)产品来的实在。我一直觉得无论什么策略,只要你能了解底层逻辑、能够把握住风险点,都是可以投的,哪怕是垃圾债也可以投,毕竟很难赚到认知以外的钱,即便是赚到了,心里也不会踏实。关于DMA就先说这么多吧,评论区交流。更多文章:私募finder:套利策略真没你想象中的那么安全!私募finder:为什么量化策略规模大了收益就会下降?800万如何投资能确保年化6%的收益?私募finder:2023上半年私募投资总结分析(所推私募全红)。编辑于 2024-02-29 09:12・IP 属地上海阳光私募对冲基金金融市场赞同 7536 条评论分享喜欢收藏申请转载文章被以下专栏收录投资科普股票、期货、期权等各类衍生品
【STM32】 DMA原理,步骤超细详解,一文看懂DMA-CSDN博客
>【STM32】 DMA原理,步骤超细详解,一文看懂DMA-CSDN博客
【STM32】 DMA原理,步骤超细详解,一文看懂DMA
最新推荐文章于 2023-12-25 09:33:17 发布
Z小旋
最新推荐文章于 2023-12-25 09:33:17 发布
阅读量10w+
收藏
5.6k
点赞数
1.7k
分类专栏:
【STM32】
【通信协议】
文章标签:
DMA
STM32DMA
DMA原理
DMA详解
DMA配置
博客为博主原创,转载请评论说明并注明出处,谢谢
本文链接:https://blog.csdn.net/as480133937/article/details/104927922
版权
【STM32】
同时被 2 个专栏收录
48 篇文章
4622 订阅
订阅专栏
【通信协议】
14 篇文章
183 订阅
订阅专栏
如需转载请注明地址:https://blog.csdn.net/as480133937/article/details/104927922
DMA的基本介绍
什么是DMA (DMA的基本定义)
DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,
CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?
因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理, DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作–计算、控制等。
DMA定义:
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
外设到内存内存到外设内存到内存外设到外设
DMA传输参数
我们知道,数据传输,首先需要的是1 数据的源地址 2 数据传输位置的目标地址 ,3 传递数据多少的数据传输量 ,4 进行多少次传输的传输模式 DMA所需要的核心参数,便是这四个
当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。 也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。
DMA的主要特征
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置;
在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;支持循环的缓冲器管理;每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;可编程的数据传输数目:最大为65535。
STM32少个DMA资源?
对于大容量的STM32芯片有2个DMA控制器 两个DMA控制器,DMA1有7个通道,DMA2有5个通道。 每个通道都可以配置一些外设的地址。
①DMA1 controller
从外设(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])产生的7个DMA请求,通过逻辑或输入到DMA1控制器 其中每个通道都对应着具体的外设: ② DMA2 controller
从外设(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,其中每个通道都对应着具体的外设:
这些在下方系统框图中也可以清晰地看到
DMA工作系统框图
上方的框图,我们可以看到STM32内核,存储器,外设及DMA的连接,这些硬件最终通过各种各样的线连接到总线矩阵中,硬件结构之间的数据转移都经过总线矩阵的协调,使各个外设和谐的使用总线来传输数据。 我们对他来进行一点一点的分析:
下面看有与没有DMA的情况下,ADC采集的数据是怎样存放到SRAM中的?
没有DMA
1.如果没有DMA,CPU传输数据还要以内核作为中转站,比如要将ADC采集的数据转移到到SRAM中,这个过程是这样的:
内核通过DCode经过总线矩阵协调,从获取AHB存储的外设ADC采集的数据, 然后内核再通过DCode经过总线矩阵协调把数据存放到内存SRAM中。
有DMA传输
有DMA的话,
DMA传输时外设对DMA控制器发出请求。DMA控制器收到请求,触发DMA工作。DMA控制器从AHB外设获取ADC采集的数据,存储到DMA通道中DMA控制器的DMA总线与总线矩阵协调,使用AHB把外设ADC采集的数据经由DMA通道存放到SRAM中,这个数据的传输过程中,完全不需要内核的参与,也就是不需要CPU的参与,
我们把上面的步骤专业一点介绍:
在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。DMA传输结束,如果有更多的请求时,外设可以启动下一个周期。
总之,每次DMA传送由3个操作组成:
从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。
DMA传输方式
方法1:DMA_Mode_Normal,正常模式,
当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次 方法2:DMA_Mode_Circular ,循环传输模式
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式
仲裁器
仲裁器的作用是确定各个DMA传输的优先级
仲裁器根据通道请求的优先级来启动外设/存储器的访问。
优先权管理分2个阶段:
软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:
最高优先级高优先级中等优先级低优先级;
硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。比如:如果软件优先级相同,通道2优先于通道4。
注意: 在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。
DMA数据流(仅存在于STM32F4 /M4 内核上)
在设置了DMA的通道之后,还要选择通道对应外设的数据流
8 个 DMA 控制器数据流都能够提供源和目标之间的单向传输链路。每个数据流配置后都可以执行: ● 常规类型事务:存储器到外设、外设到存储器或存储器到存储器的传输。 ● 双缓冲区类型事务:使用存储器的两个存储器指针的双缓冲区传输(当 DMA 正在进行自/至缓冲区的读/写操作时,应用程序可以进行至/自其它缓冲区的写/读操作)。要传输的数据量(多达 65535)可以编程,并与连接到外设 AHB 端口的外设(请求 DMA 传输)的源宽度相关。每个事务完成后,包含要传输的数据项总量的寄存器都会递减。
DMA_SxCR 寄存器控制数据流到底使用哪一个通道,每个数据流有 8 个通道可 供选择,每次只能选择其中一个通道进行 DMA 传输。接下来,我们看看 DMA2 的各数据流通 道映射表,如表 28.1.1 所示:
DMA 传输通道
每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据 量是可编程的,大达到65535。包含要传输的数据项数量的寄存器,在每次传输后递减。
可编程的数据量: 外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程。
指针递增模式
根据 DMA_SxCR 寄存器中 PINC 和 MINC 位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值
通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。
如果使能了递增模式,则根据在 DMA_SxCR 寄存器 PSIZE 或 MSIZE 位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增 1个数据宽度、2个数据宽度或 4个数据宽度。
存储器到存储器模式
DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。
当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时,DMA传输结束。存储器到存储器模式不能与循环模式同时使用。
这里要注意仅 DMA2 的外设接口可以访问存储器,所以仅 DMA2 控制器支持存储器到存储器的传输,DMA1 不支持。
存储器到存储器模式不能与循环模式同时使用。
DMA中断
每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。
使没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx位,即数据流 x 的 DMA 传输完成与否标志。
可编程的数据传输宽度、对齐方式和数据大小端 当PSIZE和MSIZE不相同时,DMA模块按照下图进行数据对齐。
注意:在大容量产品中, DMA2 通道 4 和 DMA2 通道 5 的中断被映射在同一个中断向量上。在互联型产品 中, DMA2 通道 4 和 DMA2 通道 5 的中断分别有独立的中断向量。所有其他的 DMA 通道都有自己的 中断向量
DMA的内存占用
在STM32控制器中,芯片采用Cortex-MX架构,总线结构有了很大的优化,DMA占用另外的地址总线,并不会与CPU的系统总线发生冲突。也就是说,DMA的使用不会影响CPU的运行速度
但是要注意: DMA 控制器和Cortex-M3核共享系统数据总线执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求可能会停止 CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。
DMA配置部分
此部分我们分为DMA寄存器和DMA库函数分别介绍:
DMA寄存器
DMA配置参数包括:通道地址、优先级、数据传输方向、存储器/外设数据宽度、存储器/外设地址是否增量、循环模式、数据传输量。
DMA中断状态寄存器(DMA_ISR)
我们如果开启了 DMA_ISR 中这些中断,在达到条件后就会跳到中断服务函数里面去,即使 没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx, 即通道 DMA 传输完成与否的标志。
注意此寄存器为只读寄存器,所以在这些位被置位之后,只 能通过其他的操作来清除。
DMA中断标志清除寄存器(DMA_IFCR)
DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 0 清除。在 DMA_ISR 被置位后, 我们必须通过向该位寄存器对应的位写入 0 来清除。
DMA通道x配置寄存器(DMA_CCRx)
该寄存器控制着 DMA 的很多相关 信息,包括数据宽度、外设及存储器的宽度、通道优先级、增量模式、传输方向、中断允许、 使能等都是通过该寄存器来设置的。所以 DMA_CCRx 是 DMA 传输的核心控制寄存器
DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)
这个寄存器控制 DMA 通道 x 的每次 传输所要传输的数据量。其设置范围为 0~65535。并且该寄存器的值会随着传输的进行而减少, 当该寄存器的值为 0 的时候就代表此次数据传输已经全部发送完成了。所以可以通过这个寄存 器的值来知道当前 DMA 传输的进度
DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)
该寄存器用来存储 STM32 外设的地 址,比如我们使用串口 1,那么该寄存器必须写入 0x40013804(其实就是&USART1_DR)。如果使 用其他外设,就修改成相应外设的地址就行了。
DMA通道x配置寄存器(DMA_CMARx)
,该寄存器和 DMA_CPARx 差不多, 但是是用来放存储器的地址的。比如我们使用 SendBuf[5200]数组来做存储器,那么我们在 DMA_CMARx 中写入&SendBuff 就可以了。
DMA寄存器配置流程
通道配置过程 下面是配置DMA通道x的过程(x代表通道号):
在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将 是数据传输的源或目标。在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数 据将从这个地址读出或写入这个地址。在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外 设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。设置DMA_CCRx寄存器的ENABLE位,启动该通道。
一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。 当传输一半的数据后,半传输标志(HTIF)被置1,当设置了允许半传输中断位(HTIE)时,将产生 一个中断请求。在数据传输结束后,传输完成标志(TCIF)被置1,当设置了允许传输完成中断位 (TCIE)时,将产生一个中断请求。
DMA库函数
1.DMA初始化函数
DMA_DeInit(DMAX_ChannelX);
功能:将DMAyChannelx寄存器的初始化为其默认值
注释:RCC_ResetCmd中对DMA无定义,因此采用的直接操纵DMA寄存器的方式
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct)
功能:设置要开启的通道,还有一些参数,包括外设基地址,存储器基地址,传输的数据量,增量模式,数据宽度等。
具体看下方结构体代码介绍:
typedef struct {
uint32_t DMA_PeripheralBaseAddr;
/*设置DMA源地址*/
uint32_t DMA_MemoryBaseAddr;
/*设置DMA目的地址*/
uint32_t DMA_DIR;
/* 设置数据传输方向,决定是从外设读取数据到内存还送从内存读取数 据发送到外设,也就是外设是源地还是目的地
*/
uint32_t DMA_BufferSize;
/*设置传输大小*/
uint32_t DMA_PeripheralInc;
/*设置ReceiveBuff地址是否自增*/
uint32_t DMA_MemoryInc;
/*设置传输数据时候内存地址是否递,需要开启*/
uint32_t DMA_PeripheralDataSize;
/*外设的数据长度是为字节传输(8bits),半 字传输(16bits) 还是字传输(32bits) */
uint32_t DMA_MemoryDataSize;
/*设置内存的数据长度*/
uint32_t DMA_Mode;
/*设置DMA的模式,正常模式/循环模式 是否循环发送*/
uint32_t DMA_Priority;
/*设置 DMA 通道的优先级,有低,中,高,超高四种模式*/
uint32_t DMA_M2M;
/*设置是否是存储器到存储器模式传输,*/ }
DMA_InitTypeDef;
2.DMA使能函数
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
功能:使能或者失能DMA外设
例如:DMA_Cmd(DMA1_Channel1 , ENABLE); 3.DMA中断使能函数
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);
功能:配置指定的DMAy通道x的中断
注释:DMA_IT_TC:传输完成 DMA_IT_HT:传输一半 DMA_IT_TE:传输错误
例如:DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);
4.设置CNDTRx和读CNDTRx函数 (通道传输数据量)
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
作用:前者设置DMA通道的传输数据量(DMA处于关闭状态);后者获取当前DMA通道传输剩余数据量(DMA处于开启状态)。
DMA库函数配置过程:
使能DMA时钟:RCC_AHBPeriphClockCmd();初始化DMA通道:DMA_Init();
//设置通道;传输地址;传输方向;传输数据的数目;传输数据宽度;传输模式;优先级;是否开启存储器到存储器。 使能外设DMA;
以串口为例:使能串口DMA发送,串口DMA使能函数。调用函数:USART_DMACmd(); 使能DMA通道传输;函数:DMA_Cmd();查询DMA传输状态。函数:DMA_GetFlagStatus();获取当前剩余数据量大小 函数: DMA_GetCurrDataCounter(DMA1_Channel4);
UART DMA传输
DMA就是一个搬运工,可以将数据从一个位置搬运到另一个位置。 以UART为例,如果要接收数据,会触发UART中断,然后CPU介入,在中断中通过CPU将UART输入寄存器的值读出来,存放到内存中; 而DMA方式,产生UART中断后,DMA直接参与,把UART输入寄存器的值搬运到内存中,CPU只需要在去检查内存的值就好了,这样提高了CPU的效率。
DMA代码配置
① DMA初始化配置
void dma_init()
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
/*DMA配置*/
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;//串口数据寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff; //内存地址(要传输的变量的指针)
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //方向(从内存到外设)
DMA_InitStructure.DMA_BufferSize = 500; //传输内容的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_Byte ; //外设数据单位
DMA_InitStructure.DMA_MemoryDataSize =
DMA_MemoryDataSize_Byte ; //内存数据单位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; //DMA模式:一次传输,循环
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium ; //优先级:高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止内存到内存的传输
DMA_Init(DMA1_Channel4, &DMA_InitStructure); //配置DMA1的4通道
DMA_Cmd(DMA1_Channel4,ENABLE);
DMA_SetCurrDataCounter(DMA_CH4,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//配置DMA发送完成后产生中断
}
DMA中断
void DMA1_Channel4_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
{
DMA_ClearFlag(DMA1_FLAG_TC4);
}
}
main函数
#define SEND_BUF_SIZE 500 //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.
u8 SendBuff[SEND_BUF_SIZE]; //发送数据缓冲区
const u8 TEXT_TO_SEND[]={"STM32F1 DMA 串口实验"};
uint16_t i;
int main(void)
{
uart_init(115200); //串口初始化为115200
for(i=0;i<500;i++)
{
SendBuff[i] =0xaf;
}
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //使能串口dma传输
while(1);
=
}
优惠劵
Z小旋
关注
关注
1764
点赞
踩
5689
收藏
觉得还不错?
一键收藏
打赏
知道了
65
评论
【STM32】 DMA原理,步骤超细详解,一文看懂DMA
DMA的基本介绍什么是DMA (DMA的基本定义)DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的...
复制链接
扫一扫
专栏目录
Stm32Dma_stm32_stm32DMA_dma_
10-04
学习STM32的基础例程,对初学者很有帮助,主要是对DMA的基本操作
STM32 TIM+DMA输出PWM工程源码
11-30
DMA+TIM方式输出PWM,无需CPU干预,
测试采用的是STM32F103C8T6 测试发现定时器的DMA通道与官方资料不符
成功实现DMA到TIM 的PWM输出
65 条评论
您还未登录,请先
登录
后发表或查看评论
STM32】 DMA原理,步骤超细详解,一文看懂DMA
modi000的博客
03-19
4792
如需转载请注明地址:https://blog.csdn.net/as480133937/article/details/104927922
DMA的基本介绍
什么是DMA (DMA的基本定义)
DMA,全称Direct Memory Access,即直接存储器访问。
DM...
对STM32 DMA突发传输的理解
最新发布
changzehai的博客
12-25
475
STM32 DMA 突发传输的理解
STM32 DMA使用详解
08-11
DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。
stm32学习
sdkdslx的博客
08-27
523
波特率:每秒传送的位数
DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始...
DMA之理解
热门推荐
zhejfl的博客
09-12
14万+
1、DMA由来
DMA(Direct Memory Access,直接存储器访问)。在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。CPU是通过系统总线与其他部件连接并进行数据传输。
1.1程序传送方式
程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式和查询(条件传送方式)两种。
1.1.1无条件传送方式
微机系统中的一些简单的...
DMA简介
羞羞滴小朋友
03-15
1万+
为什么要有 DMA 技术?
dma主要是用于读写数据用的
在没有 DMA 技术前,I/O 的过程是这样的:
CPU 发出对应的指令给磁盘控制器,然后返回;
磁盘控制器收到指令后,于是就开始准备数据,会把数据放入到磁盘控制器的内部缓冲区中,然后产生一个中断;
CPU 收到中断信号后,停下手头的工作,接着把磁盘控制器的缓冲区的数据一次一个字节地读进自己的寄存器,然后再把寄存器里的数据写入到内存,而在数据传输的期间 CPU 是无法执行其他任务的。
可以看到,整个数据的传输过程,都要需要 CPU 亲自.
DMA的解读
2301_76143875的博客
01-01
3317
直接存储器访问(Direct Memory Access),简称DMA。前述的对I/O设备的数据搬运操作,无论是轮询方式还是中断方式,都需要CPU读写参与其中,在要进行大量数据传输时,CPU的利用效率将大大降低;DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。
stm32---DMA
weixin_53762042的博客
05-20
1万+
DMA:全称Direct Memory Access(直接存储器访问),把一个地址空间的值“复制”到另一个地址空间,使用DMA传输方式无需CPU直接控制传输,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。
作用:为CPU减负。
硬件方面,STM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道,DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求(由硬件决定),附图DMA各通道限定可处理请求:
还有一个“仲裁器”来协调
STM32使用SPI+DMA(标准库)
m0_67530207的博客
10-07
1万+
因为DMA_Mode_Normal模式使用一次后DMA_BufferSize会清零,如下代码用于重置DMA_BufferSize。注意:DMA_PeripheralBaseAddr不是SPI外设的地址,而是SPI1->DR即SPI数据寄存器的地址。既然使用的是SPI+DMA,必定要使能SPI,详细请参考。配置完SPI后,配置DMA,如下。
DMA介绍、原理、工作模式
weixin_48943109的博客
08-26
2863
DMA,全称Direct Memory Access,直接存储器访问。DMA将数据从一个内存地址复制到另一个内存地址的操作,当然不仅仅局限于内存到内存,也可以外设和内存之间相互访问。那么DMA进行数据的搬移和普通通信方式(IIC、SPI)想比区别在哪,普通通信方式IIC或者SPI或多或少的到需要CPU的参与,CPU控制收发、读写,而DMA在进行数据传输的时候不需要CPU参与,因此大大降低了CPU的工作量。
STM32 DMA串口不定长数据收发+FreeRTOS操作系统 参考代码
08-08
使用CubeMX封装的FreeRTOS操作...如果是从我的文章来的,可以直接看stm32f1xx_it.c文件,所有的DMA处理逻辑基本就写在这个文件里面啦~ 因为中文注释会在CubeMX每一次代码初始化的时候被搞乱,所以只能用英文注释了 qaq
STM32_DMA.rar_stm32 dma
09-23
该文件是基于STM32的DMA代码,里面的编程思想可以学习学习
STM32-DMA.zip_stm32 dma
09-19
stm32关于DMA数据的传输程序,程序实现功能正常,可以直接下载使用
STM32+RS485+DMA+modbus协议
01-29
STM32F103zet6芯片 进行modbus协议代码的编写 使用DMA进行数据发送和接收 主机读取多个从机的n个寄存器数据 主机向从机的1个寄存器中写入数据
DMA.zip_stm32 dma_stm32视频
09-24
学习视频,讲述stm32的DMA用法,手把手5分钟学会
DMA.rar_stm32 dma_stm32 的DMA
09-21
STM32的DMA代码需要的可以下载!!
STM32_DMA-.rar_stm32 dma_stm32 dma
09-23
STM32_DMA 程序生成C语言程序,STM32FXX开发适用
(1条消息) stm32】 dma原理,步骤超细详解,一文看懂dma_stm32 dma 工作流程_modi00
09-16
DMA(Direct Memory Access,直接内存访问)是一种计算机系统中用于实现高速数据传输的技术。在STM32中,DMA被广泛应用于外设与内存之间的数据传输,可以大大提高系统的效率。下面对DMA的原理和工作流程进行详细解析。
DMA的原理是通过将CPU的主存访问请求拦截下来,直接从外设(如UART、SPI、ADC等)读取或写入数据到内存,或者从内存读取数据写入外设,从而避免了CPU的参与。这样,CPU可以同时进行其他运算任务,而不需要等待数据传输的完成。
DMA的工作流程主要分为配置、启动和中断处理三个步骤。
首先,需要进行DMA的配置。配置包括选择DMA通道、外设和内存的地址、数据宽度、传输方向、传输模式等参数。可以使用STM32提供的DMA控制器进行配置,通过设置相应的寄存器来完成。
接着,启动DMA传输。启动传输的方式可以是软件触发或硬件触发。软件触发是通过设置DMA控制器的相关位来启动传输。硬件触发是通过外设的中断或事件信号触发DMA传输。一旦传输启动,DMA将依据配置的参数进行数据传输。
最后,当DMA传输完成时,会触发相关的中断处理函数,去执行一些必要的操作,如数据处理、状态更新等。可以通过检查DMA相关寄存器的标志位来确定传输是否完成,并进行相应的处理。
总结起来,DMA技术可以在不占用CPU的情况下实现高速数据传输。通过配置、启动和中断处理等步骤,DMA可以灵活地控制外设和内存之间的数据传输,提高系统的效率和性能。在STM32中,DMA是实现高速数据传输的重要技术之一。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
Z小旋
CSDN认证博客专家
CSDN认证企业博客
码龄5年
暂无认证
125
原创
480
周排名
890
总排名
645万+
访问
等级
5万+
积分
7万+
粉丝
3万+
获赞
3214
评论
12万+
收藏
私信
关注
热门文章
PWM原理 PWM频率与占空比详解
321277
【STM32】HAL库 STM32CubeMX系列学习教程
293620
【STM32】STM32 CubeMx使用教程一--安装教程
266288
【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解
252778
【常用传感器】DS18B20温度传感器原理详解及例程代码
238896
分类专栏
【通信协议】
14篇
【FPGA】
2篇
Modbus
2篇
【STM32】
48篇
【传感器专栏】
7篇
LCD12864
2篇
【嵌入式学习】
15篇
【硬件电路设计】
2篇
Altium designer
4篇
【语言学习】
c语言学习
15篇
Shell
4篇
JAVA
2篇
Python学习
8篇
SQL server
2篇
【图像处理】
6篇
Hexo
1篇
数字电子技术
2篇
NXP智能车学习
5篇
Arduino
2篇
MATLAB
1篇
日常随记
6篇
环境搭建
2篇
最新评论
【STM32】 定时器---正交解码编码器模式详解
Cruel_summer.:
我咋进不了中断函数?
【STM32】STM32 CubeMx使用教程一--安装教程
無荏知晓:
用手机给电脑开热点,然后电脑PC端去更新试试
【常用传感器】DS18B20温度传感器原理详解及例程代码
Agleareyou:
简直就是我的恩人
AT24C02 E2PROM芯片详解
Memory_2003:
清晰明了
【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())
weixin_49735992:
指针方式的有个疑惑的地方:
“*p1++;
*p2++;”
这两个取值运算应该是没必要的;
因为*(取值运算)和++的优先级是一样的,且结合性是从右向左,所以结果没有问题;
但是习惯性的思考是从左向右,也就是先取值,再++。
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
【ZYNQ】AXI4总线接口协议学习
【FPGA】zynq 单端口RAM 双端口RAM 读写冲突 写写冲突
【STM32存储器映射-寄存器基地址-偏移】
2023年3篇
2022年24篇
2021年16篇
2020年31篇
2019年51篇
2018年1篇
目录
目录
分类专栏
【通信协议】
14篇
【FPGA】
2篇
Modbus
2篇
【STM32】
48篇
【传感器专栏】
7篇
LCD12864
2篇
【嵌入式学习】
15篇
【硬件电路设计】
2篇
Altium designer
4篇
【语言学习】
c语言学习
15篇
Shell
4篇
JAVA
2篇
Python学习
8篇
SQL server
2篇
【图像处理】
6篇
Hexo
1篇
数字电子技术
2篇
NXP智能车学习
5篇
Arduino
2篇
MATLAB
1篇
日常随记
6篇
环境搭建
2篇
目录
评论 65
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
Z小旋
你的鼓励将是我创作的最大动力
¥1
¥2
¥4
¥6
¥10
¥20
扫码支付:¥1
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
直接内存访问_百度百科
访问_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心直接内存访问播报讨论上传视频计算机术语收藏查看我的收藏0有用+10本词条由《中国科技信息》杂志社 参与编辑并审核,经科普中国·科学百科认证 。直接内存访问(DMA,Direct Memory Access)是一些计算机总线架构提供的功能,它能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。中文名直接内存访问外文名Direct Memory Access缩 写DMA领 域计算机目录1简介2原理3缓存一致性问题4DMA引擎5RDMA简介播报编辑通常会指定一个内存部分用于直接内存访问。在ISA总线标准中,高达16兆字节的内存可用于DMA。EISA和微通道架构标准允许访问全套内存地址(假设他们可以用32位寻址)。外围设备互连通过使用一个总线主控器来完成直接内存访问。直接内存访问的另一个选择是程控输入输出(PIO)接口。在程控输入输出接口中,设备之间所有的数据传输都要通过处理器。ATA/IDE接口的新协议是Ultra DMA,它提供的突发数据传输速率可达33兆字节每秒。具有Ultra DMA/33的硬盘驱动器也支持PIO模式1、3、4和多字DMA模式2(每秒16.6兆字节)。 [1]原理播报编辑外设与存储器之间以及存储器与存储器之间的数据传输,通常采用程序中断方式、程序查询方式和DMA控制方式。程序中断方式和程序查询方式都需要CPU发出输入/输出(In/Out,I/O)的指令,然后等待I/O设备完成操作之后返回,期间CPU需要等待I/O设备完成操作。DMA在传输存储器和I/O设备的数据时,无须CPU来控制数据的传输,直接通过DMA控制器(direct memory access controller,DMAC)完成外设与存储器之间以及存储器与存储器之间的数据高速传输。 [3]DMA传输原理一个完整的DMA传输包括DMA请求、DMA响应、DMA传输和DMA结束4个步骤。DMA传输原理如图1所示,图中I/O设备为源端设备,由I/O设备向目的端设备(存储器)传输数据,其DMA的基本传输过程如下:①CPU对总线控制器进行初始化,制定工作内存空间,读取DMAC中的寄存器信息,了解DMAC的传输状态[1];②I/O设备向DMAC发送DMA请求(DMA request,DREQ),DMAC收到此信号后,向CPU发出总线保持信号(HOLD); ③CPU当前总线周期执行结束后发出总线响应信号保持确认(hold acknowledgment,HLDA); ④DMAC收到总线授权后,向I/O设备发送DMA响应信号DMA确认(DMA acknowledgment,DACK),表示允许I/O设备进行DMA传送;⑤开始传输时,DMAC首先从源地址读取数据并存入内部缓存中,再写入目的地址,完成总线数据从源地址到目的地址的传输[1];⑥DMA传输完成后,DMAC向CPU发出结束信号,释放总线,使CPU重新获得总线控制权。一次DMA传输只需要执行一个DMA周期,相当于一个总线读/写周期,因而能够满足外设数据高速传输的需要。 [3]DMA是所有现代电脑的重要特色,它允许不同速度的硬件设备来沟通,而不需要依于中央处理器的大量中断负载。否则,中央处理器需要从来源把每一片段的数据复制到寄存器,然后把它们再次写回到新的地方。在这个时间中,中央处理器对于其他的工作来说就无法使用。DMA传输常使用在将一个内存区从一个设备复制到另外一个。当中央处理器初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存去。像是这样的操作并没有让处理器工作拖延,使其可以被重新调度去处理其他的工作。DMA传输对于高性能嵌入式系统算法和网络是很重要的。 举个例子,个人电脑的ISADMA控制器拥有8个DMA通道,其中的7个通道是可以让计算机的中央处理器所利用。每一个DMA通道有一个16位地址寄存器和一个16位计数寄存器。要初始化数据传输时,设备驱动程序一起设置DMA通道的地址和计数寄存器,以及数据传输的方向,读取或写入。然后指示DMA硬件开始这个传输动作。当传输结束的时候,设备就会以中断的方式通知中央处理器。"分散-收集"(Scatter-gather)DMA允许在一次单一的DMA处理中传输数据到多个内存区域。相当于把多个简单的DMA要求串在一起。同样,这样做的目的是要减轻中央处理器的多次输出输入中断和数据复制任务。 DRQ意为DMA要求;DACK意为DMA确认。这些符号一般在有DMA功能的电脑系统硬件概要上可以看到。它们表示了介于中央处理器和DMA控制器之间的电子信号传输线路。 [1]缓存一致性问题播报编辑DMA会导致缓存一致性问题。想像中央处理器带有缓存与外部内存的情况,DMA的运作则是去访问外部内存,当中央处理器访问外部内存某个地址的时候,暂时先将新的值写入缓存中,但并未将外部内存的数据更新,若在缓存中的数据尚未更新到外部内存前发生了DMA,则DMA过程将会读取到未更新的数据。相同的,如果外部设备写入新的值到外部内存内,则中央处理器若访问缓存时则会访问到尚未更新的数据。这些问题可以用两种方法来解决:1.缓存同调系统(Cache-coherent system):以硬件方法来完成,当外部设备写入内存时以一个信号来通知缓存控制器某内存地址的值已经过期或是应该更新数据。2.非同调系统(Non-coherent system):以软件方法来完成,操作系统必须确认缓存读取时,DMA程序已经开始或是禁止DMA发生。第二种的方法会造成DMA的系统负担。 [2]DMA引擎播报编辑除了与硬件交互相关外,DMA也可为昂贵的内存耗费减负。比如大型的拷贝行为或scatter-gather操作,从中央处理器到专用的DMA引擎。Intel的高端服务器包含这种引擎,它被称为I/O加速技术(IOAT)。 [2]RDMA播报编辑在电脑运算领域,远程直接内存访问(英语:remote direct memory access,RDMA)是一种直接存储器访问技术,它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高通量、低延迟的网络通信,尤其适合在大规模并行计算机集群中使用。RDMA支持零复制网络传输,通过使网络适配器直接在应用程序内存间传输数据,不再需要在应用程序内存与操作系统缓冲区之间复制数据。这种传输不需要中央处理器、CPU缓存或上下文交换参与,并且传输可与其他系统操作并行。当应用程序执行RDMA读取或写入请求时,应用程序数据直接传输到网络,从而减少延迟并实现快速的消息传输。但是,这种策略也表现出目标节点不会收到请求完成的通知(单向通信)等相关的若干问题。 [2]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000DMA三种方式以及DMA特点_dma方式-CSDN博客
>DMA三种方式以及DMA特点_dma方式-CSDN博客
DMA三种方式以及DMA特点
拾牙慧者
已于 2022-07-03 21:55:48 修改
阅读量3.8w
收藏
114
点赞数
21
分类专栏:
操作系统原理
文章标签:
接口
嵌入式
cpu
于 2021-01-10 22:58:55 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42604176/article/details/112447972
版权
操作系统原理
专栏收录该内容
15 篇文章
13 订阅
订阅专栏
博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。
DMA三种方式:数据块传送方式、周期挪用方式、交替访存方式
数据块传送方式:在I/O接口电路中设置一个比较大的数据缓冲区,一般能存放一个数据块,I/O接口电路与内存之间的数据交换以数据块为单位。总线仲裁器判定究竟是DMA控制器还是CPU能获得总线的使用权。
周期挪用方式:当I/O接口没有DMA请求时,CPU按程序要求访问内存;一旦I/P接口有DMA请求,则I/O接口挪用一个或几个周期。缺点是:数据输入或庶出过程中实际占用了CPU时间。
交替访存方式:CPU与DMA控制器交替访问内存。不需要总线使用权的申请、建立和归还过程。 效率高,但实现起来有困难,基本上不被使用。
DMA方式特点: 1、内存既可以被CPU访问也可以被DMA控制器访问,CPU和DMA控制器会竞争总线的使用权,因而需要仲裁机制 2、外部设备与内存之间的整个数据交换过程全部在DMA控制器的控制下完成,CPU能够与外部设备并行工作,大大提高了效率 3、在DMA方式开始之前CPU要对DMA控制器进行初始化,在DMA方式结束之后,CPU要申请中断,对内存缓冲区进行后处理。 I/O接口电路DMA传送方式:
优惠劵
拾牙慧者
关注
关注
21
点赞
踩
114
收藏
觉得还不错?
一键收藏
打赏
知道了
0
评论
DMA三种方式以及DMA特点
DMA三种方式:数据块传送方式、周期挪用方式、交替访存方式数据块传送方式:在I/O接口电路中设置一个比较大的数据缓冲区,一般能存放一个数据块,I/O接口电路与内存之间的数据交换以数据块为单位。总线仲裁器判定究竟是DMA控制器还是CPU能获得总线的使用权。周期挪用方式:当I/O接口没有DMA请求时,CPU按程序要求访问内存;一旦I/P接口有DMA请求,则I/O接口挪用一个或几个周期。缺点是:数据输入或庶出过程中实际占用了CPU时间。交替访存方式:CPU与DMA控制器交替访问内存。不需要总线使用权的申请、
复制链接
扫一扫
专栏目录
STM32-DMA-详细讲解
10-16
主要讲解STM32 DMA controller的特点,架构,性能 和用法,还有示例用法
DMA介绍、原理、工作模式
weixin_48943109的博客
08-26
2863
DMA,全称Direct Memory Access,直接存储器访问。DMA将数据从一个内存地址复制到另一个内存地址的操作,当然不仅仅局限于内存到内存,也可以外设和内存之间相互访问。那么DMA进行数据的搬移和普通通信方式(IIC、SPI)想比区别在哪,普通通信方式IIC或者SPI或多或少的到需要CPU的参与,CPU控制收发、读写,而DMA在进行数据传输的时候不需要CPU参与,因此大大降低了CPU的工作量。
参与评论
您还未登录,请先
登录
后发表或查看评论
DMA的三种传输方式,你GET到了吗?
weixin_55796564的博客
03-02
7893
以下文章来源于:公_众_号开源电子网
读取更多技术文章,请扫码关注
关注公众号,后台回复:DMA
(免费领取项目文件)
DMA的三种传输方式,你GET到了吗?
前言
DMA,详称“Direct Memory access”,直接寄存器访问,被亲切的称为“数据搬运工”。DMA的传输是不需要CPU去控制的,CPU只需要对DMA进行配置即可。所以,在进行大量数据传输的时候,我们首先想到的是能不能用DMA帮我们完成数据传输工作,CPU就可以去干别的事情。
DMA传输简单来说,就是要确定三要素:源地址(从哪里提
对STM32 DMA突发传输的理解
最新发布
changzehai的博客
12-25
475
STM32 DMA 突发传输的理解
视频采集中DMA控制的流横式接口设计
11-11
摘要 研究一种基于片上可编程系统(SoPC)技术的视频数据传输方案。该方案自定制了一个四口SDRAM控制器,并将其中的两口设计成符合流模式传输规范的接口,作为一个SoPC外设挂在AValon总线上,方便重复使用。另外,采用DMA控制以流传输模式进行数据搬运,不仅可解放CPU,而且速度快、控制灵活,解决了视频处理中数据路径的优化问题。
引 言
随着计算机技术、多媒体技术以及通信技术的发展,数字视频技术得到了越来越广泛的应用。在数字视频技术的研究中,视频数据传输是一个技术关键。本文针对视频数据流数据量大、实时性要求高的特点,采用流模式传输,将视频采集数据通过DMA从存储资源紧张的片内缓
EDMA-API.rar_DMA api functions_edma_edna_ti dma a
09-20
关于DSP的EDNA使用寄存器和相关API函数的总结资料,EDMA是在DMA上发展起来的一种传输方式,它拥有DMA传输的全部特性,除了具有DMA后台操作(即不占用CPU的时钟),高吞吐率等特点外,EDMA比DMA通道的功能
更加强大
DMA传送方式
11-13
DMA传送方式有3种:单元传送方式、块传送方式和on-the-fly传送方式。与外部DMA请求/应答协议不同的是,DMA传送方式定义了每次传送读/写的单元数,如表所示。
表 DMA传送方式
(1)单元传送方式
单元传送方式意味着每个DMA请求对应一对DMA读/写周期,即1个单元读,然后1个单元写。
(2)块传送方式
块传送方式意味着在连续4个字的DMA写周期前有连续的4个字的DMA读周期,即4个字突发读,然后4个字突发写,因此传输的数据个数应该是16字节的倍数。
如果传送大小或者DMA计数值不是16的倍数,则DMA将不能完整地传送完数据。假设要传送的数据
DMA方式
Cold_Meteor的博客
08-26
1169
本文简要介绍了DMA方式的三种交换数据方法,DMA的工作过程,DMA接口的功能和组成,以及DMA接口的类型。
计算机组成原理笔记——DMA方式
热门推荐
qq_43839907的博客
06-13
1万+
DMA的特点
DMA和程序中断方式的数据通路
DMA与主存交换数据的三种工作方式
1、停止CPU访问主存
CPU放弃了对总线的控制权,放弃了对主存的访问。
控制简单
CPU处于不工作状态或保持状态,未充分发挥CPU对主存的利用率
2、周期挪用(周期窃取)
...
直接存储器存取(DMA)有哪3种工作方式?
进阶的小宋
02-28
1762
学习
散列DMA设计的高速串口驱动技术
07-28
详细地介绍了DMA数据传输的特点,提出了一套完整的基于散列DMA的工业级高速串口驱动设计方案,并利用该方案在SPEAR300处理器平台上设计了可在12Mbps下稳定工作的高速串口。该方案极少产生中断,大大提高了数据传输的效率。通过与西门子S7系列PLC进行的通信测试,证实了该方案的有效性和可靠性。
基于单片机系统采用DMA块传输方式实现高速数据采集
02-03
摘要:介绍一种基于单片机系统设计的DMA硬件电路,以字块传输方式与高速A/D接口。结合在数字式磁通表设计中的应用给出其硬件软件设计方案实例。 PC机中外设与内存储器之间数据直接传输的DMA功能以其高效、高速、CPU资源占用少等特点已被广泛应用,这一功能通过安装在主板上的专用DMA控制器芯片或集成在外围控制芯片来实现。单片机的应用领域也常常需要有高速数据传输或数据采集,虽然近些年单片机速度有所提高,仍然无法应付类似单脉冲信号捕获、周期信号频谱分析等需要采用高速A/D的场合。对于速率在100ksps以上的数据采集或传输一般的中断查询法就不易实现,因此考虑通过直接存储存取操作才能完成。然而单片
DMA如何实现中断处理
12-09
该资源是ppt文档,内容主要分为5个部分:
DMA传送的特点
DMA传送的过程
DMA传送的方式
DMA控制器
DMA传送的应用
实时图像处理系统的DMA控制器设计
01-19
摘要:在分析传统DMA控制器结构的基础上,针对实时图象处理系统的数据传输要求,提出了多端口模块设计、增加RoundRobin通道优先级仲裁算法和优化数据传输通道等优化方法,以提高数据传输速度,并改进了地址产生模式来满足图像算法的要求。 数字图像处理是嵌入式系统为广泛的应用之一。目前,数字图像处理技术无论在科学研究、工业生产或管理部门中都得到越来越多的应用。而目标跟踪、机器人导航、自动驾驶、交通监视等应用也极大地促进了实时图像处理技术的发展。 数字图像处理的特点是数据量大、运算复杂、实时性强。通常,数据量往往大于片内的存储容量,对于片内存储资源有限的处理系统来说,一般需要借用外部存储空间。为
STM32 SPI DMA 的使用
08-03
一是想总结一下SPI总线的特点与注意点,二是总结一下SPI DMA的使用。
【DSP复习主要知识点】(大概)
hanhan的博客
01-06
6818
1、数字系统对比模拟系统
数字化的优点:
1.高度的程控能力与灵活性
2、更高的精度
3、可靠性与可重复性得到了改善
4、大规模集成
5、接口方便
6、灵活性好
7、保密性好
8、特殊应用(只有数字能做):信息无失真压缩、线性相位滤波器、软件无线电技术
模拟与数字各有所长:
1、实时性
模拟:除了电路引入的延时外,处理是实时的
数字:取决于处理器的速度
2、高频信号的处理
模拟:可以处理包括微波毫米波乃至光波信号
数字:按照奈奎斯特准则的要求,受S/H、A/D 和处理速度的限制
3、模拟与数字信号转换
【嵌入式系统】STM32配置FreeRTOS以及利用多线程完成流水灯、按键、蜂鸣器、数码管工作
hanhan的博客
10-30
5892
1、利用STM32CubeMX配置FreeRTOS
2、利用线程完成流水灯、按键、蜂鸣器工作
3、关于FreeRTOS的注意事项
注意点:
1、每个任务函数中都要有延时delay
2、osdelay使当前任务挂起,当延时结束,又唤醒当前任务,相当于释放了cpu。
而HALdelay在延时中还是会占用cpu资源的。
3、时间戳可以在不使用delay的情况下得到当前时间
4、os函数都需要在任务函数中调用
...
试比较常用的三种DMA传送方式各自的特点
06-07
常用的三种DMA传送方式分别是单向DMA、双向DMA和循环DMA。
1. 单向DMA:单向DMA是指数据只能在一个方向上进行传送,一般用于从外设读取数据或将数据写入外设。单向DMA传输的速度快,但不能进行双向数据传输。
2. 双向DMA:双向DMA是指数据可以在两个方向上进行传送,既可以从外设读取数据,也可以将数据写入外设。双向DMA传输的速度比单向DMA慢,但具有双向数据传输的优点。
3. 循环DMA:循环DMA是指在DMA传输过程中,传输完成后会自动重新开始传输,循环传输一定的数据量。循环DMA可以在传输过程中不需要CPU干预,自动完成多次数据传输,并且可以节约CPU的时间。
总之,三种DMA传送方式各有特点,需要根据具体的应用场景选择适合的传输方式。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
拾牙慧者
CSDN认证博客专家
CSDN认证企业博客
码龄6年
腾讯
561
原创
3万+
周排名
4881
总排名
124万+
访问
等级
1万+
积分
3155
粉丝
2107
获赞
537
评论
8809
收藏
私信
关注
热门文章
Error: Flash Download failed - Target DLL has been cancelled
47441
微机原理——指令系统——算数运算指令(ADD、ADC、SUB、SBB、INC、DEC、NEG、CMP、MUL、IMUL、DIV、IDIV、CBW、CWD、BCD调整)
46724
DMA三种方式以及DMA特点
38306
智能车复工日记【3】:图像处理——基本扫线和基本特征提取和十字补线
36223
数学建模:层次分析法实例以及代码
31938
分类专栏
电子设计竞赛
付费
4篇
智能车
付费
15篇
库函数
1篇
开源源码探究
MySQL源码分析
13篇
postgresql源码分析
4篇
webrtc源码探究
开发笔记
2篇
分布式与软件架构
25篇
C++linux后台开发入门
19篇
并发/行、多线/进程、IPC
27篇
网络编程
12篇
后端应用设计
5篇
代码重构与设计
9篇
音视频方向
11篇
linux & Git
16篇
编译原理 & cmake
8篇
前后端开发功能代码库
24篇
BugFix
3篇
环境配置
11篇
操作系统原理
15篇
中间件设计与使用
ETCD
4篇
MQ
4篇
Redis使用与设计原理
7篇
MySQL
48篇
新型数据库技术
3篇
语言学习
C++ 挖坑与填坑
102篇
C++内存管理
13篇
python
22篇
语言的细节
5篇
杂感
2篇
经典数据结构与算法
17篇
算法:二分思想
6篇
算法:位运算
1篇
算法:贪心
8篇
栈与队列
5篇
算法:哈希表
9篇
算法:回溯法
15篇
算法:DP
14篇
算法:双指针
10篇
算法:二叉树基础
23篇
算法:滑动窗口
6篇
图像处理原理
17篇
opencv基操与实战
29篇
数学分析
31篇
通信原理
3篇
微机原理
10篇
数字信号处理
4篇
面经
9篇
leetcode刷题笔记
83篇
最新评论
(1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的证明过程
quaer:
其实很简单 上面提取e的-j*5/2w 下面提取 e的-j*1/2w
答案自然就出来了
【电设控制与图像训练题】【激光打靶】【openmv测试代码以及效果】
织梦兽:
这个环的距离10.20.30.40是直接给的?不应该摄像头算出来吗
Opencv——findContours函数再探(由轮廓联想连通域)
HX3054505842:
你好,如何才能选择正确的图像格式和通道组合呢?有这方面的资料参考吗?
详细讲解设计跳表的三个步骤(查找、插入、删除)
一个逗比居然能:
启发很大,感谢博主!
【DSP复习主要知识点】(大概)
陈跃光:
博主,您好。请问一下,有相关书籍推荐吗?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
C++简单实现布隆过滤器
CMPXCHG和lwarx (LL)/stwcx (SC)
【C++】RVO、NRVO优化以及返回值优化失效的场景
2023年62篇
2022年86篇
2021年200篇
2020年236篇
目录
目录
分类专栏
电子设计竞赛
付费
4篇
智能车
付费
15篇
库函数
1篇
开源源码探究
MySQL源码分析
13篇
postgresql源码分析
4篇
webrtc源码探究
开发笔记
2篇
分布式与软件架构
25篇
C++linux后台开发入门
19篇
并发/行、多线/进程、IPC
27篇
网络编程
12篇
后端应用设计
5篇
代码重构与设计
9篇
音视频方向
11篇
linux & Git
16篇
编译原理 & cmake
8篇
前后端开发功能代码库
24篇
BugFix
3篇
环境配置
11篇
操作系统原理
15篇
中间件设计与使用
ETCD
4篇
MQ
4篇
Redis使用与设计原理
7篇
MySQL
48篇
新型数据库技术
3篇
语言学习
C++ 挖坑与填坑
102篇
C++内存管理
13篇
python
22篇
语言的细节
5篇
杂感
2篇
经典数据结构与算法
17篇
算法:二分思想
6篇
算法:位运算
1篇
算法:贪心
8篇
栈与队列
5篇
算法:哈希表
9篇
算法:回溯法
15篇
算法:DP
14篇
算法:双指针
10篇
算法:二叉树基础
23篇
算法:滑动窗口
6篇
图像处理原理
17篇
opencv基操与实战
29篇
数学分析
31篇
通信原理
3篇
微机原理
10篇
数字信号处理
4篇
面经
9篇
leetcode刷题笔记
83篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
拾牙慧者
欢迎请作者喝奶茶
¥1
¥2
¥4
¥6
¥10
¥20
扫码支付:¥1
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)_cpu dma-CSDN博客
>【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)_cpu dma-CSDN博客
【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)
仲夏夜之梦~
已于 2023-08-08 16:27:34 修改
阅读量3.2k
收藏
17
点赞数
2
分类专栏:
嵌入式
文章标签:
linux
运维
服务器
于 2023-08-04 21:18:12 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/challenglistic/article/details/132109276
版权
嵌入式
专栏收录该内容
25 篇文章
16 订阅
订阅专栏
DMA(Direct Memory Access),字面意思“直接访问内存”,无需 CPU 干预直接读写内存。传统CPU读写数据时,需要先将要使用的数据保存到 RAM,等要用时再从RAM 加载。
目录
一、传统CPU存取数据
二、认识DMA
1、什么是DMA
2、DMA 的工作模式、数据传输方式、寻址模式
3、为什么要使用DMA
三、DMA 数据传输
1、准备阶段
2、传输请求
3、数据传送
4、善后处理
一、传统CPU存取数据
CPU 不直接存取外设的原因:
CPU 的工作速度和外设的工作速度差距太大外设格式种类繁多,无法直接存取,需要经过转换
基于上述原因,CPU 不能直接从外设获取或者向外设写入内容。传统CPU 获取数据的步骤如下:
1、CPU 将外设数据加载到内存(和CPU的处理速度最接近)
2、CPU 检查 cache 是否有自己需要的数据(是否命中)
3、如果命中,直接返回数据;如未命中,继续从内存获取(这里暂时不考虑MMU)
4、返回数据
二、认识DMA
由上面CPU 读取数据来看,无论是将外设数据搬移到内存,还是从内存读取数据,都需要CPU 的参与。为了让 CPU 能够专注于处理手中事务,DMA 将负责数据的搬移工作。
1、什么是DMA
DMA(Direct Memory Access)即直接存储器访问,借助内部的控制器来实现内存和外设之间的数据传输。有了DMA,CPU 可以专注于内存数据的存取;数据的搬运过程完全可以交由DMA硬件完成。有了DMA以后,不代表完全不需要CPU了,只是不会像中断那样频繁向CPU发送请求。
开始传输时刻:DMA向CPU申请至少一个总线周期的占用时间来做数据传输工作结束传输时刻:DMA向CPU发送中断请求,请求CPU处理这些数据
2、DMA 的工作模式、数据传输方式、寻址模式
工作模式:直接模式、FIFO 模式。
① 直接模式
DMA 直接进行从源地址到目的地址的数据传输。
② FIFO 模式
FIFO模式下,可以将要传输的多个数据(或字节)累计存储在FIFO缓冲器中,然后在FIFO缓冲器中设置存储阈值,当到达阈值时,FIFO会自动把所有存储的数据一次性的发送到目标地址。
数据传输方式:单字传送、块传送
① 单字传送(单次模式)
DMA 请求获得批准后,CPU 让出一个总线周期用于字或字节的传送。结束后, DMA 控制器归还总线控制权,CPU 再重新判断下一个总线周期的总线控制权是 CPU 保留,还是继续响应一次新的 DMA 请求。这种方式称为单字传送方式,又称为周期挪用或周期窃取。
② 块传送(突发模式)
DMA 请求获得批准后,DMA 控制器掌管总线控制权,连续占用若干个总线周期,进行成组连续的批量传送,直到批量传送结束,才将总线的控制权交还给 CPU。这种方式称为成组连续传送方式
寻址模式:增量寻址、非增量寻址
① 增量寻址:发送完数据后,继续发送下一个地址的数据,配合突发传输模式
② 非增量寻址: 一发送完数据后,如果想要继续发送数据,需要更具软件配置的发送下一个数据的地址,再进行数据的传输
3、为什么要使用DMA
第一,可以把比较固定的任务让DMA来做,可以减轻CPU负担,提高系统的效率
第二,DMA具有一般CPU没有的高效操作,能够提高系统的吞吐率(IO 效率)
三、DMA 数据传输
1、准备阶段
CPU 会对 DMA 控制器和 IO 接口进行初始化,初始化的内容如下:
① DMA 控制器初始化
配置 DMA 内存缓冲区的首地址(即告诉DMA把数据放到哪)配置 DMA 传输方向(是向外设传数据,还是从外设读数据)配置 DMA 交换量(设置数据传输的上限)
② 接口的初始化
I/O 设备的寻址信息
2、传输请求
① 设备接口 => DMA 控制器
设备接口向DMA控制器发送 “ DMA请求 ” ,即请求使用 DMA 进行数据传输
② DMA 控制器 => CPU
DMA 控制器向CPU申请 “ 总线占用 ”,DMA控制器和 CPU 只能有一个占用总线
③ CPU => DMA 控制器
CPU 批准使用总线,此时CPU会让出一个或者多个总线周期用于数据传输。在DMA数据传输期间,CPU 停止访问内存,无法执行需要占用总线的指令。
④ DMA 控制器 => 设备接口
DMA 批准设备请求,此时 DMA控制器将掌握总线控制权。如果是单字节传送,一个总线周期后,DMA归还总线控制权;如果是块传送,连续占用若干个总线周期后,DMA才会归还总线控制权。
3、数据传送
数据传送期间,DMA 控制器会向总线发送读/写命令、向 I/O 接口发响应信号。真正的数据交互是内存和设备接口,DMA 控制器只是负责控制整个数据传送流程。
4、善后处理
在初始化时,CPU 便指定了DMA的交换量,而且DMA 控制器内部有一个计数器,只有 DMA 控制器知道传送是否结束。当传送结束时,DMA控制器向CPU发送一个传输完成的中断,CPU重新接管总线的控制权。
注意:DMA 控制器并非只有在传输完成时才会发送中断,其实传输过半、传输错误也可以发送中断
参考文章:
DMA基本工作原理总结概述(一)——DMA系统架构_dma工作原理_摆渡沧桑的博客-CSDN博客
DJ9-3 DMA 方式_dma会占用总线吗_狂放不羁霸的博客-CSDN博客
优惠劵
仲夏夜之梦~
关注
关注
2
点赞
踩
17
收藏
觉得还不错?
一键收藏
知道了
0
评论
【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)
【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)
复制链接
扫一扫
专栏目录
STM32之DMA.doc
12-16
DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。
DMA配合串口1数据收发(不定长).zip
08-28
DMA:直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。配置串口IDLE中断,通过监测总线空闲状态,实现数据接收。寄存器方式实现
参与评论
您还未登录,请先
登录
后发表或查看评论
DMA简单理解和分享
u010715044的博客
11-23
2573
直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。因此,大量数据拷贝时,使用DMA可以释放CPU资源。
单片机与DSP中的Blackfin533的DMA技术及其在图像处理中的应用
12-10
摘要:介绍了Blackfin533中DMA的类型及特点,描述了DMA在实时图像处理领域数据传输中的重要应用,给出了两个具体的应用实例,最后指出了使用Blackfin533的DMA时应注意的事项。
关键词:Blackfin533;DMA;实时图像处理;数据传输
直接存储器存取(Direct Memory Access,简称DMA对计算机系统是非常重要的。它可以使CPU在运行指令的同时从外部存储器或设备中存取数据,也可以在CPU不参与的情况下,由专用的DMA控制器存取数据。 1 Blackfin533中的DMA
Blackfin系列DSP产品包括ADSP-BF535和ADSP-B
单片机与DSP中的ADSP2116中DMA的应用
12-10
摘要:直接内存存取(DMA)是DSP芯片中用于快速数据交换的重要技术,文中对AD公司的浮点系列芯片ADSP2116x中DMA的应用方法作了详细介绍,同时重点介绍了链式DMA的操作方法,给出了一些实际应用中的例子。
关键词:DMA 链式DMA 浮点系列芯片 ADSP2116x
1 DMA概述
直接内存存取(DMA)是计算机系统提高运行效率的一项重要技术。它可以在CPU运行指令的同时,使系统从外部存储器或设备中存取数据也可以在核心处理器不参与的情况下由专用的DMA设备存取数据。
对于DSP芯片来讲,DMA的作用尤为重要。众所周知,DSP芯片主要面向实时信号处理其核心运算部件具
DMA原理,步骤超细详解,一文看懂DMA
李肖遥的专栏
10-11
6425
关注、星标公众号,直达精彩内容素材来源:csdn整理:技术让梦想更伟大|李肖遥 DMA的基本介绍 什么是DMA (DMA的基本定义)DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就...
DMA与CPU之间的切换
jonky999的博客
04-11
1099
一个设备接口试图通过总线直接向另一个设备发送数据时,会先向CPU发送dma请求信号,即向CPU提出接管总线控制权的总线请求。cpu收到该信号,在当前的总线周期结束后,会按DMA信号的优先级和提出DMA请求的先后顺序进行响应。CPU对某个设备接口响应DMA请求时,会让出总线控制权。于是在DMA控制器的管理下,外设和存储器直接进行数据交换,不需要CPU干预。数据传送完毕后,设备接口会向CPU发送DMA结束信号,交换给CPU总线的控制权。在传统的CPU存取数据时,会先将数据放到缓存寄存器中然后再写入到指定位置。
DMA是一个超级简化版的cpu吗?
vincent3678的博客
07-12
271
是的,复杂一点的soc里,master很多的,还比如JPEG模块,会主动读取YUV或JPG图片,经过压缩或解压后再主动写到ram里,也是初始化的时候CPU给他配置一下,后面JPEG模块就自己玩了,或者摄像头模块,主动从引脚上读取数据解析后放到ram里,这些都不需要CPU干预的,不然每次操作都用CPU从fifo读写数据,那效率太低了。从性能上一个主要跑AI推理的机器,应该是GPU性能大于CPU,我猜的单GPU板卡中是高性能图像处理期+低性能CPU,CPU做引导启动,提供一些风扇控制,异常处理等等服务。
DMA实现数据传输流程
热门推荐
qq_42878057的博客
03-23
1万+
1.相关概念
(1)DMA直接寄存器访问
可实现外设数据寄存器到存储器、存储器到外设数据寄存器、存储器到存储器之间的高效数据传输,无需CPU操作控制。
(2)外设与存储器
外设包括ADC、SPI、I2C、USART等等
存储器包括片内SRAM、外部存储器、片内Flash等等
(3)具体应用场合举例:
ADC采集可以利用DMA将AD转换数据转移到目标存储区,适用于多通道采集、采样频率高、连续传输的ADC采集场合;
将特定存储区的数据转移到外设数据寄存器,用于外设的对外数据传输,如存储器传输数据到串口数据寄存器
【计算机组成原理·笔记】DMA方式
m0_51810668的博客
06-10
1032
【计算机组成原理·笔记】DMA方式
stm32教程-DMA-为CPU减负.rar
01-03
stm32教程-DMA-为CPU减负,使用dma方式为stm32减负。DMA (Direct Memory Access),直接存储器存取,是一种可以大大减轻
CPU 工作量的数据存取方式,因而被广泛地使用。早在 8086 的应用中,就已
经有 Intel 的 8237 这种典型的 DMA 控制器。而 STM32 的 DMA 则是以类似外
设的形式,添加到 Cortex 内核之外的。
在硬件系统中,主要由 CPU(内核)、外设、内存(SRAM)、总线等结构组
成,数据经常要在内存与外设之间转移,或从外设 A 转移到外设 B。
例如:当 CPU 需要处理由 ADC 外设采集回来的数据时,CPU 首先要把数
据从 ADC 外设的寄存器读取到内存中(变量),然后进行运算处理,这是一般的
处理方法。
基于单片机系统采用DMA块传输方式实现高速数据采集
02-03
摘要:介绍一种基于单片机系统设计的DMA硬件电路,以字块传输方式与高速A/D接口。结合在数字式磁通表设计中的应用给出其硬件软件设计方案实例。 PC机中外设与内存储器之间数据直接传输的DMA功能以其高效、高速、CPU资源占用少等特点已被广泛应用,这一功能通过安装在主板上的专用DMA控制器芯片或集成在外围控制芯片来实现。单片机的应用领域也常常需要有高速数据传输或数据采集,虽然近些年单片机速度有所提高,仍然无法应付类似单脉冲信号捕获、周期信号频谱分析等需要采用高速A/D的场合。对于速率在100ksps以上的数据采集或传输一般的中断查询法就不易实现,因此考虑通过直接存储存取操作才能完成。然而单片
基于DMA的DSP_Cache优化.pdf
08-29
数字信号处理器大都采用两级高速缓存结构 ,为高复杂度算法的实现提供了有力的保证。由于一般片上内存空间不大 ,对于通信和图 像系统较大的数据 ,需要将数据存在片外 ,从而导致处理效率很低。本文以 TI C6000 系列芯片为例 ,从分析它的 Cache 结构出发 ,利用直接存 储器存取 DMA (Direct Memory Access) 设计了一种双缓冲区结构 ,以减少片内、外存储器之间数据交换的时间 ,并针对高斯滤波函数加以实 现。测试表明这种方法能使硬仿真时所用的 CPU 周期数与软仿真时相同。
数据转换/信号处理中的DMA缓存解耦的一点见解
10-16
DMA(英文全称:Direct Memory Access,中文:直接内存访问)是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。
DMA的传输模型结构见下图:
Figure 1 DMA传输模型
从上图可知,使用DMA从源地址传输数据到目的地址,数据都必须通过DMA控制器内部的寄存器或FIFO作缓存,而不是在源和目的地之间直接传输,这是因为源和目的所在设备的
DMA.rar_MSP430f16x DMA
09-24
直接存储器存取(DMADirect Memory Access)方式是用硬件实现存储器与存储器之间或存储器与I\O设备之间直接进行高速数据传送,不需要CPU的干预。这种方式通常用来传送数据块。MSP430f16x系列单片机内部含有DMA模块,...
Linux下mysql添加用户并授权数据库权限
beautifulmemory的博客
03-06
192
在 Linux 下,你可以使用 MySQL 的 root 用户登录到 MySQL 数据库,然后通过 SQL 命令来添加新用户并授予数据库权限。
【Linux】Linux的管道与重定向
AliceNo的博客
03-02
943
在Linux系统中,管道和重定向是使命令行操作更为灵活和高效的关键工具。通过管道,我们可以将一个命令的输出作为另一个命令的输入,实现命令之间的连接和协作。而重定向则允许我们将命令的输入和输出从默认位置进行定向,使得我们能够轻松地将结果保存到文件中或者从文件中读取输入。本文将详细探讨这两个重要概念,并演示它们在日常Linux命令行操作中的应用。管道和重定向是Linux命令行中的两个强大而灵活的工具,它们为用户提供了处理和操作命令输入输出的便利方式。
linux-rpm命令
最新发布
weixin_44654338的博客
03-06
154
rpm命令管理程序包:安装、升级、卸载、查询和校验。1、忽略依赖关系安装/卸载包。2、安装相关默认路径。6、查询已安装过的包。
《Linux C编程实战》笔记:共享内存
ouliten的博客
03-02
839
由于本人要考研了,播客可能不会再长更。这本《Linux C编程实战》其实也差不多完结了,还剩网络编程章节没有讲,我肯定是没时间讲了,可能考研失败了会回来继续。《Primer C++》的课后题还有第八章的存货,后续章节只能随缘更新。Qt部分真烂尾了,写Qt项目的注释实在太累了。最有可能更新的部分是力扣题讲解,因为写来准备复试上机。最后祝大家,也祝我一切顺利。
stm-32:dma直接存储器存取
09-19
STM32是意法半导体(STMicroelectronics)推出的一系列微控制器产品,其中的STM32F系列产品支持DMA(Direct Memory Access,直接存储器存取)功能。
DMA是一种在微控制器系统中实现高效数据传输的技术。它允许外设直接与内存进行数据传输,无需CPU的干预,提高了系统的效率和吞吐量。
STM32的DMA功能使得外设可以直接读写存储器,而不需要CPU来处理数据传输。通过DMA控制器,外设可以直接访问存储器的指定地址,将数据从外设读取到存储器中,或者将存储器中的数据传输到外设中。
使用DMA的好处是可以减轻CPU的负担,使CPU能够更集中地处理其他任务。DMA可以在后台进行数据传输,而CPU可以同时处理其他的计算和逻辑操作,提高了系统的响应速度和处理能力。
在STM32中,DMA控制器可以通过多种配置参数来控制数据传输的方向、源地址、目的地址、传输长度等。可以通过编程来配置DMA传输的参数,并启动或停止DMA传输。DMA传输完成后,可以通过中断或轮询方式来检测并执行相应的操作。
总之,STM32的DMA直接存储器存取功能使得外设可以直接进行数据传输,减轻了CPU的负担,提高了系统的效率和吞吐量。它在很多需要高效数据传输的应用中有着重要的作用,比如音频、视频处理、通信和存储等领域。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
仲夏夜之梦~
CSDN认证博客专家
CSDN认证企业博客
码龄3年
暂无认证
471
原创
3万+
周排名
4854
总排名
92万+
访问
等级
6121
积分
817
粉丝
1199
获赞
163
评论
4749
收藏
私信
关注
热门文章
【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)
32675
重新认识 IP地址
23479
【虚拟机】Ubuntu 手动配置DNS
20972
【虚拟机】Ubuntu18.04 设置共享文件夹(解决/mnt 目录下没有 hgfs 目录)
16924
解决Ubuntu“无法定位软件包 xxx”的问题
14429
分类专栏
嵌入式
25篇
STM32
4篇
汇编
13篇
makefile
9篇
Linux驱动(I.MX6ULL)
27篇
I.MX6ULL裸机开发
29篇
Linux 基本命令和开发工具
53篇
cmake
15篇
Linux 基础
131篇
C/C++
110篇
数据结构
12篇
Mysql / Sqlite 数据库
21篇
springboot + vue3 + mybatis
23篇
最新评论
Ubuntu 安装指定版本 Mysql,并设置远程连接(以安装mysql 5.5 为例)
大傻羊:
为啥我下载之后就只有8.几的版本
【裸机开发】SPI 通信接口(一)—— SPI 通信流程及四种工作模式
0xffffffffffffffe:
写得太好啦Thanks♪(・ω・)ノ
【Git】本地仓库 — 远程仓库的操作命令
CSDN-Ada助手:
哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性。
【Git】 工作区 — 本地仓库的操作命令
CSDN-Ada助手:
哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性。
【Git】Git 的安装及其配置
CSDN-Ada助手:
如何在 Git 中进行代码审核?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
【cmake】定义函数
【cmake】pkg_check_modules 使用详解
【Git】移除Git中的文件
2024年13篇
2023年169篇
2022年281篇
2021年10篇
目录
目录
分类专栏
嵌入式
25篇
STM32
4篇
汇编
13篇
makefile
9篇
Linux驱动(I.MX6ULL)
27篇
I.MX6ULL裸机开发
29篇
Linux 基本命令和开发工具
53篇
cmake
15篇
Linux 基础
131篇
C/C++
110篇
数据结构
12篇
Mysql / Sqlite 数据库
21篇
springboot + vue3 + mybatis
23篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值