bsp_dma.h
#ifndef __BSP_DMA_H
#define __BSP_DMA_H
#include "gd32e10x.h"
#define USART_RX_DMA DMA0
#define USART_RX_DMA_CHANNEL DMA_CH5
#define USART_RX_DMA_CLOCK RCU_DMA0
#define USART_DR_ADDRESS (USART1+0x04)
void USART_RX_DMA_Config(uint8_t* Memory_Base_Address,uint8_t Transfer_Number);
#endif
bsp_dma.c
#include "bsp_dma.h"
/*!
\brief 配置DMA0_CHl5,这样USART2_Rx就能发出这个通道的DMA请求
\param[in] Transfer_Number: 需要传输的数据个数
\param[out] Memory_Base_Address:存储器的首地址
\retval none
*/
void USART_RX_DMA_Config(uint8_t* Memory_Base_Address,uint8_t Transfer_Number)
{
dma_parameter_struct dma_init_struct;
rcu_periph_clock_enable(USART_RX_DMA_CLOCK);
dma_init_struct.periph_addr=USART_DR_ADDRESS;
dma_init_struct.periph_width=DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.memory_addr=(uint32_t)Memory_Base_Address;
dma_init_struct.memory_width=DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.number=Transfer_Number;
dma_init_struct.priority=DMA_PRIORITY_ULTRA_HIGH;
dma_init_struct.periph_inc=DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc=DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.direction=DMA_PERIPHERAL_TO_MEMORY;
dma_circulation_disable(USART_RX_DMA, USART_RX_DMA_CHANNEL);
dma_init(USART_RX_DMA, USART_RX_DMA_CHANNEL, &dma_init_struct);
dma_channel_enable(USART_RX_DMA, USART_RX_DMA_CHANNEL);
}
main.c
uint8_t dma_receive_data[20];
//uint8_t dma_receive_data_element_index=0;
void test_dma(void)
{
USART_TX_GPIO_Config();
USART_RX_GPIO_Config();
MAX485_EN_GPIO_Config();
USART_Config();
usart_interrupt_disable(DEBUG_USARTx, USART_INT_RBNE);
USART_RX_DMA_Config(dma_receive_data,8);
gpio_bit_set(MAX485_EN_GPIO_PORT,MAX485_EN_GPIO_PIN);
USART_SendArray(ay,8);
gpio_bit_reset(MAX485_EN_GPIO_PORT,MAX485_EN_GPIO_PIN);
usart_dma_receive_config(DEBUG_USARTx,USART_DENR_ENABLE);
}