一文详解STM32串口通信

发布者:Heavenly999最新更新时间:2024-01-25 来源: elecfans关键字:STM32  串口通信  波特率 手机看文章 扫描二维码
随时随地手机看文章

1 什么是串口通讯?

串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。

典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。如下是串行通讯示数据传输意图。b6c412a8-93fb-11ed-bfe3-dac502259ad0.png     2 串口通讯的通讯协议 最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485。我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。


3 串口通讯的物理层

串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。b6dc31d0-93fb-11ed-bfe3-dac502259ad0.png在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。下图为DB9标准串口通讯接口:b705a876-93fb-11ed-bfe3-dac502259ad0.pngDB9引脚说明:b720997e-93fb-11ed-bfe3-dac502259ad0.png上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可。b72e12de-93fb-11ed-bfe3-dac502259ad0.png     串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

4 波特率

波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示。b75d2a92-93fb-11ed-bfe3-dac502259ad0.png比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的。收发波特率一致可以实现通讯:b771f30a-93fb-11ed-bfe3-dac502259ad0.gif收发波特率不一致,导致RX端不能正常接收:b787ebec-93fb-11ed-bfe3-dac502259ad0.gif

5 串口通讯的数据结构

b7a4e378-93fb-11ed-bfe3-dac502259ad0.png     起始位:起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

6 单双工通讯

单工:数据传输只支持数据在一个方向上传输;半双工:允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;全双工:允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。b7b793e2-93fb-11ed-bfe3-dac502259ad0.png

7 STM32中的串口通讯

STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。b7e311d4-93fb-11ed-bfe3-dac502259ad0.pngTXD:数据发送引脚;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。

b6dc31d0-93fb-11ed-bfe3-dac502259ad0.png因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换。如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示。b8078154-93fb-11ed-bfe3-dac502259ad0.pngSTM32中串口通讯已经给大家建好了相应的库函数,大家在使用和配置串口的时候直接进行调用库函数和配置就行了,STM32串口通信库函数实例相关文章学习STM32单片机,绕不开的串口STM32实例-用按键控制串口发送数据,文末附代码请大家参照一下代码:1、初始化结构体代码b8226cee-93fb-11ed-bfe3-dac502259ad0.png

2、NVIC配置中断优先级

b831a498-93fb-11ed-bfe3-dac502259ad0.png

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); 

}

关键字:STM32  串口通信  波特率 引用地址:一文详解STM32串口通信

上一篇:STM32中的SPI总线介绍
下一篇:学习STM32时为什么要学习汇编?

推荐阅读最新更新时间:2024-11-17 05:47

