概述
本文是对STM32的USART相关知识扫盲(参考正点原子的教学),文章架构如下:
- 结合《STM32F4xx中文参考手册》,先从系统框图和寄存器的角度剖析USART硬件架构。
- 然后结合库例程剖析USART初始化的基本配置流程,进一步学习嵌入式代码规范
阅读完本文,要能回答以下问题:
- 什么是USART?跟USART并列的串行通信标准还有哪些?
- 采用USART实现不同对象之间通讯时,需要注意什么?
- 简述USART模块系统框图构成?如何让USART模块工作在不同模式?
- USART模块是用来收发数据的,而正常收发数据的进行,是需要设置合适的波特率的,结合硬件知识谈谈对设置波特率的理解。
- 如何计算并配置波特率相关的寄存器呢?
- 简述USART的相关寄存器,并对寄存器中的常用位进一步解释。
HAL库是通过HAL_UART_Init()函数进行USART相关寄存器的初始化配置的,研究此函数,回答以下问题:
- 从该函数接收参数、返回参数的角度简述该函数是如何配置串口初始化的。
- 需要进行初始化配置的USART的寄存器的地址是如何定位到的?
- 从该函数具体实现何种功能的角度简述该函数是如何配置串口初始化的。
- 该函数里面,如何初始化串口相关IO口的复用配置的?
- 上一个问题我们已经知道,该函数通过调用HAL_UART_MspInit()函数来实现IO口的复用配置,进一步研究可以发现,这个函数在定义时,函数类型前面可以加了_Weak关键字,这个关键字有什么用?
- 该函数里面,如何初始化串口特性的呢?
文章最后,列出了一些值得进一步研究的内容,包括对串口发送数据配置流程、接收数据配置流程、串口收发数据中断处理流程等,详情阅读文章《初探STM32F4(4)–USART(2)》。
一、USART概述
1、什么是USART?
- USART全称通用同步/异步串行接收/发送器,它是一种全双工、同步/异步、串行的通信设备
- 全双工/半双工/单工是一组概念,表征数据的传送方向。单工是指数据只支持在一个方向传输,半双工是指数据可以两个方向传输、但同一时刻只能有一个方向,全双工允许统一时刻两个方向传输
- 同步/异步是一组概念,表征数据传送是否依靠时钟信号来同步。带时钟信号传输就是同步通信、不带时钟信号就是异步通信
- 串行/并行是一组概念,数电基础中已讲过移位寄存器的概念,不再赘述。
2、与USART并列的串行通信标准还有哪些?
3、采用USART实现不同对象之间通讯,需要注意什么?
- 不同终端之间通过USART通信,双方要注意适配问题,有三个层次的适配问题需要注意
- 第一个层次是物理层,即接口适配,常用的接口有RS232、RS485、TTL直连、USB
- 第二个层次是数据层,即规定好数据格式
- 包括起始位(1位逻辑0表示数据位开始)、数据位(9或9位)、奇偶校验位、停止位(1或2位)
- 波特率规定了移位寄存器传输每一位数据的时钟速度
- 第三个层次是协议层,即程序规定好通讯规范
二、USART硬件架构
系统框图
1、简述USART模块系统框图构成
- 当需要接收数据时,外部数据从RX引脚串行输入到IrDA(一个红外线数据通信模块),然后送入接收移位寄存器,在数电一章我们已经了解过,移位寄存器就是一系列的D触发器的组合,它支持串入、串出、并入、并出。当一组数据完整送入到移位寄存器后,再并出到数据寄存器(RDR)。
- 对于发送数据,数据总线先把数据送到发送数据寄存器(TDR),并入到发送移位寄存器,然后从TX接口串行输出。
- 对于上述数据收发过程,存在大量的组合逻辑电路在配合工作。
- 对于单独一块电路的正常工作,需要配置好它的控制信号
- 对于多块电路协调工作时,当某一块电路已经完成了工作,需要产生标志信号,此时可以使能下一块电路开始工作。
- 同时,当某些特定模块产生标志信号后,表明系统已经完成了某些功能,CPU可以接手做一些信息处理了(进入中断服务程序)
- 这些零零总总的信号构成了USART的各种寄存器。
2、通过分析系统框图,可以发现USART可以工作在不同的模式,简单阐述下其中的机理。
- USART模块可以配置成多种模式,具体能配置的模式如下所示。
- USART不同模式怎么选择呢?每一种模式对应一块电路需要工作,只要把对应模式的电路给使能信号即可。使能信号也好理解,必然是对应于寄存器中的某些位啦。
3、利用数电知识分析如何设置波特率?
- 设置波特率就是设置移位寄存器的时钟频率,这个时钟频率决定了一组数据完整送入进移位寄存器,可以并行输出至数据寄存器(DR)的时间。只有双方约定好了这个时间,才能正确地对数据进行解析。
- 设置波特率大小的直接思路就是对系统高频时钟信号进行分频,得到一个频率相对较低的时钟频率。
- 如何分频?利用计数器就能实现分频功能。
- 使用计数器实现分频需要的控制信号有哪些?需要设置计数器每个周期复位的门槛值,这个值可以被映射成时钟频率的分频倍数。
- 分频倍数对应USART寄存器USARTDIV中存储的值,这个值可以通过软件赋值。
波特率计算过程
1、如何计算波特率,即正确的分频值呢?
- 已经知道,波特率设置就是对高频时钟进行分频。而高频时钟的来源有两处:fPCLK1和fPCLK2。
- 对高频时钟进行两步分频:
- 先经过USARTDIV分频
- 再经过采样除法器分频。采样除法器可以实现16倍分频过采样和8倍分频过采样
- USARTDIV分频系数的取值,是通过波特率寄存器USART_BRR来设置的,USART_BRR低16位有效,且分为两部分,高12位用于设置整数,低四位用于设置小数。当采样除法器8倍分频时,小数位的最高位无效。
- 举一个例子:
- 要设置115200波特率,在10进制下,用高频时钟频率除以需要设置的波特率,再除以采样除法器的16倍分频(默认over=0),得到USARTDIV的值为48.8
- 将SARTDIV的整数部分赋值给DIV_Mantissa,即整数部分写入0X30
- 将SARTDIV的小数部分乘16赋值给DIV_Fraction(乘16是因为小数部分是一个占几分之几的概念),即小数部分写入0X0D
- 所以USART_BRR寄存器写入0X30D。
USART相关寄存器
1、简述USART相关寄存器,如下所示。
- 首先是上文已经介绍过的波特率寄存器USART_BRR
- 每个USART串口有三个控制寄存器,对应USARTx_CR1~3,具体每一位的含义查数据手册。
- USARTx_CR1用于定义数据格式,使能USART收发数据,使能是否响应各种中断信号
- USARTx_CR2用于定义USART模块的工作模式
- USARTx_CR3也用于定义USART模块的工作模式
- USARTx_CR1用于定义数据格式,使能USART收发数据,使能是否响应各种中断信号
- 总的来说,USARTx_CR1最为重要,详细介绍一下,低16位有效:
- OVER8:过采样模式选择
- UE:USART使能,软件置位
- M:选择字长
- WAKE:决定USART的唤醒方式
- PCE:Parity control enable,置1使能后,计算出来的奇偶校验位(可以通过组合逻辑电路硬件实现)被插入到MSB(Most Significant Bit)最高有效位,并对接收到的数据检查奇偶校验位。
- PS:Parity Selection,设置是奇校验还是偶校验
- 9~4位是各种标志符的中断使能(IE、Interrupt enable)信号
- TE、RE:发送寄存器与接收寄存器的使能
- RWU:Receiver WakeUp,选择USART接收器是否工作在静音模式
- SBK:Send Break,用于发送断路字符
- 接着是两个数据寄存器
低9位有效,数据寄存器包含两个