精华内容
下载资源
问答
  • dma验证
    2018-04-18 15:25:00

    哪有ZedBoard PetaLinux下PS侧DMA验证的例子

    转载于:https://www.cnblogs.com/yangtuzi/p/8875134.html

    更多相关内容
  • DMA验证复习(一)

    2022-09-09 15:24:31
    dma

    目录

    1.1 概述

    1.2 工作原理

    1.3 DMA结构框图

    1.4 工作流程

    1.5 通道访问带宽

    1.6 DMA通道映射以及优先级说明

    1.7 主要寄存器


    1.1 概述

    ⚫符合AMBA规范

    ⚫8个DMA通道,每个通道都可以支持单向传输。

    ⚫16个DMA请求。PrimeCellDMAC提供16个外围DMA请求线。

    ⚫单一DMA和突发DMA请求信号。每个连接到PrimeCellDMAC的外围设备都可以断言突发DMA请求或单个DMA请求。DMA突发大小是通过编程PrimeCellDMAC来设置的。

    ⚫支持内存到内存、内存到外设、外设到内存和外设到外设传输。

    ⚫硬件DMA通道优先级。每个DMA通道有一个特定的硬件优先级。DMA通道0具有最高的优先级,直到具有最低优先级的通道7。如果来自两个通道的请求同时处于有效状态,那么优先级最高的通道将首先得到服务。

    ⚫AHBslaveDMA编程接口。PrimeCellDMAC是通过在AHBslave接口上写入DMA控制寄存器来编程的。

    ⚫两个AHBbusmaster用于传输数据。当DMA请求有效时,这些接口用于传输数据。

    ⚫32-bitAHBmaster总线宽度。

    ⚫递增或非递增的源和目标寻址

    ⚫可编程DMA突发大小。DMA突发大小可以编程以更有效地传输数据。通常,突发大小被设置为外围设备的FIFO大小的一半。

    ⚫每个通道支持内部4-wordFIFO。

    ⚫支持8-bit、16-bit和32-bit传输。

    ⚫支持大端和小端模式,复位时默认为小端模式。

    ⚫分离和合并DMA错误和DMA计数中断请求。在一个DMA错误或DMA计数达到0时(这通常用来表示传输已经完成)产生一个对处理器的中断。三种中断请求信号被用来做这个:-DMACINTTC在传输完成时发出信号。-DMACINTERR错误发生时发出信号。-DMACINTR是将DMACINTTC和DMACINTERR中断请求信号合并。DMACINTR中断请求可以用于有很少中断控制器请求输入的系统。

    ⚫中断屏蔽。DMA错误和DMA终端计数中断请求可以被屏蔽。

    ⚫原始中断状态。DMA错误和DMA计数原始中断状态可以在屏蔽之前读取。

    ⚫测试寄存器用于模块和集成系统级测试。

    1.2 工作原理

    (1)、外设DMA为外设和内存的通道,采用外设请求触发方式进行数据传输,每个外设通道都可以支持Peripheral->RAM或者RAM->Peripheral的数据传输,并且根据目标外设类型的不同,自适应选择byte/half-word/word传输方式。DMA作为Master,在收到request后将发起AHBtransactions进行数据操作,外设目标地址根据通道接入选择自动定位,RAM目标地址则根据寄存器配置定位。

    (2)、每个channel可以从多个外设中选择一个作为source或destination,同时软件可以设置通道优先级,当两个通道同时要访问RAM时,由优先级决定谁先访问,另一个通道将被挂起,直到优先通道访问完毕。

    (3)、外设请求可以是准备发送(RAM/Flash->Peripheral)或接收完成(Peripheral->RAM),数据传输通过AHB总线完成,当DMA访问外设时,CPU对同一个外设的访问将引起冲突,哪个Master访问被挂起取决于BusMatrix设置的仲裁优先级。这里需要注意的是,由于大部分外设都被挂在APB总线上,APB映射到AHB仅为一个slave,因此当DMA访问APB中任意外设时,CPU即使访问APB下的其他外设,也同样会引起总线仲裁。通过DMACCxConfiguration(通道配置寄存器)的FlowCntrl可以配置每个通道的传输方向,软件必须保证传输方向配置与实际挂载到这个通道上的外设请求相一致。比如通道1当前挂载的外设请求是UART0接收,则必须将FlowCntrl配置为010(数据从外设读出,写入RAM),每次UART0接收完一帧数据,将发送RXD0请求给DMA,DMA响应请求后,从UART0接收缓存寄存器读取数据,如果DIR被错误的配置为,则DMA对UART0接收缓存寄存器的写操作将被UART0忽略。

    (3)、软件可设置DMA的存储器指针,用于配置DMA传输的起始地址,可以选择指针递增或递减方式。另有DMACCxControl寄存器的TransferSize位配置传输次数,根据起始地址和传输次数,计算得到终止地址,当存储器指针指向终止地址时,本次传输结束,关闭通道。

    (4)、在DMA一个完整transferblock完成之前,软件随时可以关闭channel使能,这将导致当前AHB传输(如果正在进行)完成,然后通道被禁用。通道中的所有数据FIFO都会丢失。通过简单地设置通道使能位来重新启动通道会产生不可预测的影响,必须完全重新初始化通道。到达最后一个LLI或遇到通道错误时,通道也被禁用,通道启用位被清除。如果必须在不丢失通道FIFO中的数据的情况下禁用通道,则必须设置暂停位,以便进一步的DMA请求被忽略。然后必须轮询Active位,直到它达到0,表明在通道FIFO中没有数据留下。最后,可以清除通道使能位。

    1.3 DMA结构框图

     DMA包含两个AHB master接口,一个AHB slave接口,一个DMA响应请求接口,一个中断请求接口。

    1.4 工作流程

    工作流程分为:通道请求处理与数据搬运过程

    通道请求处理:

    (a)、DMA接受到请求,跳到步骤b

    (b)、判断是否有其他通道正在搬运数,若有,则停留在步骤b直至其他通道当次搬运完成;若无,进一步判断是否有其他同时置起的请求信号,若有,则判断当前通道优先级是否高于其他通道,若是,则跳到步骤c并向数据搬运过程发起请求,若否,则停留在步骤b直至其他通道当次搬运完成

    (c)、并等待数据搬运完成响应信号,得到响应则,跳到步骤d,否则停在步骤c

    (d)、数据搬运长度+1,判断是否达到设定长度,若是则产生通道使能关闭脉冲;判断请求是否释放,若是,则跳到步骤a,若否,则停留在步骤d判断数据传输达到设定长度,否则跳到步骤a

    数据搬运:

    (a)、等待通道请求处理过程发起请求

    (b)、向HADDR写源地址

    (c)、向HADDR写目的地址,同时读取HRDATA

    (d)、将读到的HRDATA数据写到HWDATA

    (e)、向通道请求处理过程发出搬运完成响应,并跳到步骤a

    1.5 通道访问带宽

    DMA外设通道支持字节/半字/字访问,每个通道都可以通过通道控制寄存器中的DWidth和SWidth位来配置传输带宽。

    1.6 DMA通道映射以及优先级说明

    DMA通道优先级是固定的。DMA通道0具有最高的优先级,DMA通道7具有最低的优先级。如果DMA正在为一个较低优先级的通道传输数据,然后一个较高优先级的通道开始有效,在切换到高优先级通道传输数据之前,它要完成由低优先级通道授权给master接口的传输次数。在最坏情况下,这相当于一个四字节。

    在DMAC中,两个最低优先级的通道6和7被设计成不会使AHB总线饱和。如果这些较低优先级的通道中的一个被激活,那么DMAC为一个周期的可编程的WIDTH的每4次传输放弃总线,而不管传输的大小。例如,如果可编程的大小宽度是8,那么在8位的4次传输后DMAC放弃总线。这使其它AHBmaster可以访问总线。建议RAM->RAM传输使用这些低优先级通道之一,或者在DMACRAM到RAM传输期间阻止其它低优先级的AHB总线master访问总线。

    1.7 主要寄存器

     

     

     

     

     

    展开全文
  • DMA验证报告[参考].pdf

    2021-10-11 02:07:13
    DMA验证报告[参考].pdf
  • AHB-SRAM设计验证

    2022-04-04 19:51:16
    AHB-SRAM设计验证
  • IC验证DMA使用

    千次阅读 2020-07-17 15:25:48
    DMA分为标准DMA和集成DMA。比如SD模块内部集成了DMA功能模块,其使用方法与标准DMA存在不同。 一、标准DMA使用 1.DMA配置寄存器CONFIG中使能DMA。 2.中断控制寄存器INTTCLR中清掉所有中断。 3.通道0的源地址寄存器C0...

    DMA分为标准DMA和集成DMA。比如SD模块内部集成了DMA功能模块,其使用方法与标准DMA存在不同。此外DMA搬运数据过程是不借助于中断进行的!
    一、标准DMA使用
    1.DMA配置寄存器CONFIG中使能DMA。
    2.中断控制寄存器INTTCLR中清掉所有中断。
    3.通道0的源地址寄存器C0SRCADDR中设置数据源地址。
    4.通道0的目的地址寄存器C0DESTADD中设置数据目的地址。
    5.通道0链接列表寄存器C0LLI中设置为零(仅发送一个package的情况),如果使用多个通道,该寄存器的值设置高30位,即reg[31:2]设置第二个通道连接列表寄存器C1LLI的地址,低两位即reg[1:0]设置为0。
    6.通道0的控制寄存器中设置tranfer size、burstsize、
    tranfer width和source increment 和destnation increment等。
    其中,tranfer size为总的传输数据量大小,其计算方法为tranfer size= N* source tranfer width;burst size 就是DMA请求一次总线完成的数据传输量;tranfer width分为source tranfer width 和destnation tranfer size,source tranfer size 就是数据源读取时的位宽,destnation tranfer size 就是向目的地址写数据时的数据宽度;increment代表在读写数据时地址是否递增,而在从memroy向peripheral搬运时,source increment置高,即地址递增,而destnation increment 置低,即地址不变,一直是数据发送寄存器的地址(如I2C、UART)。
    7.通道0的配置寄存器C0CONFIG中使能通道0,并且配置source request peripheral 和 destnation request peripheral,也就是DMA控制器分配好的外设(如I2C、UART、CAN和SPI等,如果是SRAM和DDR等MEMORY,则不需要设置)读写编号。
    如果仅发送一个package,以上配置就结束了,如果需要发送多个package,需要使用别的channel,即DMA的channel1-7,需要继续以下操作:
    8.通道n的源地址寄存器CnSRCADDR中设置数据源地址。
    9.通道n的目的地址寄存器CnDESTADD中设置数据目的地址。
    10.通道n链接列表寄存器CnLLI中设置为下一个通道n+1的链接列表寄存器的地址,若该通道为最后一个通道,其值设置为0,代表是最后一个通道。就实际观察来看,该寄存器设置的正确与否,不影响通道1-7的使用。
    11.通道n的控制寄存器中设置tranfer size、burstsize、
    tranfer width和source increment 和destnation increment等。
    12.通道n的配置寄存器CnCONFIG中使能通道n,并且配置source request peripheral 和 destnation request peripheral,也就是DMA控制器分配好的外设(如果是SRAM和DDR等MEMORY,则不需要设置)读写编号。其中,n小于等于7。
    二、集成DMA使用
    在集成的DMA中,以SD模块为例,每个Descriptor分为4个部分DES0\DES1\DES2\DES3来配置DMA要搬运数据的信息。4个32bit 的寄存器地址可以随意连续地在存储器(如SRAM)中分配,另外SD控制器的内部有两个与DMA使用相关的寄存器需要配置,分别是模式寄存器BMOD和描述符首地址寄存器DBADDR。BMOD寄存器主要用于DMA复位,DMA使能,burst长度配置等,需要注意的是,软复位SWR不会自动清零,在置位后,需要软件手动清零,然后使能DMA,配置burst长度等。DBADDR寄存器配置内容就是DES0寄存器地址。
    Descriptor分为 dual-buffer模式和chain descriptor 模式, 描述符的结构图如下所示:
    在这里插入图片描述
    Descriptor配置流程如下:
    1.在DES0中设置end of ring、second address chained、first descriptor和last descriptor 等。end of ring 置高代表这是最后一个descriptor;send address chained 置高,代表该descriptor 指向的第二个地址不再是buffer的地址,而是第二个descriptor的地址;first 、last descriptor不再介绍。
    2.DES1设置descriptor指向的两个buffer的大小(dual-buffer中使用两个buffer,而chain descriptor结构中只用到一个buffer)。
    3.DES2中存放buffer1的地址指针;
    4.Dual-buffer模式中,DES3中存放Buffer2的地址指针,而chain descriptor模式中,DES3存放下一个descriptor的地址指针。
    三、DMA从外设(例SPI、UART和I2C等)向sram等memory中搬数据时,判断数据是否搬运完成呢,可以查看外设接收FIFO中是否为空、或者查看标准DMA的通道配置寄存器Channel Configuration Register中的bit17位是否为active,1代表当前DMA还在搬运数据,0代表DMA搬运数据完成!
    以上是个人在验证中的理解,如有错误,欢迎指正!

    展开全文
  • 下图是我实际中的 DMA 及 SPI 使用情况: SPI1 仅使用发送功能,SPI2 仅使用接收功能,两者均使用 DMA。由于 SPI 没有仅发送模式,因此 SPI2 必须要配置一个 TX,否则导致 SPI 报错(实际并不配置 SPI 的发送引脚...

    缘起

      在最近的项目测试中发现,SPI 通信总是莫名其妙的失败,查看寄存器发现 SPI 已经被停止了。根据手册,SPI 在异常情况下会被强制停止(SPI 的使能为被清零),而根据波形显示通信过程没有问题。下图是我实际中的 DMA 及 SPI 使用情况:
    在这里插入图片描述

    1. SPI1 仅使用发送功能,SPI2 仅使用接收功能,两者均使用 DMA。由于 SPI 没有仅发送模式,因此 SPI2 必须要配置一个 TX,否则导致 SPI 报错(实际并不配置 SPI 的发送引脚)。
    2. 在初始化时,先初始化了 SPI2(含 DMA),然后再初始化的 SPI1(含DMA),这里是关键。
    3. 在初始化之后,SPI 立刻开始工作(有数据通信)。其中,SPI2 大约以 8MHz 的速率不停的接收数据,SPI1 则以 1MHz 的速率在需要的时候才会发送数据。
    4. 问题是在以上流程中,在配置 SPI2 时,有概率导致 SPI2 异常停止!

    问题分析

      最初怀疑是 SPI 的问题,因为在初始实现这部分功能时就遇到了很多坑,我也写过博文华大 MCU 之五 SPI 从机 DMA 模式 配置(不能正常接收问题处理) 来专门记录遇到的问题。但是再一次整理了一下 SPI 的配置流程,并没有发现啥问题。在测试中发现,将 SPI2 使用的 DMA 停止,则不会出现问题,于是开始调查 DMA 的问题。

    DMA 的坑

      最开始将问题重点放到了 DMA 的配置上,怀疑是不是 DMA 部分配置项不正确。但是,读数情况下 SPI 是工作正常的,如果是配置不对,应该是一个必出现的问题。转而又开始怀疑是不是配置时序(寄存器的配置的先后顺序)不对,反复查看代码也没有发现问题。正在一筹莫展之时,有同事提出了手册中 DMA 章节给出的一个注意事项:
    在这里插入图片描述
      其实,最开始实现 SPI 驱动时就关注过该注意事项,只是开始的理解是,这条注意事项是针对同一通道而言的,同一通道在工作时不能再次配置上面说的这些寄存器,不同 DMA 通道之间应该互不影响。然而实际情况是,只要 DMA 有任意一个通道在传输数据,其他所有通道都不可以配置!

      这就导致了一个很大的问题,外设在工作中不可避免的要重新配置 DMA。例如,SPI 的 DMA 发送,由于发送数据长度是动态变化的,必须每次重新进行配置,则根据上面这一条,必须把该 DMA 下的其他通道(例如上面我的 SPI1 使用的通道)也都全部停止,这样就可能导致其他外设丢失数据。

      最麻烦的是,这个问题没有找到任何其他的解决方法,只能是停止该 DMA 下的所有通道,进而来配置自己需要的那个通道参数。起初在寻找解决方法的时候,也考虑是不是可以用下图所示的寄存器位来进行一下判断,而是实际是下面的位根本没有任何用处。
    在这里插入图片描述
    还是以我上面的使用示例来说,SPI2 作为从机接收,由于使用了 DMA,MCU 并不能确定数据何时到来。即使 MCU 检测 DMAACT 未动作,可能在实际配置通道时,DMA 又变为了动作状态。

    配置

      根据手册,使用 DMA 时需要先写寄存器将 DMA 控制器使能,使能方法是写 DMA 使能寄存器 DMA_EN.EN 位。 如下图所示:
    在这里插入图片描述
    我试了一下,不先使能貌似也没法发现啥问题啊!不知道为啥!?

    无法获取当前传出数据长度

      先来说一下需求:在串口驱动中,串口的接收使用 DMA 来实现,DMA 配置为循环模式,在指定缓冲区中循环存放收到的数据,通过读写指针来标记数据的读和写位置。
      然而,驱动库中 DMA 接口并没有能获取当前 DMA 传输了多少字节的接口!!!无奈只能选择修改驱动库,添加一些指定的接口,如下图所示:
    在这里插入图片描述
      后来,为了不修改驱动库,我直接把接口放到了自己的驱动里面,然后使用寄存器直接读取:M4DMA1->MONRPT0_f.DRPT,这样的话,需要注意与通道号的对应关系,如 MONRPT0 即通道 0。

    中断的使用

      在华大的 DMA 中,中断默认都是开启的,这点在配置 DMA 的时候需要特殊注意。我们需要使用 DMA 的屏蔽中断寄存器来屏蔽不使用的中断。如下图示:
    在这里插入图片描述
    在实际写代码时,需要调用 en_result_t DMA_DisableIrq(M4_DMA_TypeDef* pstcDmaReg, uint8_t u8Ch, en_dma_irq_sel_t enIrqSel); 来关闭不需要的中中断。例如,DMA 的块传输完成中断 和 传输完成中断 通常不会一起使用!这点对于用惯了 ST MCU 的人来说需要特殊注意!

    结论

    1. 在使用中,发现华大 MCU 的外设配置中,有不少的坑,尤其是对于我这种用惯了 STM32 的人来说。例如之前说的 SPI、中断、这里说的 DMA 等等。
    2. 千万不要完全相信华大 MCU 驱动库中给出的示例,里面是丢三落四各种错误!
    3. 在用户手册中一些比较重要的点,手册往往是一笔带过,在我们实际使用中容易被忽略,而往往忽略的就是问题的关键。而且对于异常情况,手册中没有很详细的描述,导致真正出现问题时,从手册中不能很快分析出原因。
    4. 对于某些外设,有很多用来观察外设工作的寄存器(ST 没有这部分寄存器),我们在实际使用中,往往需要等待这些寄存器中的某些位被置位之后才可以继续操作,否则会出现各种错误

    参考

    1. HC32F460系列用户手册Rev1.21.pdf
    展开全文
  • DMA实验

    2022-05-01 14:42:07
    一、DMA(直接存储器访问)简介 DMA传输数据从一个地址空间复制到另一个地址空间 作用:为CPU减负 DMA1有7个通道,DMA2有5个通道 DMA特性 ●每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件...
  • //timer.c file .../* Buffer that holds one complete DMA transmission * * Ensure that this buffer is big enough to hold * all data bytes that need to be sent * * The buffer siz...
  • DMA原理&AHB-DMA控制器工作过程总结

    千次阅读 2021-10-29 16:09:47
    DMA(direct memory access),直接存储器访问是用来数据搬运的技术,在没有DMA的情况下,数据的访问要通过CPU一条一条执行指令来实现,这种访问方式不仅速度慢,而且占用cpu算力。对于高速外设,数据传输的速度必须要...
  • DMA+SPI

    千次阅读 2020-05-17 08:10:28
    DMA+SPIDMA+SPI通信串口DMA发送:SPI+DMA:SPI主机模式与从机模式的区别:SPI的主要中断类型:SPI的寄存器:SPI_CR: 分为两个共32位的控制寄存器。SPI_DR:是一个十六位的可读写寄存器。SPI_SR:是一个十六位只读...
  • Xilinx PCIE DMA 仿真环境搭建

    千次阅读 热门讨论 2019-06-03 22:55:44
    4、xapp1052DMA仿真 4.1 testcase 4.2 配置cfg_bus_mstr_enable 4.3 WR DMA仿真 4.4 RD DMA仿真 1、前言 在阅读本文之前,建议刚接触PCIE的读者,请按顺序逐一阅读下面几个内容: 五、X...
  • 基于FPGA的PCIe总线DMA控制器的设计与验证.pdf
  • 在双核移动终端中进行验证,两芯片通过串口进行芯片间通信,实验结果证明了设计的高速串口驱动具有较好的可靠性和可行性。
  • DMA控制模块的设计参考,对于初学者可以以此为参考进行设计,代码可在仿真软件中验证(modelsim、VCS等)。
  • DMA设备的vxworks驱动,该为6.8版本,不过我已经在5.5版本上验证可以使用。
  • STM32G0 硬件SPI+DMA+LL库,最高通讯速率32MBit/s,经过逻辑分析仪验证,数组正确无误。
  • 由CUBEMX配置,基于HAL库,带FreeRTOS系统,IDE为STM32CubeIDE,实现多串口DMA收发程序,经过验证
  • 基于蜂鸟E203riscv系统的DMA外设代码
  • 某些板卡没有CD引脚(卡检测),因此您应在sdio_sd.c文件中注释掉以下定义,以关闭SD卡预验证。 # define SD_USE_DETECT_PIN 将以下定义添加到您的代码中以启用轮询模式而不是DMA # define SD_POLLING_MODE (( ...
  • 在Windows上使用磁盘设备进行DMA的小概念验证。 ddma一种小概念证明,用于在Windows上将磁盘设备用于DMA。 为什么某些本地虚拟机管理程序(即Hyper-V)允许来宾虚拟化设备访问权限,这意味着可以绕过SLAT。 演示在...
  • 将传统数据传输方式与存储器直接存取(direct memory access,DMA)数据传输方式进行了对比分析,结合外设组件互连标准(peripheral component interconnection,PCI)总线的特点,以嵌入式Linux系统为平台,重点...
  • 基于多通道DMA控制器的媒体播放器SoC设计与验证,曾文龙,周游,提出了一种基于多通道直接内存存取DMA(Direct Memory Access)控制器的媒体播放器片上系统SoC(System on Chip)设计方案,不仅实现了内外部存储空间
  • 通过HAL库实现STM32的ADC+DMA, 使用购买的额STM32F103C8T6和光敏传感器验证
  • 以太网接口因其具有标准开放、易于扩展、低成本等优点而在工业中得到了广泛应用。...通过使用DMA方式提升以太网接口的性能,并用PING包试验的方式进行了验证。结果表明,通过使用DMA可以显著地提升以太网接口的性能
  • 介绍了一种基于PCIE总线主模式DMA高速...实验利用自行开发的PCIE接口板实现了单字读写及DMA读写的传输方式,并在上位机软件界面上及ChipScope中显示并验证了读写数据的正确性,经实验表明传输速率可稳定在400 MB/s左右.
  • 它是以FPGA为平台构建的SOPC系统,内含软核处理器Microblaze和包含DMA控制器的用户自定义IP,经验证,方案中的DMA控制器实现了对闪存阵列的编程命令、地址的传输,以及存储阵列的流水线编程,提高了传统的由CPLD与...
  • 使用STM32F407单片机的DMA功能,利用串口接收不定长数据的程序,验证可以使用。
  • DMA介绍和几个问题

    千次阅读 2015-06-17 08:52:15
    我学习DMA碰到的几个问题不了解什么是DMA 不知道DMA有什么优点 不知道什么时候使用DMA问题一 DMA简单的说就是数据的搬运工,将数据从外设搬到内存,或者将内存的一个位置搬运到另一个位置。只要开启了使能就开始...
  • 利用 串口+DMA+IDLE中断+无锁队列,提高串口接收效率 接收会产生的中断有三种: - 串口空闲中断:正常接收(小于 dma 设置的 buffer_size 时) - DMA传输完成中断:刚好为 dma 设置的 buffer_size 时,不过一般...
  • ZYNQ DMA

    千次阅读 2021-06-08 21:10:34
    ZYNQ之DMA LOOPBACK实验1 原理介绍1.1 AXI4(AXI-full)总线学习1.2 zynq ps端几种接口1.3 AXI DMA简介1.4 AXI DMA编程顺序1.5 实验目的2 实验步骤2.1 建立BD文件2.2 SDK文件3 结果分析3.1 实验条件3.2 实验结果3.3 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,375
精华内容 4,150
关键字:

dma验证