当前位置: 首页 > news >正文

STM32通信接口----USART

 STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等,这些都是芯片内部的电路,这些电路的配置寄存器、数据寄存器斗殴在芯片里面,操作这些寄存器直接读写即可。但也有一些功能是STM32内部没有的,如蓝牙无线遥控功能、陀螺仪加速度计测量姿态的功能,只能外挂芯片来完成,外挂的芯片,数据都在STM32外面,STM32若想获取这些数据,则需在两个设备之间连接上一根或多跟通信线,通过通信线路发送或接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。

全双工:通信双方能够同时进行双向通信,一般来说,全双工(发送线路和接受线路互不影响)的通讯都有两根数据线(串口TX发送RX接收;SPI,一根MOSI发送,一根MISO接收)。

半双工:I2C,CAN,USB都只有一根数据线

单工:数据只能从一个设备到另一个设备,而不能反着来,如把串口的RX引脚去掉,那串口就退化成单工

时钟:告诉接收方什么时候需要采集数据,I2C和SPI有单独的时钟线,接收方可以在时钟信号的指引下进行采样;串口、CAN、USB没有时钟线,需要双方约定一个采样频率,并且还需要加一些帧头帧尾等,进行采样位置的对齐

电平:单端信号引脚的高低电平都是对GND的电压差,所以单端信号通信的双方必须要共地(把GND接在一起),表中前3个还应加一个GND引脚,不接GND没法通信;差分信号是靠两个差分引脚的电压差来传输信号的,通信时可不用GND,使用差分信号可以极大地提高抗干扰特性,一般传输速度快、距离远。

设备:中间3个可在总线上挂载多个设备,需要有一个寻址的过程,以确定通信的对象

 单片机和电脑通信,是串口的一大优势,可以接电脑屏幕,非常适合调试程序,打印信息I2C和SPI等一般都是芯片之间的通信,不会接在电脑上

如上图,第一个是USB转串口模块,上面有一个芯片,型号是CH340,这个芯片可以把串口协议转换为USB协议,左边是USB口,可以插在电脑上,右边是串口的引脚,可以和支持串口的芯片接在一起,以实现串口和电脑的通信;第二个是陀螺仪传感器模块,可测角速度、加速度这些姿态参数,左右各有4个引脚,一边是串口的引脚,另一边是I2C的引脚;第三个是蓝牙串口模块,下面4个脚是串口通信的引脚,上面的芯片可以和手机互联,实现手机遥控单片机的功能

一般串口通信的模块都有四个引脚,TX和RX都是单端信号,它们的高低电平都是相对于GND的,线路对地是0V,就代表发送了逻辑0;线路对地是3.3V,就代表发送了逻辑1

串口通信的TX、RX、GND是必须要接的,上面的VCC,如果两个设备都有独立供电,那VCC可以不接;如果其中一个设备没有供电,如设备1是STM32,设备2是蓝牙串口模块,STM32有独立供电,蓝牙串口没有独立供电,那样就需要把蓝牙串口的VCC和STM32的VCC接在一起,STM32通过这根线,向右边的子模块供电。

串口有很多电平标准,直接从控制器出来的信号,一般都是TTL电平。相同的电平才能相互通信,不同的电平信号,需要加一个电平转换芯片,转接一下。

单片机(低压小型设备)电路中最常见的是TTL电平

RS232电平,一般在大型的机器上使用

前两种电平标准,通信最远只能达到几十米,而使用RS485电平标准,通信距离可以达到上千米

在软件层面,它们都属于串口,所以程序并不会有什么变化

上图的两个时序图,就是串口发送一个字节的格式,该格式是串口协议规定的。串口中,每一个字节都装载在一个数据帧里面,每个数据帧都有起始位、数据位和停止位组成。数据位有8个,代表一个字节的8位,在右边这个数据帧里面,还可以在数据位的最后,加一个奇偶校验位,这样数据位总共是9位,有效载荷是前8位,代表一个自己字节,校验位跟在有效载荷后面,占1位

波特率(二进制调制下,波特率等于比特率,单片机的串口通信,基本都是二进制调制,高电平表示1,低电平表示0,1位就是1bit):串口一般是使用异步通信,所以需要双方约定一个通信速率,如A每隔1s发送一位,那么B应该每隔1s接收一位,若接受快了,就会重复接收某些位;如果接收慢了,就会漏掉某些位。故发送和接收,必须要约定好速率,这个速率参数,就是波特率。如双方规定波特率为1000bps,表示1s要发1000位,每一位的时间就是1ms

