STM32串口通信简明知识

发布者:自由漫步最新更新时间:2024-08-27 来源: elecfans关键字:STM32  串口通信  并行通信 手机看文章 扫描二维码
随时随地手机看文章

什么是串口通讯?

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

典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。如下是串行通讯示数据传输意图。

poYBAGGSOQCAN5_sAAAbxGV_uUc387.png

串口通讯的通讯协议

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

我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。

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

串口通讯的物理层

串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

poYBAGGSOQGAMFhSAACuJnG1VJs266.png

在上面的通讯方式中,两个通讯设备的'DB9接口'之间通过串口信号线建立起连接,串口信号线中使用'RS-232标准'传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个'电平转换芯片'转换成控制器能识别的'TTL校准'的电平信号,才能实现通讯。

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

pYYBAGGSOQOAVMq2AAE2pgLX83A536.png

DB9引脚说明:

pYYBAGGSOQSAMHGFAACKGKtdHjY166.png

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

wKgZomUDxQ2AApZHAAEPbkrvIaI357.png

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

波特率

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

poYBAGGSOQeAWl8CAAA_iOmRihA798.png

比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。

因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的:动图演示常用通信协议原理。

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

wKgaomREozyAEC87AAAtrk-E2iI532.jpg

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

wKgZomREozyAajfSAAAgToKpNrs333.jpg

串口通讯的数据结构

wKgZomUDxRSAfbwcAABJJSl1aeg272.png

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

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

奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。

停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。

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

单双工通讯

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

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

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

poYBAGGSOQqAVGdjAAFsx0MRWn8644.png

STM32中的串口通讯

STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。

pYYBAGGSOQyAVq_1AABTBMG6eqk130.png

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。

wKgaomUDxRiAAuoQAACKfhmI81U456.png

因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换。如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示。

poYBAGGSOQ-AA_RBAAD60Hk8Gss325.png

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


/*配置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配置函数


voidDEBUG_USART_Config(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

USART_InitTypeDefUSART_InitStructure;

/*第一步:初始化GPIO*/

//打开串口GPIO的时钟

DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE);

//将USARTTx的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);


//将USARTRx的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串口中断及DMA接收常见的几个问题
下一篇:STM32F030在低温下无法启动

推荐阅读最新更新时间:2024-11-18 09:22

