本实验基于STM32F103C8T6核心板操作
实验器材:核心板、ST-LINK烧录器、若干杜邦线及飞线、3个LED灯、面包板
STM32CubMX、Keil5 MDK、串口调试助手
文章目录
一、了解串口协议
串口协议即一种规则——规范串口之间数据的传输。将串口通信分为协议层和物理层,物理层为线路连接;协议层制定通信的规则,双方数据的打包、解包标准(串口数据包:起始位、数据位、校验位、停止位)
常用协议有RS-232、RS-422、RS-485。以下是具体介绍
1. RS-232协议
RS-232代表着什么?
数据传输标准是由美国电子工业协会(EIA)制定的。前缀RS表示推荐标准。所有EIA标准均以这些字符开头。RS-232的正式规范是它是一个使用串行二进制数据交换在DTE和DCE设备之间进行通信的接口。DTE是数据终端设备的缩写,而DCE代表数据通信设备。本实验中,上位机(PC)就是DTE,STM32就是DCE。
下图是设备间以RS-232标准进行串口通信的视图。
可见接收两端都有一个电平转换芯片,用于将RS-232标准的电平转换为TTL电平,这是因为TTL电平在计算机内部的运行是理想的,但在通信使用中大多采用并行数据传输且抗干扰能力差,这对于设备间的通信传输就不适合了,因此考虑可靠性和成本原因,最开始制定了RS-232协议电平(抗干扰容限较大)负责较近距离设备通信。下图是电平比对:
RS-232 | TTL | |
---|---|---|
“1” | -15V~-5V | +2.4V~+5V |
“0” | +5V~+15V | 0V~+0.4V |
以下是物理层接口视图:(现在使用的RS-232协议一般只使用RXD和TXD分别用于接收/传送数据)
RS-232的缺点:电平值较高易损坏电路、传输速率满足不了需求(最高19200bps)、抗干扰能力不足、有限的通信距离(通常在15m以内)、仅能实现点对点。
综上,后续推出了RS-422用于弥补RS-232传输速率和距离、抗干扰能力和仅能实现点对点的不足,之后又因工业控制技术的飞速发展,亟需一种总线通信技术能够适合远距离的数字通信,因此在RS-422的基础上推出了RS-485。此处仅将RS-422当作一个过渡版本,接下来是对RS-485的介绍。
2. RS-485
典型的串行通信标准就是RS-232和RS-485。
RS-485与RS-232的不同:
1.逻辑电平不同,以下为比对
RS-485 | RS-232 | |
---|---|---|
“1” | +2V~+6V | -15V~-5V |
“0” | -6V~-2V | +5V~+15V |
2.传输速率最高可达10Mbps
3.抗干扰能力更强
4.最大实际传输距离可达3000m
5.RS-485为差分传输(抗干扰能力强的原因),RS-232为单端传输
6.RS-485为半双工(原因在于数据传输,下文解释),RS-232为全双工
7.RS-485能实现一对多通信传输,以下是详细介绍
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线拓扑结构,在同一总线上最多可以挂接32个节点。
RS-232使用的是差分传输,如果要用单片机控制接口设备,就要使用到收发器,以下图示
其中:
A和B为总线;
R为接收器输入;
RE为接收器使能信号;
DE为发送器使能信号;
D为发送器输出;
以上可以见得在通信传输中需要使用的收发器只能传输一路差分信号,因此RS-485是半双工工作模式。在工业控制中,一般都是主机和从机之间进行通信,以下视图
3. 了解"USB/TTL转232"模块工作原理
工作原理::
串口发送
串口应用发送数据->USB串口驱动获取数据->驱动将数据经过USB通道发送给USB串口设备->USB串口设备接收到数据通过串口发送
串口接收
USB串口设备接收串口数据->将串口数据经过USB打包后上传给USB主机->USB串口驱动获取到通过USB上传的串口数据->驱动将数据保存在串口缓冲区提供给串口应用读取
二、 安装 stm32CubeMX,配合Keil,分别尝试使用寄存器地址方式和HAL库这两种方式,完成下列任务:
1. 重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
在上篇文章中已经在keil5上进行了模拟仿真和逻辑分析仪观察输出波形,接下来进行烧录和演示,这里用的是ST-LINK烧录器,在option for taget中的debug选择即可。
下载烧录
演示图:
2. 完成一个STM32的USART串口通讯程序
要求:1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello world!”。win10采用“串口助手”工具接收。
接下来是利用HAL库完成对此任务的完成,上篇文章中已经详细说明了初始设置步骤。
- 创建新工程,选择STM32F103C8T6芯片。
- 设置引脚PA10和PA9为UART接收和传输模式
- 设置HSE时钟
- 设置调试
- 设置传输参数(115200bps传输速率、1停止位、无校验位)
- 最后生成工程即可,接下来,转入keil中操作主函数,使之能够向上位机传输“hello world!”
- 在主函数内键入以下代码,此为使用HAL_UART进行数据传输
- 接下来就是编译、烧录即可,以下为串口助手演示
三、利用虚拟逻辑分析仪观察两个实验中各引脚的时序波形
1. LED流水灯
在上篇文章中已经详细介绍了如何使用逻辑分析仪观察LED流水灯各引脚电平,以下是结果图。
分析:从上到下依次为PA5、PB9、PC14,低电平代表灯亮,高电平代表灯灭,可以观察出,三个灯是流水灯输出,且每个灯亮的间隔刚好是1s
2. 串口通信输出hello world!
进入options for target中的debug
Dialog DLL 设置为 DARMSTM.DLL
和 TARMSTM.DLL
Parameter 都设置为 -pSTM32F103C8
(芯片型号)
- 进入仿真,加入
USART1_SR
,Display type选择bit,观察仿真波形
- gid(虚线间隔)为50ms时
-
grid为0.5ms时
-
grid为0.1ms时
-
grid为2us时
由前几张图分析得每个信号之间高电平持续约100ms;传输信号期间其低电平(即有效电平)持续约0.1ms、传输信号期间高电平持续约6us。
总结
本文是基于上篇文章的实验,了解了RS-232和RS-485两个典型得串口协议,实现LED流水灯和串口通信传输,最后再次利用虚拟逻辑分析仪分别对两个实验得输出波形进行了分析验证。
参考文章
https://blog.csdn.net/qq_45945548/article/details/121720676
https://blog.csdn.net/Qxiaofei_/article/details/116565060
https://blog.csdn.net/weixin_48268385/article/details/120947234
https://blog.csdn.net/weixin_43937576/article/details/109636580