基于STM32实验:了解串口协议并实现串口通信、LED流水灯实践

本实验基于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-232TTL
“1”-15V~-5V+2.4V~+5V
“0”+5V~+15V0V~+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-485RS-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.DLLTARMSTM.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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、一盏一盏:第一盏先亮--延时--熄灭--延时--下一盏; 2、利用数组方法点亮:定义一个数组(即0xfe,0xfd,0xfb,0xf7,0xef,oxdf,0xbf,0x7f:依次代表只有第一盏,第二盏....亮),再利总线,按顺序点亮八盏; 3、利用移位方法点亮:(1)、利用移位运算和按位或运算,依次点亮八盏; (2)、包含intrins头文件(里面含有移位函数),使用相应的左移或右移函数进行移位, 下面是代码和注释,详细解释了点亮流水灯的思路,附件含有源代码和仿真文件,有需要的可以下载 //方式0控制流水灯循环点亮 #include //包含51单片机寄存器定义的头文件 #include //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量 sbit P17=P1^7; /************************************************************** 函数功能:延时约150ms **************************************************************/ void delay(void) { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; } /************************************************************** 函数功能:发送一个字节的数据 **************************************************************/ void Send(unsigned char dat) { P17=0; //P1.7引脚输出清0信号,对74LS164清0 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期,保证清0完成 P17=1; //结束对74LS164的清0 SBUF=dat; //将数据写入发送缓冲器,启动发送 while(TI==0) //若没有发送完毕,等待 ; TI=0; //发送完毕,TI被置“1”,需将其清0 } /******************************************* 函数功能:主函数 ******************************************/ void main(void) { unsigned char i; SCON=0x00; //SCON=0000 0000B,使串行口工作于方式0 while(1) { for(i=0;i<8;i++) { Send(Tab[i]); //发送数据 delay(); //延时 } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值