当前位置: 首页 > news >正文

STM32CUBUMX配置RS485(中断接收)--保姆级教程

————————————————————————————————————
⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。
⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。
⏩本篇文章对STM32CUBEMX配置RS485做一个详细的使用教程。
⏩感谢你的阅读,不对的地方欢迎指正。
————————————————————————————————————

一.RS485工作原理

简介

RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。目前标准名称为TIA-485,但工程师及应用指南仍继续使用RS-485来称呼此标准。

RS-485仅是一个电气标准,描述了接口的物理层,像协议、时序、串行或并行数据以及链路全部由设计者或更高层协议定义。 RS-485定义的是使用平衡(也称作差分)多点传输线的驱动器(driver)和接收器(receiver)的电气特性。

关键特性

差分传输增加噪声抗扰度,减少噪声辐射
长距离链路,最长可达4000英尺(约1219米)
数据速率高达10Mbps(40英寸内,约12.2米)
同一总线可以连接多个驱动器和接收器
宽共模范围允许驱动器和接收器之间存在地电位差异,允许最大共模电压-7-12V

信号电平

RS-485能够进行远距离传输主要得益于使用差分信号进行传输,当有噪声干扰时仍可以使用线路上两者差值进行判断,使传输数据不受噪声干扰。
在这里插入图片描述
RS-485差分线路包括以下2个信号:

  • A:非反向(non-inverting)
  • 信号 B:反向(inverting)信号

也可能会有第3个信号,为了平衡线路正常动作要求所有平衡线路上有一个共同参考点,称为SC或者G。该信号可以限制接收端收到的共模信号,收发器会以此信号作为基准值来测量AB线路上的电压。RS-485标准中提到:

  • 若是MARK(逻辑1),线路B信号电压比线路A高
  • 若是SPACE(逻辑0),线路A信号电压比线路B高

注:不同的IC使用的信号标示方式不同,不过EIA的标准中只使用A和B的名称。数据为1时,信号B会比信号A要高。不过因为标准其中也提到信号A是“非反向信号”,信号B是“反向信号”。因此信号A、B的定义就更容易混淆了,许多组件制造商(错误的)依循了这个A/B的命名原则,所以具体定义需要实际参考设计厂家芯片手册。
为了不引起分歧,一种常用的命名方式是:

  • TX+ / RX+ 或D+来代替B(信号1时为高电平)
  • TX- / RX- 或D-来代替A(信号0时为低电平)

下图列出在RS-485利用“异步开始-停止”方式发送一个字符(0xD3,最低比特先发送)时,U+端子及 U−端子上的电压变化。
在这里插入图片描述
更多原理讲解可以看看参考

实验环境

软件环境

STM32CUBEMX -6.9.0
KEIL 5.38

硬件环境

串口转485电路
在这里插入图片描述
串口/RS485转USB转换器(方便调试)与串口转485接线:

  • A - A
  • B - B
  • VCC - 5V
  • GND - GND

STM32H723ZGT6开发板与串口转485接线:

  • PB6 - RXD
  • PB7 - TXD
  • PB5 - 485T/R

MX配置

板子、时钟、调试之类的配置就不说了,具体可以看看这篇:
STM32CUBEMX配置ADC(多通道轮询)(STM32H7)–保姆级教程
这里只说一下RS485的具体配置
在这里插入图片描述
1.配置USART1作为我们连接RS485的接口
在这里插入图片描述
2.配置PB5为我们RS485收发的控制引脚
在这里插入图片描述
3.打开串口中断,并配置优先级

驱动编写

usart.h
加入接收缓冲区

/* USER CODE BEGIN Private defines */
#define USART1_RXBUFFERSIZE 1 //每次接收1个数据进入一次中断
#define USART1_REC_LEN 200  	 //定义最大接收字节数 200#define RS485DIR_TX HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//定义我们的控制引脚为发送状态
#define RS485DIR_RX HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);//定义我们的控制引脚为接收状态
/* USER CODE END Private defines */

usart.c

