现场485总线干扰导致的stm32 DMA 接收异常

项目背景:

        现场变送器安装在变电站强电附近。产品批量生产使用一段时间后,最近突然有一个站点出现通讯故障问题。开始于某个变送器无法召唤数据,慢慢的所有变送器全部掉线。如果重新上电,变送器的数据都正常。掉线时间随机,掉线点位随机。

解决过程:

        根据现象,分析应为现场总线上的干扰导致。之前用了TI的485芯片,做了基本的通讯线路保护,后查资料,最好使用带有隔离的485芯片,于是采用了金升阳的某一485隔离芯片。重新设计电路板后现场更换,运行一段时间仍然会出现这种现象。现场采集发现过485网关数据丢失数据的问题。

        既然现场干扰问题不好解决,只能从变送器本身的做文章,主要下手的目标就是stm32主控芯片本身。

        485总线的干扰会引起数据错误,高低电平不稳导致的芯片识别为不定长度的01010010组合,瞬间可能就把接收数组搞溢出。在更换隔离的485芯片的同时,将片内的看门狗已设置,那么如果是有HARDFAULT的话一段时间后也会重启程序。

        下一步就查看DMA接收方面的资料,下面的链接给我了启发,干扰后可能导致DMA无法进入接收中断。

https://blog.csdn.net/hxkrrzq/article/details/102664983

https://www.jianshu.com/p/6995fb60364f

https://blog.csdn.net/qq_20999867/article/details/92961110

https://blog.csdn.net/tiantangmoke/article/details/103308851

由于我的经验有限,学习stm32 时使用的是HAL库,标准库的一个寄存器的使用不敢乱动。于是我就使用了比较蹩脚的方式:看门狗程序设置好,使用定时器监视总线数据收发,由于上位机程序轮询时间一般设置为1~3秒,于是将定时器设置为一秒溢出全局变量“catch_count”加一,在接受标志位处“catch_count”清零。判断“catch_count”大于5,也就是5秒内没有接收到数据,就将串口重新初始化。

更改程序后,进行人工干预485总线,连接多个变送器,老程序3个,新程序2个,干扰到都没有数据后,等待下次轮询结果,老程序就无法采集,新程序能正常恢复。

此方法虽然能解决问题,比较粗暴,能解决偶尔总线干扰引起的假死现象,但是如果现场干扰是持续发生的话,还是从现场总线屏蔽保护方面进行解决。

已下是stm32 cubemx的配置及程序部分内容:

看门狗设置:

MX_IWDG_Init();

 尽量靠近while(1)大循环前开启看门狗,放置前置初始化外设时间过长。

HAL_IWDG_Refresh(&hiwdg);

喂狗函数。

超时未接收数据后进行串口重新初始化

		if(catch_count > 5)
		{
			HAL_UART_MspDeInit(&huart2);
			HAL_UART_MspInit(&huart2);
		}
		

定时器设置

 

 记得开启定时器中断

HAL_TIM_Base_Start_IT(&htim3);

有什么更好的办法欢迎交流。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32 RS485接收程序是针对STM32系列单片机的一种程序设计,用于实现RS485通信协议中的接收功能。 首先,RS485是一种电气标准,具有双向通信功能,可通过单个串行总线连接多个设备。在STM32单片机中,我们可以通过配置对应的GPIO引脚和串口控制器来实现RS485通信。 在编写RS485接收程序时,我们需要根据通信协议和硬件连接进行相应的配置和初始化。首先,配置GPIO引脚为输入模式,用于接收数据。其次,配置UART串口模式为接收模式,并设置波特率和其他相关参数。 接下来,我们可以使用中断或轮询的方式进行数据接收。如果选择中断方式,需要在初始化中开启对应的接收中断,并编写中断服务函数来处理接收到的数据。如果选择轮询方式,可以在主循环中不断检测接收缓冲区是否有数据到达,并进行相应的处理。 在接收到数据后,我们可以根据协议要求进行数据解析和处理。一般来说,RS485通信协议中会包含起始位、数据位、校验位等信息,我们可以根据这些信息对接收到的数据进行解析,判断数据的有效性,并可以根据需要进行处理,比如存储、显示或执行相应操作。 需要注意的是,在RS485通信中还需要进行相关的异常处理和错误处理。比如,在接收过程中可能会出现数据错误、负载变化等情况,我们需要在程序中加入相应的保护措施和容错处理,以提高通信稳定性和可靠性。 综上所述,STM32 RS485接收程序的实现需要根据具体的硬件连接和通信协议要求进行相应的配置和初始化,并编写相应的数据接收、解析和处理代码,同时还需要添加异常处理和错误处理的机制。这样才能有效地实现STM32单片机的RS485接收功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值