通用同步异步收发器(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。
以下 USART 接口位于
GD32F10x_Firmware_Library_V2.2.2\Firmware\GD32F10x_standard_peripheral\Include\gd32f10x_usart.h
。
功能
|
复位外设USART/UART
|
函数定义
|
void usart_deinit(uint32_t usart_periph)
|
参数
|
usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
|
返回
|
无
|
功能
|
配置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:波特率值
|
返回
|
无
|
功能
|
配置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
|
功能
|
配置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)无效
|
功能
|
配置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
|
偶校验
|
功能
|
配置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
|
功能
|
配置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
|
功能
|
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发送
|
功能
|
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接收
|
功能
|
使能USART/UART
|
函数定义
|
void usart_enable(uint32_t usart_periph)
|
参数
|
usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
|
返回
|
无
|
功能
|
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:发送的数据
|
返回
|
无
|
功能
|
USART/UART接收数据功能
|
函数定义
|
uint16_t usart_data_receive(uint32_t usart_periph)
|
参数
|
usart_periph:USARTx(x=0,1,2)或UARTx(x=3,4)
|
返回
|
接收的数据
|
功能
|
使能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
|
错误中断
|
功能
|
获取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
|
校验错误标志
|
功能
|
获取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
|
错误中断和镇错误标志
|
总线
|
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 功能引脚。
-
使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟
-
初始化 GPIO,并将 GPIO 复用到 USART 上
-
配置 USART 参数
-
配置中断控制器并使能 USART 接收中断
-
使能 USART
-
在 USART 接收中断服务函数实现接收和发送
使用 GPIO 之前都需要初始化配置它,并且还要添加特殊设置,因为我们使用它作为外设的引脚,一般都有特殊功能。我们在初始化时需要把它的模式设置为复用功能。这里把串口的 Tx 引脚配置为复用推挽输出,Rx 引脚为浮空输入,数据完全由外部输入决定。
接下来,我们配置 USART0 通信参数为:波特率 115200,字长为 8,1 个停止位,没有校验位,不使用硬件流控制,收发一体工作模式,然后调用 USART 初始化函数完成配置。
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
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);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_enable(USART0);
- 抢占优先级,数字越小,优先级越高
- 若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高
nvic_irq_enable(USART0_IRQn, 0, 0);
usart_interrupt_enable(USART0, USART_INT_RBNE);
使能了 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
启动文件中查看:
;
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
DCD EXTI4_IRQHandler ; 26:EXTI Line 4
DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel 0
DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel 1
DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel 2
DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel 3
DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel 4
DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel 5
DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel 6
DCD ADC0_1_IRQHandler ; 34:ADC0 and ADC1
DCD USBD_HP_CAN0_TX_IRQHandler ; 35:USBD and CAN0 TX
DCD USBD_LP_CAN0_RX0_IRQHandler ; 36:USBD and CAN0 RX0
DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1
DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC
DCD EXTI5_9_IRQHandler ; 39:EXTI Line 5 to EXTI Line 9
DCD TIMER0_BRK_IRQHandler ; 40:TIMER0 Break
DCD TIMER0_UP_IRQHandler ; 41:TIMER0 Update
DCD TIMER0_TRG_CMT_IRQHandler ; 42:TIMER0 Trigger and Commutation
DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare
DCD TIMER1_IRQHandler ; 44:TIMER1
DCD TIMER2_IRQHandler ; 45:TIMER2
DCD TIMER3_IRQHandler ; 46:TIMER3
DCD I2C0_EV_IRQHandler ; 47:I2C0 Event
DCD I2C0_ER_IRQHandler ; 48:I2C0 Error
DCD I2C1_EV_IRQHandler ; 49:I2C1 Event
DCD I2C1_ER_IRQHandler ; 50:I2C1 Error
DCD SPI0_IRQHandler ; 51:SPI0
DCD SPI1_IRQHandler ; 52:SPI1
DCD USART0_IRQHandler ; 53:USART0
DCD USART1_IRQHandler ; 54:USART1
DCD USART2_IRQHandler ; 55:USART2
DCD EXTI10_15_IRQHandler ; 56:EXTI Line 10 to EXTI Line 15
DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm through EXTI Line
DCD USBD_WKUP_IRQHandler ; 58:USBD WakeUp from suspend through EXTI Line
DCD TIMER7_BRK_IRQHandler ; 59:TIMER7 Break Interrupt
DCD TIMER7_UP_IRQHandler ; 60:TIMER7 Update Interrupt
DCD TIMER7_TRG_CMT_IRQHandler ; 61:TIMER7 Trigger and Commutation Interrupt
DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare
DCD ADC2_IRQHandler ; 63:ADC2
DCD EXMC_IRQHandler ; 64:EXMC
DCD SDIO_IRQHandler ; 65:SDIO
DCD TIMER4_IRQHandler ; 66:TIMER4
DCD SPI2_IRQHandler ; 67:SPI2
DCD UART3_IRQHandler ; 68:UART3
DCD UART4_IRQHandler ; 69:UART4
DCD TIMER5_IRQHandler ; 70:TIMER5
DCD TIMER6_IRQHandler ; 71:TIMER6
DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0
DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1
DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2
DCD DMA1_Channel3_4_IRQHandler ; 75:DMA1 Channel3 and Channel4
* @brief 重定向c库函数printf到USARTx
* @retval None
int fputc(int ch, FILE *f)
usart_data_transmit(USART0, (uint8_t)ch);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
return ch;
* @brief 重定向c库函数getchar,scanf到USARTx
* @retval None
int fgetc(FILE *f)
uint8_t ch = 0;
ch = usart_data_receive(USART0);
return ch;
#ifndef _BOARD_USART_H_
#define _BOARD_USART_H_
\file gd32f10x_it.c
\brief interrupt service routines
\version 2014-12-26, V1.0.0, firmware for GD32F10x
\version 2017-06-20, V2.0.0, firmware for GD32F10x
\version 2018-07-31, V2.1.0, firmware for GD32F10x
\version 2020-09-30, V2.2.0, firmware for GD32F10x
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
#include "gd32f10x_it.h"
#include "systick.h"
\brief this function handles NMI exception
\param[in] none
\param[out] none
\retval none
void NMI_Handler(void)
\brief this function handles HardFault exception
\param[in] none
\param[out] none
\retval none
void HardFault_Handler(void)
while(1){
\brief this function handles MemManage exception
\param[in] none
\param[out] none
\retval none
void MemManage_Handler(void)
while(1){
\brief this function handles BusFault exception
\param[in] none
\param[out] none
\retval none
void BusFault_Handler(void)
while(1){
\brief this function handles UsageFault exception
\param[in] none
\param[out] none
\retval none
void UsageFault_Handler(void)
while(1){
\brief this function handles SVC exception
\param[in] none
\param[out] none
\retval none
void SVC_Handler(void)
\brief this function handles DebugMon exception
\param[in] none
\param[out] none
\retval none
void DebugMon_Handler(void)
\brief this function handles PendSV exception
\param[in] none
\param[out] none
\retval none
void PendSV_Handler(void)
\brief this function handles SysTick exception
\param[in] none
\param[out] none
\retval none
void SysTick_Handler(void)
delay_decrement();
\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));
#include <stdio.h>
#include "gd32f10x.h"
#include "systick.h"
#include "board_usart.h"
int main(void)
systick_config();
USART_Init();
printf("a usart transmit test example!");
uint8_t test[3] = {'1', '2', '3'};
UART_Write(test, 3);
while(1)
查看打印:
注意数据发多了会丢数据,不知道为什么
百度网盘:https://pan.baidu.com/s/1GFuzNtgPDo9TiqeH9zKY6A?pwd=dl0v 提取码:dl0v
• 由 Leung 写于 2022 年 4 月 18 日
• 参考:GD32串口回环
4.GD32F103C8T6 串口中断方式接收数据和输出重定向
GD32 USART 高级编程 让你的串口不在阻塞发送
GD32F303固件库开发(9)----USART通过DMA收发
CSDN文字教程:https://blog.csdn.net/qq_24312945/article/details/125677236
B站教学视频:https://www.bilibili.com/video/BV1QG411p7cw/
这个函数本身并不是STM32标准外设库(HAL库或旧的标准外设库)中直接提供的函数,但它遵循了STM32 USART(通用同步异步收发传输器)通信的一种常见实现模式。这个函数看起来像是用户为了简化USART数据发送过程而自定义的封装函数。解析这个函数:总结:
这个函数 是用于检查STM32 USART(或UART)外设中特定标志位的状态的。这个函数返回一个 枚举类型的值,通常是 或 ,分别表示标志位被设置或未被设置。下面是对这个函数的详细理解: 在STM32的编程中, 这种写法是访问
GD32F303固件库开发.8----USART收发配置概述视频教学csdn课程硬件准备keil配置串口初始化串口重定向usart_data_transmit()发送测试结果中断发送测试结果中断接收测试结果最后
本章主要配置printf进行打印。
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。需要GD样片的可以加群申请:615061293。
csdn课程
课程更加详细。
https://download.csdn.net/course/detail/37144
一、API说明rtsconfig:使能/除能RTS,详细列表如下:ctsconfig:使能/除能CTS,详细列表如下:txconfig:使能/失能USART发送器,详细列表如下:rxconfig:使能/失能USART接收器,详细列表如下:int_flag:USART中断标志,详细列表如下:flag:USART标志位,详细列表如下:
nRTS:请求发送(Request To Send) nCTS:允许发送(Clear To Send)
2).数据寄存器
9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应了两个物理内存。
数据帧相关寄存器
文章目录串行通讯串行和并行比较数据帧波特率USART模块原理图及主要寄存器USART框图介绍主要寄存器状态寄存器数据寄存器控制寄存器USART发送实现USART接收实现总结
串口这个功能应该是很常用、基础的一个功能,无论是电脑与设备还是设备与设备之间都可以采用串口进行传输数据。在前段时间调试单片机与Dwin串口屏通信的过程中,对于接收走了很多的弯路,后来准备系统地学习下单片机的串口收发,写成一篇博客,供以后参考。
串行和并行比较
在数据传送过程中,分为串行和并行通信,其中并行通讯就是将数据的每一
* TX发送的数据 *//* TX发送数据长度 *//*发送数据长度,__IO类似volatile,随时可变 *//* RX接收数组定长 *//* RX需要接收长度 *//* 实际接收长度 *//* 串口重定向C语言printf */return ch;/* 串口重定向C语言getchar、scanf */return ch;/* 设置波特率 */
其中usart_data_transmit和usart_flag_get都是GD32芯片的库函数中,和uart相关的部分。为了实现重定向printf函数,我们需要重写fputc()这个C标准库函数,因为printf在C标准库中实质是一个宏,最终是调用了fputc()这个函数。注意,还必须包含#include 头文件,并且在keil的设置中,Target选项卡,勾选Use MicroLIB选项。用户编写了与C库函数相同名字的函数时,优先采用用户编写的函数,这样用户就可以实现对库的修改了。
采样定理告诉我们,当采样频率大于信号频率的2倍时,就可以真实还原线路上的信号。而实际应用中,采样频率一般都远大于信号频率的2倍。
GD32F130的USART的接收电路,就可以选择以16倍频率或者8倍频率采样Rx引脚上的信号。当选择16倍频率过采样方式时,USART接收器在接收一个位的时候,会在一个比特率位的时间内对Rx采样16次,并选择中间3个采样点(第7、8、9个)进