当前位置: 代码迷 >> 综合 >> 再造STM32---第十七部分:USART—串口通讯
  详细解决方案

再造STM32---第十七部分:USART—串口通讯

热度:26   发布时间:2023-12-16 14:29:56.0

本章参考资料:《STM32F4xx 中文参考手册》 USART 章节。
学习本章时,配合《STM32F4xx 中文参考手册》 USART 章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。
特别说明, 本书内容是以 STM32F42xxx 系列控制器资源讲解。
 

17.1 串口通讯协议简介:

物理层: 规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。其实就是硬
件部分。

协议层: 协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。其实就是软件部分。
 

1-RS232标准:

RS232标准串口通讯结构图:


1、 RS232标准串口主要用于工业设备直接通信
2、电平转换芯片一般有MAX3232, SP3232

 

RS-232 与 TTL 电平区别

2-USB转串口

USB转串口通讯结构图

1、 USB转串口主要用于设备跟电脑通信
2、电平转换芯片一般有CH340、 PL2303、 CP2102、 FT232
3、使用的时候电脑端需要安装电平转换芯片的驱动

 

3-原生的串口到串口

1、原生的串口通信主要是控制器跟串口的设备戒者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信
2、 GPS模块、 GSM模块、串口转WIFI模块、 HC04蓝牙模块

 

串口数据包的基本组成

起始位: 由1个逻辑 0 的数据位表示
结束位: 由 0.5、 1、 1.5 戒 2 个逻辑 1 的数据位表示
有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为 5、 6、 7 戒 8 位长
校验位: 可选,为的是数据的抗干扰性。
校验方法分为:
1-奇校验(odd)、 2-偶校验(even)
3-0 校验(space)、 4-校验(mark)
5-无校验(noparity)
奇校验(odd) : 有效数据和校验位中“ 1”的个数为奇数
比如一个 8 位长的有效数据为: 01101001,此时总共有 4个“ 1” ,为达到奇校验效果,校验位为“ 1” , 最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位
偶校验(even) : 有效数据和校验位中“ 1”的个数为偶数
比如一个 8 位长的有效数据为: 01101001,此时总共有 4个“ 1” ,为达到偶校验效果,校验位为“ 0” , 最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位
0 校验是不管有效数据中的内容是什么,校验位总为“ 0” 。
1 校验是校验位总为“ 1” 。
无校验就是数据包中不包含校验位
 

17.2 STM32串口功能框图讲解:

1-引脚
2-数据寄存器
3-控制器
4-波特率

STM32F4xx数据手册—Pinouts and pin description。
ST每个系列的芯片都有一个数据手册,里面有引脚的详细功能。
TX: 数据发送
RX: 是数据接收
SCLK: 时钟,仅同步通信时使用
nRTS: 请求发送(Request To Send)
nCTS: 允许发送(Clear To Send)
数据寄存器—USART_DR9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应了两个物理内存。

USART_CR1: M, 0: 8bit, 1: 9bit
USART_CR2: STOP
USART_CR1: PCE、 PS、 PEIE
USART_SR : PE
USART_SR: TXE, Transmit data register empty
USART_SR: TC, Transmission complete
USART_CR1: TXEIE
USART_CR1: TCIE
USART_SR: RXNE, Read data register not empty
USART_CR1: RXNEIE
USART_CR1: UE、 TE、 RE

波特率—每秒钟要发送多少数据
USART_BRR:波特率寄存器
USART_CR1: OVER8

USARTDIV:无符号的定点数
FPCLK:串口的时钟,注区分APB2和APB1两条总线
OVER8:过采样模式

 

例如:

USART: USART1,时钟为90M
波特率: 115200
OVER8: 0, 16倍过才样, BRR小数位有效

7.3 STM32串口初始化结构体讲解:

USART初始化结构体

typedef struct
{
uint32_t USART_BaudRate; //波特率 BRR
uint16_t USART_WordLength; //字长 CR1_M
uint16_t USART_StopBits; //停止位 CR2_STOP
uint16_t USART_Parity; //校验控制 CR1_PCE、 CR1_PS
uint16_t USART_Mode; //模式选择CR1_TE、 CR1_RE
// 硬件流选择 CR3_CTSE、 CR3_RTSE
uint16_t USART_HardwareFlowControl;
} USART_InitTypeDef;

同步时钟初始化结构体

typedef struct
{
uint16_t USART_Clock; // 同步时钟 CR2_CLKEN
uint16_t USART_CPOL; // 极性 CR2_CPOL
uint16_t USART_CPHA; // 相位 CR2_CPHA
uint16_t USART_LastBit; //最后一个位的时钟脉冲 CR2_LBC
} USART_ClockInitTypeDef;

7.4 编程时需要用到的固件库函数:

1-配置GPIO为具体的第二功能
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
2-中断配置函数
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
FunctionalState NewState)
3-串口使能函数
void USART_Cmd(USART_TypeDef* USARTx,FunctionalState NewState)

4-数据发送函数
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

5-数据接收函数
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
6-中断状态位获取函数
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)

7.5 代码讲解:

硬件设计-1: TTL电平转USB电平(使用时电脑上记得安装CH340驱动)

硬件设计-2: TTL电平转232电平

编程要点:

1-初始化串口需要用到的GPIO, GPIO_InitTypeDef,
GPIO_PinAFConfig();
2-初始化串口, USART_InitTypeDef
3-中断配置
4-使能串口
5-编写发送和接收函数
6-编写中断服务函数

 

电脑端发送过来的数据是字符格式的