串口的空闲状态是高电平,即没有数据传输时,引脚必须置高电平,需要传输时,必须要先发送一个起始位(低电平),打破空闲状态的高电平,产生一个下降沿,告诉接收设备,这一帧数据要开始了

低位先行:如要发送一个字节,是0x0F,首先把0F转化为二进制,即0000 1111,数据要从低位进行发送,也就是1111 0000,依次发送在引脚上。

校验位:使用奇偶校验的数据验证方法,可判断数据传输是不是出错了,若数据出错,可选择丢弃或者要求重传,校验可选3种方式:无校验(上图左)、奇校验、偶校验(上图右)。

奇校验:包括校验位在内的9位数据会出现奇数个1,如传输0000 11111,校验位需再补一个1,

若数据是0000 1110,校验位补0。发送方在发送数据后,会补一个校验位,保证1的个数为奇数;

接收方,在接收数据后,会验证数据位和校验位,如果1的个数还是奇数,就认为数据没有出错;如果在传输中因为干扰,有一位由0变成1,或者由1变成0,那么整个数据的奇偶特性就会发生变化,接收方就认为传输出错。奇偶校验的检出率不是很高,如果有两位数据同时出错,奇偶特性变不变,那就校验不出来了。更高的检出率,可了解CRC校验(STM32也有CRC的外设)

串口通信的实际波形

探头GND接在负极,探头接在发送设备的TX引脚

在STM32中,根据字节数据翻转高低电平,是由USART外设自动完成的

TX引脚发送------置定时翻转的高低电平

RX引脚接收-------定时读取高低电平

串口的停止位是可以进行配置的,可以选择1位、1.5位、2位等

STM32内部的USART外设(串口通信的硬件支持电路):按照串口协议来产生和接收高低电平信号,实现串口通信

STM32的USART同步模式,只是多了一个时钟输出而已,只支持时钟输出,不支持时钟输入,更多是为了兼容别的协议或者特殊用途而设计的,并不支持两个USART之间进行同步通信

波特率发生器:用来配置波特率,其实是一个分频器,如APB2总线给个72MHZ的频率,然后波特率发生器进行分频,得到我们想要的波特率时钟,在这个时钟下进行收发,就是我们指定的通信波特率

常用串口参数:波特率9600或者115200,数据位8位,无校验

串口支持DMA进行数据转运,如果有大量数据进行收发,可以使用DMA转运数据,减轻CPU的负担

STM32F103C8T6总共有3个独立的USART外设,可以挂载很多串口设备,USART1是APB2总线上的设备,其余两个是APB1总线的设备

TDR(只写)与RDR(只读)占用一个地址,在程序上表现为一个寄存器,就是数据寄存器DR

发送移位寄存器:把一字节的数据一位一位地移出去,正好对应串口协议的波形的数据位。如在某时刻给TDR写入了0x55这个数据,在寄存器里是二进制数据,0101 0101,此时硬件检测到你写入数据了,就会检查,当前移位寄存器是不是有数据正在移位,如果没有,这个0101 0101就会立刻全部移动到发送移位寄存器(在发送器控制下,一位一位地把数据输出到TX引脚,这里是向右移位的,正好和串口协议规定的低位先行是一致的),准备发送。当数据从TD动到移位寄存器时,会置一个标志位(TX Empty),检查这个标志位,如果置1(数据其实还没有发送出去)了,我们就可以在TDR写入下一个数据了。当数据移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器里来;如果当前移位寄存器移位还没有完成,TDR的数据就会进行等待,一但移位完成,就会立刻转移过来。有了TDR和移位寄存器的双重缓存,可以保证连续发送数据的时候,数据帧之间不会有空闲。

数据从RX引脚通向接收移位寄存器,在接收器控制下,一位一位地读取RX电平,先放在最高位,然后向右移,移位8次之后,就能接受一个字节了,当一个字节移位完成后,这一个字节的数据就会整体地一下子转移到接收数据寄存器RDR里来,在转移的过程中,也会置一个标志位RXNE(RX Not Empty),当检测到RXNE置1后,就可以把数据读走了,当数据从移位寄存器转移到RDR时,就可以直接接收下一帧数据了。