STM32的IO模式选择
有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别 有关推挽输出、开漏输出、复用开漏输出、复用推挽输出 以及上拉输入、下拉输入、浮空输入、模拟输入的区别 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO
[单片机]
STM32与Actility ThingPark的合作实现高效的无线固件更新
在物联网(IoT)领域,无线固件更新(FUOTA)技术的引入显著提高了设备管理的效率和灵活性。STM32与Actility ThingPark平台的结合,为开发者提供了一个强大的工具,使他们能够在极短的时间内设置和执行FUOTA活动。 FUOTA的重要性及其实施挑战 FUOTA技术的引入,使得开发者可以远程更新设备固件,而无需物理访问每个设备。这不仅大大降低了维护成本,还提高了设备的安全性和性能。然而,实施FUOTA并非易事。它需要开发者掌握多种通信协议和低级编码技术,以确保数据包的安全传输和设备的正确更新。 Actility ThingPark平台通过提供后端和客户端基础设施,简化了FUOTA的实施过程。该平台与S
[单片机]
stm32,ov7670识别二值化并识别黑色物体,串口返回坐标值
自己网上找的代码,根据要求修改可二值化,识别黑色物体,用红色框框框起来,串口返回坐标值 单片机源程序如下: #include led.h #include delay.h #include key.h #include sys.h #include lcd.h #include usart.h #include string.h #include ov7670.h #include tpad.h #include timer.h #include exti.h #include usmart.h #include EasyTracered.h const u8*LMODE_TBL ={
[单片机]
stm32---RS485初始化
u8 RS485_RX_BUF ; //接收缓冲,最大64个字节. u8 RS485_RX_CNT=0; //接收到的数据长度 /* 函数:RS485_Init 功能:串口初始化配置 参数:Baud:波特率 备注:GPIO/USART/NVIC初始化,开启串口中断,使能串口中断(中断处理函数) 步骤: 1---GPIO/USART1/NVIC初始化结构体定义 2---开启串口USART,GPIO端口时钟 3---复位串口 4---USART2_TX/USART2_RX 串口接受/发送端口配置寄存器结构体参数配置 5---NVIC 中断控制器配置 6---USART2 初始化设置 7---开启中断 8---
[单片机]
stm32专题十七:深度解析 stm32 硬件iic (i2c)
首先是配置I2C的GPIO,然后配置I2C参数。就是常规配置,按流程来写不会错。 /** * @brief EEPROM IIC 配置 */ void I2C_EE_config(void) { GPIO_InitTypeDef GPIO_InitStruct; I2C_InitTypeDef I2C_InitStruct; // 开启I2C GPIO时钟 EPROM_I2C_GPIO_APBxClkCmd(EEPROM_I2C_SCL_GPIO_CLK | EEPROM_I2C_SDA_GPIO_CLK, ENABLE); // 开启I2C 外设时钟 EEPROM_I2C_APBxC
[单片机]
<font color='red'>stm32</font>专题十七:深度解析 <font color='red'>stm32</font> 硬件iic (i2c)
关于STM32主存储块擦除编程操作的一些疑问
1.为什么每次都要检查BSY位是否为0? 因为BSY位为1时,不能对任何FPEC寄存器执行写操作,所以必须要等BSY位为0时,才能执行闪存操作。 2.如果没有擦除就进行编程,会出现什么结果? STM32在执行编程操作前,会先检查要编程的地址是否被擦除,如果没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1。唯一例外的是,当要编程的数据为0X0000时,即使未擦除,也会进行编程,因为0X0000即使擦除也可以正确编程。 3.为什么操作后要读出数据并验证? STM32在某些特殊情况下(例如FPEC被锁住),可能根本就没有执行所要的操作,仅通过寄存器无法判断操作是否成功。所以,保险起见,操作后都要读出所
[单片机]
关于STM32的printf()函数重映射
printf()函数的重映射: 在配置的target选项中选择use microlib,然后在main()函数之前添加函数重映射,如下: int fputc(int ch, FILE *f) { USART_SendData(USART1, (u8) ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); return ch; } 在main()函数中包含stdio.h头文件,在其他自己创建的函数中若使用printf()函数也应该包含改头文件,这样一来,prinft()函数重映射的使用便不会有警告以及错误。 若不是用微库,则应该在重映射printf()之前添
[单片机]
STM32-蜂鸣器实验
一,蜂鸣器介绍 蜂鸣器分有源蜂鸣器和无源蜂鸣器,这里的源指的是震荡源 一般我们使用有源蜂鸣器,如图:   有两个引脚,较长的一端为正极,较短的一段为负极 二,蜂鸣器硬件连接: 蜂鸣器负极连接在STM32的PB8引脚: 错误的连接方法: IO口接蜂鸣器接地 错误的臆想: IO口输出高电平,蜂鸣器正负极产生电压差,蜂鸣器发出声响 错误分析: STM32IO口电流驱动能力非常有限,不能通过IO口驱动大功率硬件,需要通过三极管来驱动(三极管的放大作用),将IO口输出的小电流放大为大电流(放大倍数β) R38作用: STM32芯片复位后IO口默认为浮空状态,IO口电平是不确定的,有可能跳边的电流经过三极管被放大使蜂鸣器
[单片机]
STM32-蜂鸣器实验
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved