一、简介
通用同步异步收发器(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_8BIT | 8bits |
| USART_WL_9BIT | 9bits |
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_1BIT | 1bit |
| USART_STB_0_5BIT | 0.5bit,该位对UARTx(x=3,4)无效 |
| USART_STB_2BIT | 2bit |
| USART_STB_1_5BIT | 1.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_LBD | LIN断开信号检测中断 |
| USART_INT_CTS | CTS中断 |
| 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_CTSF | CTS变化标志 |
| USART_FLAG_LBDF | LIN断开检测标志 |
| 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_LBD | LIN断开检测中断和标志 |
| USART_INT_FLAG_CTS | CTS中断和标志 |
| USART_INT_FLAG_ERR_ORERR | 错误中断和过载错误 |
| USART_INT_FLAG_ERR_NERR | 错误中断和噪声错误标志 |
| USART_INT_FLAG_ERR_FERR | 错误中断和镇错误标志 |
三、USART收发通信
3.1 引脚分布
| 总线 | APB2总线 | APB1总线 | APB1总线 | APB1总线 | APB1总线 |
|---|---|---|---|---|---|
| 引脚 | USART0 | USART1 | USART2 | UART3 | UART4 |
| TX | PA9(重映射PB6) | PA2(重映射PD5) | PB10(重映射PC10) | PC10 | PC12 |
| RX | PA10(重映射PB7) | PA3(重映射PD6) | PB11(重映射PC11) | PC11 | PD2 |
| SCLK | PA8 | PA4(重映射PD7) | PB12(重映射PC12) | ||
| CTS | PA11 | PA0(重映射PD3) | PB13 | ||
| RTS | PA12 | PA1(重映射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
上一篇:GD32F103学习笔记(8)——ADC接口使用
下一篇:GD32F103学习笔记(6)——系统延时使用
推荐阅读最新更新时间:2026-03-24 10:58
- REF196 精密微功率、低压差堆叠电压基准的典型应用电路
- LTC4367IMS8 用于滞后调节的过压电源控制器的典型应用
- CLRC663非接触式读写器IC的典型应用
- 使用 ON Semiconductor 的 CS-5621 的参考设计
- RSO-0515S 15V、67mA输出DC/DC转换器典型应用电路
- NCP51200 3 Amp VTT 终端稳压器 DDR1、DDR2、DDR3、LPDDR3、DDR4 的典型应用
- LR645大电流SMPS启动电路典型应用
- ADR420 可编程电流源的典型应用
- DC417B,使用 LT1806CS8 多尺寸单运算放大器原型的演示板
- DM300019,用于评估 dsPIC30F 和 dsPIC33F MCU 系列器件的 dsPICDEM 入门开发板



英飞凌PSoC 6 电位器控制LED闪烁状态并水墨屏显示——源码
Follow me第三季第4期任务
现代雷达系统的信号设计
ALD2701Z
BFR340T






京公网安备 11010802033920号