锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机串口最底层的本质​ (转载)

时间:2023-02-11 02:00:00 公头母头25针串口并口连接器

单片机串口底部的本质

嵌入式专栏 今天

关注 星标公众,不要错过精彩的内容

图片

来源 |网络

嵌入式开发,UART串口是最常见的通信接口。你知道为什么串口这么常见吗?本文将带您深入了解串口底部的本质。

一、串口通信是什么?

串行通信是指数据只能通过一条接收线和一条发送线传输到位的通信方式。虽然串行通信比字节传输的并行通信慢,但串行口只能通过使用两条线实现数据传输。

典型的串口通信由地线、发送和接收三条线完成。由于串口通信是异步的,端口可以在一条线上发送数据,同时在另一条线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的验证。这些参数必须匹配两个需要串口通信的端口,这也是实现串口通信的前提。

图1:串行通信示数据传输意图

二、串口通信通信协议?

最初的数据是模拟信号输出的简单过程量,然后仪表界面出现了RS232接口可以实现点对点通信,但这种方式不能实现网络功能,这促进了RS485。

我们知道串口通信的数据传输是0和1,在单总线,I2C、UART逻辑1或逻辑0是通过一条线的高低电平来判断的,但信号线GND与其他设备形成通信模式,容易产生干扰,抗干扰性能相对较弱。因此,差异通信,支持多机通信,强抗干扰RS485被广泛使用。

RS485通信最大的特点是传输速度可以达到10Mb/s以上,传输距离可达3000米左右。需要注意的是,虽然485的最大速度和最大传输距离很大,但传输速度会随着距离的增加而减慢,所以两者不能兼得。

三、串口通信的物理层

串口通信的物理层有很多标准,如上述,我们主要解释RS-232标准,RS-232标准主要规定了信号的用途、通信接口和电平标准。

在上述通信方式中,两个通信设备"DB9接口"连接通过串口信号线建立,并在串口信号线中使用"RS-232标准"因为RS-控制器无法直接识别232电平标准的信号,因此这些信号将通过一个"芯片的电平转换"转换为控制器识别"TTL校准"只有电平信号才能实现通信。

下图为DB9标准串口通信接口:

DB9引脚说明:

上表是计算机端。DB由于两个通信设备之间的收发信号,9公头标准接法(RXD与TXD)应交叉连接,因此调制调解器端DB9母头的收发信号接法一般与公头相反。只要使用两个设备之间的连接"直通型"串口线可以连接起来。

串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机控制时DTR当信号线表示为逻辑1时,它是为了通知远端调制调解器,该机器已准备好接收数据,0表示尚未准备就绪。

四、波特率

波特率是指数据信号对载波的调制速率,用单位时间内载波调制状态变化的次数来表示;

例如,波特率为96000bps;代表每秒96000的传输bit,也就是说,每秒分为9600等份。

所以,每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。由于是9600等份,即每1bit然后是下一个比特,没有额外的间隔。为了实现串口通信,收发端设置的波特率必须相同,否则无法实现通信。

一致的收发波特率可以实现通信:

收发波特率不一致,导致收发波特率不一致RX端不能正常接收:

五、串口通信的数据结构

起始位:起始位置必须是持续比特时间的逻辑0电平,标志传输字符的开始,接收器可以使用起始位置与发送器的数据同步。

数据位:数据位跟随起始位,是通信中真正有效的信息。数据位的位数可以由通信双方共同约定。传输数据时,先传输字符的低位,再传输字符的高位。

奇偶校验位:奇偶验证位置只有一个,用于奇偶验证或偶偶验证,不需要奇偶验证位置。如果是奇怪的验证,则需要确保传输的数据具有奇怪的逻辑高度;如果是偶数验证,则需要确保传输的数据具有偶数的逻辑高度。

停止位:停止位可以是1,1.软件可以设置5位或2位。它必须是逻辑1电平,标志着传输字符的结束。

空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位置,表示线路处于空闲状态,必须用高电平填充。

六、单双工通讯

单工:数据传输只支持数据在一个方向上传输;

半双工:允许数据在两个方向传输,但在某个时刻只允许数据在一个方向传输。事实上,它是一种单工通信,不需要独立的接收端和发送端,可以合并为一个端口;

全双工:允许数据同时向两个方向传输,因此全双工通信是两种单工方式的结合,需要独立的接收端和发送端。

七、STM串口通信32

STM有两种串口通信接口:UART(通用异步收发器),USART(大容量同步异步收发器)STM32F10x系列芯片分别由三个芯片组成USART和两个UART。

TXD:数据发送引脚;RXD:数据输入引脚

两个芯片之间的连接GND共地,同时TXD和RXD交叉连接可以在两个芯片之间进行TTL电平通信。

但如果是芯片和PC除共地条件外,机器连接不能使用上述直接交叉连接,尽管两者都有TXD和RXD引脚,但通常PC机使用的是RS232接口(9针)通常是TXC和RXD通过电平转换获得芯片和PC机的RS232接口直接通信,芯片的输入输出端口也需要电平转换RS232型,再交叉连接,两者的电平标准不同:

单片机的点评标准(TTL电平): 5V表示1,0V表示0;

RS232电平标准: 15/ 13V表示0,-15/-13表示1。

所以单片机和PC串口通信应遵循:单片机串口和上位机给出的RS232口通过电平转换电路实现TTL电平与RS232电平间转换.

如果使用USB串口通信也可以实现,USB串口电路图如下所示

STM32串口通信代码

STM32中串口通信为您建立了相应的库函数。使用和配置串口时,您可以直接调用库函数和配置。请参考代码:

1.初始化结构代码

typedefstruct{
uint32_tUSART_BaudRate;//波特率
uint16_tUSART_WordLength;//字长
uint16_tUSART_StopBits;//停止位
uint16_tUSART_Parity;//校验位
uint16_tUSART_Mode;//USART模式
uint16_tUSART_HardwareFlowControl;//硬件流控制
}USART_InitTypeDef;

2、NVIC优先级中断配置

NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;

/*选择嵌套向量中断控制器组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

nbsp; /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* 抢断优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

 

3、USART配置函数

void DEBUG_USART_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 
 /* 第一步:初始化GPIO */
  // 打开串口GPIO的时钟
 DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
  // 将USART Tx的GPIO配置为推挽复用模式
 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure); 
 
 /* 第二步:配置串口的初始化结构体 */
  // 打开串口外设的时钟
 DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
 // 配置串口的工作参数
 // 配置波特率
 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
 // 配置 针数据字长
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 // 配置停止位
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 // 配置校验位
 USART_InitStructure.USART_Parity = USART_Parity_No ;
 // 配置硬件流控制
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 // 配置工作模式,收发一起
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 // 完成串口的初始化配置
 USART_Init(DEBUG_USARTx, &USART_InitStructure);

/*--------------------------------------------------------*/
 // 串口中断优先级配置
 NVIC_Configuration();
 
 // 使能串口接收中断
 USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
/*--------------------------------------------------------*/
 
 /* 第三步:使能串口 */ 
  // 使能串口
 USART_Cmd(DEBUG_USARTx, ENABLE); 
}

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章