【STM32下UART协议的一些认识与使用方法】

STM32下UART协议的一些认识与使用方法

  • 串口定义
    • 通用串行异步收发器
  • 协议中相关的概念
    • 空闲位
    • 起始位
    • 数据位
    • 奇偶校验位
      • 三种校验方式
      • BT接收数据的流程
    • 停止位
    • 波特率
    • 总结
  • UART的三种工作方式
  • UART控制器
    • 发送数据流程
    • 接收数据流程
  • UART初始化
  • UART相关结构体和库函数

串口定义

通用串行异步收发器

• 通用:UART的应用非常广泛,应用领域:工控行业,电力系统等
• 串行:处理器和外设之间只需连接一根信号线,处理器和外设数据传输是一个bit位一个bit位的传输 
	○ 切记:UART数据传输从低位开始传输
	○ 例如:处理器给BT发送数据0x95(1001 0101)
		最终处理器和BT之间的信号线的时序(高低电平序列):
		高->低->高->低->高->低->低->高
		1   0   1  0   1   0  0   1
• 并行:处理器和外设之间数据传输会连接多根数据线(8/16/32), 一次可以传输多个字节
• 串行和并行对比:
		□ 传输速度:一般来说,并行要快于串行
		□ 抗干扰:串行优于并行
		□ 传输距离:串行优于并行
• 异步:数据以独立的字节形式传输,每个字节都被单独同步。发送方和接收方必须事先约定好数据速率
      (波特率)、数据位、停止位和奇偶校验位等参数,以确保数据能被正确解析。
• 收发器:发送数据和接收数据的硬件单元
		如果CPU给外设发送数据:CPU是发送器,外设是接收器
		如果外设给CPU发送数据:外设是发送器,CPU是接收器

在这里插入图片描述

问:何为数据同步呢?
答:处理器和外设的数据传输必须在同一个步调上,保证双方数据传输无误,不能出现数据丢失现象
    例如:CPU给BT外设发送1,2,CPU发送完1之后,BT只有将1接收完毕,CPU才能发送数据2
    
问:何为异步呢?
答:“异步”是指在数据传输时,发送方和接收方没有统一的时钟信号来同步数据。
   在异步通信中,每个数据字节(通常是8位)前面会加上一个起始位,后面加上一个或多个停止位,
   有时还会加上奇偶校验位。这种方式允许接收方在接收到每个字节的起始位时重新同步。
   因此,即便是在没有共享时钟信号的情况下,接收方也能准确地捕获发送方发出的每个字节。
   
问:何为同步呢?
答:说明处理器和外设之间不仅仅需要数据线(顾名思义用来传输数据的信号线)
   还需要连接一根时钟控制信号线,此信号线用于双方的数据同步,此方式就是同步方式
    简单来说就四个字:低放高取

协议中相关的概念

空闲位

处理器和外设不进行数据传输时,数据线上持续发送空闲位,空闲位的有效位数为一个 bit位, 高电平有效

起始位

如果处理器和外设开始传输数据,首先传输起始位,有效位数为一个bit位,低电平有效

数据位

表示处理器和外设传输数据的有效位数,数据位的有效位数:5/6/7/8,一般选择8位(表示传输的数据有效位数为8个bit位)
注意:处理器和外设数据位保持一致

奇偶校验位

用于检测双方数据传输是否发生了错误,有效位数为一个bit位,如果不校验,则无需发送校验位
注意:双方的校验方式保持一致

三种校验方式

  1. 奇校验(odd)
  2. 偶校验(even)
  3. 不校验(None)
    例如:处理器给BT发送数据0x95(1001 0101),采用奇校验方式
    处理器发送数据流程:
    首先处理器将0x95通过一根数据线发给bt
    然后处理器计算0x95中"1"的个数,为4个,而现在采用的是奇校验
    所以处理器此时心里就明白将来要发送的校验位的值为1,因为:4+1=5(奇数)
    最后处理器通过数据线再给BT发送一个校验位为1

BT接收数据的流程

首先BT从数据线上将处理器发送来的数据进行接收,0x95(1001 1010 假设传输无误)
然后BT计算0x95中"1"的个数为4,而BT也采用奇校验,所以BT心里明白待会儿处理器发送的校验位肯定是1
最后BT从数据线上将处理器发送来的校验位1进行接收然后判断:
a.如果确实是1,则数据传输无误
b.如果是0,说明数据传输出错了

停止位

如果处理器和外设要结束数据的传输,只需发送停止位即可,有效位数为:1/2
有效电平是高电平,注意:处理器和外设停止位保持一致

