一、大致理解:
(1)是一个片上外设
(2)通用同步、异步收发器(S:同步、A:异步)
(3)由两根数据线和地线以及一根时钟线组成(数据线:Tx:发数据线,Rx:收数据线、地线:GND、时钟线:RCC)(UART没有时钟线)
(4)全双工通信
(5)串行通信
(6)1对1通信
(7)采用帧格式:1起始位+(5-8)位数据位+1(0-1)位校验位+停止位
1、理解半双工、单工、全双工
半双工:可选择收,或者发,但是只能单向发送
单工:只能二选一,选择其一后就不能再改变了。
全双工:收发可以同时进行。
2、理解串行和并行
串行:一个单位一个单位的发(收)数据。
并行:利用多条数据线实现同一时间内多单位数据收(发)。
(注意:串行 != UART串口)
3、理解一对一、一对多通行
一对一:一个串口单元只能对一个串口单元通信
一对多:一个串口单元可以对多个串口单元通信
4、理解帧格式
帧格式就是一种通信协议,它规定了两个串口都必须使用这套语言。
类比记忆:就相当于两个人交流,如果两个人使用的是不同国家的语言就会导致听不懂话里的信息,帧格式就是强制他们用同一国语言,这样就可以正常交流
1 个起始位:线路从高电平拉低,通知接收方一帧开始。
5~8 个数据位:实际载荷,通常低位先行。(LSB:低位数据权位,MSB:高位数据权位)
0 或 1 个校验位:可选,用于简单的单比特错误检测(奇校验或偶校验)。
1 或 2 个停止位:拉高线路,标示帧结束,给接收方缓冲时间。
空闲时线路保持高电平。这种格式没有地址概念,只适合点对点通信。
5、理解波特率和比特率
比特率:每秒传递的比特个数(bit/s)
波特率:每秒传递信息的种数(Bd)
比如01、11、00、10表达四种信息假设,如果每秒传递一种信息01
那么它的比特率为2bit/s,波特率为1Bd
二、USART串口片上外设总结构图:
(1)需要注意的部分:
除了上图,其他都是我们往MCU写入对应的程序让他自己完成的。
三、看看MCU内存映射USART的具体位置:
(注释:只是截取了属于这方面的USART内存范围作为拼凑,并原本就是这样。)
(1)视角集中到USART1:
这就是USART1内存中所映射的寄存器了。
I.(USART_DR寄存器)
收(RDR)发(TDR)寄存器所在的位置:
我们所说的收发寄存器就位于偏移量为004h那个位置,USART1它用一个寄存器表示收(RDR)、发(TDR)寄存器,这些尽管意法半导体没有纰注这时如何做到的。
如何实现传输的?
HAL库中专门有一个函数专门朝这个寄存器进行写入数据。
HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);参数含义:
husart:USART 句柄指针,包含外设实例及配置信息。pTxData/pRxData:指向发送或接收数据缓冲区的指针。(再代码阶段自己创建)Size:要发送或接收的数据元素个数(注意不是字节数,取决于字长配置)。Timeout:超时时间(单位通常为毫秒),防止阻塞卡死。
状态寄存器(USART_SR):
来表述DR寄存器当前状态来返回给用户的一个寄存器。
该注意什么?
对于初学者来说现在只用注意这两个就可以了:
借助TXE标志实现阻塞式发送:
因为MCU读取USART的方式是先SR再DR所以就会在写入数据之前读取TXE,这时如果TXE = 0那就说明此时DR寄存器属于有数据阶段,MCU就不会执行朝DR中编辑数据操作,这就会造成阻塞状态。
四、CH340K:(USB接口和UART TTL接口的翻译官)
五、使用CubeMx配置USART
(1)、打开CUbeMx软件:
(2)、创建新文件:
(3)搜索对应的板子(基于自己买的单片机板子类型而定)
(4)完成前置工作:
这一步我简单解释一下:将SYS(系统核心)调试配置采用SW
使用外部高速时钟源
(5)、配置USART:
USART1使用异步通信。