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)详解 的相关文章

  • 【UART】Verilog实现UART接收和发送模块

    目录 写在前面 UART 工作原理 UART 接收部分 UART RX 模块图 UART RX 时序图 Verilog 实现 UART RX 模块 UART 发送部分 UART TX 模块图 UART TX 时序图 Verilog 实现 U
  • 蓝牙mesh组网-JDY-24M初步探索

    操作步骤如下 这款JDY 24M蓝牙功能强大 我主要应用其中mesh组网这个功能 mesh组网简单来说 就是组网的这几个蓝牙是可以互相通信 一一通信是通过蓝牙地址来确定的 一 配置组网 需要用到两根USB转TTL的线 JDY 24M蓝牙2个
  • UART通信原理

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

    CSerialPort教程4 3 x 4 CSerialPort在QT中的使用 环境 QT 5 6 3 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Ja
  • 硬件设计——外围电路(晶振电路)

    硬件设计之晶振电路 为什么要用晶振 晶振电路由何组成 晶振电路中其电容的作用 在日常的电路设计中 我们经常会用到晶振电路 所以我们就要首先先提一下什么是晶振 这样才能理解晶振电路 为什么要用晶振 晶振的作用是为系统提供基本的时钟信号 通常一
  • 使用HAL库开发STM32:UART基础使用

    文章目录 目的 基础说明与初始化 基础说明 初始化 数据接收和发送 轮询方式 中断方式 DMA方式 其它说明 总结 目的 UART 异步串口 是单片机非常常用的一个功能 一般用作设备或模块间通讯的一种方式 通常所说的232或是485通讯从写
  • UART串口协议

    通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UATR 是一种异步收发传输器 将数据由串行通信与并行通信间做传输转换 作为并行输入称为串行输出的芯片 UART是一种通用串
  • 【嵌入式基础】串口通信

    目录 1 前言 2 基本概念 2 1 波特率 2 2 起始位 2 3 数据位 2 4 校验位 2 5 停止位 2 6 空闲位 3 工作模式 3 1 单工模式 3 2 半双工模式 3 3 全双工模式 4 同步通信和异步通信 4 1 同步通信
  • Unity缺少System.IO.Ports

    问题 我需要使用串口相关的类库 但是引用不到 怎么解决的 PlayerSetting 界面把 Api Compatibility Level 切换为 NET 4 x 然后就好了
  • OUT指令时,就进入了I/O端口读写周期

    1 译码电路的输入信号 每当CPU执行IN或者OUT指令时 就进入了I O端口读写周期 此时首先是端口地址有效 然后是I O读写控制信号 IOR和 IOW有效 把对端口地址译码而产生的译码信号同 IOR和 IOW结合起来一同控制对I O端口
  • 串口通信——接收串口数据并处理(C语言)

    本文主要内容包含 1 接收串口数据程序的编程逻辑示意图 2 接收串口数据程序要用到的通用函数模块 可直接引用 无需更改 3 接收串口数据程序的示例 1 接收串口数据程序的编程逻辑示意图 2 与串口有关的函数模块及数组 可直接引用到自己的程序
  • 数字电路的时钟(1)-- 时钟抖动和分类

    时钟抖动通常分为时间间隔误差 Time Interval Error 简称TIE 又叫相位抖动 周期抖动 Period Jitter 和相邻周期抖动 cycle to cycle jitter 三种抖动 TIE又称为phase jitter
  • 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件 又称为脉冲电机 在驱动电源的作用下 步进电机受到脉冲的控制 其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比 步进电机每接收一个电脉冲 转
  • HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏 在STM32开发板上的实战应用及其详解 一 HMI智能串口屏使用步骤 二 附录 一 HMI智能串口屏使用步骤 安装USART HMI软件 一般买的串口屏里面 商家送的资料里面都有改该软件 打开软件 并点击左上角的 新建 选
  • Gem5 中与 ARM 裸机的 UART 通信

    我目前正在使用 Gem5 我必须通过 UART 从我的主机访问 ARMv8 裸机选项 所以我尝试了很多方法 但我还没有准备好 您能否让我知道 如何在裸机类型编程中将主机的串行端口映射到 ARMv8 的串行端口 任何帮助 将不胜感激 工作设置
  • 使用 read(...) 时在换行符处停止

    我需要从通过 UART 连接的 GPS 读取 NMEA 语句 操作系统是Debian 语言必须是C 为此 我使用以下命令打开文件open 并读取一个字符串read 但是 这样我必须指定字符串长度 这会分解句子 相反 我想读到 NMEA 句子
  • 如何将 microbit 与 BLE 连接并监听按钮按下事件?

    2021 年 11 月 28 日编辑 如果您需要使用蓝牙低功耗将 microbit 连接到计算机 并在单击按钮时执行操作 直接跳并跟随 ukBaz https stackoverflow com users 7721752 ukbaz的回答
  • 如何在R中从串口读取数据

    我想绘制来自串行端口的实时数据 我认为 R 将是完成这项工作的好工具 我在尝试从串行端口 COM4 读取数据时遇到了困难 我已经验证数据是通过 terra term 传入的 并在尝试 R 之前关闭会话 但我似乎无法在 R 中获取任何内容 我
  • 使用 /dev/tty* 进行 9 位 uart 仿真

    我有一个不常见的协议 它需要 9600 波特率 9 位和 1 个停止位 我找不到任何可以实现此发送 接收的驱动程序 我可以寄东西到 dev tty 用于模拟这些查询 我应该发送什么 如何模拟 9600 波特率 您可以使用粘性奇偶校验 也称为
  • STM32:从自定义引导加载程序跳转到应用程序时发生硬故障

    我正在开发带有自定义引导加载程序和应用程序的 STM32F401 MCU 编译器是GCC 5 2 1 没有运行优化 在以下跳转序列后的第一次中断后 我遇到了硬故障 引导加载程序 gt 应用程序 gt 引导加载程序 gt 应用程序 从引导加载

随机推荐

  • 关于虚拟机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 微信 电话 这些都是最常见的人与人之间远程无线通信的方式 那么也有像红外遥控 蓝牙数据传输等器件或硬件之间的通信 这些通信方式都有一些共同点 无线 易受干扰 信号变差 等 而