UART串口通信
我们在生活中处处都会接触到或者是用到通信,QQ,微信,电话,这些都是最常见的人与人之间远程无线通信的方式,那么也有像红外遥控,蓝牙数据传输等器件或硬件之间的通信,这些通信方式都有一些共同点:无线,易受干扰(信号变差)等
而在传输数据等数据准确率要求较高的场合,往往人们会选择用有线的方式进行数据传输,如移动硬盘,网线,计算机内部的总线等,那么,我们所学的USAR串口通信,也属于有线通信的一种
文章目录
- UART串口通信
- 前提知识补充
- UART概述
-
- UART的配置方法
- GPIO口的配置
- USART的配置
- 使能USART时钟
- **用波特率(函数形参)计算波特率寄存器数值**
- 配置USART控制寄存器1
- 配置USART控制寄存器2
- 发送/接受数据的方法
-
- 补充
-
前提知识补充
-
通信协议:双方实体完成通信或服务所必须遵循的规则
例如:规定数据传输方式(TCP UDP等),规定传输的内容格式(HTTP等)
-
同步通信:两个设备之间进行信息交换时,出数据线外,还有同步时钟线,用来同步器件A和器件B的收发速率
-
异步通信:没有时钟线相连,再发完一个字节后,可以相隔任意时间发送下一个数据
-
接收器/发送器:接收/发送数据的一端
-
单工通信:一台设备只能作为接收器或者发送器
-
半双工通信:同一时刻,一台设备只能作接收器或者发送器,但不能同时作接收器和发送器(或者理解为信号可以在两个方向上传输,但同一时刻只能朝一个方向传输)
-
全双工通信:同一时刻,一台设备既作接收器也做发送器
-
串行通信:通信双方按位进行,将数据按位依次传输
-
并行通信:一组数据的各数据位在多条线上同时被传输
UART概述
那么了解完这些基本知识(了解就好,不用过多深究),我们现在来看我们要学习的UART串口通信:
UART(通用异步串行收发器
从它的名字就可以看出来,UART是异步,串行通信,除此之外,STM32F4的UART也是全双工数据交换方式
数据帧格式:
位名 | 位数 | 电平高低 |
---|
空闲电平 | | 高 |
起始位 | 1 | 低 |
数据位 | 5—8位(ST芯片8—9位) | |
校验位 | 1 | |
停止位 | 0.5—2 | 高 |
波特率:
波特率通常等于单位时间内传输的数据位数
例如:115200 表示1s传输115200位数据
UART通信接口:
任何USART双向通信均需要至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):
- RX:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
- TX:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使能了发送器但没有待发送的数据,则 TX 引脚处于高电平。
UART的配置方法
GPIO口的配置
- 时钟使能:找到芯片电路原理图上UART对应的GPIO端口,使能该端口
- GPIO控制寄存器:配置模式寄存器为复用模式,根据需要配置其他控制寄存器
- 复用功能低位/高位寄存器,低位寄存器AFR[0],高位寄存器AFR[1]
USART的配置
使能USART时钟
找到芯片框图里对应USART的时钟线并使能,通常为APBx总线
用波特率(函数形参)计算波特率寄存器数值
计算方法:
Tx/Rx波特率 = fCK / (8 × (2 - OVER8) * USARTDIV)
fCK为USART输入时钟的频率,例如 84Mhz = 84 * 106
OVER8表示选择的过采样倍数,例如16倍过采样即为0 , 8倍过采样即为1
所以可以通过这个公式计算USARTDIV
void uart_Init(u32 baud)
{
float usartdiv;
u32 div_m,div_f;
usartdiv = (float)fck / (8 * (2 - OVER8) * baud);
div_m = usartdiv;
div_f = (usartdiv - div_m) * 8 * (2 - OVER8) + 0.5f;
USART->BRR = (div_m<<4) + div_f;
}
配置USART控制寄存器1
必须配置的有:
位 | 功能 |
---|
15 | 过采样模式 |
13 | USART使能 |
12 | 字长 |
10 | 奇偶校验控制使能 |
3 | 发送器使能 |
2 | 接收器使能 |
配置USART控制寄存器2
必须配置的有:
发送/接受数据的方法
查询发送(接收)数据法
查询:用while()不断循环判断
当发送数据寄存器为空时,表示数据已传输到移位寄存器,就可以发送数据
void usart_send(u8 data)
{
while(!(USART->SR & (1<<7)));
USART->DR = data;
}
当读取数据寄存器不为空时,表示移位寄存器的内容已经传输到数据寄存器中,现在就可以读取数据
u8 usart_recv(void)
{
while(!(USART->SR & (1<<5)));
return USART->D;
}
补充
利用串口重定向printf的方法:
int fputc(int c, FILE * stream)
{
while(!(USART1->SR & (1<<7)));
USART1->DR=c;
return c;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)