GD32使用固件库通过DMA进行串口通信

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、串口打印

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值