波特率

表示双方数据传输的速率,常用的两个波特率:115200bps/9600bps
(bps = bit per second = 每秒传输多少位)
注意:双方的配置也要一致
在这里插入图片描述

总结

UART数据传输的协议流程:
空闲位->起始位->数据位->(校验位)->停止位->空闲位

问:如果要传输2个字节或者2个字节以上的数据,流程应该是什么样呢?
答:空闲位->起始位->低字节的8位数据->(校验位)->停止位->
   起始位->高字节的8位数据->(奇偶校验)->停止位...->空闲位

UART的三种工作方式

	单工:数据传输永远朝一个方向
	半双工:数据传输可以双向进行,但是同一时刻只能朝一个方向
	全双工:数据传输可以同时双向进行,一般都是工作在全双工模式下

结论:UART实际硬件连接至少三根线:TX(发送),RX(接收),GND(共地)
在这里插入图片描述

UART控制器

发送数据流程

	• 由于CPU核发送数据的速度,也就是向数据寄存器DR中写入数据的速度远远快于发送移位寄存器将数据
	  一位一位的发送到TX引脚上的速度,所以首先判断TC位是否为1,如果为1表示发送数据寄存器为空
	  则CPU方可发送数据,否则采用轮询方式等待,直到发送数据寄存器为空也就是TC为1时才能发送下一
	  个数据
	• 如果TC为1,则CPU核软件上以指针或者采用库函数将数据放到数据寄存器DR中
	• 发送数据寄存器的数据硬件上自动拷贝到发送移位器中
	• 发送移位器根据给定的波特率将数据一位一位的按照UART协议发送到TX引脚上

在这里插入图片描述

接收数据流程

• 接收移位器首先根据给定的波特率将数据一位一位的按照UART协议从RX引脚上获取数据
• 接收移位寄存器中的数据硬件上自动拷贝到数据寄存器DR中
• 由于CPU核从数据寄存器DR中读取数据的速度远远快于接收移位器从RX引脚上一位一位接收数据的速度,
  所以当RXNE为1时,CPU核方可从数据寄存器DR中获取数据,否则CPU核轮询等待,直到数据寄存器DR中有
  数据也就是RXNE为1时CPU才能读取数据
• 如果RXNE为1,则CPU核软件上以指针或者采用库函数从数据寄存器DR中读取数据

UART初始化

使能串口时钟及GPIO端口时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

GPIO端口模式设置,设置串口对应的引脚为复用功能
在这里插入图片描述

UART相关结构体和库函数

typedef struct
{
  uint32_t USART_BaudRate;            //波特率,例如:115200
  uint16_t USART_WordLength;          //字长
  uint16_t USART_StopBits;            //停止位
  uint16_t USART_Parity;              //校验位
  uint16_t USART_Mode;                //USART模式
  uint16_t USART_HardwareFlowControl; //硬件流控制
} USART_InitTypeDef;

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/433270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络-物理层

物理层 基本概念传输媒体信道复用频分复用(FDM)时分复用(TDM)波分复用(WDM)码分复用(CDM) 宽带接入技术ADSL技术光纤同轴混合网(HFC网)FTTx技术 数据通信常识 上次我们已经大致学习了…

基于yolov5的山羊姿态检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示: 基于yolov5的山羊姿态检测系统,系统既能够实现图像检测,也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili (一)简介 基于yolov5的山羊姿态检测系统是在pytorch框架下实现的,这是一个完整的项目…

AndroidStudio连不上adb报错ADB Connection Error

之前笔者一直通过AndroidStudio来看日志,也一直用的一套自己的SDK,用了好几年了。 但是突然有一天,AndroidStudio启动后就弹出警告窗:ADB Connection Error,如下: 在Event Log面板还持续性的输出&#x…

论文目录3:大模型时代(2023+)

1 instruction tuning & in context learning 论文名称来源主要内容Finetuned Language Models Are Zero-Shot Learners2021 机器学习笔记:李宏毅ChatGPT Finetune VS Prompt_UQI-LIUWJ的博客-CSDN博客 早期做instruction tuning的work MetaICL: Learning to …

产品推荐 - Xilinx FPGA下载器 XQ-HS/STM2

