uint32_t source_data_size : 16; // * 必须配置
uint32_t dest_data_size : 16; // * 必须配置
uint32_t source_burst_length : 16; // * 必须配置
uint32_t dest_burst_length : 16; // * 必须配置
uint32_t block_count; // * 必须配置(固定为1)
uint16_t source_peripheral_id; // # 可选配置(根据实际需要决定是否配置)
uint16_t dest_peripheral_id; // # 可选配置(根据实际需要决定是否配置)
struct dma_block_config *head_block; // * 必须配置
void *user_data; // # 可选配置(根据实际需要决定是否配置)
dma_callback_t dma_callback; // # 可选配置(根据实际需要决定是否配置)
上述两个结构体定义中的参数,在 DMA 配置过程中关注以下原则即可:
标记为 必须配置 的参数,是必须正确填写的,否则 DMA 将无法正常工作;
标记为 可选配置 的参数,需要根据实际需求决定是否需要进行配置;
标记为 不用配置 的参数,无需关注之;
下面两个表格中详细列出了 struct dma_config
和 struct dma_block_config
中各个参数的详细含义及 PAN1080 DMAC 的使用说明:
dma_block_config 结构体参数详解
若 DMA 源端是 Memory,则应填待传输 Memory 的起始地址,注意此地址有对齐要求,需能被 source_data_size
整除
若 DMA 源端是 Peripheral,则应填此外设 Data FIFO 的寄存器地址,各寄存器定义详见:
include\drivers\dma\dma_panchip.h
dest_address
DMA 目的端地址
需要注意:
若 DMA 目的端是 Memory,则应填待传输 Memory 的起始地址,注意此地址有对齐要求,需能被 dest_data_size
整除
若 DMA 目的端是 Peripheral,则应填此外设 Data FIFO 的寄存器地址,各寄存器定义详见:
include\drivers\dma\dma_panchip.h
source_gather_interval
DMA Gather 源端地址到达边界后的调整值
PAN1080 DMAC 不支持 Gather 特性,此参数无意义
dest_scatter_interval
DMA Scatter 目的端地址到达边界后的调整值
PAN1080 DMAC 不支持 Scatter 特性,此参数无意义
dest_scatter_count
DMA Scatter 目的端地址调整次数
PAN1080 DMAC 不支持 Scatter 特性,此参数无意义
source_gather_count
DMA Gather 源端地址调整次数
PAN1080 DMAC 不支持 Gather 特性,此参数无意义
block_size
当前 DMA Block 预期传输的数据长度(字节)
需要注意此处待传输的数据长度必须同时满足以下几个条件:
block_size
是 source_data_size
的整数倍
block_size
是 dest_data_size
的整数倍
block_size
/ dest_data_size
不可超过 4095
next_block
指向下一个 DMA Block 的配置参数
PAN1080 DMAC 不支持 Chaining Multi-Block 特性,所以此参数必须配置为0
source_gather_en
DMA Source Gather 使能控制
PAN1080 DMAC 不支持 Gather 特性,此参数无意义
dest_scatter_en
DMA Destination Scatter 使能控制
PAN1080 DMAC 不支持 Scatter 特性,此参数无意义
source_addr_adj
DMA 源端地址步进规则(递增、递减、或不变)
PAN1080 DMAC 支持此特性,但用户无需在此处配置,原因是 DMA Driver 会根据实际传输类型,自动按如下规则配置步进:
若源端为 Memory,则 Source Address 步进会被配置为递增;
若源端为 Peripheral,则 Source Address 步进会被配置为不变;
dest_addr_adj
DMA 目的端地址步进规则(递增、递减、或不变)
PAN1080 DMAC 支持此特性,但用户无需在此处配置,原因是 DMA Driver 会根据实际传输类型,自动按如下规则配置步进:
若目的端为 Memory,则 Destination Address 步进会被配置为递增;
若目的端为 Peripheral,则 Destination Address 步进会被配置为不变;
source_reload_en
DMA 源端地址自动重新加载使能控制
PAN1080 DMAC 支持此特性,但 PAN1080 DMA Driver 未实现此特性,因此无需配置
dest_reload_en
DMA 目的端地址自动重新加载使能控制
PAN1080 DMAC 支持此特性,但 PAN1080 DMA Driver 未实现此特性,因此无需配置
fifo_mode_control
决定 DMA 执行一个 Burst Transaction 之前,DMA FIFO 中需要有多少空间或数据
PAN1080 DMAC 支持此特性,但用户无需在此处配置,原因是 DMA Driver 强制将此特性配置为“只要 FIFO 空间或数据足够一次 Single Transfer,就可以传输”
flow_control_mode
决定目的端 Peripheral 作为流控时,源外设如何给数据
PAN1080 DMAC 不支持 Peripheral 作为流控,自然也不支持此特性,此参数无意义
DMA Peripheral 传输方式下的外设 ID
PAN1080 DMAC 支持此特性,但 DMA Driver 使用另外两个单独的参数来分别指示源端和目的端外设 ID:
source_peripheral_id
dest_peripheral_id
channel_direction
DMA 传输类型
PAN1080 DMAC 支持以下 4 种传输类型:
MEMORY_TO_MEMORY
MEMORY_TO_PERIPHERAL
PERIPHERAL_TO_MEMORY
PERIPHERAL_TO_PERIPHERAL
complete_callback_en
决定 dma_callback
函数是在每个 Block 传输完成后触发,还是所有数据传输完成后触发
PAN1080 DMA Driver 支持此特性,但由于 PAN1080 DMAC 硬件仅支持单个 Block 传输,因此在概念上,“每个 Block 传输完成”与“所有数据传输完成”是相同的,在实际应用中,建议直接将此参数配置为0即可
error_callback_en
DMA 传输出错的 Callback 函数使能控制
PAN1080 DMAC 支持Error中断,但 PAN1080 DMA Driver 未实现此特性,因此无需配置
source_handshake
决定 DMA 源端握手方式为硬件握手还是软件握手
PAN1080 DMAC 支持此特性,但用户无需在此处配置,原因是 DMA Driver 强制将此特性配置为“硬件握手”
dest_handshake
决定 DMA 目的端握手方式为硬件握手还是软件握手
PAN1080 DMAC 支持此特性,但用户无需在此处配置,原因是 DMA Driver 强制将此特性配置为“硬件握手”
channel_priority
当前 DMA 通道的优先级
PAN1080 DMAC 支持此特性,3个通道的优先级可以独立配置,优先级可选范围为 0 ~ 3,其中数字越大表示优先级越高,在实际应用中,如果没有特殊需求,建议直接将此参数配置为0即可
source_chaining_en
DMA 源端 Block-Chaining (Multi-Block) 特性使能控制
PAN1080 DMAC 硬件不支持,此参数无意义
dest_chaining_en
DMA 目的端 Block-Chaining (Multi-Block) 特性使能控制
PAN1080 DMAC 硬件不支持,此参数无意义
linked_channel
DMA 衔接通道
PAN1080 DMAC 硬件不支持,此参数无意义
source_data_size
DMA 源端数据宽度(字节)
PAN1080 DMAC 支持的源端数据宽度有 1、2、4 字节:
若 DMA 源端是 Memory,则此参数可以任意配置为上述 3 个可选参数之一
若 DMA 源端是 Peripheral,则此参数应与对应外设传输的 Data 宽度保持一致
dest_data_size
DMA 目的端数据宽度(字节)
PAN1080 DMAC 支持的目的端数据宽度有 1、2、4 字节:
若 DMA 目的端是 Memory,则此参数可以任意配置为上述 3 个可选参数之一
若 DMA 目的端是 Peripheral,则此参数应与对应外设传输的 Data 宽度保持一致
source_burst_length
DMA 源端 Burst 长度
PAN1080 DMAC 支持的源端 Burst 长度有 1、4、8 字节:
若 DMA 源端是 Memory,则此参数可以任意配置为上述 3 个可选参数之一
若 DMA 源端是 Peripheral,则此参数不应超过对应外设的 FIFO 深度大小
dest_burst_length
DMA 目的端 Burst 长度
PAN1080 DMAC 支持的目的端 Burst 长度有 1、4、8 字节:
若 DMA 目的端是 Memory,则此参数可以任意配置为上述 3 个可选参数之一
若 DMA 目的端是 Peripheral,则此参数不应超过对应外设的 FIFO 深度大小
block_count
DMA 待传输的 Block 数量
PAN1080 DMAC 不支持 Chaining Multi-Block 特性,所以此参数必须配置为1
source_peripheral_id
DMA 源端 Peripheral ID
当 DMA 源端被配置为 Peripheral 时(即 Peripheral-to-Memory 或 Peripheral-to-Peripheral 方式),此处用于指定对应外设的 Peripheral ID,PAN1080 所有支持 DMA 功能的外设 Periphal ID 定义详见:
include\drivers\dma\dma_panchip.h
dest_peripheral_id
DMA 目的端 Peripheral ID
当 DMA 目的端被配置为 Peripheral 时(即 Memory-to-Peripheral 或 Peripheral-to-Peripheral 方式),此处用于指定对应外设的 Peripheral ID,PAN1080 所有支持 DMA 功能的外设 Periphal ID 定义详见:
include\drivers\dma\dma_panchip.h
head_block
指向第一个 DMA Block 的配置参数
需要先定义一个 struct dma_block_config
类型的变量用于存放 Block 配置参数,然后将其指针赋给此 head_block
参数
user_data
DMA Callback 的用户数据,
此参数会作为函数参数传进 dma_callback
指向的函数中,作为用户数据使用,在实际应用中,如果没有特殊需求,建议直接将此参数配置为0即可
dma_callback
DMA Callback 函数的指针,
当 DMA 传输完成(或 Block 传输完成)后,会自动触发此参数指向的函数,在实际应用中,建议实现callback函数,以方便确认DMA传输成功
6 RAM/Flash资源使用情况
Memory region Used Size Region Size %age Used
FLASH: 62068 B 1020 KB 5.94%
SRAM: 26936 B 64 KB 41.10%
IDT_LIST: 0 GB 2 KB 0.00%