STM32F4串口通信(UART)详解

UART串口通信

我们在生活中处处都会接触到或者是用到通信,QQ,微信,电话,这些都是最常见的人与人之间远程无线通信的方式,那么也有像红外遥控,蓝牙数据传输等器件或硬件之间的通信,这些通信方式都有一些共同点:无线,易受干扰(信号变差)等

而在传输数据等数据准确率要求较高的场合,往往人们会选择用有线的方式进行数据传输,如移动硬盘,网线,计算机内部的总线等,那么,我们所学的USAR串口通信,也属于有线通信的一种

前提知识补充

  • 通信协议:双方实体完成通信或服务所必须遵循的规则

    例如:规定数据传输方式(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口的配置

  1. 时钟使能:找到芯片电路原理图上UART对应的GPIO端口,使能该端口
  2. GPIO控制寄存器:配置模式寄存器为复用模式,根据需要配置其他控制寄存器
  3. 复用功能低位/高位寄存器,低位寄存器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;//div_m为整数部分,div_f为小数部分(会转化成整数)
    
    usartdiv = (float)fck / (8 * (2 - OVER8) * baud);
    //现在要得到usartdiv的整数部分和小数部分
    div_m = usartdiv;//自动转换,截断得整数部分
    //由usartdiv减去整数部分即得小数部分,小数部分再转换成能整数
    div_f = (usartdiv - div_m) * 8 * (2 - OVER8) + 0.5f;//四舍五入
    //在编写这句代码时遇到一个waring
    //single-precision operand implicity converted to double-precesion
    //意思是单精度运算隐式转换成双精度运算了
    //这是由于末尾的0.5被默认转换成双精度浮点数了,这时给它末尾加一个f即可告诉编译器它是一个单精度浮点数
    USART->BRR = (div_m<<4) + div_f;//赋值给寄存器
    /**********************************************************/
}
配置USART控制寄存器1

必须配置的有:

功能
15过采样模式
13USART使能
12字长
10奇偶校验控制使能
3发送器使能
2接收器使能
配置USART控制寄存器2

必须配置的有:

功能
13:12停止位

发送/接受数据的方法

查询发送(接收)数据法

查询:用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的方法:
//为什么要用fputc?	因为printf也是去调用fputc来打印字符
//故引入stdio.h,然后写如下函数即可覆盖原来的fputc
//注意这个方法需要勾选魔术棒下的USE MicroLIB使用微库
//使用微库会关闭半主机状态
int fputc(int c, FILE * stream)
{
	while(!(USART1->SR & (1<<7)));
	USART1->DR=c;//将字符c写到数据寄存器发送出去,这样就可以在串口软件看到输出的字符了
	
	return c;
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值