参考《GD32F4xx 用户手册》
DMA 控制器由 4 部分组成:
AHB 从接口配置 DMA;
两个 AHB 主接口进行数据传输;
两个仲裁器进行 DMA 请求的优先级管理;
数据处理和计数。
DMA0对应外设
DMA1对应外设
下方示例
ADC采样,使用的是ADC0
通道分别是4,13,15
PA4 | ADC01_IN4 |
PC3 | ADC01_IN13 |
PC5 | ADC012_IN15 |
/* DMA singledata mode initialize struct */
/*
typedef struct
{
uint32_t periph_addr; /*!< peripheral base address 外设基址 */
uint32_t periph_inc; /*!< peripheral increasing mode 外设递增模式*/
uint32_t memory0_addr; /*!< memory 0 base address 存储0的基址 */
uint32_t memory_inc; /*!< memory increasing mode 存储递增模式 */
uint32_t periph_memory_width; /*!< transfer data size of peripheral 外设传输数据位宽*/
uint32_t circular_mode; /*!< DMA circular mode DMA循环模式 */
uint32_t direction; /*!< channel data transfer direction 数据通道传输方向*/
uint32_t number; /*!< channel transfer number 传输通道数量*/
uint32_t priority; /*!< channel priority level 通道优先级*/
} dma_single_data_parameter_struct;
*/
void dma_config(void)
{
/* ADC_DMA_channel configuration */
dma_single_data_parameter_struct dma_single_data_parameter;
/* ADC_DMA_channel deinit */
dma_deinit(DMA1,DMA_CH0);
/* initialize DMA single data mode */
dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_SYNCDATA);
dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_single_data_parameter.memory0_addr = (uint32_t)(adc_value);
dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_32BIT;
dma_single_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE;
dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;
dma_single_data_parameter.number = 2;
dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_single_data_mode_init(DMA1,DMA_CH0,&dma_single_data_parameter);
/* DMA channel 0 peripheral select */
dma_channel_subperipheral_select(DMA1,DMA_CH0,DMA_SUBPERI0);
/* enable DMA channel */
dma_channel_enable(DMA1,DMA_CH0);
}