1.数据通信的基础概念
1.1.串行/并行通信
数据通信按数据通信方式分类:串行通信、并行通信
1.2.单工/半双工/全双工通信
数据通信按数据传输方向分类:单工通信、半双工通信、全双工通信
- 单工通信:数据只能沿一个方向传输
- 半双工通信:数据可以沿两个方向传输,但需要分时进行
- 全双工通信:数据可以同时进行双向传输
1.3.同步/异步通信
数据通信按数据同步方式分类:同步通信、异步通信
- 同步通信:共用同一时钟信号
- 异步通信:没有时钟信号,通过在数据信号中加入起始位和停止位等一些同步信号
1.4.比特率与波特率
- 比特率:每秒钟传送的比特数,单位bit/s
- 波特率:每秒钟传送的码元数,单位Baud
- 比特率 = 波特率 * log2 M ,M表示每个码元承载的信息量
- 二进制系统中,波特率数值上等于比特率
1.5.常见的串行通信接口
2.串口(RS-232)
2.1.什么是串口
串口:即串行通信接口,指按位发送和接收的接口,如:RS-232/422/485等。
RS-232接口(DB9)
2.2.RS-232电平与COMS/TTL电平对比
电平标准 | 逻辑1 | 逻辑0 |
---|---|---|
RS-232电平 | -15V ~ -3V | +3V ~ +15V |
COMS电平 | 3.3V | 0V |
TTL电平 | 5V | 0V |
2.3.设备间的RS-232通信示意图
2.4.STM32串口与电脑USB口通信示意图
2.5.RS-232异步通信协议
- 启动位:必须占1个位长,保持逻辑0电平
- 有效数据位:可选5、6、7、8、9个位长,LSB在前,MSB在后
- 校验位:可选占1个位长,也可以没有该位
- 停止位:必须有,可选占0.5、1、1.5、2个位长,保持逻辑1电平
一般情况下,启动位为1,数据位为8,校验位为0,停止位为1。
3.STM32的USART
3.1.STM32的USART简介
- USART:通用同步异步收发器,Universal synchronous asynchronous receiver transmitter
- UART: 通用异步收发器,Universal asynchronous receiver transmitter,
- USART/UART都可以与外部设备进行全双工异步通信
- 对于USART,既可以作为USART使用,也可以作为UART使用,我们常用USAT的功能
3.2. STM32的USART主要特征
- 全双工异步通信
- 单线半双工通信
- 单独的发送器和接收器使能位
- 可配置使用DMA的多缓冲器通信
- 多个带标志的中断源
3.3. STM32的USART框图
- STM32的USRAT简化框图
着重关注:
①发送/接收数据的流程
②相关寄存器作用
③设置波特率
- F1/F4/F7框图
- H7框图
3.4.设置USART波特率(以F1为例)
把USARTDIV的值写入USART_BRR寄存器
uint16_t mantissa;
uint16_t fraction;
mantissa=39;
fraction=0.0625*16+0.5=0x01; /* USARTDIV = DIV_Mantissa + (DIV_Fraction/16) 四舍五入*/
USART1->BRR = (mantissa << 4) + fraction;
波特率设置通用公式推演(F1)
设置USART/UART波特率(F4)
设置USART/UART波特率(F7)
设置USART/UART波特率(H7)
3.5.USART寄存器介绍(F1)
- BRR寄存器在上一节已经讲过,不再赘述
- 控制寄存器1(CR1)
该寄存器需要完成的配置:
位13:使能USART
位12:配置8个数据位
位10:禁止检验控制
位5:使能接收缓冲区非空中断
位3:使能发送
位2:使能接收
- 控制寄存器2(CR2)
该寄存器需要完成的配置:配置1个停止位
- 控制寄存器3(CR3)
该寄存器需要完成的配置:配置不选择半双工模式
- 数据寄存器(DR)
设置好控制和波特率寄存器后,往该寄存器写入数据即可发送,接收数据则读该寄存器
- 状态寄存器(SR)
根据TC位可以知道能否发数据,根据RXNE位知道是否收到数据
4.HAL库外设初始化MSP回调机制
- 当多个PPP外设同时使用MSP函数,则可以通过判断外设寄存器基地址区分是哪个外设,再配置PPP外设用到的硬件
- 当多个PPP外设共用该函数,文件不好管理,而且放到一起看着比较乱,这时候就不建议使用该函数
5.HAL库中断回调机制
- 当多个PPP外设同时使用中断回调函数,则可以通过判断外设寄存器基地址区分是哪个外设进入中断,并执行相应的处理
- 当多个PPP外设共用该函数文件不好管理,这时候就不建议使用该函数
6.USART/UART异步通信配置步骤
- HAL_UART_Init(UART_HandleTypeDef *huart)关键结构体(F1).
typedef struct
{ uint32_t BaudRate; /* 波特率 */
uint32_t WordLength; /* 字长 */
uint32_t StopBits; /* 停止位 */
uint32_t Parity; /* 奇偶校验位 */
uint32_t Mode; /* UART 模式 */
uint32_t HwFlowCtl; /* 硬件流设置 */
uint32_t OverSampling; /* 过采样设置 */
}UART_InitTypeDef
-
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size).
作用:以中断的方式接收指定字节的数据
形参 1 是 UART_HandleTypeDef 结构体类型指针变量
形参 2 是指向接收数据缓冲区
形参 3 是要接收的数据大小,以字节为单位 -
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout).
作用:以阻塞的方式发送指定字节的数据
形参 1 :UART_HandleTypeDef 结构体类型指针变量
形参 2:指向要发送的数据地址
形参 3:要发送的数据大小,以字节为单位
形参 4:设置的超时时间,以ms单位
7.IO引脚复用功能
7.1.STM32F1的IO引脚复用
- 通用:IO端口的输入或输出是由GPIO外设控制,我们称之为通用
- 复用:IO端口的输入或输出是由其它非GPIO外设控制,我们称之为复用
- 各IO支持什么复用功能:可查数据手册引脚定义
- IO复用功能冲突问题:同一时间IO只能用作一种复用功能,否则会发生冲突
- 遇到IO复用功能冲突:可考虑重映射功能
AFIO寄存器的作用就是复用功能IO和调试配置的,STM32F103共有6个AFIO的寄存器:事件控制寄存器AFIO_EVCR、复用重映射和调试IO配置寄存器AFIO_MAPR、外部中断配置寄存器AFIO_EXTICR1-4。可以参考文章http://t.csdn.cn/hJJeL
7.3.STM32F4/F7/H7的IO引脚复用
为了解决F1系列存在的IO复用功能冲突问题,F4往后的系列都加入了复用器,有如下特点:
- 每个 IO 引脚都有一个复用器
- 复用器采用 16 路复用功能输入(AF0 到 AF15)
- 复用器一次仅允许一个外设的复用功能 (AF) 连接到 IO 引脚
- 通过GPIOx_AFRL和GPIOx_AFRH寄存器进行配置
复位完成后,所有 IO 都会连接到系统的复用功能 0 (AF0)。注意,中断的复用使用的是SYSCFG_EXTICR寄存器
8.编程实战:通过串口接收或者发送一个字符
源码暂不贴出
9.解读例程源码:串口实验(接收不定长字符,并发送出去)
【注意】printf也可以实现串口发送,速度其实并不快(115200波特率下1ms大约11字节),调试时可以用,做开发尽量不用