STM32F4串口通信(UART)详解

2023-05-16

UART串口通信

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

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

文章目录

    • UART串口通信
    • 前提知识补充
    • UART概述
      • 数据帧格式:
      • 波特率:
      • UART通信接口:
    • UART的配置方法
      • GPIO口的配置
      • USART的配置
        • 使能USART时钟
        • **用波特率(函数形参)计算波特率寄存器数值**
        • 配置USART控制寄存器1
        • 配置USART控制寄存器2
    • 发送/接受数据的方法
      • 查询发送(接收)数据法
    • 补充
        • 利用串口重定向printf的方法:

前提知识补充

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

    例如:规定数据传输方式(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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F4串口通信(UART)详解 的相关文章

  • ESP-NOW无线通信

    本文由铁熊与默联合创作 在学习 Arduino 开发的过程中 无线通讯是我们学习道路上一道必过的坎 无线通讯摆脱了线材的束缚 使用更加灵活且通讯距离根据不同无线模块可达几十米甚至是数公里 常见的无线通讯方式有蓝牙 WiFi LoRa NB
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • CSerialPort教程4.3.x (1) - CSerialPort项目简介

    CSerialPort教程4 3 x 1 CSerialPort项目简介 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python Node
  • USART_FLAG_TC与 USART_FLAG_TXE之间的区别,各自的用途 - 附举例代码及说明

    USART FLAG TC与 USART FLAG TXE之间的联系 各自的用途 名词解释 STM32固件库使用手册 USART FLAG TXE 发送数据寄存器空标志位 USART FLAG TC 发送移位寄存器发送完成标志位 串口发送数
  • QT开发之串口通信(四)

    VS2015 QtPackage版本1 3 11插件 QT5 13 1 最近使用串口遇到一些问题 1 问题 在上述编译环境下发生数据会出现发送一次数据后无法重复发送数据 返回值也没有问题 查询得知 QByteArray SendBytes
  • 8086CPU外部引脚图

    8086CPU外部引脚图 在最小模式中引脚定义 AD15 AD0 Address Data Bus 16位地址 数据总线 分时复用 传输地址时三态输出 传输数据时三态双向输入 输出 在总线周期T1状态 CPU在这些引脚上输出存储器或I O端
  • Ubuntu+Python环境做上位机

    最近需要制作程控电阻箱的上位机 使得大学毕业后就不再接触硬件的我无从下手 拿到机器后不知道怎么与其进行通信 Google上的资料也很少 现将我的环境搭建过程记录下来 希望对和我一样的小白有所帮助 软件环境 Ubuntu 16 04 pyth
  • LInux下串口编程详解细节

    LInux下串口设置详解 日期 2011 04 01 来源 Linux社区 作者 huang879135 字体 大 中 小 串口的设置主要是设置struct termios结构体的各个成员值 include
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • 蓝桥杯51单片机之数码管从点亮到动态时钟的实现【单片机开发初学者必掌握】

    文章目录 一 点亮数码管 二 八位数码管同时从0到F 三 显示学号 指定数字 四 中断机制的引入 五 利用中断实现动态时钟 一 点亮数码管 首先看一下案例源码 include
  • STM32串口配置实验

    STM32 串口简介 串口作为 MCU 的重要外部接口 同时也是软件开发重要的调试手段 其重要性不言而喻 现在基本上所有的 MCU 都会带有串口 STM32 自然也不例外 STM32 的串口资源相当丰富的 功能也相当强劲 ALIENTEK
  • 奇偶校验位

    在串行通信中 奇偶校验位通常是由UART这样的接口硬件生成 校验的 在接收方 通过接口硬件中的寄存器的状态位传给 CPU 以及操作系统 错误数据的恢复通常是通过重新发送数据 这个过程通常由如操作系统输入输出程序这样的软件处理的
  • 【嵌入式基础】串口通信

    目录 1 前言 2 基本概念 2 1 波特率 2 2 起始位 2 3 数据位 2 4 校验位 2 5 停止位 2 6 空闲位 3 工作模式 3 1 单工模式 3 2 半双工模式 3 3 全双工模式 4 同步通信和异步通信 4 1 同步通信
  • OUT指令时,就进入了I/O端口读写周期

    1 译码电路的输入信号 每当CPU执行IN或者OUT指令时 就进入了I O端口读写周期 此时首先是端口地址有效 然后是I O读写控制信号 IOR和 IOW有效 把对端口地址译码而产生的译码信号同 IOR和 IOW结合起来一同控制对I O端口
  • 使用ROS通过串口获取遥控器信号(二)

    使用ROS通过串口获取遥控器信号 二 十 编写串口通信节点 sudo gedit catkin ws src uart communication src commu cpp 加入以下代码 根据实际情况修改自己的代码 注意serial的AP
  • 串口通信——接收串口数据并处理(C语言)

    本文主要内容包含 1 接收串口数据程序的编程逻辑示意图 2 接收串口数据程序要用到的通用函数模块 可直接引用 无需更改 3 接收串口数据程序的示例 1 接收串口数据程序的编程逻辑示意图 2 与串口有关的函数模块及数组 可直接引用到自己的程序
  • Python:简易的串口收发程序

    Python 简易的串口收发程序 更新历史 20201204 首次发布 最近需要搞一个基于Python的串口程序 要求 能够将字符串形式的十六进制数 例如 12 34 CD EF 转化成对应的二进制数据后发送给一个串口设备 能够从串口设备接
  • Android usb通信 实现app与arduino通信demo

    Android usb通信 一 前言 二 开始 1 AndroidManifest xml清单文件 2 创建权限广播接收者 3 枚举usb设备 4 获取usb接口以及输入 输出端点 5 打开设备 6 设置波特率 7 创建接收数据的线程 8
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过

随机推荐

  • 关于虚拟机ubuntu编译程序时报make: warning: Clock skew detected. Your build may be incomplete.问题的解决办法

    关于ubuntu虚拟机编译程序时报make warning Clock skew detected Your build may be incomplete 问题的解决办法 xff1a 我在ubuntu虚拟的arm linux gcc上编译
  • 解决rosbag时间戳未对齐的解决方法

    解决rosbag时间戳未对齐的解决方法 Reference ROS org rosbag Cookbook http wiki ros org rosbag Cookbook rosbag在存储时间时 xff0c 接收消息的时间和生成消息的
  • ROS+python控制小乌龟走方形的实现rospy

    常见的简陋的控制乌龟行走方形的方式很简单 xff0c 例如 xff1a 代码有些地方是测试用的 xff0c 可以不要 usr bin env python from pickle import TRUE import rospy from
  • C++ STL算法

    C 43 43 STL算法 1 非修正序列算法1 1 adjacent find first last 1 2 count first last val 2 修正序列算法2 1 random shuffle first last 2 2 p
  • git子模块的修改和更新操作

    Reference git子模块的修改和更新操作 1 子库与父库 git关于子模块的官方文档链接 xff1a https git scm com book zh v2 Git E5 B7 A5 E5 85 B7 E5 AD 90 E6 A8
  • CMakeLists Option使用简介

    CMakeLists Option使用简介 1 基本格式2 示例3 基本用法4 C程序条件编译5 次项目之间选项的关系 Reference xff1a CMake之Option使用简介 CMake中的option用于控制编译流程 xff0c
  • 四轴一键起飞定高定点悬停伪代码

    四轴飞行器一键起飞定高 xff0c 降落 xff0c 光流定点悬停控制算法伪代码 基于飞控系统的二次开发
  • 开源飞控地面站 Openpilot GCS (现在的Librepilot GCS)源码分析  (2)地图插件

    xff08 xff11 xff09 OpenPilot项目中有地图显示模块 xff08 xff12 xff09 地图显示模块的插件是 xff1a opmap插件 xff0c 位置是src gt plugins gt opmap xff08
  • ubuntu 下运行程序报错 对‘std::cout’未定义的引用:gcc与g++的区别

    目录 1 问题提出 2 gcc与g 43 43 的区别 2 1 预处理 2 2 编译 2 3 汇编 2 4 链接运行 3 总结 1 问题提出 linux初学 xff0c 写了个例程 xff0c 用gcc o编译时出现以下问题 xff1a 后
  • 2.2 开启调度器

    开启调度器 void vTaskStartScheduler void BaseType t xReturn if configSUPPORT STATIC ALLOCATION 61 61 1 静态创建空闲任务 StaticTask t
  • 4. 消息队列

    消息队列 队列又称消息队列 xff0c 常用于任务间通信的数据结构 xff0c 可以在任务与任务之间 xff0c 中断与任务之间传递消息 xff0c 实现任务接收来自其他任务或中断的不固定长度的消息 任务可从消息队列中读取消消息 xff0c
  • 网卡接口

    网络接口 网络接口 xff08 以太网 xff09 是硬件接口 xff0c LwIP是软件 xff0c 并且网卡也是由很多种的 LwIP使用一个数据结构 xff0c nitif来描述网卡 用户提供最底层的接口函数 xff0c LwIP则提供
  • 系统扇区

    系统结构 DBR xff0c 主引导记录 xff1b DPT xff0c 分区表 xff1b DBR xff0c 分区引导扇区 引导扇区 MBR Main Boot Record xff0c 主引导扇区 xff0c 硬盘主引导记录区 xff
  • 华为3COM交换机配置命令详解

    1 配置文件相关命令 Quidway display current configuration 显示当前生效的配置 Quidway display saved configuration xff1b 显示flash中配置文件 xff0c
  • 分区结构

    分区结构 DBR xff0c 引导记录区 xff0c 包括一个引导程序和一个BPB xff0c 即本分区参数记录表 系统可直接访问的第一个扇区 xff0c 大小为512个字节 xff08 特殊情况占用其他保留扇区 xff09 512字节中
  • 1. 列表和列表项

    列表和列表项 列表 列表是一个数据结构 xff0c 用来追踪任务 xff0c 列表中有一个指针指向列表项 列表是一个结构体 xff0c 内部携带一个指针 xff0c 指针指向列表项 xff0c 列表项形成双向链式结构挂载在列表下 一个列表下
  • C#简单串口调试助手【傻瓜教程】chanson_chapter01

    简易串口调试助手制作教程 C Winform chanson chapter01 说明 xff1a 本教程基于win10 x64 位操作系统 xff0c 软件环境为Microsoft Visual Studio Community 2015
  • 快速上手Ubuntu之安装篇——安装win7,Ubuntu16.04双系统

    Linux可以说是开发者的系统 xff0c 对于开发者来说 xff0c Linux发行版不仅为我们提供了无数强大的开发工具 xff0c 还能帮助我们从源码上学习操作系统是工作的 而且经常在命令行上工作的我们还能在别人面前耍下酷 Ubuntu
  • SpringBoot中事件的使用

    项目中很多场景可以使用事件来对系统进行解耦 xff0c 让系统更便于维护和扩展 SpringBoot项目默认是支持事件的 xff0c 我们只需要自定义事件 xff0c 然后发布事件 xff0c 之后监听事件处理业务逻辑即可 SpringBo
  • STM32F4串口通信(UART)详解

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