概念是我们对于一个事物的所见清晰度,没有了概念,整个世界都是模糊的!
有关通信的一些概念:
并行/串行:发送数据的信息形式
同步/异步:有时钟辅助来确保信息传输速度的叫做同步,有特殊信号位来控制信息传输的叫做异步
全双工/半双工/单工:信息通道 全双工相当于双向车道,半双工相当于潮汐车道,单工相当于单向通道
比特率/波特率:发送信息传输的速率,二者分子不同分母都为时间,比特率 bits/s | 波特率 码元/s
几种常见的通信方式:
SPI UART I2C
串口通信详解
RS232/USB转串口/串口转串口
TTL电平:直接从单片机里出来的 0 - 1v/ 1 - 3.3v
RS232电平:0- -15v / 1 - 15v
以RS232代表的物理层解析
工业设备里静电,粉尘比较严重,所以要使用峰峰值更大的RS232
有的板子已经集成了电平转换芯片,有的则没有,需要自己去买扩展:
协议层解析:
串口的数据包基本格式:
起始位:一个逻辑0的数据为表示
结束位:由0.5 / 1 / 1.5 / 2 个 逻辑1 来表示 一般我们设置为1个
有效数据位:起始位后面紧接着的就是有效数据 长度在5,6,7,8,9位中可选
校验位:可选的,为的是数据的抗干扰性。分为奇偶校验,无校验,0校验,1校验五种,一般设置为无校验
串口模块的功能框图:
USART的引脚及功能:
TX:Transmit
RX:Receive
SCLK:时钟配置 只在同步通信时使用 一般我们只用异步 在信息中添加特殊位
nRTS:
nCTS:
对应引脚的GPIO查询可以在STM32F10X数据手册的Pinouts and pin description 中查询
下面几个寄存器用于控制填充数据包
数据寄存器 USART_DR:
9位有效,这个寄存器可以有两种功能,发送数据(TDR)和接收数据(RDR),一个地址对应了两个物理内存
(就像一个房间,当单片机需要发送数据时里面住的是信息发送的使者,当需要接收数据时里面住的是接收数据的接收者)
控制寄存器
USART_CR1:
M:
控制9位有效中实际会使用的位数,定义了数据字的长度,由软件对其设置和清零
0: 一个起始位,8个数据位,n个停止位
1: 一个起始位,9个数据位,n个停止位 n表示不确定 由其他寄存器决定(下面就会说)
PCE 和 PS:
校验位:parity control enable 使能校验 parity select 选择用奇还是偶校验
PEIE 如果校验出现错误则会使用这个寄存器来使能中断
(由usart_sr 的寄存器PE 来决定是否有校验错误)
USART_CR2:
STOP:00: 1个停止位
我们使用一个停止位就可以了
数据发送/接收的具体流程
下面几个寄存器用于数据发送或接收
USART_CR1 UE : 使能串口的时钟(数据传输完毕USART自动关闭时钟所以每次使用都得再次打开,相当于发送和接收路上的大门)
USART_CR1 TE/RE: 使能发送/接收 (小门)
发送和接收时的配置以及寄存器状态位的改变
先上数据传输的流程图:
再上数据状态寄存器的详细表格:
发送数据来源:CPU /DMA从内存读取
放到发送数据寄存器 TDR 接收数据寄存器 RDR
| /
| TXE transmit data register empty 1:该过程结束 0:该过程未结束 |
/ |
再放到 发送移位寄存器 接收移位寄存器
| /
| TC transmision complete 1:发送完成 0:发送未完成 | RXNE ( READ DATA NOT EMPRT)
/ | 0:未接受到数据 1:接收到数据 可读
再一位一位地发送到TX发送引脚 一位一位的接收
接收数据的来源:RX引脚
涉及到3个寄存器地改变 需软件不断检查这3个寄存器
几个与中断相关的寄存器
STM32CUBEMAX配置串口:
HAL库中关于串口的几个函数:
1 阻塞发送接收函数:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
2 非阻塞发送接收接收
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
3 非阻塞发送接收的回调函数
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)