同步博客地址:从STM32开始的RoboMaster生活:进阶篇 III [UART & USART]
项目&教程仓库:-STM32-RoboMaster-
1.0 什么是UART和USART?有什么区别嘛?
1.1 UART定义
Universal Asynchronous Receiver/Transmitter:通用异步收发传输器,是一种串行异步收发协议,应用十分广泛。UART工作原理是将数据的二进制位一位一位的进行传输。在UART通讯协议中信号线上的状态位高电平代表’1’低电平代表’0’。当然两个设备使用UART串口通讯时,必须先约定好传输速率和一些数据位。分类属于并行传输,通常1字节数据的8位同时传输,结束后再继续传第2个字节,如同波浪一般,一波一波传输。
1.2 UART与USART的区别
- UART
从图上可以看出整个传输过程。首先,在没有数据传输任务的时候,互相之间都是高电平 ( 1 ) ,然后,在有传输任务的时候,有1.5字节宽的起始信号,然后开始传输真正的信号,结束任务后,再给1.5字节宽的结束信号,最后回归没有数据传输的高电平。
- USART <-- Universal Synchronous/Asynchronous Receiver/Transmitter 通用同步异步接收发送器
USART是UART的升级版,区别在于多了CLK线,在CLK没有信号的时候,就表明没有数据传输任务,有CLK信号的时候,就是正在传输信号,并且CLK提供了时钟同步功能,效验也更精确。但在实际使用的时候,其实并不会感觉UART和USART有很大的区别,除非接触非常底层的东西。
2.0 UART和USART在哪里?
-
UART
- UART7
尽管大疆第一个图中标明的是USART7,但是其实只能使用异步通讯,也就是普通的UART。
- UART8
尽管大疆第一个图中标明的是USART8,但是其实只能使用异步通讯,也就是普通的UART。
-
USART
- USART6
-
DJI ON BOARD SDK
- USART3
这个是大疆预留的官方接口,与一般的USART的接线不同,不能直接使用,也不推荐使用。
3.0 UART和USART有啥用?
-
与PC端通讯
可以作为Debug的一种手段,或者监控数据流通的方法。
-
与其他设备通讯
比如两个MCU互相通讯,也就是作为主从机来使用。
4.0 UART和USART的两种不同使用模式
4.1 Polling
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
- 参数
huart
:指向UART引脚配置结构体pData
:指向需要传输的字符串Size
:传输数据的字节大小Timeout
:最大等待完成时限,单位为毫秒,也可以用HAL_MAX_DELAY
来直接无限等待
- 返回值
HAL_StatusTypeDef
:如果传输完成,返回HAL_OK
;如果没有在时限内完成,返回HAL_TIMEOUT
;如果在传输出错,返回HAL_ERROR
;如果该UART正在被占用,返回HAL_BUSY
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
- 参数
huart
:指向UART引脚配置结构体pData
:指向需要传输的字符串Size
:传输数据的字节大小Timeout
:最大等待完成时限,单位为毫秒,也可以用HAL_MAX_DELAY
来直接无限等待
- 返回值
HAL_StatusTypeDef
:如果传输完成,返回HAL_OK
;如果没有在时限内完成,返回HAL_TIMEOUT
;如果在传输出错,返回HAL_ERROR
;如果该UART正在被占用,返回HAL_BUSY
4.2 Interrupt
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
- 参数
huart
:指向UART引脚配置结构体pData
:指向需要传输的字符串Size
:传输数据的字节大小
- 返回值
HAL_StatusTypeDef
:如果传输完成,返回HAL_OK
;如果在传输出错,返回HAL_ERROR
;如果该UART正在被占用,返回HAL_BUSY
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
- 参数
huart
:指向UART引脚配置结构体pData
:指向需要传输的字符串Size
:传输数据的字节大小
- 返回值
HAL_StatusTypeDef
:如果传输完成,返回HAL_OK
;如果在传输出错,返回HAL_ERROR
;如果该UART正在被占用,返回HAL_BUSY
这里的函数并不是直接接收数据,而是表明开启UART的Interrupt模式
接收完数据后,该UART的Interrupt模式会自动关闭,需要再手动开启
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
......
}
- 在写代码的时候,在
main.c
中创建HAL_UART_TxCpltCallback
函数 - 在该函数中填写UART发送结束后,需要执行的代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
......
}
- 在写代码的时候,在
main.c
中创建HAL_UART_RxCpltCallback
函数 - 在该函数中填写UART接收结束后,需要执行的代码
5.0 练习项目
5.1 项目简介
- 电脑控制LED灯:在电脑上按下r,反转红色LED状态,按下g,反转绿色LED状态,按下1~8,反转对应的LED1~8的状态,并且返回打印反转的LED灯号
5.2 芯片配置
- 芯片视角
- GPIO配置列表