数据通信的基础概念
串行/并行通信
单工/半双工/全双工通信
同步/异步通信
波特率
- 比特率:每秒钟传送的比特数,单位 bit/s
- 波特率:每秒钟传送的码元数,单位 Baud
- 比特率 = 波特率 * log2 M ,M 表示每个码元承载的信息量
- 二进制系统中,波特率数值上等于比特率
常见的串行通信接口
串口(RS-232)
#串口
什么是串口
RS-232 电平与 COMS/TTL 电平对比
设备间的 RS-232 通信示意图
STM32 串口与电脑 USB 口通信示意图
RS-232 异步通信协议
lsb:最低有效位,位 0
msb:最高有效位,位 7
STM32 的 USART
#usart
STM32 的 USART 简介
Universal synchronous asynchronous receiver transmitter,通用同步异步收发器 usart
Universal asynchronous receiver transmitter,通用异步收发器 uart
USART/UART 都可以与外部设备进行全双工异步通信
USART,我们常用的也是异步通信
STM32 的 USART 主要特征
- 全双工异步通信
- 单线半双工通信
- 单独的发送器和接收器使能位
- 可配置使用 DMA 的多缓冲器通信
- 多个带标志的中断源
参考:STM32xxxx 参考手册(中文版).pdf USART 相关章节
如何快速查看 STM32 某个外设的数量及其对应的引脚?
参考:ST MCU 最新选型手册.pdf
STM32F1/F4/F7 的 USART 框图
需要了解的点:
①,发送/接收数据的流程
②,相关寄存器作用
③,设置波特率
STM32F1/F4/F7/H7 的 USART 框图简化版
设置 USART/UART 波特率(F1)
波特率计算公式:baud=fck /(16∗USARTDIV),算出 usartdiv 就可以算出上面的 div_mantissa(整数部分),fraction 就是小数部分,也可以算出来,然后写道寄存器里面去
其中"fck"是串口的时钟,如:USART1 的时钟是 PCLK2,其他串口都是 PCLK1(上图)
如何使用寄存器操作的方式设置波特率 - USART1 为例
1 | uint16_t mantissa; |
波特率设置通用公式推演(F1)
USART 寄存器介绍(F1)可略
控制寄存器 1(CR1)
该寄存器需要完成的配置:
位 13:使能 USART
位 12:配置 8 个数据位
位 10:禁止检验控制
位 5:使能接收缓冲区非空中断
位 3:使能发送
位 2:使能接收
控制寄存器 2(CR2)
该寄存器需要完成的配置:配置 1 个停止位
控制寄存器 3(CR3)
该寄存器需要完成的配置:配置不选择半双工模式
数据寄存器(DR)
设置好控制和波特率寄存器后,往该寄存器写入数据即可发送,接收数据则读该寄存器
状态寄存器(SR)
根据 TC 位可以知道能否发数据,根据 RXNE 位知道是否收到数据
需要配置的时序总结(需要查看进行配置)
HAL 库外设初始化 MSP 回调机制(了解)
#MSP
HAL 库外设初始化 MSP 回调机制- USART 为例
1 | void HAL_UART_MspInit(UART_HandleTypeDef *huart) |
HAL 库中断回调机制(了解)
#IRQ
中断服务函数在.s 里面找到
HAL 库中断回调机制 - USART 为例(F1)
1 | UART中断回调函数: |
- Date:2023-06-18
- Time:20:26
- Subject: none
- Tags: #stm32 #配置
[[2023-06]]
USART/UART 异步通信配置步骤(掌握)
- 配置串口工作参数 2. HAL_UART_Init()
- 串口底层初始化
- HAL_UART_MspInit() 配置 GPIO、NVIC、CLOCK 等 上一个笔记里面有
- 开启串口异步接收中断
- HAL_UART_Receive_IT()
- 设置优先级,使能中断
- HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
- 编写中断服务函数
- USARTx_IRQHandler()、 UARTx_IRQHandler()
- 串口数据发送
- USART_DR, HAL_UART_Transmit()
HAL 库相关函数介绍
- HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef * huart)
- handletypedef 命名的是句柄
关键结构体(F1):
- handletypedef 命名的是句柄
1 | typedef struct |
- HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef _ huart , uint8_t _ pData , uint16_t Size)
- 作用:以中断的方式接收指定字节的数据
- 形参 1 是 UART_HandleTypeDef 结构体类型指针变量
- 形参 2 是指向接收数据缓冲区
- 形参 3 是要接收的数据大小,以字节为单位
- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef _ huart, uint8_t _ pData, uint16_t Size, uint32_t Timeout)
- 作用:以阻塞的方式发送指定字节的数据(必须发送完才能接受,和上面有区别)
- 形参 1 :UART_HandleTypeDef 结构体类型指针变量
- 形参 2:指向要发送的数据地址
- 形参 3:要发送的数据大小,以字节为单位
- 形参 4:设置的超时时间,以 ms 单位
IO 引脚复用功能(掌握)
#复用
何为复用?
- 通用:IO 端口的输入或输出是由 GPIO 外设控制,我们称之为通用
- 复用:IO 端口的输入或输出是由其它非 GPIO 外设控制,我们称之为复用
STM32F1 的 IO 引脚复用
参考:STM32F103ZET6(中文版).pdf 第 3 小节 引脚定义
IO 引脚复用映射示意图
温馨提示:IO 引脚与 AF(0~15)具体定义关系,需要参考对应的芯片数据手册
GPIO 复用功能低位寄存器(AFRL)
GPIO 复用功能高位寄存器(AFRH)
摘自:STM32F4xx 参考手册_V4(中文版).pdf,7.4.9 节 7.4.10