GD32F103学习笔记(7)——USART串口使用

发布者:BlissfulJourney最新更新时间:2025-02-26 来源: elecfans关键字:GD32F103  USART  串口使用 手机看文章 扫描二维码
随时随地手机看文章

一、简介

通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter) 是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART 就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。

USART 满足外部设备对工业标准 NRZ 异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。USART 支持同步单向通信和半双工单线通信;还支持局域互连网络 LIN、智能卡(SmartCard)协议与 lrDA(红外线数据协会) SIR ENDEC 规范。

USART 在 GD32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。

USART 支持 DMA 功能,以实现高速率的数据通信,除了 UART4。

二、API说明

以下 USART 接口位于 GD32F10x_Firmware_Library_V2.2.2FirmwareGD32F10x_standard_peripheralIncludegd32f10x_usart.h。

2.1 usart_deinit

功能复位外设USART/UART
函数定义void usart_deinit(uint32_t usart_periph)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
返回

2.2 usart_baudrate_set

功能配置USART/UART波特率
函数定义void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
baudval:波特率值
返回

2.3 usart_word_length_set

功能配置USART/UART字长
函数定义void usart_word_length_set(uint32_t usart_periph, uint32_t wlen)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
wlen:配置USART字长
返回

wlen:配置USART字长,详细列表如下:

含义
USART_WL_8BIT8bits
USART_WL_9BIT9bits

2.4 usart_stop_bit_set

功能配置USART/UART停止位
函数定义void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
stblen:配置USART停止位
返回

stblen:配置USART停止位,详细列表如下:

含义
USART_STB_1BIT1bit
USART_STB_0_5BIT0.5bit,该位对UARTx(x=3,4)无效
USART_STB_2BIT2bit
USART_STB_1_5BIT1.5bit,该位对UARTx(x=3,4)无效

2.5 usart_parity_config

功能配置USART/UART奇偶校验
函数定义void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
paritycfg:配置USART奇偶校验
返回

paritycfg:配置USART奇偶校验,详细列表如下:

含义
USART_PM_NONE无校验
USART_PM_ODD奇校验
USART_PM_EVEN偶校验

2.6 usart_hardware_flow_rts_config

功能配置USART RTS硬件控制流
函数定义void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
rtsconfig:使能/除能RTS
返回

rtsconfig:使能/除能RTS,详细列表如下:

含义
USART_RTS_ENABLE使能RTS
USART_RTS_DISABLE除能RTS

2.7 usart_hardware_flow_cts_config

功能配置USART CTS硬件控制流
函数定义void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
ctsconfig:使能/除能CTS
返回

ctsconfig:使能/除能CTS,详细列表如下:

含义
USART_CTS_ENABLE使能CTS
USART_CTS_DISABLE除能CTS

2.8 usart_transmit_config

功能USART/UART发送器配置
函数定义void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
txconfig:使能/失能USART发送器
返回

txconfig:使能/失能USART发送器,详细列表如下:

含义
USART_TRANSMIT_ENABLE使能USART发送
USART_TRANSMIT_DISABLE失能USART发送

2.9 usart_receive_config

功能USART/UART接收器配置
函数定义void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
rxconfig:使能/失能USART接收器
返回

rxconfig:使能/失能USART接收器,详细列表如下:

含义
USART_RECEIVE_ENABLE使能USART接收
USART_RECEIVE_DISABLE失能USART接收

2.10 usart_enable

功能使能USART/UART
函数定义void usart_enable(uint32_t usart_periph)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
返回

2.11 usart_data_transmit

功能USART/UART发送数据功能
函数定义void usart_data_transmit(uint32_t usart_periph, uint16_t data)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
data:发送的数据
返回

2.12 usart_data_receive

功能USART/UART接收数据功能
函数定义uint16_t usart_data_receive(uint32_t usart_periph)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
返回接收的数据

2.13 usart_interrupt_enable

功能使能USART中断
函数定义void usart_interrupt_enable(uint32_t usart_periph, uint32_t int_flag)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
int_flag:USART中断标志
返回

int_flag:USART中断标志,详细列表如下:

