GD32F30x系列---串口通信(USART)基础配置(中断接收模式)

GD32F30x系列USART数据帧可以通过全双工或半双工、同步或异步进行传输,且支持DMA功能,目前我们这里先不使用DMA,下一节再使用DMA与其对比。
其他的原理与解析就不再赘述,大家可以自行搜索相关资料,要多看数据手册。
1、创建一个usart.c文件和usart.h文件到对应的文件夹中,如下图所示:
在这里插入图片描述
将usart.c文件和gd32f30x_usart.c、gd32f30x_misc.c库文件添加到项目工程中,如下图所示:
在这里插入图片描述
2、实现串口的初始化,以及串口发送数据,串口中断接收。–这里我们以USART2为例进行初始化和数据接收与发送。

//usart.c文件

#include "usart.h"

uint8_t g_usart_recv_data[100];//用来保存串口接收到的数据,暂时只缓存100个
uint16_t g_usart_recv_count=0;//用来保存当前串口接收到的数据个数

/*
	串口初始化--中断模式
	这里以USART2为例,
*/
void gd32_usart_init(void)
{
	usart_deinit(USART2);
	usart_disable(USART2);
	rcu_periph_clock_enable(RCU_GPIOB);
	rcu_periph_clock_enable(RCU_USART2);//使能时钟
	/* connect port to USARTx_Tx */
	gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);//IO口复用

	/* connect port to USARTx_Rx */
	gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);//IO口配置
	nvic_irq_enable(USART2_IRQn,1,0);//中断配置
	
	usart_interrupt_enable(USART2,USART_INT_RBNE);//接收中断
	usart_baudrate_set(USART2,38400);//波特率设置
	usart_parity_config(USART2,USART_PM_NONE);//校验位设置
	usart_word_length_set(USART2,USART_WL_8BIT);//数据位设置
	usart_stop_bit_set(USART2,USART_STB_1BIT);//停止位设置
	usart_hardware_flow_rts_config(USART2, USART_RTS_DISABLE);//
    usart_hardware_flow_cts_config(USART2, USART_CTS_DISABLE);//硬件l流控设置
	usart_data_first_config(USART2,USART_MSBF_LSB);//发送模式--LSB
	usart_transmit_config(USART2,USART_TRANSMIT_ENABLE);//发送使能
	usart_receive_config(USART2,USART_RECEIVE_ENABLE);//接收使能
	usart_enable(USART2);//使能串口
}

/*
	USART2 串口发送数据
	p_buff 要发送的数据数组
	data_len 发送的数据长度
*/
void gd32_usart_send(uint8_t *p_buff,uint32_t data_len)
{
	uint32_t i = 0;
	while(data_len--)
	{
		usart_data_transmit(USART2,p_buff[i]);
		while(usart_flag_get(USART2,USART_FLAG_TBE) == RESET);
		i++;		
    }
}

/*
	串口接收中断函数
*/
void USART2_IRQHandler(void)
{
	if(usart_interrupt_flag_get(USART2,USART_INT_FLAG_ERR_ORERR) != RESET
	||usart_interrupt_flag_get(USART2,USART_INT_FLAG_ERR_NERR) != RESET
	||usart_interrupt_flag_get(USART2,USART_INT_FLAG_ERR_FERR) != RESET)
	{
		usart_interrupt_flag_clear(USART2,USART_INT_FLAG_ERR_ORERR);
		usart_interrupt_flag_clear(USART2,USART_INT_FLAG_ERR_NERR);
		usart_interrupt_flag_clear(USART2,USART_INT_FLAG_ERR_FERR);
		return;
	}
	
	if(g_usart_recv_count>=100)
	{
		g_usart_recv_count = 0;
	}
	
	if(usart_interrupt_flag_get(USART2,USART_INT_FLAG_RBNE) != RESET)
	{
		usart_interrupt_flag_clear(USART2,USART_INT_FLAG_RBNE);
		g_usart_recv_data[g_usart_recv_count++] = (uint8_t)usart_data_receive(USART2);
	}
	
}

//usart.h文件
#ifndef  __USART_H__
#define  __USART_H__

#include "gd32f30x.h"

void gd32_usart_init(void);
void gd32_usart_send(uint8_t *p_buff,uint32_t data_len);

#endif

3、在main.c文件的main函数中调用串口的初始化,并循环调用串口发送,这里循环1S发送字符“1234567890”,连接好硬件板和电脑后,编译下载程序到硬件板中,点击调试运行,如下图所示:
在这里插入图片描述
4、连接好电脑的串口工具和硬件板,并打开串口调试工具,运行程序即可接收到程序发送出来的字符串,如下图所示:
在这里插入图片描述
5、使用电脑的串口助手发送字符串到硬件板,设置断点查看接收的数据是否正确,如下图所示:
在这里插入图片描述
数据发送完成后设置断点,查看到当前systick为2114,如下图所示:
在这里插入图片描述
我们的systick是1ms中断一次,即1ms当前的systick增加1,因此连续发送200字节的数据消耗CPU的时间为2114-2058=56ms的时间。后续我们在使用DMA发送来验证一下需要多少时间。