/* USER CODE BEGIN 0 */
#include <stdio.h>
#include <stdarg.h>
extern unsigned char USART1_aRxBuffer[USART1_RXBUFFERSIZE];//HAL库使用的串口接收缓冲
extern unsigned char USART1_RX_BUF[USART1_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
/* USER CODE END 0 */

在这里插入图片描述
在初始化中加入:

HAL_UART_Receive_IT(&huart1, (unsigned char *)USART1_aRxBuffer, USART1_RXBUFFERSIZE);//此处为添加的

这是为了将接收到的数据放到我们的数组中,USART1_aRxBuffer:存入的数组, USART1_RXBUFFERSIZE:一次存入的大小

stm32h7xx_it.c
编写中断和回调函数:

unsigned short USART1_RX_STA = 0;       //接收状态标记	
unsigned char USART1_aRxBuffer[USART1_RXBUFFERSIZE];//HAL库使用的串口接收缓冲
unsigned char USART1_RX_BUF[USART1_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */unsigned int timeout=0;unsigned int maxDelay=0x1FFFF;/* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */timeout=0;while (HAL_UART_GetState(&huart1)!=HAL_UART_STATE_READY)//等待就绪{timeout++;//超时处理if(timeout>maxDelay) break;		}timeout=0;while(HAL_UART_Receive_IT(&huart1,(unsigned char *)USART1_aRxBuffer, USART1_RXBUFFERSIZE)!=HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1{timeout++; //超时处理if(timeout>maxDelay) break;	}/* USER CODE END USART1_IRQn 1 */
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART1)//如果是串口1{if((USART1_RX_STA&0x8000)==0)//接收未完成{if(USART1_RX_STA&0x4000)//接收到了0x0d{if(USART1_aRxBuffer[0]!=0x0a)USART1_RX_STA=0;//接收错误,重新开始else USART1_RX_STA|=0x8000;	//接收完成了 }else //还没收到0X0D{	if(USART1_aRxBuffer[0]==0x0d)USART1_RX_STA|=0x4000;else{USART1_RX_BUF[USART1_RX_STA&0X3FFF]=USART1_aRxBuffer[0] ;USART1_RX_STA++;if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收	  }		 }}}
}

main.c
编写测试代码:

