GD32 DMA串口接收发送

  • GD32 DMA串口接收

简介:GD32其实跟STM32差不多,有些程序简直可以在两个单片机上直接运行,但用GD32的库函数貌似比STM32的库函数比较复杂(可能是因为刚接触所以很多都没了解到,不熟悉),最近用到了串口DMA发送,但看官方的DEMO又没写得很仔细,就上网搜索了一下并记录下来。由于只用到的串口的DMA发送,并没有用到接收,所以本文只有发送,接收以后有空再补上。

①先确认所用串口发送是属于哪个DMA和哪一个通道

GD32 DMA串口接收发送_第1张图片
GD32 DMA串口接收发送_第2张图片

在这个工程中,我用的是串口2,所以应该发送对应的是DMA0的CH1,这一步是十分重要的,要是设置错误就白做了。

②初始化相对应的串口

这部分就略过了,串口初始化都差不多。

③初始化相对应的DMA通道

需要注意的是千万别忘了使能对应时钟!

其中USART2_DATA_ADDRESS指的是串口2存要发送数据的寄存器的地址,我用的单片机型号是GD32f103C8

#define USART2_DATA_ADDRESS      ((USART_BASE+(0x00000400U))+ (0x00000004U))
void uart2_dma_txinit(void)     
{     
		dma_parameter_struct dma_init_struct;
	
		/* enable DMA1 */
		rcu_periph_clock_enable(RCU_DMA0);
		dma_struct_para_init(&dma_init_struct);
		dma_deinit(DMA0, DMA_CH1);
		
		dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;//设置方向
        dma_init_struct.memory_addr = NULL;
        dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
        dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
        dma_init_struct.number = 0;
        dma_init_struct.periph_addr = USART2_DATA_ADDRESS;   //外设地址
        dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
        dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
        dma_init(DMA0, DMA_CH1, &dma_init_struct);
	
		/* configure DMA mode */
		dma_circulation_disable(DMA0, DMA_CH1);
		dma_memory_to_memory_disable(DMA0, DMA_CH1);
}

④编写DMA发送函数

void usart2_dma_send(uint8_t *buffer,uint16_t len)
{
	dma_channel_disable(DMA0, DMA_CH1);
	
	dma_memory_address_config(DMA0, DMA_CH1,(uint32_t)buffer);//设置要发送数据的内存地址
	dma_transfer_number_config(DMA0, DMA_CH1,len);//一共发多少个数据
	
	dma_channel_enable(DMA0, DMA_CH1);
	
  	usart_dma_transmit_config(UART_UART, USART_DENT_ENABLE);//使能串口DMA发送
	while(RESET == dma_flag_get(DMA0, DMA_CH1, DMA_FLAG_FTF));
}
	while(RESET == dma_flag_get(DMA0, DMA_CH1, DMA_FLAG_FTF));
}

你可能感兴趣的:(单片机)