UART-通用异步收发器

news2024/11/6 14:46:41

1. UART的基本工作原理

UART通信主要有两个部分构成:发送器和接收器,也就是我们常见的(RX接收,TX发送)两个独立的线路来实现数据的双向传输,由于是异步的,UART并不需要时钟信号,而是通过设定一定的波特率来进行双方的通信,可以理解为协议。

在UART中,数据规定通过固定的格式进行发送,格式形式(起始位,数据位校验位,停止位)

        起始位:用于通知接收端即将开始数据传输,通常是一个低电平。

        数据位:就是我们要发送的数据内容,一般是5-9位。

        校验位:用于错误检测,可选

        停止位:表示数据结束,通常位高电平

这些格式构成一个数据帧,主机与从机通信的时候就是通过一帧一帧的数据进行通信。

那么我们就来简单举一个例子:

在UART通信中,如果启用了校验位,通常采用奇校验偶校验来检测传输过程中可能出现的单比特错误。具体来说,校验位是一位额外的数据位,通过对前面的数据位进行“加和”判断奇偶性来确定其值。接收端通过计算收到的数据位和校验位的奇偶性,判断数据是否完整正确。

假设发送的数据为01000001(即ASCII字符“A”),8位数据中包含两个“1”,是偶数个:

  • 奇校验:校验位设为1,使得整个数据帧的“1”位总数为奇数。
    • 最终发送的帧:起始位 (0) | 01000001 | 校验位 (1) | 停止位 (1)
  • 偶校验:校验位设为0,使得整个数据帧的“1”位总数为偶数。
    • 最终发送的帧:起始位 (0) | 01000001 | 校验位 (0) | 停止位 (1)

那么我们就可以根据例子来总结得到,校验位的作用:

当我们规定校验方式为奇校验的时候,1的个数要为奇数,如果现在数据(一串二进制码例如上面的01000001)当中 有两个1,那么校验位就位1,现在有3个1。接收端接收到数据帧之后,会按照格式读取数据帧,首先读取起始位,一般位0,那么从机就知道接下来的二进制就是数据位,由于于我们规定了数据位的个数,一般是(5-9)位,然后是校验位这里是1,停止位。数据读取完毕,如果这时候计算得到的数据位当中的1和校验位的1个数相加为奇数,那么数据没有错误,如果相加为偶数,则数据传输出现错误。

当我们规定校验方式为偶校验的时候,数据位中1的个数加上校验位中1的个数要为偶数,否则数据传输出现错误。

当然,校验位只能用于单个数据帧的检验,并不能用于多个数据帧的检验

 

2. 实现UART发送功能

UART的发送过程涉及将要发送的数据(通常是8位)转换为串行格式,然后按位输出到Tx引脚。

步骤:

  1. 配置波特率:设定UART模块的波特率,以确保发送端和接收端的波特率一致。
  2. 加载数据:将要发送的数据写入UART发送缓冲区。
  3. 起始位:设置Tx引脚为低电平(0),通知接收端即将开始发送数据。
  4. 发送数据位:从最低有效位(LSB)开始依次发送每一位数据。
  5. 校验位(可选):如果启用了校验位,则按照设定的校验规则添加校验位。
  6. 停止位:发送1位或2位的高电平,表示数据传输结束。
  7. 等待传输完成:通常通过检查发送缓冲区是否为空或传输完成标志位。

 配置UART的波特率(Baud Rate)是实现UART通信的关键步骤之一。波特率决定了每秒钟传输的位数,通常发送端和接收端必须设置相同的波特率,才能保证通信的同步

波特率的单位:bit/s,也就是每秒钟传输位数的多少,那么我们要如何配置波特率呢?

1. 波特率计算公式

        不同的MCU或者处理器通常都会有一个波特率生产寄存器,比如在中断当中,就有一个(UART_BRR寄存器)我们通过设置这个寄存器的值,就能够产出需要的波特率。具体的计算公式如下:

其中:

  • 时钟频率:MCU主时钟频率(如16 MHz、8 MHz)。
  • 分频因子:通常为8或16,具体取决于MCU的UART模块设置。
  • 寄存器值:设置在UART模块的波特率寄存器中,用于配置实际波特率。

 

 那么UART_BRR是一个16位的寄存器,UART_BRR寄存器的16位通常分为两个部分:

  1. DIV_Mantissa(整数部分):通常占高12位([15:4]位)。
  2. DIV_Fraction(小数部分):通常占低4位([3:0]位)。

所以,UART_BRR寄存器最终的16位值为0x0673(104的十六进制为0x67,小数部分为3)。将这个值写入UART_BRR寄存器,即可实现9600的波特率。通过这样,就能配置波特率。

2.缓冲区?

那么将要发送的数据写入UART发送缓冲区。缓冲区具体指的是什么?

在UART通信中,“缓冲区”是指一个临时存储区域,用于存放即将发送或刚接收的数据。UART缓冲区一般分为发送缓冲区接收缓冲区,目的是让数据的读写过程更加顺畅和稳定,避免传输速度与数据处理速度不匹配的问题。

 其实,缓冲区也是一个寄存器,在发送的时候,

1. 发送缓冲区

发送缓冲区:是用来暂时存储即将通过UART发送出去的数据。当数据进入缓冲区,也就是寄存器的时候,UART硬件会从缓冲区中取出数据,通过TX引脚发送数据出去,

  • 作用:当程序将数据写入发送缓冲区后,UART硬件会从缓冲区逐位取出数据,通过TX引脚发送出去。
  • 常见实现
    • 单字节寄存器:一些简单的UART实现只有一个字节大小的发送寄存器,比如USART_DR寄存器(在STM32中)。每次只能写入一个字节,硬件在发送完该字节后会触发“发送缓冲区空”标志。
    • 多字节缓冲区:为了提高效率,某些系统会使用一个环形缓冲区(FIFO队列),可以存放多个字节。这样,程序可以在较短时间内将多字节数据写入发送缓冲区,而UART硬件会逐字节从缓冲区取数据发送出去。
2. 接收缓冲区

接收缓冲区:用来暂时存储UART接收到的数据,当数据从RX引脚接收后,UART硬件将数据暂时存入到接收缓冲区当中,当接收缓冲区满时,UART会设置一个标志位或触发一个接收中断,通知主程序读取数据。主程序读取缓冲区中的数据后,标志位会被清除,表示接收缓冲区可以接收新的数据。

  • 作用:当数据通过RX引脚接收后,硬件会将其存入接收缓冲区中。这样,程序可以在稍后再读取数据,而不必完全同步于硬件的接收速度。
  • 常见实现
    • 单字节寄存器:类似于发送缓冲区,一些简单的UART实现也会有单字节的接收寄存器。当接收到一个字节的数据时,UART会触发“接收缓冲区满”标志,通知程序读取。
    • 多字节缓冲区:为了避免数据丢失,UART也可以使用多字节环形缓冲区,允许接收端在不忙时读取数据,特别适合高波特率和连续数据的应用。

以发送缓冲区为例,典型的工作过程如下:

  1. 加载数据:程序将数据写入发送缓冲区。
  2. UART发送:UART硬件从发送缓冲区中逐字节取出数据,通过TX引脚发送出去。
  3. 缓冲区管理:如果使用的是单字节寄存器,发送完一个字节后,缓冲区标志会被清空,表示可以加载新的数据;如果是多字节缓冲区,UART硬件会持续发送,直到缓冲区为空。

 

3. 实现UART接收功能

UART接收过程则是将接收端Rx引脚上的串行数据转换为并行数据,再读入接收缓冲区。

步骤:

  1. 等待起始位:UART接收器持续监测Rx引脚,检测到低电平即认为接收到了起始位,准备接收数据。
  2. 采样数据位:根据波特率和位时间(Bit Time),依次采样数据位。
  3. 校验位(可选):如果启用了校验,验证接收到的数据是否满足校验要求。
  4. 停止位检测:检查停止位是否为高电平,确认数据完整性。
  5. 存储数据:将接收到的数据写入接收缓冲区,等待上层程序读取。