从今天开始,像使用U盘一样,升级STM32
有没有想过,像使用U盘一样升级STM32固件,非常简单,非常方便 1:插入电脑USB接口 2:把升级固件拖到设备盘符 3:升级完成 抛弃繁琐的USB DFU,抛弃落后的串口升级,让我们来谈谈U盘升级STM32 为什么设计这个BOOT LOADER 在电子产品开发过程中,为了满足市场需要,经常是先开发出一个简单可用的版本,然后逐步迭代升级,修复bug,并增强系统功能 一个稳定,简单,安全的升级方式,就变得非常重要 对于嵌入式系统来说,常见的升级方式为 串口升级(私有协议或者X-Modem) USB升级(DFU) U盘升级(OTG) 网络升级 无线升级(OTA) 从技术来说,这几种升级方式大同小异,原理
[单片机]
为什么STM32单片机编程时需要使能时钟
作为一个STM32的菜鸟级人物,我刚开始接触STM32时,其实和当年开始学习51单片机的心理是一样的。茫然,谁说不是呢?但是,正常的学习途径无非就是看书,然后敲代码,最后烧程序,有问题就check,然后再继续烧,我都怀疑我快成了火头工。因为在我的印象中,只有这类职业才和“烧”有着密不可分的联系。即使当一名敬业又牛逼的火头工是我毕生的梦想。OK,不侃了。我希望,通过写日志把我作为一个菜鸟在学习STM32中的问题记录下来,同时以我为鉴,规避那些没有必要的破事。 1. 学习STM32要不要基础 原则上它应该是需要的,但是,我们也能发现很多人也是没有基础的。比如说,我们实验室的大师兄原来是管理专业,但是现在相当牛逼,软硬皆通。如果你和
[单片机]
STM32总线结构和存储器
也就说我们所操作的就是别名区的位
[单片机]
<font color='red'>STM32</font>总线结构和存储器
STM32简易多级菜单(数组查表法)显示方法
单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了。 1 多级菜单 多级菜单的实现,大体分为两种设计思路: 通过双向链表实现 通过数组查表实现 总体思路都是把菜单的各个界面联系起来,可以从上级菜单跳到下级菜单,也可从下级菜单返回上级菜单。 数组查表的方式比较简单,易于理解,本篇就来使用数组查表发在STM32上实现多级菜单的显示。 2 代码实现 2.1 数组查表 首先需要定义一个结构体: typedef struct { uchar current; uchar up;//向上翻索引号 uchar down;//向下翻索引号 uchar ent
[单片机]
<font color='red'>STM32</font>简易多级菜单(数组查表法)显示方法
完善STM32产品线 意法发布STM32 F3系列
今年5月份,意法半导体发布了基于ARM Cortex-M0架构的STM32 F0系列入门型微控制器,至此,STM32系列产品已经拥有了基于Cortex-M系列内核的完整解决方案,从入门级的微控制器STM32 F0到内置DSP和FPU的高性能微控制器STM32 F4系列,至此,细心认识也许会产生疑问:F3在哪里?它在STM32家族中的地位又将如何?9月13日,意法半导体的32位微控制器产品线经理 Jean-Marc Mathieu专程抵京,为业界揭开了STM32 F3系列产品的神秘面纱。 这套搭载ARM Cortex-M4内核的STM32 F3系列产品不仅内置了DSP和FPU功能,且拥有无与伦比的模拟外设组合,定位介于F1
[单片机]
完善<font color='red'>STM32</font>产品线 意法发布<font color='red'>STM32</font> F3系列
stm32输入捕获,捕获高电平
输入捕获就是用定时器检测引脚上的电平时间,可以检测高电平时间和低电平时间,然后可以算引脚上信号的频率和占空比。 基本思路就是利用定时器的输入捕获功能。 定时器捕获到高电平或低电平就会进入捕获中断 例如: 我们要捕获高电平时间 0 设置定时器计数频率和装载值,一般设置1MHz,65535 1 设置定时器捕获为高电平捕获 2 进入捕获中断后,获取CNT计数值或CCRx值,定时器捕获到电平后会把CNT的值保存到CCRx。 设置成低电平捕获。 3 再次进入捕获中断,获取CNT计数值-上次的CNT值=总高电平时间。 设置成高电平捕获。 4 重复2-3即可完成下一次捕获。当然还要考虑溢出的情况,
[单片机]
<font color='red'>stm32</font>输入捕获,捕获高电平
STM32单片机----外部中断EXTI学习
可屏蔽中断和不可屏蔽中断: 按照是否可以被屏蔽,可将中断分为两大类:不可屏蔽中断(又叫非屏蔽中断)和可屏蔽中断。不可屏蔽中断源一旦提出请求,CPU必须无条件响应,而对可屏蔽中断源的请求,CPU可以响应,也可以不响应。CPU一般设置两根中断请求输入线:可屏蔽中断请求INTR(Interrupt Require)和不可屏蔽中断请求NMI(NonMaskable Interrupt)。对于可屏蔽中断,除了受本身的屏蔽位控制外,还都要受一个总的控制,即CPU标志寄存器中的中断允许标志位IF(Iinterrupt Flag)的控制,IF位为1,可以得到CPU的响应,否则,得不到响应。 GPIO口与EXTI外中断的映像图:
[单片机]
<font color='red'>STM32</font>单片机----外部中断EXTI学习
STM32 HAL库学习(二) 串口收发数据
上一篇实现了LED的点亮和串口轮询发送数据,这章想着实现串口接收数据,不得不说,在开始使用STM32的外设才对HAL库的框架有更准确的理解。之前一直不懂HAL库的优越性在哪,这次对它的msp层有了一定认识。 简单来说,HAL库有一个特点就是对于许多外设的初始化以及功能操作,都提供有一个weak版本的函数,例如串口的HAL_UART_MspInit()函数和HAL_UART_MspDeInit()函数等,这些都可以供用户在需要时在stm32f0xx_hal_msp.c中进行重写实现功能。 用串口初始化来举例子,用Cube配置UART1使能并生成代码后可以看到有三个关键函数: 1、void MX_USART1_UART_I
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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