6.3. 应用示例¶
6.3.1. 内存到内存传输¶
GX_DMA_AHB_CH_CONFIG dma_config = {0};
int channel = gx_dma_select_channel();
if(channel == -1)
return -1;
dma_config.trans_width = GX_DMA_AHB_TRANS_WIDTH_8;
dma_config.flow_ctrl = GX_DMA_AHB_TT_FC_MEM_TO_MEM_DMAC;
dma_config.src_msize = GX_DMA_AHB_BURST_TRANS_LEN_8;
dma_config.src_addr_update = GX_DMA_AHB_CH_CTL_L_INC;
dma_config.src_master_select = GX_DMA_AHB_MASTER_3;
dma_config.dst_addr_update = GX_DMA_AHB_CH_CTL_L_INC;
dma_config.dst_msize = GX_DMA_AHB_BURST_TRANS_LEN_8;
dma_config.dst_master_select = GX_DMA_AHB_MASTER_3;
if(gx_dma_xfer_poll(dst, (void *)src, count, channel, &dma_config) != 0)
return -1;
6.3.2. 读外设数据¶
GX_DMA_AHB_CH_CONFIG dma_config = {0};
int dma_channel;
dma_channel = gx_dma_select_channel();
if (dma_channel < 0) {
return -1;
}
dma_config.trans_width = GX_DMA_AHB_TRANS_WIDTH_8;
/* dma source config */
dma_config.src_addr_update = GX_DMA_AHB_CH_CTL_L_NOINC;
dma_config.src_hs_select = GX_DMA_AHB_HS_SEL_HW;
dma_config.src_master_select = GX_DMA_AHB_MASTER_2;
dma_config.src_msize = GX_DMA_AHB_BURST_TRANS_LEN_8;
dma_config.src_hs_per = DMA_HS_PRE_FLASH_SPI_RX;
/* dma destination config */
dma_config.dst_addr_update = GX_DMA_AHB_CH_CTL_L_INC;
dma_config.dst_hs_select = GX_DMA_AHB_HS_SEL_HW;
dma_config.dst_master_select = GX_DMA_AHB_MASTER_3;
dma_config.dst_msize = GX_DMA_AHB_BURST_TRANS_LEN_32;
dma_config.dst_hs_per = 0;
dma_config.flow_ctrl = GX_DMA_AHB_TT_FC_PER_TO_MEM_DMAC;
// gx_dcache_invalid_range((unsigned int *)data, len);
gx_dma_xfer((void *)data, (void *)DISP_SPIM_RXDR_LE,len, dma_channel, &dma_config);
gx_dma_wait_complete(dma_channel);
6.3.3. 写外设数据¶
GX_DMA_AHB_CH_CONFIG dma_config = {0};
int dma_channel;
dma_channel = gx_dma_select_channel();
if (dma_channel < 0) {
return -1;
}
dma_config.trans_width = GX_DMA_AHB_TRANS_WIDTH_8;
/* dma source config */
dma_config.src_addr_update = GX_DMA_AHB_CH_CTL_L_INC;
dma_config.src_hs_select = GX_DMA_AHB_HS_SEL_HW;
dma_config.src_master_select = GX_DMA_AHB_MASTER_3;
dma_config.src_msize = GX_DMA_AHB_BURST_TRANS_LEN_32;
dma_config.src_hs_per = 0;
/* dma destination config */
dma_config.dst_addr_update = GX_DMA_AHB_CH_CTL_L_NOINC;
dma_config.dst_hs_select = GX_DMA_AHB_HS_SEL_HW;
dma_config.dst_master_select = GX_DMA_AHB_MASTER_2;
dma_config.dst_msize = GX_DMA_AHB_BURST_TRANS_LEN_8;
dma_config.dst_hs_per = DMA_HS_PRE_FLASH_SPI_TX;
dma_config.flow_ctrl = GX_DMA_AHB_TT_FC_MEM_TO_PER_DMAC;
// gx_dcache_clean_range((unsigned int *)data, len);
gx_dma_xfer((void *)DISP_SPIM_TXDR_LE, (void *)data,len, dma_channel, &dma_config);
gx_dma_wait_complete(dma_channel);