含义
USART_INT_PERR校验错误中断
USART_INT_TBE发送缓冲区空中断
USART_INT_TC发送完成中断
USART_INT_RBNE读数据缓冲区非空中断和过载错误中断
USART_INT_IDLE空闲线检测中断
USART_INT_LBDLIN断开信号检测中断
USART_INT_CTSCTS中断
USART_INT_ERR错误中断

2.14 usart_flag_get

功能获取USART状态寄存器标志位
函数定义FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
flag:USART标志位
返回SET或RESET

flag:USART标志位,详细列表如下:

含义
USART_FLAG_CTSFCTS变化标志
USART_FLAG_LBDFLIN断开检测标志
USART_FLAG_TBE发送数据缓冲区空
USART_FLAG_TC发送完成
USART_FLAG_RBNE读数据缓冲区非空
USART_FLAG_IDLEF空闲线检测标志
USART_FLAG_ORERR溢出错误
USART_FLAG_NERR噪声错误标志
USART_FLAG_FERR帧错误标志
USART_FLAG_PERR校验错误标志

2.15 usart_interrupt_flag_get

功能获取USART中断标志位状态
函数定义FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, uint32_t int_flag)
参数usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
int_flag:USART中断标志
返回SET或RESET

int_flag:USART中断标志,详细列表如下:

含义
USART_INT_FLAG_PERR校验错误中断和标志
USART_INT_FLAG_TBE发送缓冲区空中断和标志
USART_INT_FLAG_TC发送完成中断和标志
USART_INT_FLAG_RBNE读数据缓冲区非空中断和标志
USART_INT_FLAG_RBNE_ORERR读数据缓冲区非空中断和过载错误中断标志
USART_INT_FLAG_IDLE空闲线检测中断和标志
USART_INT_FLAG_LBDLIN断开检测中断和标志
USART_INT_FLAG_CTSCTS中断和标志
USART_INT_FLAG_ERR_ORERR错误中断和过载错误
USART_INT_FLAG_ERR_NERR错误中断和噪声错误标志
USART_INT_FLAG_ERR_FERR错误中断和镇错误标志

三、USART收发通信

3.1 引脚分布

总线APB2总线APB1总线APB1总线APB1总线APB1总线
引脚USART0USART1USART2UART3UART4
TXPA9(重映射PB6)PA2(重映射PD5)PB10(重映射PC10)PC10PC12
RXPA10(重映射PB7)PA3(重映射PD6)PB11(重映射PC11)PC11PD2
SCLKPA8PA4(重映射PD7)PB12(重映射PC12)

CTSPA11PA0(重映射PD3)PB13

RTSPA12PA1(重映射PD4)PB14

STM32F103RCT6 系统控制器有三个 USART 和两个 UART,其中 USART0 时钟来源于 APB2 总线时钟,其最大频率为 108MHz,其他四个的时钟来源于 APB1 总线时钟,其最大频率为 54MHz。UART 只是异步传输功能,所以没有 SCLK、CTS 和 RTS 功能引脚。


3.2 编程要点

使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟


初始化 GPIO,并将 GPIO 复用到 USART 上


配置 USART 参数


配置中断控制器并使能 USART 接收中断


使能 USART


在 USART 接收中断服务函数实现接收和发送


3.3 USART初始化

使用 GPIO 之前都需要初始化配置它,并且还要添加特殊设置,因为我们使用它作为外设的引脚,一般都有特殊功能。我们在初始化时需要把它的模式设置为复用功能。这里把串口的 Tx 引脚配置为复用推挽输出,Rx 引脚为浮空输入,数据完全由外部输入决定。

接下来,我们配置 USART0 通信参数为:波特率 115200,字长为 8,1 个停止位,没有校验位,不使用硬件流控制,收发一体工作模式,然后调用 USART 初始化函数完成配置。


