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;
在这里进行简单说明
- 以上配置中所说的内存就是指内部SRAM,外设可以是真实的内部外设比如UART、IIC,也可以是FPGA通过AHB实现的外设或者通过AHB2APB的桥连接实现的APB外设,也可以是通过AHB2HBUS连接的内置hyperRAM(?待定,未测试)。
- 如果是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标志。
- 针对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 ); // 配置并等待传输完成
(图片来源网络,侵删)
(图片来源网络,侵删)
(图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。