4. 中断方式实现UART收发

在实际应用中,常用UART中断来实现非阻塞的收发数据,避免程序在等待数据时挂起。

  • 发送中断:在发送数据时,可以通过发送完成中断通知处理器开始下一次发送。
  • 接收中断:在接收数据时,可以通过接收中断通知处理器有新数据可读。

 UART可以通过接收中断通知主程序有新数据可读。中断触发时,程序可以立即读取数据并处理。中断触发,程序从缓冲区当中读取数据。

以下是UART接收中断的典型工作流程:

  1. 接收数据:UART硬件从RX引脚接收到数据后,会将数据存入接收缓冲区中。

  2. 触发中断:数据存入接收缓冲区后,UART硬件会设置一个“接收中断标志位”(或称为“接收缓冲区满”标志位),然后触发接收中断。

  3. 中断服务程序(ISR)处理

    • 在接收中断服务程序(Interrupt Service Routine, ISR)中,程序可以检查接收缓冲区是否有新数据。
    • 如果有新数据,ISR会从接收缓冲区中读取数据,存入用户定义的变量或缓冲区,供进一步处理。
  4. 清除标志位:读取数据后,接收缓冲区的标志位会被清除,这样UART硬件可以接收新的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 互斥锁

首先是概念 互斥锁是可以休眠的。 所以不能在中断中使用, 在中断中只能使用 自旋锁。 然后是 函数: 然后是 open 如果以 NONBLOCK 打开, 遇到 互斥锁怎么办? 总结一下: 1 open() 函数的 阻塞与不阻塞的标志&#…

第72期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

[ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Linux运维高手工具全集及功能分类:20+必备神器

文章目录 Linux运维高手工具全集及功能分类:20必备神器一、系统管理与配置1.1 Shell1.2 Ansible1.3 Puppet1.4 Chef 二、监控与告警2.1 Prometheus2.2 Grafana2.3 Zabbix2.4 Nagios2.5 ELK Stack(Elasticsearch, Logstash, Kibana) 三、容器与…

安卓APP开发中,如何使用加密芯片?

加密芯片是一种专门设计用于保护信息安全的硬件设备,它通过内置的加密算法对数据进行加密和解密,以防止敏感数据被窃取或篡改。如下图HD-RK3568-IOT工控板,搭载ATSHA204A加密芯片,常用于有安全防护要求的工商业场景,下…

什么是x86架构,什么是arm架构

什么是 x86 架构? x86 架构是一种经典的指令集架构(ISA),最早由英特尔在 1978 年推出,主要用于 PC、服务器等领域。 它是一种复杂指令集计算(CISC)架构,支持大量的复杂指令和操作&…

知识分享 | SNP检测试剂盒开发注意事项及启衡星CDMO案例分享

一、SNP检测方法 常规有阵列的杂交、qPCR和测序等多种方法,其中基于qPCR方法的SNP检测试剂盒因具有快速、简便的优势,已有大量检测试剂盒上市。如:人CYP2C9和VKORC1基因检测试剂盒、人类SLCO1B1和ApoE基因分型检测试剂盒、人ADRB1&#xff0…

详解varint,zigzag编码, 以及在Go标准库中的实现

文章目录 为啥需要varint编码为啥需要zigzag编码varint编码解码 zigzag编码解码 局限性 为啥需要varint编码 当我们用定长数字类型int32来表示整数时,为了传输一个整数1,我们需要传输00000000 00000000 00000000 00000001 32 个 bits,而有价…

又一部神作登场,MTC高分8.8认证,堪称年度佳片

威尼斯电影节上,布拉迪科贝特导演的新作《粗野派》大放异彩。这部电影,不仅在现场收获了观众的真诚掌声,甚至被不少专业影评人评为“2024年度最佳电影”,而这个评价背后,是一部作品真正打动人心的力量。 布拉迪科贝特&…

低代码平台如何通过AI赋能,实现更智能的业务自动化?

引言 随着数字化转型的加速推进,企业在日常运营中面临的业务复杂性与日俱增。如何快速响应市场需求,优化流程,并降低开发成本,成为各行业共同关注的核心问题。低代码平台作为一种能够快速构建应用程序的工具,因其可视化…

进程、孤儿进程、僵尸进程、fork、wait简介

进程相关概念 程序和进程 程序:是指编译好的二进制文件,在磁盘上,占用磁盘空间, 是一个静态的概念. 进程:一个启动的程序, 进程占用的是系统资源,如:物理内存,CPU,终端等…

已解决:VS2022一直显示编译中但无法运行的情况

本问题已得到解决,请看以下小结: 关于《VS2022一直显示编译中但无法运行的情况》的解决方案 记录备注报错时间2024年报错版本VS2022报错复现突然VS2022不能启动,一直显示编译中,取消重试无效,重新生成解决方案无效报错…

12. MapReduce全局计数器

一. 计数器概述 在执行MapReduce程序时,控制台的输出中一般会包含如下内容。 这些输出就是MapReduce的全局计数器的输出信息。计数器是用来记录job的执行进度和状态的,它的作用可以理解为日志,方便用户了解任务的执行状况,辅助…

Springboot集成阿里云通义千问(灵积模型)

我这里集成后,做成了一个工具jar包,如果有不同方式的,欢迎大家讨论,共同进步。 集成限制: 1、灵积模型有QPM(QPS)限制,每个模型不一样,需要根据每个模型适配 集成开发思路: 因有…

今年双11,拼多多吹“新”风

文 | 螳螂观察 作者 | 陈小江 这届双11真变了。 以前提到双11,不管平台、商家全都盯着价格。但今年不一样。这届双11给出了新解法——平台不再把“我的价格比你低”挂在嘴边,转而更关心消费者体验和为商家减负。 双11这艘大船,在航行到第…

005 IP地址的分类

拓扑结构如下 两台主机处于同一个网关下,通过ping命令检测,可以连通 &nbps; 拓扑结构如下 使用ping 检查两台电脑是否相通, 因为网络号不一样,表示两台电脑不在同一个网络,因此无法连通 拓扑结构如下 不在同一网络的PC要相…

记本地第一次运行seatunnel示例项目

前置 静态源码编译通过:https://blog.csdn.net/u011924665/article/details/143372464 参考 seatunnel官方的开发环境搭建文档:https://seatunnel.incubator.apache.org/zh-CN/docs/2.3.5/contribution/setup 安装scala 下载scala 去官网下载&…

《暗河传》 顺利杀青,苏棋演绎“千面鬼”慕婴引期待

近日,由龚俊、彭小苒、常华森、杨雨潼等一众优秀演员出演的古装武侠剧《暗河传》顺利杀青,00后小花苏棋饰演的“千面鬼”慕婴一角也收获了许多关注的目光。 《暗河传》凭借其精彩的剧情和庞大的粉丝基础,自开拍起便备受关注。在剧中&#xff…

推荐一个没有广告,可以白嫖的产品宣传册转换翻页电子书的网站

​随着数字化时代的到来,传统的纸质宣传册逐渐被电子书所取代。为了满足企业和个人对高效、便捷的电子宣传册制作需求,许多在线平台应运而生。今天,就让我为您推荐一个无需广告干扰、完全免费使用的在线宣传册转换翻页电子书网站——【FLBOOK…

QT 从ttf文件中读取图标

最近在做项目时,遇到需要显示一些特殊字符的需求,这些特殊字符无法从键盘敲出来,于是乎,发现可以从字体库文件ttf中读取显示。 参考博客:QT 图标字体类IconHelper封装支持Font Awesome 5-CSDN博客 该博客封装的很不错…