// GPIO时钟使能rcu_periph_clock_enable(RCU_GPIOA);// USART时钟使能rcu_periph_clock_enable(RCU_USART0);

    // 配置TX为推挽复用模式gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);// 配置RX为浮空输入模式gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    // 配置串口的工作参数usart_deinit(USART0);usart_baudrate_set(USART0, 115200U);                        // 波特率usart_word_length_set(USART0, USART_WL_8BIT);               // 帧数据字长usart_stop_bit_set(USART0, USART_STB_1BIT);                 // 停止位usart_parity_config(USART0, USART_PM_NONE);                 // 奇偶校验位usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);  // 硬件流控制RTSusart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);  // 硬件流控制CTSusart_receive_config(USART0, USART_RECEIVE_ENABLE);         // 使能接收usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);       // 使能发送usart_enable(USART0);                                       // 使能串口    

3.4 串口中断初始化

抢占优先级,数字越小,优先级越高


若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高


// 使能USART中断nvic_irq_enable(USART0_IRQn, 0, 0);// 使能串口接收中断usart_interrupt_enable(USART0, USART_INT_RBNE);

3.5 串口中断处理函数

使能了 USART0 接收中断,当 USART0 有接收到数据就会执行 USART0_IRQHandler() 函数。usart_interrupt_flag_get() 函数与 usart_flag_get() 函数类似用来获取标志位状态,但 usart_interrupt_flag_get() 函数是专门用来获取中断事件标志的,并返回该标志位状态。使用 if 语句来判断是否是真的产生 USART 数据接收这个中断事件,如果是真的就使用 USART 数据读取函数 usart_data_receive() 读取数据到指定存储区。然后再调用 USART 数据发送函数 usart_data_transmit() 把数据又发送给源设备,即 PC 端的串口调试助手。


/*!

    brief      this function handles USART RBNE interrupt request and TBE interrupt request

    param[in]  none

    param[out] none

    retval     none

*/void USART0_IRQHandler(void){

    unsigned char data;

    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))

    {

        data = usart_data_receive(USART0);

            

        usart_data_transmit(USART0, (uint8_t)data);

        while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));//发送完成判断

    }}

串口中断处理函数名称要与串口相对应,可在 startup_gd32f10x_hd.s 启动文件中查看:


;                   /* external interrupts handler */

                    DCD     WWDGT_IRQHandler                  ; 16:Window Watchdog Timer

                    DCD     LVD_IRQHandler                    ; 17:LVD through EXTI Line detect

                    DCD     TAMPER_IRQHandler                 ; 18:Tamper Interrupt   

                    DCD     RTC_IRQHandler                    ; 19:RTC through EXTI Line

                    DCD     FMC_IRQHandler                    ; 20:FMC

                    DCD     RCU_IRQHandler                    ; 21:RCU

                    DCD     EXTI0_IRQHandler                  ; 22:EXTI Line 0

                    DCD     EXTI1_IRQHandler                  ; 23:EXTI Line 1

                    DCD     EXTI2_IRQHandler                  ; 24:EXTI Line 2

                    DCD     EXTI3_IRQHandler                  ; 25:EXTI Line 3

[1] [2] [3]
关键字:GD32F103  USART  串口使用 引用地址:GD32F103学习笔记(7)——USART串口使用

上一篇:GD32F103学习笔记(8)——ADC接口使用
下一篇:GD32F103学习笔记(6)——系统延时使用

推荐阅读最新更新时间:2026-03-24 10:58

