通信接口
- 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统
- 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发
| 名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 |
|---|---|---|---|---|---|
| USART | TX、RX | 全双工 | 异步 | 单端 | 点对点 |
| I2C | SCL、SDA | 半双工 | 同步 | 单端 | 多设备 |
| SPI | SCLK、MOSI、MISO、CS | 全双工 | 同步 | 单端 | 多设备 |
| CAN | CAN_H、CAN_L | 半双工 | 异步 | 差分 | 多设备 |
| USB | DP、DM | 半双工 | 异步 | 差分 | 点对点 |
串口
- 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信
- 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力
硬件电路
- 简单双向串口通信有两根通信线(发送端TX和接收端RX)
- TX与RX要交叉连接
- 当只需单向的数据传输时,可以只接一根通信线
- 当电平标准不一致时,需要加电平转换芯片

电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
- TTL电平:+3.3V或+5V表示1,0V表示0
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
串口参数及时序
- 波特率:串口通信的速率
- 起始位:标志一个数据帧的开始,固定为低电平
- 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
- 校验位:用于数据验证,根据数据位计算得来
- 停止位:用于数据帧间隔,固定为高电平

USART简介
- USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
- USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
- 自带波特率发生器,最高达4.5Mbits/s
- 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
- 可选校验位(无校验/奇校验/偶校验)
- 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
实际外设: STM32F103C8T6 USART资源:USART1、USART2、USART3


更多USART的相关内容:STM32F10xxx参考手册(中文).pdf 页码516/手册25
代码
|
|
USART_InitTypeDef为USART配置结构体USART_BaudRate为波特率:常用9600、115200等USART_HardwareFlowControl为硬件流控制(一般不用)USART_Mode为模式USART_Parity为奇偶校验USART_StopBits为停止位USART_WordLength为字长
USART_ITConfig函数用于配置USART中断USART_SendData函数用于发送数据USART_ReceiveData函数用于读取接收到的数据- 获取USART标志位
USART_GetFlagStatus标志位USART_GetITStatus中断标志位
| USART_HardwareFlowControl | 值 | 描述 |
|---|---|---|
| USART_HardwareFlowControl_None | ((uint16_t)0x0000) | 关闭 |
| USART_HardwareFlowControl_RTS | ((uint16_t)0x0100) | 发送可接收信号 |
| USART_HardwareFlowControl_CTS | ((uint16_t)0x0200) | 接收可发送信号 |
| USART_HardwareFlowControl_RTS_CTS | ((uint16_t)0x0300) | 开启全部 |
| USART_Mode | 值 | 描述 |
|---|---|---|
| USART_Mode_Rx | ((uint16_t)0x0004) | 发送 |
| USART_Mode_Tx | ((uint16_t)0x0008) | 接收 |
| USART_Parity | 值 | 描述 |
|---|---|---|
| USART_Parity_No | ((uint16_t)0x0000) | 不校验 |
| USART_Parity_Even | ((uint16_t)0x0400) | 偶校验 |
| USART_Parity_Odd | ((uint16_t)0x0600) | 奇校验 |
| USART_StopBits | 值 | 描述 |
|---|---|---|
| USART_StopBits_1 | ((uint16_t)0x0000) | 1位停止位 |
| USART_StopBits_0_5 | ((uint16_t)0x1000) | 0.5位停止位 |
| USART_StopBits_2 | ((uint16_t)0x2000) | 2位停止位 |
| USART_StopBits_1_5 | ((uint16_t)0x3000) | 1.5位停止位 |
| USART_WordLength | 值 | 描述 |
|---|---|---|
| USART_WordLength_8b | ((uint16_t)0x0000) | 8位数据 |
| USART_WordLength_9b | ((uint16_t)0x1000) | 9位数据 |
| USART_ITs | 值 | USART_Flags | 值 | 描述 |
|---|---|---|---|---|
| USART_IT_PE | ((uint16_t)0x0028) | USART_FLAG_PE | ((uint16_t)0x0001) | 奇偶检验错 |
| USART_IT_TXE | ((uint16_t)0x0727) | USART_FLAG_TXE | ((uint16_t)0x0080) | 发送数据寄存器空 |
| USART_IT_TC | ((uint16_t)0x0626) | USART_FLAG_TC | ((uint16_t)0x0040) | 发送完成 |
| USART_IT_RXNE | ((uint16_t)0x0525) | USART_FLAG_RXNE | ((uint16_t)0x0020) | 接收数据就绪可读 |
| USART_IT_IDLE | ((uint16_t)0x0424) | USART_FLAG_IDLE | ((uint16_t)0x0010) | 检测到空闲线路 |
| USART_IT_LBD | ((uint16_t)0x0846) | USART_FLAG_LBD | ((uint16_t)0x0100) | 断开标志 |
| USART_IT_CTS | ((uint16_t)0x096A) | USART_FLAG_CTS | ((uint16_t)0x0200) | CTS标志 |
| USART_IT_ERR | ((uint16_t)0x0060) | 未开启USART_IT_ERR时,只能由USART_GetFlagStatus(USARTx,USART_Flag_ORE) 检测到USART_IT_ORE;在开启USART_IT_ERR后,才能被 USART_GetITStatus(USARTx,USART_IT_ORE) 检测到USART_IT_ORE; | ||
| USART_IT_ORE | ((uint16_t)0x0360) | USART_FLAG_ORE | ((uint16_t)0x0008) | 检测到数据溢出 |
| USART_IT_NE | ((uint16_t)0x0260) | USART_FLAG_NE | ((uint16_t)0x0004) | 噪声标志 |
| USART_IT_FE | ((uint16_t)0x0160) | USART_FLAG_FE | ((uint16_t)0x0002) | 帧错误 |
数据包设计
HEX固定包长

字符可变包长