注:这里再拓展一个小知识,就是我们之前每1S发送一次数据使用的是delay_1ms(1000)函数,这个函数的话CPU是一直在等待时间到达的,并没有去处理其他的事情(除了中断),这里我们可以使用systick,来实现1S发送一次数据,但是CPU不用一直等待而可以去执行其他的事情,这对软件开发来说是可以大大提高CPU的利用率的,而且正常的软件开发中,非特殊需要都不会使用delay_1ms()这种一直等待函数。
直接在main函数中实现即可,后续有这种延时的需求也可以使用这种方式,例如LED闪烁等。

int main(void)
{
	uint32_t usart_delay_time=0;
	systick_config();
	gd32_gpio_init();
	gd32_usart_init();
	while(1) 
	{
		uint8_t data[]="1234567890";
		if(systick_distance_get(usart_delay_time)>1000)
		{
			gd32_usart_send(data,sizeof(data));
			usart_delay_time = systick_get();
		}
	}
	return 0;
}

这里我们可以看到效果与之前的代码是一样的,如下图所示:
在这里插入图片描述

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 首先需要在NVIC中使能USART中断。具体步骤如下: 1.定义一个NVIC_InitTypeDef类型的结构体变量,用于配置NVIC。 ``` NVIC_InitTypeDef NVIC_InitStructure; ``` 2.配置NVIC,使能USART中断。 ``` NVIC_InitStructure.NVIC_IRQChannel = USARTx_IRQn; //USARTx为你所使用的串口,例如USART1 NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` 3.在USART中断处理函数中处理数据。 ``` void USARTx_IRQHandler(void) { if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET) //判断是否接收到数据 { //处理接收到的数据 USART_ClearITPendingBit(USARTx, USART_IT_RXNE); //清除中断标志位 } } ``` 其中,USART_GetITStatus()函数用于判断是否接收到数据,USART_ClearITPendingBit()函数用于清除中断标志位,防止多次进入中断。 ### 回答2: 要使能GD32微控制器的USART中断,需要以下步骤: 1. 配置USART参数:首先,需要配置USART的通信参数,如波特率、数据位、停止位等。可以通过设置USART相应寄存器来实现,如USART_CTL0和USART_BAUD。 2. 使能USART时钟和引脚:在使用USART之前,需要通过RCC_AHBxClock_Enable()函数使能时钟,以及配置相应的引脚作为USART的数据收发引脚。 3. 配置中断:使能USART接收和发送中断,可以通过设置USART_CTL0寄存器中的相应位来实现。例如,通过设置USART_CTL0 Bit 5(RXIEN)和Bit 7(TXIEN)分别使能接收和发送中断。 4. 编写中断处理函数:编写适当的中断处理函数来处理接收和发送中断。可以使用USART_ISR()函数来检查中断源,并根据接收和发送状态进行相应的处理。在处理完中断后,需要清除相关的标志位,以确保正确的中断处理。 5. 使能全局中断:最后,在主程序中使能全局中断,以确保使能中断的正常运行。可以使用__enable_irq()函数来使能全局中断。 以上就是使能GD32微控制器的USART中断的步骤。根据具体的应用需求,可以根据上述步骤进行相应的配置和编程。 ### 回答3: 要使能GD32USART中断,首先需要进行以下几个步骤: 1. 启用USART外设的时钟:在使能USART中断之前,必须先确保USART外设的时钟已启用。通常,可以使用RCC_ClkInitStruct结构体来配置USART的时钟源并使能时钟。 2. 配置USART的参数:设置USART的波特率、数据位、停止位、校验位等参数。可以通过USART_Init函数来实现。 3. 配置中断优先级:使用NVIC_Init函数配置USART相关中断的优先级。可以根据需求设置不同的优先级。 4. 使能中断:使用USART_ITConfig函数来使能或禁止指定的USART中断。可以通过传递参数USART_IT_RXNE来使能接收中断,或传递USART_IT_TXE来使能发送中断等。 5. 编写中断服务函数:根据需要,编写相应的USART中断服务函数。例如,可以在接收中断服务函数中处理接收到的数据,或在发送中断服务函数中发送数据。 6. 在主函数中开启中断:在主函数中,调用NVIC_EnableIRQ函数来开启USART所使用的中断。这样,当满足中断触发条件时,相关的中断服务函数将被调用。 需要注意的是,除了以上步骤外,还需要根据具体的GD32系列芯片和使用的开发环境进行相应的配置和适配。具体的配置方法可以参考GD32系列芯片的技术手册和开发环境的相关文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小吴同学啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值