在做项目的时候是不是发现串口是最常用的通信接口,所以我自己整理了一下关于串口的一些常识性知识,方便自己学习。
关键词:Loto虚拟示波器,串口时序,电平标准,模拟串口
我们常说的串口按电平分类的话有两种,一种是TTL电平的串口,一种是232电平的串口。 首先我们先看一下这两种电平的区别。 TTL电平标准:输出L: <0.8V; H: >2.4V,输入L: <1.2V: H: >2.0V TTL器件输出低电平要小于0.8V,高电平要大于2.4V,输入,低于1.2V就认为是0,高于2.0就认为是1.于是TTL电平的输入低电平的噪声容限就只有(O.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V. RS232标准: 逻辑1的电平为-3~-15V,逻辑0的电平为+3~+15V,注意电平的定义反相了一次。
然而TTL电平的串口还可以分为两种UART与USART。我们打开stm32cubeMX看到stm32F103有2个UART和3个USART。在日常我们就可以说,它有5个串口,因为USART可以配置成UART。
UART与USART都是单片机上的串口通信,他们之间的区别如下: 首先从名字上看: UART:universal asynchronous receiver and transmitter通用异步收/发器 USART:universal synchronous asynchronous receiver and transmitter通用同步/异步收/发器 从名字上可以看出,USART在UART基础上增加了同步功能,即USART是UART的增强型,事实也确实是这样。但是具体增强到了什么地方呢? 其实当我们使用USART在异步通信的时候,它与UART没有什么区别,但是用在同步通信的时候,区别就很明显了:大家都知道同步通信需要时钟来触发数据传输,也就是说USART相对UART的区别之一就是能提供主动时钟。如STM32的USART可以提供时钟支持ISO7816的智能卡接口。
在实际的项目中用的最多的还是UART ,配置为:N, 8 ,1.波特率常用的有2400,9600,57600,115200.我们用串口来干什么呢?用过一些模块的工程师会知道,很多模块都是通过串口来控制或者通过串口透传数据的,比如gsm(2g,4g),gps,wifi,蓝牙等等,这些模块都是通过串口来控制。所以作为一个工程师,必须要搞懂串口。下面我们通过Loto虚拟示波器采集不同波特率的UART 波形:
对比理论的时序图,我们找找起始位和停止位,这个数据是多少? 有时候我们面试会考一个题目,那就是UART波特率9600的时候,它的一个bit是多长时间,这个怎么算?初学者肯定蒙了,我用串口直接就配置然后发数据就行了,从来没算过,下面我总结一下:
波特率2400:1/2400≈416.67*10^(-6)s=416.67us 波特率4800:1/4800≈208.33*10^(-6)s=208.33us 波特率9600:1/9600≈104.17*10^(-6)s=104.17us 波特率19200:1/19200≈52.08*10^(-6)s=52.08us 波特率57600:1/57600≈17.36*10^(-6)s=17.36us 波特率115200:1/115200≈8.68*10^(-6)s=8.68us
对比我们用Loto虚拟示波器采集的数据看看是不是一致呢?
我们算这个数据有什么用呢?是的!没错!就是模拟串口!当单片机串口不够用的时候项目中会用到。接下来我会分析几个论友写的代码,逐步深入理解TTL串口。
下面这个模拟串口的代码: 首先说它的发送吧,发送一个字节,先发送起始位OI_TXD = 0; 然后delay_us(BuadRate_9600);然后依次从低位开始检测Data的每一位,从而拉高拉低OI_TXD,然后延时,移位,重复8次,最后发送停止位发送完一个Data。 接收的话:它是stm32开了个定时器4和一个外部中断.外部中断采到下降沿,然后定时器设置为107us中断一次,去采集一个bit,为什么是107us呢?因为此时波特率是9600,一个bit是104.17us,然后可以依次采集每个bit,直到采完一个data。(个人感觉107us不稳定)
|