GD32F4xx系列的串口收发的基础配置

GD32F4xx系列的串口收发的基础配置:(这里主要是以中断模式为例)
原理就不赘述了,网上资料很多,这里直接进行配置和测试。
1,首先添加GD32F4xx的串口外设库函数文件以及中断配置库函数文件到工程中。
在这里插入图片描述
2,新建2个文件,一个为uart.c 用来做串口的初始化配置。 一个为gd32f4xx_it.c用来管理串口接收中断以及接收数据处理。将两个文件添加至工程中。
在这里插入图片描述
3,进行串口的初始化配置以及串口接收中断处理。(这里以USART1为例,波特率9600)

//uart.c
//串口初始化
int32_t uart_init(void)
{
	usart_deinit(USART1);
	usart_disable(USART1);//禁用串口
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_USART1);//使能时钟
	gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_2|GPIO_PIN_3);
	gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2|GPIO_PIN_3);
	gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2|GPIO_PIN_3);//USART1对应MCU的GPIOA 的PIN2和PIN3,这里对该引脚进行复用功能设置
	nvic_irq_enable(USART1_IRQn,5,0);//配置中断

	usart_interrupt_enable(USART1,USART_INT_RBNE);	//使能中断	
	usart_baudrate_set(USART1,9600);//设置波特率
	usart_parity_config(USART1,USART_PM_NONE);//无校验
	usart_word_length_set(USART1,USART_WL_8BIT);//8位数据
	usart_stop_bit_set(USART1,USART_STB_1BIT);//1个停止位
	usart_hardware_flow_coherence_config(USART1,USART_HCM_NONE);//无硬件流控
	
	usart_transmit_config(USART1,USART_TRANSMIT_ENABLE);//发送使能
	usart_receive_config(USART1,USART_RECEIVE_ENABLE);//接收使能
	
	usart_data_first_config(USART1,USART_MSBF_LSB);//LSB模式
	usart_enable(USART1);//使能串口
    return 0;
}

//串口发送
int32_t uart_send(uint8_t *data,uint32_t len) 
{
    uint32_t i = 0;
	while(len--)
	{
		usart_data_transmit(USART1,data[i]);
		while(usart_flag_get(USART1,USART_FLAG_TBE) == RESET);
		i++;		
    }
	return 0;
}

//关闭串口
int32_t uart_stop(void)
{
    usart_disable(USART1);
    return 0;
}

gd32f4xx_it.c
uin8_t  g_serial_recv_buf[256];
UInt16_t g_recv_positin=0;
//串口接收中断
void USART1_IRQHandler(void)
{
	if( g_recv_positin >= sizeof(g_serial_recv_buf) ) 
    {   
        memset(g_serial_recv_buf,0,sizeof(g_serial_recv_buf));
        g_recv_positin = 0;
    }
	if(usart_interrupt_flag_get(USART1,USART_INT_FLAG_ERR_ORERR) != RESET)
	{
		usart_interrupt_flag_clear(USART1,USART_INT_FLAG_ERR_ORERR);
	}
	if(usart_interrupt_flag_get(USART1,USART_INT_FLAG_RBNE) != RESET)
	{
		usart_interrupt_flag_clear(USART1,USART_INT_FLAG_RBNE);
		g_serial_recv_buf[g_recv_positin++] = usart_data_receive(USART1);
	}
	if(usart_interrupt_flag_get(USART1,USART_INT_FLAG_TBE) != RESET)
	{
		usart_interrupt_flag_clear(USART1,USART_INT_FLAG_TBE);
	}
}

4,在main函数中进行初始化以及循环调用发送。
在这里插入图片描述
5,连接好串口和MCU,使用串口工具设置波特率9600 和相关配置与MCU串口初始化一致,打开串口工具可以接收到MCU发送过来的数据。
在这里插入图片描述
MCU发送的数据与串口工具接受的数据一致,修改MCU发送的数据,发现串口工具接收的数据也变化成修改后的数据。
在这里插入图片描述
说明串口发送配置成功。
6,使用串口工具给MCU发送数据。
使用串口工具发送一个字节hex数据,使用调试模式查看MCU接收到的数据,对比串口发送的数据与MCU接收的数据一致。
在这里插入图片描述
使用串口发送多字节数据,查看MCU接收数据是否正确
在这里插入图片描述
串口接收与发送数据均正常
注:若出现MCU串口接收数据与发送数据功能正常,但是发送数据与接收的数据不对或出现乱码现象,基本可确定为系统时钟配置的问题,系统时钟选择或者外部晶振选择错误。调整好使用的时钟和晶振即可解决。

串口发送测试:(这里做一下串口连续发送数据所占用MCU时间的测试与后续使用DMA进行数据传输进行对比);
程序先运行到发送数据之前,当前的系统时钟大约运行7ms 左右
在这里插入图片描述
连续发送100个字节的数据,发送完成后当前的系统时间为110ms,说明串口连续发送100字节数据消耗MCU 110-7=103ms的时间,平均发送一个字节需要消耗1ms的时间。(这里是以波特率9600为例,当然波特率越高发送数据越快占用的时间也越少,但波特率高误码率也相对较高)
在这里插入图片描述
后续可看下使用DMA的方式传输数据。

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
gd32f4是华大基于ARM Cortex-M4核心开发的一款微控制器系列串口DMA收发是指使用DMA(直接内存访问)功能实现串口通讯数据的接收和发送。 gd32f4系列微控制器内部拥有多个UART串口,配有DMA控制器用于数据的传输。使用串口DMA收发的好处是能够实现高效率的数据传输,减轻CPU的负担,提高系统的实时性。 首先,要使用串口DMA收发,需要先配置UART串口和DMA的相关寄存器。通过设置串口的波特率、数据位、停止位等参数,以及使能DMA收发功能,使得串口能够通过DMA控制器进行数据的传输。 在接收数据时,可以通过DMA设置接收缓冲区的地址和大小,并配置正确的接收模式(循环模式或单次模式)。当串口接收到数据时,DMA控制器会将数据直接传输到指定的接收缓冲区,无需CPU的干预。 在发送数据时,同样需要设置DMA发送缓冲区的地址和大小,并配置正确的发送模式。通过设置发送缓冲区的地址和大小,DMA控制器能够直接从指定的发送缓冲区读取数据,并通过串口发送出去,也无需CPU的干预。 当DMA传输完成后,可以通过相应的中断或状态位检测传输的结果,以便做出相应的操作,比如继续发送或接收数据。 串口DMA收发能够大大提高系统的数据传输效率,减少CPU的负担,提高系统的实时性。在使用gd32f4进行串口DMA收发时,需要正确配置相关寄存器和检测传输的状态,以确保数据的可靠传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴同学啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值