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

这篇具有很好参考价值的文章主要介绍了GD32F30x系列---串口通信(USART)基础配置(中断接收模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GD32F30x系列USART数据帧可以通过全双工或半双工、同步或异步进行传输,且支持DMA功能,目前我们这里先不使用DMA,下一节再使用DMA与其对比。
其他的原理与解析就不再赘述,大家可以自行搜索相关资料,要多看数据手册。
1、创建一个usart.c文件和usart.h文件到对应的文件夹中,如下图所示:
gd32串口中断收发程序,GD32F30x开发,mcu,单片机,c语言
将usart.c文件和gd32f30x_usart.c、gd32f30x_misc.c库文件添加到项目工程中,如下图所示:
gd32串口中断收发程序,GD32F30x开发,mcu,单片机,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”,连接好硬件板和电脑后,编译下载程序到硬件板中,点击调试运行,如下图所示:
gd32串口中断收发程序,GD32F30x开发,mcu,单片机,c语言
4、连接好电脑的串口工具和硬件板,并打开串口调试工具,运行程序即可接收到程序发送出来的字符串,如下图所示:
gd32串口中断收发程序,GD32F30x开发,mcu,单片机,c语言
5、使用电脑的串口助手发送字符串到硬件板,设置断点查看接收的数据是否正确,如下图所示:
gd32串口中断收发程序,GD32F30x开发,mcu,单片机,c语言
数据发送完成后设置断点,查看到当前systick为2114,如下图所示:
gd32串口中断收发程序,GD32F30x开发,mcu,单片机,c语言
我们的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;
}

这里我们可以看到效果与之前的代码是一样的,如下图所示:
gd32串口中断收发程序,GD32F30x开发,mcu,单片机,c语言文章来源地址https://www.toymoban.com/news/detail-529863.html

到了这里,关于GD32F30x系列---串口通信(USART)基础配置(中断接收模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F4X USART串口使用

    串口是MCU与外部通信的重要通信接口,也是MCU在开发过程中的调试利器。串口通信有几个重要的参数,分别是波特率、起始位、数据位、校验位。双方在进行串口通信前必须要约定好通信的参数,否则会导致通信失败。 起始位是自动产生,无需配置,通常是产生一个低电平为

    2024年02月11日
    浏览(60)
  • GD32F103串口DMA收发(空闲中断 + DMA)

    GD32F103串口DMA收发(空闲中断 + DMA) 代码如下:

    2024年02月12日
    浏览(48)
  • 「STM32入门」USART串口通信

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 本文将介绍USART  概念解释 TX、RX分别是Transmit和Receive的缩写,代表发送、接受数据 全双工的含义是发送线路和接受线路互不影响,可以同时进

    2024年02月06日
    浏览(48)
  • GD32F103 硬件SPI通信

    SPI既可以做主机也可以做从机。 当做主机时。MOSI,SCK,CS都是作为输出。 而作为从机时。MOSI,SCK,CS都是作为输入。  所以SPI的硬件电路应该实现这样的功能。 1. GD32框图 如下图做主机的数据流向:   如下图做从机的数据流向:    2. STM32框图  通过一些寄存器的配置来控制

    2024年02月02日
    浏览(43)
  • STM32CubeMX实现USART串口通信

    硬件:stm32f103c8t6核心板 软件:STM32CubeMX 6.6.1 keil5 mdk 这里就不再详细介绍了,详细请参考上一篇博客: https://blog.csdn.net/qq_55894922/article/details/127232999?spm=1001.2014.3001.5501 若点击 Manage embedded software packages 后,出现失败,则需要随便点击其它任一选项,进行下载一些文件,比如点

    2023年04月17日
    浏览(56)
  • STM32入门学习之USART串口通信:

    1.串口通信简介:通用异步收发传输器UART(Universal Asynchronous Receiver/Transmitter)是负责处理数据总线和串口之间的串/并通信的设备。UART通信规定了数据帧的格式:起始位、数据位、校验位、停止位等。UART异步通信只需要通信双方设置好数据帧的格式和波特率即可完成通信。因为

    2024年02月16日
    浏览(48)
  • gd32f103vbt6 串口OTA升级5-combin部分

    本文主要是bin文件的组成进行一些简单介绍,方便理解升级的过程。 2.1 rk3399cpu+gd32f103 2.2 连接方式:串口(115200,8N1)或者iic(本文没有介绍iic) 3.1 单片机端分两个部分:iap(用于升级)和app(自己的应用)部分(这两个部分本文不做介绍)。 3.2 linux端做一个升级的app软件

    2024年02月16日
    浏览(56)
  • STM32F103RCT6 -- 基于FreeRTOS 的USART1 串口通讯

    使用 FreeRTOS 提供的队列(Queue)机制来实现数据的接收和发送 TX - PA9 RX - PA10 波特率:9600 数据位:8bit 校验位:无 停止位:1bit 数据格式: RX: 55 AA 06 00 06 31 02 24 01 FC 80 TX: 55 AA 06 00 06 32 01 24 01 B8 70 55 AA – 帧头 06 - 数据字节数,不包括帧头,不包括校验位 00 06 – 模块 31 02 24

    2024年02月16日
    浏览(48)
  • stm32中常见的通信协议之USART(串口)

    USART是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收。 串口的通信速度用波特率来表示,其单位为bps(bit per second)即每秒钟传送bit的数量。 串口规定,数据线在空闲的状态下,必须是置为高电平的状态。 起始信号为低电平,因为串口

    2023年04月08日
    浏览(49)
  • gd32f103vbt6 串口OTA升级3-linux端的部分

    本文主要是对linux端升级单片机程序的功能部分做一些介绍,包括一些软件流程。 2.1 rk3399cpu+gd32f103 2.2 连接方式:串口(115200,8N1)或者iic(本文没有介绍iic) 3.4.1  0 ~(0x5c00-1) : iap程序区,用于存放iap程序 3.4.2  0x5c00~(0x6000-1) : 这个1k用于存放一些标志位,以及程序的

    2024年02月17日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包