Edit online

编程指南

注:
  • 源端与终端地址需要 4Byte 对齐。
  • 外设 WIDTH 设置需与外设模块寄存器位宽对齐。
  • 外设 LENGTH 设置需要与 WIDTH 对齐。
  • SPI Width 说明:DMA_Width=32,则 SPI.src_word_en=1。DMA_Width=8,则 SPI.src_word_en=0。需要配置 spi 模块内部 src_word_en 使用。
  • UART Byte 传输说明:如 UART 需要实现 Byte 功能 (即每接收到 1Byte 数据,马上写到内存中),则 Burst=1、Type=io_single、Block_length=1。

dma_flow1

1. DMA 编程指南

外设与外设传输

  • TASK_LENGTH:需要与 max(src_width,dst_width)对齐。
  • 外设模块内部水位:等于 block_length
  • src_type=iob 与 dst_type=iob: block_length=src_width*src_burst=dst_width*dst_burst
  • src_type=iob 与 dst_type=ios: block_length=src_width*src_burst
  • src_type=ios 与 dst_type=iob: block_length=dst_width*dst_burst
以 SPI 为例,源端为 SPI0,终端为 SPI1。SPI 的 width 支持 8 或者 32。SPI 支持 burst 操作。
1. 外设与外设传输编程示例
对象参数配置值例 1配置值例 2配置值例 3配置值例 4配置值例 5配置值例 6
源端 SPI0

src_spi0

width888888
burst111188
typeiosiosiosiosiob (或 iof)iob (或 iof)
终端 SPI1dst_spi1
width328328328
burst114444
typeiosiosiob (或 iof)iob (者 iof)iob (者 iof)iob (或 iof)
要求length 对齐要求4Byte 对齐1Byte 对齐4Byte 对齐1Byte 对齐4Byte 对齐1Byte 对齐
block_length41164168
src_spi0 与 spi1 模块内部水位41164168

DMA 编程说明

以下是以 SRAM 搬运数据到 SPI (spi0) 为例的 DMA 配置步骤:

  1. 初始化参数。
    2. DMA 编程初始化参数示例
    源端终端
    SRAM (假设 src _width=32)
    • src_width = 32
    • src_burst = 16
    • src_type = memory
    SPI (spi0, dma_id=8)
    • dst_width = 32
    • dst_burst = 4
    • dst_type = io_burst
  2. 计算 Block_Length。

    由于对象包含外设并且 type=io_burst,则 block_length=32x4/8=16(Bytes)。

  3. 初始化 SPI 进行,并且把 SPI 的水位设置为等于 length。此处设为 16,等于 length。
  4. 使能 DMA 模块时钟、释放 DMA 复位并使能 DMA 中断。
  5. 配置任务链表内容如下:
    3. DMA 任务链表编程示例
    地址参数描述备注
    0xa1c8_6688TASK_LINK_IDTASK_LINK_ID 需要与 SET 一致。
    0x2148_22c0 TASK_CFG_1
    0x0000_0010BLOCK_LEN
    0x9004_7444SRC_ADDR 源端地址:sram 首地址
    0x913f_0200DST_ADDR终端:SPI0 TX_FIFO 地址
    0x0000_00f4TASK_LENGTH
    0x55ff_0000TASK_CFG_2 使用推荐值 0x55ff_0000。
    0xffff_fffc下一 task 首地址因为只有一个 task,故为 0xffff_fffc。
  6. 把任务链表首地址 (0x900406e0),写到 DMA 所对应通道的 DMA_CH_TASK_ADD_1 寄存器中。
  7. 启动 DMA 传输,等待 DMA 传输完成中断。