STM32CubeMX学习笔记(6)——USART串口使用
一、USART简介 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。 串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USAR
[单片机]
【GD32H757Z海棠派开发板使用手册】第十讲 USART-中断串口收发实验
10.1实验内容 通过本实验主要学习以下内容: 使用中断进行串口收发 10.2实验原理 10.2.1串口寄存器介绍 串口有几个非常重要的寄存器需要读者理解。 数据接收寄存器(USART_RDATA) 数据发送寄存器(USART_RDATA) 发送时,除了发送数据寄存器,还有一个移位寄存器,当数据写入数据寄存器中,移位寄存器空闲的情况下,数据从数据寄存器中转移到移位寄存器,移位寄存器按照低bit——高bit的顺序将数据移位到IO口上。 接收时,接收到的数据保存在数据接收寄存器中,CPU或DMA可以从该寄存器中读接收到的数据。 状态寄存器(USART_STAT ) 我们需要特别理解TBE、TC、RBNE、IDLE、OR
[单片机]
【GD32H757Z海棠派开发板<font color='red'>使用</font>手册】第十讲 <font color='red'>USART</font>-中断<font color='red'>串口</font>收发实验
【GD32F303红枫派开发板使用手册】第十七讲 USART-中断串口收发实验
17.1实验内容 通过本实验主要学习以下内容: 使用中断进行串口收发 17.2实验原理 前面章节中我们已经学习了串口的状态标志位,本实验就是使用TBE中断和RBNE中断来实现中断收发数据,实验原理是RBNE中断用来接受数据,IDLE中断用于判断发送方数据结束,TBE中断用于发送数据。 17.3硬件设计 本实验仍然使用USB转UART接口,硬件设计见前面章节。 17.4代码解析 17.4.1串口中断发送函数 在driver_uart.c中定义了串口中断发送函数: C Drv_Err driver_uart_int_transmit(typdef_uart_struct *uartx,uint8_t *pbuff,uint16_t
[单片机]
【GD32F303红枫派开发板<font color='red'>使用</font>手册】第十七讲 <font color='red'>USART</font>-中断<font color='red'>串口</font>收发实验
STM32中USART 串口简单使用
  使用查询方式的USART:   设置时钟:   RCC_APB2Periph_AFIO 功能复用IO时钟   RCC_APB2Periph_GPIOA GPIOA时钟   RCC_APB2Periph_USART1 USART1时钟   你可以用   //使能串口1,PA,AFIO总线 RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);   或直接   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE); //全部APB
[单片机]
STM32F429(HAL库)_USART串口发送&接收(使用STM32CubeMX)
一、HAL库相关函数 1、串口发送/接收函数 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制 HAL_UART_Receive();串口轮询模式接收,使用超时管理机制 HAL_UART_Transmit_IT();串口中断模式发送 HAL_UART_Receive_IT();串口中断模式接收 HAL_UART_Transmit_DMA();串口DMA模式发送 HAL_UART_Transmit_DMA();串口DMA模式接收 2、串口中断函数 HA
[单片机]
STM32F429(HAL库)_<font color='red'>USART</font><font color='red'>串口</font>发送&接收(<font color='red'>使用</font>STM32CubeMX)
stm32f407的串口使用集合(USART1,USART2,USART3,USART6)
由于项目需要使用多串口,因此基于正点原子探索者开发板的串口例程里的串口不够用,在此基础之上,自己对需要用的几个串口操作做了简要的封装,其中已经实现的串口有串口1,串口2,串口3以及串口六,如果有大神能够帮忙完善,本菜鸟在此先谢过,请多多指教 其中的头文件内容如下: /* * file: usart.h * author: Jeans Oyoung * create on June 23, 2016 */ #include string.h #define USE_USART1 #define USE_USART2 #define USE_USART3 #define USE_USART4 #define USE_U
[单片机]
STM32学习笔记:USART串口使用
1. 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。 USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。 RX: 接受数据串行输入。通过过采样技
[单片机]
AVR单片机 usart串口使用范例
usart简介: 通用同步和异步串行接收器和转发器(USART) 是一个高度灵活的串行通讯设备。主要特点为: 全双工操作( 独立的串行接收和发送寄存器) 异步或同步操作 主机或从机提供时钟的同步操作 高精度的波特率发生器 支持5, 6, 7, 8, 或9 个数据位和1 个或2 个停止位 硬件支持的奇偶校验操作 数据过速检测 帧错误检测 噪声滤波,包括错误的起始位检测,以及数字低通滤波器 三个独立的中断:发送结束中断, 发送数据寄存器空中断,以及接收结束中断 多处理器通讯模式 倍速异步通讯模式 调试结果与实物图 串口硬件电路采用的是MAX232cse,硬件连接电路图,详见开发板电路的详细介绍。 在labview中用程序调试
[单片机]
AVR单片机 <font color='red'>usart</font><font color='red'>串口</font><font color='red'>使用</font>范例
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved