上篇文章(串口通信简介-优快云博客)重点叙述了串口通信的通信协议,本文将重点叙述利用STM32F407单片机实现串口通信。(#注意:本文是基于HAL库的实现方式)
一、STM32F407串口简介
STM32F4 的串口分为两种:
①USART(即通用同步异步收发器);
②UART(即通用异步收发 器);
UART 是在 USART 基础上裁剪掉了同步通信功能,只剩下异步通信功能。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用串口通信基本都是异步通信。
STM32F4 有 4 个 USART 和 2 个 UART,其中 USART1 和 USART6 的时钟源来于 APB2 时钟,其最大频率为84MHz,其他4个串口的时钟源可以来于APB1时钟,其最大频率为42MHz。
二、USART结构图
① USART 信号引脚
TX:发送数据输出引脚;
RX:接收数据输入引脚;
SCLK:发送器时钟输出,适用于同步传输;
SW_RX:数据接收引脚,属于内部引脚,用于智能卡模式;
IrDA_RDI:IrDA 模式下的数据输入;
IrDA_TDO:IrDA 模式下的数据输出;
nRTS:发送请求,若是低电平,表示 USART 准备好接收数据;
nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送;
② 数据寄存器
USART_DR 包含了已发送或已接收的数据。由于它本身就是两个寄存器组成的,一个专门给发送用的(TDR),一个专门给接收用的(RDR),因此该寄存器具备读和写的功能。TDR 寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR 寄存器提供了内部总线和输入移位寄存器之间的并行接口。
当进行数据发送时,向 USART_DR 中写入的数据会自动存储在 TDR 内;当进行数据读取时,从 USART_DR 读数据会自动提取 RDR 的数据。
USART 数据寄存器(USART_DR)低 9 位数据有效,其他数据位保留。USART_DR 的第 9 位数据是否有效跟 USART_CR1 的 M 位设置有关,当 M 位为 0 时,表示 8 位数据字长;当 M 位 为 1 时,表示 9 位数据字长,一般使用 8 位数据字长。
当使能校验位(USART_CR1 中 PCE 位被置位)进行发送时,写到 MSB 的值(根据数据的长度不同,MSB 是第 7 位或者第 8 位)会被后来的校验位取代。
③ 控制器
USART 有专门控制发送的发送器,控制接收的接收器,还有唤醒单元、中断控制等等
④ 时钟与波特率
这部分的主要功能就是为 USART 提供时钟以及配置波特率。
波特率,即每秒钟传输的码元个数,在二进制系统中(串口的数据帧就是二进制的形式), 波特率与波特率的数值相等,所以我们今后在把串口波特率理解为每秒钟传输的二进制位数。
波特率通过以下公式得出:
“fck ”是串口的时钟,(USART2\3 和 UART4\5 的时钟源为 PCLK1,USART1\6 的时钟源为 PCLK2);
“USARTDIV”是一个无符号的定点数,存放在波特率寄存器(USART_BRR)的低 16 位,DIV_Mantissa[11:0]存放的是 USARTDIV 的整数部分,DIV_Fractionp[3:0]存放的是 USARTDIV 的小数部分;
例如:当串口 1 需要设置 115200 的波特率,且此时fck = 84MHz时,那么根据上式可得: