既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
如果你需要这些资料,可以戳这里获取
一、简介
通用同步异步收发器(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.2\Firmware\GD32F10x_standard_peripheral\Include\gd32f10x_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); // 硬件流控制RTS
usart\_hardware\_flow\_cts\_config(USART0, USART_CTS_DISABLE); // 硬件流控制CTS
usart\_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
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
3.6 printf重定向
/\*\*
\* @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
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/2b0bea0a08a687fc711345cdcd9098ed.png)
![img](https://img-blog.csdnimg.cn/img_convert/b29d99bdf9121a686f3b47a159d523bc.png)
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
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
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中...(img-9OMGfE79-1715677977714)]
[外链图片转存中...(img-I5aMh9dU-1715677977714)]
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**