目录
一、什么是串口
1、介绍
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用同步/异步串行接收/发送器
UART:(Universal Asynchronous Receiver/Transmitter) 通用异步串行接收/发送器
串口是设备双方互相进行数据传输的一种通信协议,是众多通信协议中的其中一种,并且是使用频率比较高的一种通讯协议;串口中最重要的是两个设备间需要设置同一个波特率,否则无法进行同步,从而导致数据传输失败;串口通信通过转换芯片可以转换成 USB通信/232通信/485通信.
2、USART的通信方式
异步串行全双工,并且串口通信只能一个设备对应另一个设备(一主一从),不能一对多
3、USART的数据帧格式
数据帧格式:起始位(1位)+数据位(8位)+校验位(1位)+停止位(0.5位/1位/1.5位/2位)
或数据帧格式(不用校验位):起始位(1位)+数据位(8位)+停止位(0.5位/1位/1.5位/2位)
串口数据帧最多包含12个位
4、USART通信原理图
5、串口通信的四要素
波特率+数据位+检验位+停止位
6、USART和UART的区别
USART可以在同步或者异步通信状态下使用;而UART仅可以在异步通信状态下使用。
故当在异步通信的情况下,可以用USART.
二、如何配置串口
1、串口控制器框图
1.1 数据传输框图部分
①发送部分框图
发送数据中遇到的问题:
发送数据过程:内核写入数据到TDR,TDR并行自动载入到发送移位寄存器,发送移位寄存器再串行发送出去。
封装串口发送一字节函数思路:
void 串口发送一字节函数(要发送的数据)
{
//等待之前发送的数据发送完成(等待状态寄存器的发送完成位(TC)置1)
①该位由软件序列清零(读取 USART_SR 寄存器,然后写入USART_DR 寄存器)
②TC 位也可以通过向该位写入‘0’来清零
//将数据写入到发送TDR
}
②接收部分框图
接收数据中遇到的问题:
数据接收过程:数据串行接收到接收移位寄存器,接收移位寄存器再并行自动载入到RDR,最后内核读取RDR。
封装串口接受一字节函数思路:
返回值类型 串口接受一字节函数(void)
{
//等待之前接收的数据接收完成(等待状态寄存器的接收完成位(RXNE)置1)
①通过对 USART_DR 寄存器执行读入操作将该位清零。
② RXNE 标志也可以通过向该位写入零来清零。
//读取RDR并写入变量中
//返回变量
}
1.2 波特率部分框图
红色框:整数 紫色框:小数
fCK : 串口所挂载在总线上的时钟频率
USARTDIV= fCK/(8*(2-OVER8))/bps
波特率写入值的计算:需要将通过波特率计算出来的结果写入USART_BRR寄存器
方法1:
整数部分:
DIV_M=(强转取整数)USARTDIV
小数部分:
小数计算方法
化简后得:DIV_F= (强转取整数)(USARTDIV - DIV_M)*8*(2-OVER8)
波特率写入的值=DIV_M+DIV_F
示例代码:
方法2:
注意:此时得到的值带有小数部分,要想写入寄存器(寄存器只能存整数),二进制要整体左移四位,故十进制要扩大16倍
变形得到:USARTDIV= (fCK/(8*(2-OVER8))/bps)*16
波特率写入的值 = fCK / 波特率 //注意此时是16倍过采样
波特率写入的值 = fCK / 波特率 * 2; //注意此时是8倍过采样
示例代码: