1、由编程手册可知DMA0_CH5对应USART1_RT,DMA0_CH6对应USART1_TX.

2、配置串口
void gd_eval_com_init(void)
{
/* enable GPIO & USART clock */
rcu_periph_clock_enable(RCU_GPIOA);//使能GPIO时钟
rcu_periph_clock_enable(RCU_USART1);//使能USART时钟
/* config GPIO, Rx as alternate function push-pull */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2);//输出
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ,GPIO_PIN_3);//输入
/* USART configure */
usart_deinit(USART1);
usart_baudrate_set(USART1,115200);
usart_word_length_set(USART1, USART_WL_8BIT);
usart_stop_bit_set(USART1, USART_STB_1BIT);
usart_parity_config(USART1, USART_PM_NONE);
usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
usart_receive_config(USART1, USART_RECEIVE_ENABLE);
//start uart
usart_enable(USART1);//使能USART
}
3、配置DMA0
void dma_config(void)
{
rcu_periph_clock_enable(RCU_DMA0);//开启时钟
/* ADC_DMA_channel configuration */
dma_parameter_struct dma_data_parameter;
/* ADC DMA_channel configuration */
dma_deinit(DMA0, DMA_CH5);
dma_struct_para_init(&dma_data_parameter);
/* initialize DMA single data mode */
dma_data_parameter.periph_addr = (uint32_t)(&USART_DATA(USART1));
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_data_parameter.memory_addr = (uint32_t)(receiver_buffer);
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_data_parameter.number = BUFFER_SIZE;
dma_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_init(DMA0, DMA_CH5, &dma_data_parameter);
dma_circulation_enable(DMA0, DMA_CH5);//使能
dma_deinit(DMA0, DMA_CH6);
dma_data_parameter.periph_addr = (uint32_t)(&USART_DATA(USART1));
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_data_parameter.memory_addr = (uint32_t)(transmitter_buffer);
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_data_parameter.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_data_parameter.number = BUFFER_SIZE;
dma_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_init(DMA0, DMA_CH6, &dma_data_parameter);
dma_circulation_disable(DMA0, DMA_CH6);//失能
usart_dma_receive_config(USART1, USART_DENR_ENABLE);
usart_dma_transmit_config(USART1, USART_DENT_ENABLE);
/* enable DMA channel */
dma_channel_enable(DMA0, DMA_CH5);
dma_channel_disable(DMA0, DMA_CH6);
}
4、main.c的while(1)
while(1)
{
/* 等待DMA传输完成 */
while (RESET == dma_flag_get(DMA0,DMA_CH5, DMA_FLAG_FTF));
/* 打印接收到的数据 */
printf("receiver_buffer = %s\n", receiver_buffer);
/* 清除DMA传输完成标志位 */
dma_flag_clear(DMA0,DMA_CH5, DMA_FLAG_FTF);
memset(receiver_buffer,0,sizeof(receiver_buffer));
}
5、串口打印