1 FPGA下载器简介 1.性能优良 FPGA下载器XQ-HS/STM2采用Xilinx下载模块设计而成(JTAG-SMT2NC模块,该模块与Xilinx官方开发板KC705,KCU105,ZC702,ZC706,Zedboard等板载下载器一样,下载速度快…

蓝桥杯-排序

数组排序 Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且时按从小到大的顺序。 package Work;import java.util.*;public class Imcomplete {public static void main(String args[]) {int arr[]new int [] {1,324,4,5,7,2};Arrays.sort(arr)…

C++--调整数组顺序使奇数位于偶数前面

题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 方法一: …

数学美学:探索“既不是最小值也不是最大值”的魅力

本篇博客会讲解力扣“2733. 既不是最小值也不是最大值”的解题思路,这是题目链接。 本题的思路是: 如果数组只有两个元素,直接返回任意一个即可。如果数组有三个或以上的元素,由于数组中的所有数字互不相同,我们只需要…

Git 进阶 高级用法,重要命令记录

本篇文章用于记录Git高级用法,新手可以看我的另一篇文章:Git基础教学。 Git git fetch 是git pull 的细分步骤,git pull 包含了git fetch git pull origin master 上述命令其实相当于git fetch git merge 在实际使用中,git fetc…

谷歌Gemini批量多线程写原创文章API软件-支持双标题违禁词过滤

谷歌Gemini批量多线程写原创文章软件介绍: 1、Gemini 是谷歌筹备了一年之久的GPT4真正竞品,也是目前谷歌能拿出手的功能最为强悍、适配最为灵活的大模型。 2、谷歌Gemini目前免费申请key,key没有额度限制,可以一直写文章。 3、谷…

【Claude3 最新注册教程】Claude Pro 付费订阅教程,Claude Pro多5倍使用量

一、Claude Pro 带来的变化 Claude Pro的价格与OpenAI的ChatGPT Plus相同,用户每月只需支付 20 美元(美国)或 18 英镑(英国),就能获得比免费 Claude 2 多 5 倍的对话量、发送 "更多 "信息的能力…

【C++】类与对象(上篇)

一.类的引入 C与C语言比较起来,C引入了一个新的概念,叫做类。那么在C中,类又是什么呢? 在C中,类与C语言中的结构体相似,但不同的是,C中的类中,不仅可以定义变量,还能定义…

最简单 导航栏 html css

dhl.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><link type"text/css" rel"stylesheet" href"css/dhl.css"></head><div class"dhl&quo…

java编程的简化表达方法——Lambda表达式及方法引用概述

前言&#xff1a; 学到简化写法了&#xff0c;感觉需要对代码非常熟悉才能用得好&#xff0c;整理下写法。打好基础&#xff0c;daydayup! Lambda表达式 Lambda表达式是JDK8开始新增得一种语法形式&#xff1b;作用&#xff1a;用于简化匿名内部类的代码写法。 Lambda表达式的格…

汉服文化平台网站|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的汉服文化平台网站设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 系统详细设计 前台首页功能模块 管理员功能 用户功能 系统结构设计 数据库设计 摘 要 研究内容 文末获取源码 系统详细设计 前台首页功能模块 管理员功能 用户功能 系统结构设计 数据库设计 论文参考 摘 要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台…

前端 css 实现标签的效果

效果如下图 直接上代码&#xff1a; <div class"label-child">NEW</div> // css样式 // 父元素 class .border-radius { position: relative; overflow: hidden; } .label-child { position: absolute; width: 150rpx; height: 27rpx; text-align: cente…

支持多平台,无需GPU!仅需8G内存即可部署运行大模型

随着ai技术不断发展&#xff0c;一直想本地运行一个大模型玩玩&#xff0c;奈何GPU价格不低...... 最近找到一款只需要8G内存即可运行的大模型&#xff0c;速度还挺快&#xff0c;特别分享出来。 本地安装前提 内存 8G 安装运行简要概述 首先运行服务端然后运出客户端即可本地…

06 - 镜像管理之:基础知识

1 了解镜像 Docker镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置等文件外&#xff0c;还包含了一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;。 但注意&#xff0c; 镜像不包含任何动态数据&#…

Operator开发

概述 基于k8s做扩展的时候&#xff0c;一种典型方式则是 operator 开发&#xff0c;通过 CRD(CustomResourceDefinition) 来定义自定义资源&#xff0c;开发对应的 controller 来做业务控制&#xff0c;以期实现特定的业务需求。那么其本质是什么&#xff1f;是事件驱动。与我…

图像超分辨率:Fast Nearest Convolution for Real-Time Efficient Image Super-Resolution

9.Fast Nearest Convolution for Real-Time Efficient Image Super-Resolution 提出一种适用移动端的超分网络 一些tensor op 的推理时间 一些卷积结构的推理时间 网络结构NCNet 主干网络预测的是 残差&#xff0c;什么的残差&#xff1f; 是最近邻插值图像与 ground-truth的…