发送还需要加上帧头帧尾,接收还需要剔除帧头帧尾,这些操作,内部有电路会自动执行

硬件数据流控:如果发送设备发的太快,接收设备来不及处理,就会出现丢弃或覆盖数据的现象,

nRTS:(Request To Send)是请求发送,是输出脚(n代表低电平有效),输出一个能不能接收的反馈信号,接到对方的CTS。能接收的时候,RTS就置低电平,请求对方发送,对方的CTS接收到之后,就可以一直发。当处理不过来时,比如接受数据寄存器一直没有读,又有新的数据过来了,RTS就会置高电平,当对方的CTS接收到之后,就会暂停发送,直到接收数据寄存器被读走,RTS置低电平,新的数据才会继续发送。

nCTS:(Clear To Send)清除发送,是输入脚,用于接收别人nRTS信号的。

反过来,当我的TX给别人发送数据时,我们的CTS就要接到对方的RTS,用于判断对方能不能接收

TX-------CTS   RX-------RTS

SCLK控制 :用于产生同步的时钟信号(可以兼容别的协议,有了时钟输出的串口,就可以兼容SPI;也可以做自适应波特率,如接收设备不确定发送设备给的什么波特率,就可以测量一下适中的周期,计算得到波特率),配合发送移位寄存器输出的,发送寄存器每移位一次,同步时钟电平就跳变一个周期(时钟只支持输出,不支持输入,两个USART之间,不能实现同步的串口通信)

  唤醒单元 :实现串口挂载多设备, 可以给串口分配一个地址,发送指定地址时,此设备唤醒开始工作

中断控制:配置中断是不是能通向NVIC,中断申请位,就是状态寄存器里的各种标志位,TXE(发送寄存器空)和TXNE(接收寄存器非空)较为重要,是判断发送状态和接收状态的必要标志位

波特率发生器:APB时钟进行分频,得到发送和接收移位的时钟,USART1挂载在APB2,所以就是PCLK2的时钟,一般是72MHZ;其它的USART都挂载在APB1,所以是PCLK1的时钟,一般是36MHZ,之后这个时钟进行分频,除一个USARTDIV的分频系数(分为整数部分和小数部分,支持小数点后4位),分频完之后,还要再除以16得到发送器时钟和接收器时钟,通向控制部分

TE为1,发送器使能,发送部分的波特率就有效;RE为1,接收器使能,接收部分的波特率就有效   。

复用功能这一栏,给出了每个USART,它的各个引脚都是复用在了哪个GPIO上

简化结构图,给出了USART最主要最基本的结构

波特率发生器用于产生约定的通信速率,时钟来源是PCLK2/1,经过波特率发生器分频后,产生的时钟通向发送控制器(控制发送移位)和接收控制器(控制接收移位),之后发送数据寄存器和发送移位寄存器两个寄存器配合,将数据一位一位地移出去,通过GPIO口的复用输出,输出到TX引脚,产生串口协议规定的波形(向右的箭头表示移位寄存器是向右移的,低位先行),当数据由数据寄存器转移到移位寄存器时,会置一个TXE的标志位                

RX引脚的波形,在接受控制器的控制下,一位一位地移入接收移位寄存器,右移符号代表也是右移,因为是低位先行,所以要从左边开始移进来,移完一帧数据后,数据就会统一转运到接收数据寄存器,转移的同时,置一个RXNE标志位,检查这个标志位,就可以知道是不是接收到数据了,同时这个标志位也可以去申请中断,这样就可以在接收到数据时,直接进入中断函数,然后快速的读取和保存数据

在软件层面,(上图的4个寄存器)只有一个DR寄存器可以供我们读写,写入DR时,数据走上面这条路,进行发送;读取DR时,数据走下面这条路,进行接收,这就是USART进行串口数据收发的过程

右下角是一个开关控制,配置完成之后,用Cmd开启一下外设

串口的输出TX比输入RX简单很多,输出时定时翻转TX引脚高低电平,输入时不仅要保证输入的采样频率和波特率保持一致;还要保证每次输入采样的位置,正好处于每一位的正中间(只有在每一位正中间采样,这样读进来的高低电平才最可靠,如果采样点过于靠前或靠后,有可能高低电平还正在翻转,电平还不稳定);输入最好还要对噪声有一定的判断能力,如果是噪声,最好置标志位提醒一下

