此笔记是观看尚硅谷的stm32单片机教程,STM32入门教程,寄存器与HAL库开发一套通写下的笔记
通讯基本概念
串行和并行
两者之间的区别
速度: 并行通常比穿行速度要快.
复杂性: 并行需要更多的数据线,布线更复杂; 串行通信简化了布线和接口.
距离: 串行通信更适合远距离传输,并行通信适合短距离传输.
成本: 串行接口通常成本较低,因为用到的硬件较少(数据线).
抗干扰: 串行优于并行.
单工,半双工和全双工
本质是信息传输方向有所区别.
单工: 信息传输只能从一个方向传输.
半双工: 信息能两边互传,但是每次只能一边传输.
全双工: 信息随时都能从两边传输.
同步和异步
本质是看是否有时钟来规定数据传输的频率.
同步: 多了根时钟数据线传输时钟信号.
异步: 没有时钟信号线.
串口通讯协议

传输数据时,起始位为0,停止位为1,只有收到这样类型的数据时,系统才会知道什么时候开始什么时候结束.
LSB中的L是least,最小的意思;MSB中的M是max,最大的意思,所以串口通讯是从低位开始发送的.
奇偶校验位:一个额外的数,当认定为奇校验时,前面的有效数据位和奇偶校验位中的数据中加起来,1的个数位奇数,则通过;反之亦然,但显然这种校验方式准确率不准.
空闲位是1,即当没有传输事件时,数据线中一直保持高电平,直到传输事件产生时,变为低电平表示数据即将传输.
当发送的数据长度不清楚有多长时,为了分明后面传输的1是否是真正的停止位和空闲位,通讯协议通常认为,当一个n个字节长度的数据流都为1,就判断数据已经传输结束,这段n个字节长度的1数据流被称为空闲帧.
波特率:表示每秒钟传输了多少个码元.
码元:一个判断数据大小的单位,比如说,我的数据有4钟状态,4种状态用二进制需要两位来表示,这时,我的一个码元就是两个字节的宽度,两个字节就是一个码元.
STM32中提供了串口异步通讯,由于没有时钟信号,所以两个通讯设备之间要约定好波特率,即每个码元的长度,以便解码.
USART
USART:同步异步收发器,串行通讯设备,可以和外部设备灵活的进行全双工数据交换.
UART:相比于USART去掉了同步功能 .
stm32中USART提供了5个串口一边选择,其中前三个是USART,后两个是UART.
USART1运行速度最快,其他的是USRAT运行速率的一半.
电脑上的串口一般叫com口,对应单片机上的UART口.
差分传输:两条线同时传输数据,数据的值为两条线电平之差,这样能使抗干扰能力增强,因为干扰时,两遍同时增减,最后差值出来的结果不变.
USART框图介绍
框图:

IrDASIR编解码模块
TX: 发送引脚 transmit
RX: 接收引脚 receive
SW_RX: 数据接收引脚(单线模式/智能卡模式使用)
IRDA: 红外模块
nRTS: request to send 与外设连接,发送输出请求,n为低电平使能
nCTS: clear to send 与外设连结,接受是否准备好接受的型号,n为低电平使能
SCLK: 将时钟信号输出
接收发送移位寄存器

接收移位寄存器:接收编解码模块的数据,每次接收将所有数据左/右移移位,准备接收下一位,左移右移看接受顺序
接收数据寄存器:接收移位寄存器满了的时候直接接收数据然后交给总线
发送数据寄存器和发送移位寄存器:和上面两个的功能刚好相反最后发送到编码解码模块,从TX输出
USART_DR:数据寄存器,包含了发送用寄存器和接受用寄存器
发送用寄存器(TDR)
接收用寄存器(RDR)
使用时直接用DR即可
SR模块
总框图中有个寄存器叫SR(status register),是一个状态寄存器
RXNE: 判断接受数据寄存器是否为满,寄存器为1,说明为满;对USART_DR的读操作会将此位清零
TXE:是用来判断TX是否为空,寄存器为1,说明为空;对USART_DR的写操作会将此位清零
TC:用来表示发送移位寄存器发送数据完成
IDLE:检测当前RX是否为空闲帧(接收数据是否结束);清除条件位,先读USART_SR再读USART_DR
波特率的配置
USART_BRR,是一个用来配置波特率的模块

波特率系数计算
USARTDIV = DIV_Mantissa + (DIV_Fraction/16)
最后得到的时钟为
发送器时钟 = 系统时钟/(USARTDIV * 16)
USART模块寄存器的使用
1. 波特率设置
由于数据交互最重要的就是同步频率,因此上来就要设置波特率
USART->BRR = 0x271; //一般为这个值,特殊情况取特殊值2. 收发使能和串口使能
全都是在USART_CR1寄存器中设置的,CR1的复位值都是0,因此默认都是0
USART->CR1 |= (USART_CR1_TE | USART_CR1_RE); // TX_ENABLE & RX_ENABLE
USART->CR1 |= USART_CR1_UE; // USART_ENABLE
// 其中此寄存器中有个M位,是一个控制字长的寄存器位,默认为0,输入1则数据位为9
// PS位:校验方式的选择,0为偶校验,1为奇校验 PCE位:PS位使能位
// XXIE位:各种中断使能位
// M一般和校验配合使用,M为1时,最后一位一般是校验位,此时PCE置1,然后PS位选择校验方式3.发送接收数据
uint8_t receive_char(void)
{
/* 等待接收缓冲区 非空 */
while ((USART1->SR & USART_SR_RXNE)==0)
{
}
return USART1->DR;
}
/*
向串口发送一个字符
*/
void send_char(uint8_t c)
{
while ((USART1->SR & USART_SR_TXE)==0)
{
}
/* 把想要发送的数据写入到寄存器中 */
USART1->DR = c;
}4. 接收中断使能
/* 使能USART1接受中断*/
USART1->CR1 |= USART_CR1_RXNEIE; // 接受缓冲区为满时,置1/发送一个中断信号CR2中的stop
有两个位来设置停止位数
00: 表示1.0个停止位
01: 表示0.5个停止位
10: 表示2.0个停止位
11: 表示1.5个停止位
UART4和UART5不能使用0.5和1.5个停止位