AXI DMA IP核操作流程

  • 直接寄存器模式

访问DMACR,SA,DA,length寄存器初始化DMA传输,当传输完成,相关通道的DMASR.IOC_Irq有效(前提是使能该中断,DMACR.IOC_IrqEn使能)。

MM2S 通道启动流程:

  1. MM2S_DMACR.RS=1,运行DMA
  2. 使能MM2S_DMACR.IOC_IrqEn 和MM2S_DMACR.Err_IrqEn
  3. 配置有效的MM2S_SA和MM2S_SA_MSB寄存器
  4. 写非零的数值到MM2S_LENGTH寄存器,启动读DDR发送至AXIS端口。该数值为读取内存的字节数量

S2MM通道启动流程:

  1. S2MM_DMACR.RS=1,运行DMA
  2. 使能S2MM_DMACR.IOC_IrqEn 和S2MM_DMACR.Err_IrqEn
  3. 配置有效的S2MM_DA和S2MM_SA_MSB寄存器
  4. 写非零的数值到S2MM_LENGTH寄存器,启动AXIS端口数据写入DDR。此数值需要大于等于一包数据的字节数。

在直接寄存器模式下,上述启动流程需要循环使用,每读写一次,均需要重新配置以上寄存器。

每个流程的结束,会产生中断告知CPU数据操作完成,需要CPU清除IOC_Irq寄存器中断标志。

  • SG模式

配置控制寄存器和描述符之后,SG模式启动。可以极大的提高DMA性能。

MM2S通道启动流程:

  1. 配置MM2S_CURDESC和MM2S_CURDESC_MSB寄存器,写入开始操作符的地址。
  2. 配置MM2S_DMACR.RS=1,运行DMA
  3. 寄存器MM2S_DMACR.IOC_IrqEn 和MM2S_DMACR.Err_IrqEn使能
  4. 配置MM2S_TAILDESC和MM2S_TAILDESC_MSB,此时DMA启动读取内存中的描述符
  5. DMA自动处理操作符并读取内存数据通过AXIS端口输出

S2MM通道启动流程:

  1. 配置S2MM_CURDESC和S2MM_CURDESC_MSB寄存器,写入开始操作符的地址。
  2. 配置S2MM_DMACR.RS=1,运行DMA
  3. 寄存器S2MM_DMACR.IOC_IrqEn 和S2MM_DMACR.Err_IrqEn使能
  4. 配置S2MM_TAILDESC和S2MM_TAILDESC_MSB,此时DMA启动读取内存中的描述符
  5. DMA自动处理操作符并接收AXIS端口数据写入内存中

每个流程结束(DMA接收到带有EOF的操作符),DMA产生中断至CPU,需要CPU清除IOC_Irq寄存器中断标志,重新操作上述流程。

  • 循环DMA模式

此模式下,DMA可以处理相同的缓冲描述符,并不产生中断。此模式下DMA持续工作,除非出现异常停止或者复位。

此模式的关键是,tail描述符指向first描述符。设置Cyclic BD Enable为1(需要在DMA运行之前配置)。

其余流程与SG模式一致。

版权声明:本文为CSDN博主「yindq1220」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yindq1220/article/details/122448292

生成海报
点赞 0

yindq1220

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

【STM32Cube笔记】12-配置外部中断

【STM32Cube笔记】系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯引脚配置 6-Cortex-M7内核基本配

stm32cubemx+HAL+串口接收中断

stm32cubemxHAL串口接收中断 在cubemx配置完串口和global interrupt后需要在keil中添加如下代码。 第一步:在main函数中添加接收中断标志位开启函数 HAL_UART_Receive_IT