//RS485串口
extern unsigned short USART1_RX_STA;       //接收状态标记	
extern unsigned char USART1_RX_BUF[USART1_REC_LEN];//接收字符串缓冲区
extern unsigned char USART1_aRxBuffer[USART1_RXBUFFERSIZE];//HAL库使用的串口接收缓冲
while(1)
{if(USART1_RX_STA&0x8000){					   len=USART1_RX_STA&0x3fff;//得到此次接收到的数据长度RS485DIR_TX;//拉高PB5,更改RS485模式为发送HAL_UART_Transmit(&huart1,(uint8_t*)message,sizeof(message),1000);	//发送提示信息while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);		//等待发送结束HAL_UART_Transmit(&huart1,(uint8_t*)USART1_RX_BUF,len,1000);	//发送接收到的数据while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);		//等待发送结束RS485DIR_RX;//拉低PB5,更改RS485模式为接收USART1_RX_STA=0;if(USART1_RX_BUF[0] == '1') HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_10);}
}

调试结果

在这里插入图片描述
这里就简单实现了一个发什么收什么,然后再把收到的数据发回来的实验,代码的编写和普通的串口没有什么区别,只是多了一个串口转485的模块,一般的USB转串口是用不了的,得用USB转串口/485才行。

参考

RS485-详解

相关文章:

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…...

苹果iOS 16.6 RC发布:或为iPhone X/8系列养老版本

今天苹果向iPhone用户推送了iOS 16.6 RC更新(内部版本号&#xff1a;20G75)&#xff0c;这是时隔两个月的首次更新。 按照惯例RC版基本不会有什么问题&#xff0c;会在最近一段时间内直接变成正式版&#xff0c;向所有用户推送。 需要注意的是&#xff0c;鉴于iOS 17正式版即将…...

【100天精通python】Day16:python 模块的搜索目录和导入模块异常时的处理方法

目录 1 搜索模块所在目录 2 模块不在搜索目录中 2.1 添加模块所在的目录到PYTHONPATH环境变量 2.2 修改sys.path 2.3 使用绝对路径导入 2.4将模块复制到Python搜索路径中的任意一个目录 2.5 总结 3 其他导入的模块异常处理 3.1 模块未安装 3.2 模块名称拼写错误 3.3模…...

SOC FPGA介绍及开发设计流程

目录 一、SoC FPGA简介 二、SoC FPGA开发流程 2.1 硬件开发 2.2 软件开发 一、SoC FPGA简介 SOC FPGA是在FPGA架构中集成了基于ARM的硬核处理器系统(HPS)&#xff0c;包括处理器、外设和存储器控制器。相较于传统的仅有ARM处理器或 FPGA 的嵌入式芯片&#xff0c;SOC FPGA既…...

MySQL vs. Oracle: 函数比较与联系

引言 MySQL和Oracle是两个广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们提供了丰富的函数库来处理和操作数据。本文将详细介绍MySQL和Oracle的所有函数&#xff0c;并逐一介绍它们的相同和不同之处&#xff0c;以帮助读者更好地理解和使用这两…...

【Django学习】(十五)API接口文档平台_项目流程分析_日志器_认证_授权

一、API接口文档平台 使用API接口文档不经可以很好的的维护接口数据&#xff0c;还给测试人员的接口测试工作带来了便利&#xff1b; 我们可以在全局配置文件中添加路由路径生成接口文档 1、使用docs接口文档维护接口 1.1在全局配置文件里指定用于支持coreapi的Schema # 指…...

经营简报及考核360表格

文章目录 经营简报效果图代码tableObjectSpanMethod.js 考核360委员会效果图 经营简报效果图不需要合并单元格且有汇总表头的 懒得封装了&#xff0c;所以整体没有封装 经营简报 效果图 代码 <template><el-tableref"tableRef":data"tableData.lengt…...

Spring Security 构建基于 JWT 的登录认证

一言以蔽之&#xff0c;JWT 可以携带非敏感信息&#xff0c;并具有不可篡改性。可以通过验证是否被篡改&#xff0c;以及读取信息内容&#xff0c;完成网络认证的三个问题&#xff1a;“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全&#xff0c;使用它需要采用 …...

PyTorch从零开始实现Transformer

文章目录 自注意力Transformer块编码器解码器块解码器整个Transformer参考来源全部代码&#xff08;可直接运行&#xff09; 自注意力 计算公式 代码实现 class SelfAttention(nn.Module):def __init__(self, embed_size, heads):super(SelfAttention, self).__init__()self.e…...

运动蓝牙耳机什么牌子的好用、最好用的运动蓝牙耳机推荐

音乐是运动的灵魂&#xff0c;而一款优秀的运动耳机则是让音乐与我们的身体完美融合的关键。今天&#xff0c;我推荐五款备受运动爱好者喜爱的耳机&#xff0c;它们以卓越的音质、舒适的佩戴和出色的稳定性能脱颖而出&#xff0c;助你在运动中创造最佳状态。 1、NANK南卡Runne…...

HTTP、HTTPS协议详解

文章目录 HTTP是什么报文结构请求头部响应头部 工作原理用户点击一个URL链接后&#xff0c;浏览器和web服务器会执行什么http的版本持久连接和非持久连接无状态与有状态Cookie和Sessionhttp方法&#xff1a;get和post的区别 状态码 HTTPS是什么ssl如何搞到证书nginx中的部署 加…...

【算法与数据结构】222、LeetCode完全二叉树的节点个数

文章目录 一、题目二、一般遍历解法三、利用完全二叉树性质四、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、一般遍历解法 思路分析&#xff1a;利用层序遍历&#xff0c;然后用num记录节点数量。其他的例如…...

登录和注册表单的11个HTML最佳实践

原文&#xff1a;11 HTML best practices for login & sign-up forms 原作者&#xff1a;Andrey Sitnik 翻译已获原文作者许可&#xff0c;禁止转载和商用 大多数网站都有登录或注册表单;它们是业务转换的关键部分。然而&#xff0c;即使是流行的站点也没有实现本文中提到的…...

Mysql删除历史数据

Mysql定时删除历史数据 实现 1.创建存储过程&#xff08;函数&#xff09; SQL DROP PROCEDURE IF EXISTS KeepDatasWith30Days CREATE PROCEDURE KeepDatasWith30Days() BEGINSELECT maxId:max(Id) FROM tableName WHERE CreateTime<DATE(DATE_SUB(NOW(),INTERVAL 31 D…...

Python—数据结构(一)

先放一张自己学习和整理归纳的思维导图&#xff0c;以便让大家都知道我自己的整体学习路线。 数据结构的学习路上内容枯燥&#xff0c;但坚持下来一定有很大的收获&#xff01;加油&#x1f4aa;&#x1f3fb;&#xff01; 数据结构 数据的概念数据元素&#xff1a; 若干基本…...

离线环境安装flask依赖包

找到当前版本需要的所有依赖包&#xff0c;生产flask项目生成项目依赖包文件requirements.txt 1)在当前项目目录下 生成requirements文件&#xff1a;pip freeze >requirements.txt 执行requirements文件&#xff0c;安装依赖包&#xff1a;pip install -r requirements.t…...

ChatGPT与Claude对比分析

一 简介 1、ChatGPT: 访问地址&#xff1a;https://chat.openai.com/ 由OpenAI研发,2022年11月发布。基于 transformer 结构的大规模语言模型,包含1750亿参数。训练数据集主要是网页文本,聚焦于流畅的对话交互。对话风格友好,回复通顺灵活,富有创造性。存在一定的安全性问题,可…...

登录和注册页面 - 验证码功能的实现

目录 1. 生成验证码 2. 将本地验证码发布成 URL 3. 后端返回验证码的 URL 给前端 4. 前端将用户输入的验证码传给后端 5. 后端验证验证码 1. 生成验证码 使用hutool 工具生成验证码. 1.1 添加 hutool 验证码依赖 <!-- 验证码 --> <dependency><groupId…...

HDFS的文件块大小(重点)

HDFS 中的文件在物理上是分块存储 &#xff08;Block &#xff09; &#xff0c; 块的大小可以通过配置参数( dfs.blocksize&#xff09;来规定&#xff0c;默认大小在Hadoop2.x/3.x版本中是128M&#xff0c;1.x版本中是64M。 如果一个文件文件小于128M&#xff0c;该文件会占…...

深度学习(二)

目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值&#xf…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...