当前位置: 首页 > article >正文

AG32 DMAC实现内部MCU与FPGA通信【知识库】

一、简介

DMAC是独立于MCU和FPGA之外的外设,连接到AHB总线,可通过寄存器配置实现直接内存存取。通过AHB总线实现MCU与FPGA进行高性能通信。理论最高传输速率可达 bus_clock * 32 = 168MHz * 32 = 5376Mbps = 5.25Gbps,超频到336MHz的形况下,可以翻倍。

二、流控

DMAC可选的流控模式(DMAC_FlowControlTypeDef)有以下几种,流控模式是较为关键的参数,决定了数据流怎么传输、由什么控制:

typedef enum
{DMAC_MEM_TO_MEM_DMA_CTRL                          = 0,  // 内存到内存,DMAC控制DMAC_MEM_TO_PERIPHERAL_DMA_CTRL                   = 1,  // 内存到外设,DMAC控制 DMAC_PERIPHERAL_TO_MEM_DMA_CTRL                   = 2,  // 外设到内存,DMAC控制DMAC_PERIPHERAL_TO_PERIPHERAL_DMA_CTRL            = 3,  // 外设到外设,DMAC控制DMAC_PERIPHERAL_TO_PERIPHERAL_DST_PERIPHERAL_CTRL = 4,  // 外设到外设,DSI控制DMAC_MEM_TO_PERIPHERAL_PERIPHERAL_CTRL            = 5,  // 内存到外设,外设控制DMAC_PERIPHERAL_TO_MEM_PERIPHERAL_CTRL            = 6,  // 外设到内存,外设控制DMAC_PERIPHERAL_TO_PERIPHERAL_SRC_PERIPHERAL_CTRL = 7,  // 外设到外设,源端外设控制
} DMAC_FlowControlTypeDef;

在这里进行简单说明

  1. 以上配置中所说的内存就是指内部SRAM,外设可以是真实的内部外设比如UART、IIC,也可以是FPGA通过AHB实现的外设或者通过AHB2APB的桥连接实现的APB外设,也可以是通过AHB2HBUS连接的内置hyperRAM(?待定,未测试)。
  2. 如果是FPGA实现的外设,一般使用DMAC_PERIPHERAL_TO_MEM_PERIPHERAL_CTRL/
    DMAC_PERIPHERAL_TO_PERIPHERAL_DMA_CTRL, 可以有4个通道,主要依赖两个信号进行流控,ext_dma_DMACLBREQ用于FPGA告知DMAC可以进行传输,ext_dma_DMACCLR用于DMAC告知FPGA本轮传输结束,可以清除REQ标志。
  3. 针对AHB外设 进行性传输支持最大256长度的突发,但针对APB外设则不支持突发(APB本身不支持)

三、关键函数

SYS_EnableAHBClock(AHB_MASK_DMAC0) ; // 开启时钟
DMAC_Init() // 基本初始化
DMAC_Config(DMAC_ChannelNumTypeDef channel, uint32_t srcAddr, uint32_t dstAddr,DMAC_AddrIncTypeDef srcIncr, DMAC_AddrIncTypeDef dstIncr,DMAC_WidthTypeDef srcWidth, DMAC_WidthTypeDef dstWidth,DMAC_BurstTypeDef srcBurst, DMAC_BurstTypeDef dstBurst,uint32_t transferSize, DMAC_FlowControlTypeDef transferType,uint32_t srcPeripheral, uint32_t dstPeripheral); // 配置,配置完成后会立刻开始传输。
DMAC_WaitChannel(DMAC_ChannelNumTypeDef channel) ; // 等待传输完成
DMAC_ClearChannelIntTC(DMAC_ChannelNumTypeDef channel); // 清除中断标志位
DMAC_IsEnabledChannel(DMAC_ChannelNumTypeDef channel); // 查询通道是否开启/活动,和ZYNQ类似,可以while等待(DMAC_WaitChannel的实现方式),也可以异步查询
DMAC_WaitedTransfer(DMAC_ChannelNumTypeDef channel, uint32_t srcAddr, uint32_t dstAddr,DMAC_AddrIncTypeDef srcIncr, DMAC_AddrIncTypeDef dstIncr,DMAC_WidthTypeDef srcWidth, DMAC_WidthTypeDef dstWidth,DMAC_BurstTypeDef srcBurst, DMAC_BurstTypeDef dstBurst,uint32_t transferSize, DMAC_FlowControlTypeDef transferType,uint32_t srcPeripheral, uint32_t dstPeripheral); // 配置并等待传输完成
http://www.lryc.cn/news/2393936.html

相关文章:

  • webrtc初了解
  • [STM32学习笔记(九)]CubeMX项目使用系统定时器SysTick的中断服务函数进行定时
  • 5G 核心网 NGAP UE-TNL 偶联和绑定
  • 性能测试怎么做?方法、流程与核心要点解析
  • 将ipynb文件转换为markdown格式文件
  • Vulnhub_Zico2_wp
  • 【玩转腾讯混元大模型】腾讯混元大模型AIGC系列产品深度体验
  • 品优购项目(HTML\CSS)
  • Attention Is All You Need论文阅读笔记
  • 深入理解设计模式之中介者模式
  • OpenCV 图像像素的读写操作
  • 【前端】【Vue3】vue3性能优化总结
  • 如何制作全景VR图?
  • 动态防御新纪元:AI如何重构DDoS攻防成本格局
  • 汽车软件刷写 APP SBL PBL概念
  • 自动化中的伦理:驯服人工智能中的偏见与守护合规之路
  • Flask与PostgreSQL交互教程
  • XJTU-SY轴承振动数据集的json自封装
  • Spring AI 系列2: Advisors增强器简介
  • 通过Func实现飞书应用通知消息加急处理
  • 【目标检测】【AAAI-2022】Anchor DETR
  • Spring Cloud Alibaba 学习 —— 简单了解常用技术栈
  • 智慧工厂整体解决方案
  • 秋招Day12 - 计算机网络 - TCP
  • KubeMQ 深度实践:构建可扩展的 LLM 中台架构
  • vueflow
  • LearnOpenGL-笔记-其十一
  • @Docker Compose 部署 Prometheus
  • openppp2 -- 1.0.0.25225 优化多线接入运营商路由调配
  • 二次封装 Vuex for Uniapp 微信小程序开发