当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率,连续采样一帧数据,同时从起始位开始,采样位置就要对齐到位的正中间,只要第一位对齐了,后面都是对齐的,为了实现这些功能,首先输入的这部分电路对采样时钟进行了细分,会以波特率的16倍频率进行采样,即在一位的时间里,可以进行16次采样。

采样策略:最开始,空闲状态是高电平,那采样一直是1,在某个位置突然采到一个0,说明,在这两次采样之间,出现了下降沿。如果没有任何噪声,之后应该是起始位,在起始位,会连续进行16次采样,如果没有噪声,那么这16次采样都是0;但是实际电路会存在一些噪声,所以即使这里出现下降沿了,后续也要再采样几次,以防万一。根据手册描述,这个接收电路还会在下降沿之后的第3次、5次、7次进行一批采样,在第8次、9次、10次再进行一次采样,且这两批采样都要求每3位里面至少有两个0。如果有一些轻微噪声,导致3位里面,只有两个是0,另一个是1,也算是检测到了起始位,但是在状态寄存器里会置一个NE(Noise Error),噪声标志位;若3位里面只有1个0,就不算检测到了起始位,可能前面的那个下降沿是噪声导致的,这是电路就忽略前面的数据,重新开始捕捉下降沿。

以上是STM32的串口在接收过程中,对噪声的处理,如果通过了起始位侦测,那接受状态就由空闲变为接受起始位,同时第8、9、10次采样的位置,正好是起始位的正中间,之后接收数据位时,就都在8、9、10次进行采样,这样就能保证采样位置在位的正中间了,这就是起始位侦测和采样位置对齐的策略

从1到16,是一个数据位的时间长度,在一个数据位,有16个采样时钟,由于起始位侦测已经对齐了采样时钟,所以这里就直接在第8、9、10次采样数据位,为了保证数据的可靠性,这里是连续采样3次。没有噪声的理想情况下,3次全为1或者全为0,若有噪声,导致3次采样不是全为1或者全为0,那就按照2:1的规则来,2次为1,就认为收到了1;2次为0,就认为收到了0,在这种情况下,噪声标志位NE也会置1

输入时钟/DIV=16倍的波特率

跳线帽用来选择通信电平,最好插上跳线帽,如果拿掉,相当于整个芯片没有供电

STM32通信需要3.3V,把跳线帽插在4、5引脚即可

http://www.dtcms.com/a/617795.html

相关文章:

  • 解决Web游戏Canvas内容在服务器部署时的显示问题
  • 我爱学算法之—— 哈希
  • Linux字符设备驱动模型
  • C++ List 容器详解:迭代器失效、排序与高效操作
  • 婚纱网站wordpress微商模板
  • GPT问答:泛型、哈希表与缓存、命名参数。251116
  • 免费学软件的自学网站保健品网站建设流程
  • 网络访问流程:HTTPS + TCP + IP
  • 智能体AI、技术浪潮与冲浪哲学
  • 基于 PyTorch + BERT 意图识别与模型微调
  • 沃尔沃公司网站建设微信官方网站建设
  • 网站备案域名怎么买找在农村适合的代加工
  • 42 解决一些问题
  • Claude Code 功能+技巧
  • 基于人脸识别和 MySQL 的考勤管理系统实现
  • AUTOSAR_CP_OS-Operating System for Multi-Core:多核操作系统
  • 什么是 “信任模型” 和 “安全假设”?
  • 【秣厉科技】LabVIEW工具包——HIKRobot(海康机器人系列)
  • 网易UU远程全功能技术解构:游戏级性能突围与安全边界探析
  • 蓝桥杯第八届省赛单片机设计完全入门(零基础保姆级教程)
  • 搭建网站分类建立名词
  • 没有域名的网站wordpress占用资源
  • RPA+AI双剑合璧!小红书商品笔记自动发布,效率提升2000%[特殊字符]
  • 19.传输层协议UDP
  • linux服务-rsync+inotify文件同步-rsync
  • 机器学习之ravel()的作用
  • Wi-Fi 7路由器性能分析:从传输速率到多设备协同全面解析
  • 【Java手搓RAGFlow】-1- 环境准备
  • 审计部绩效考核关键指标与综合评估方法
  • Photoshop - Photoshop 工具栏(29)钢笔工具