硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8970|回复: 16
收起左侧

[技术讨论] STM32串口空闲中断使用体验

  [复制链接]

77

主题

691

回帖

922

积分

金牌会员

积分
922
发表于 2020-11-6 12:59:40 | 显示全部楼层 |阅读模式
看到很多工程师写串口接收代码,都是使用单字节接收中断,这样其实没有发挥好STM32的资源。
利用串口IDLE+DMA实现不定长连续通信能够大大提高效率,感觉处理得当甚至可能操作自带硬件串口FIFO的串口外设。但是不知道为什么很少有人用。最近在设计一个串口通信代码框架,使用到了IDLE,遇到一些问题,研究之后找到问题,网上关于这方面内容不多,所以发出来和各位硬汉粉交流。

1、上电初始化之后进入一次空闲中断问题
看了很多资料说什么要延时一会,但是这种浪费CPU的行为是不建议的,而且我实际测试也没啥作用,也有可能是有没有领会到精髓;其实这种问题解决方案就是RX设置为上拉输入就可以了,设置上拉之后下面的问题也都会得到改善和解决。个人觉得是设置为浮空,容易受到干扰,导致频繁的出现空闲中断;如果对功耗有要求的话,另一个办法就是增加软件校验,收到数据校验之后再决定用不用,但是这种办法存在问题,如果干扰很严重,容易出现HardFault。

2、没有数据输入,却频繁接收到数据
其实这些都不是数据来的,大部分是错误,这就设计一个很少有人用的串口检测,STM32提供的再多缓冲器下的错误中断检测,只需要使能错误中断,在中断函数里面检测到错误复位一下接收。实测大部分是噪声引起的帧错误,所以如果RX设计为上拉输入,也能够避免这种问题的出现。

以上,如有不对。欢迎留言讨论。
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2020-11-6 13:59:44 | 显示全部楼层
总结一下,RX应该设置为上拉。 最好还是外部上拉。因为mcu复位期间(比如持续的按住复位按键),RX管脚是默认的下拉状态,会导致其他的设备误读。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-6 14:25:49 | 显示全部楼层
caicaptain2 发表于 2020-11-6 13:59
总结一下,RX应该设置为上拉。 最好还是外部上拉。因为mcu复位期间(比如持续的按住复位按键),RX管脚是默 ...

精辟。我一大堆其实就两点,一就是能上拉就别浮空,二是多缓冲器通信错误侦测一定要加上。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107002
QQ
发表于 2020-11-7 02:51:51 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2020-11-7 08:18:30 | 显示全部楼层
LZ说的很不错,使用IDLE确实有几个地方注意点,各个错误标志位的中断一定要加上,并在中断函数中处理是IDLE还是错误,有错误则直接清除即可。如果不加的话很有可能长时间运行发生异常,因为一旦发生错误,如果不清楚就会发送接受失败。不过大部分MCU的IDLE都只能1~2个字节,这个超时时间还是略短了一些。
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
发表于 2020-11-7 14:16:20 | 显示全部楼层
微信截图_20201107141609.png 是这样吗??
回复

使用道具 举报

3

主题

337

回帖

346

积分

高级会员

积分
346
发表于 2020-11-7 20:22:30 | 显示全部楼层
这种经验分享讨论很宝贵
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-8 18:11:57 | 显示全部楼层
zl1215 发表于 2020-11-7 08:18
LZ说的很不错,使用IDLE确实有几个地方注意点,各个错误标志位的中断一定要加上,并在中断函数中处理是IDLE ...

是的,一般发生错误没有判断到错误的话,很有可能数据完全不是想要的,像是被加密的一样。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-8 18:13:14 | 显示全部楼层

是的,如果环境恶劣的情况下,建议外加上拉。
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
发表于 2020-11-8 22:03:19 | 显示全部楼层
庄永 发表于 2020-11-8 18:13
是的,如果环境恶劣的情况下,建议外加上拉。

多谢多谢~~
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-11-9 18:04:03 | 显示全部楼层
感谢分享
回复

使用道具 举报

0

主题

125

回帖

125

积分

初级会员

积分
125
发表于 2020-11-21 18:25:44 | 显示全部楼层
使用idle可以, 但如果说使用IDLE作为帧与帧的区分, 那么就要小心, 除非通信两端都是你的出品, 否则很可以会隐藏大问题。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-11-22 15:51:20 | 显示全部楼层
我一直是纯软件开发,相对片面的聊一下看法:
1.上电初始化延时一会,我已经习惯这么操作。例如早期ST芯片初始化都喜欢用一个延时后再开始设备初始化,避免当前硬件供电不稳导致产品量产个别产品稳定性不良问题。
    回归UART通信,如果硬件做了模块化功能封装,例如产品小板是对接232串口、485型芯片等等,小板的模块电源如果得不到很好的保证,有必要做上电延时,确保模块得到稳定的电源再响应正常通信。
    现象举例:从软件的思维看串口打印,我使用USB转TTL的小板,直接连接到PA9,PA10,看打印,上电看UART初始化的通信打印都是正常的;USB转串口连接到产品的232通信输出口,上电看串口打印第二条打印总是乱码。问题规避措施:把串口初始化放后一点,甚至作为第二功能初始化,产品跑了两个循环再根据标志位初始化串口,响应功能通信也行。
2.数据的稳定性,UART通信,数据包也可以走 Modbus协议;数据通信开始,可以用指定的功能码过滤第一层,说白了第一个BYTE是地址码第二个是功能码,有数据进来,直接匹配功能码是否是当前产品通信需要的,如果不是直接丢弃当前的数据包;还可以走Modbus的数据做否定回复。另外数据包走Modbus协议传输,还可以对数据包进行CRC校准,进一步保证数据的完整性。
   PS,如果走Modbus通信,建议还要消化一下驱动模板,有些Modbus驱动是针对指令+开关量简单的数据通信(将BUFFER优化成32BYTE),必须要把指令包限制改大,具体根据自己通信的数据包特点做优化。
Releasing your creativity
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-23 21:38:04 | 显示全部楼层
Edmund1964 发表于 2020-11-21 18:25
使用idle可以, 但如果说使用IDLE作为帧与帧的区分, 那么就要小心, 除非通信两端都是你的出品, 否则很可 ...

一般做产品,即使不是自己的产品,设计串口通信,一般都会双方先敲定通讯格式的。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-23 21:39:25 | 显示全部楼层
廷润 发表于 2020-11-22 15:51
我一直是纯软件开发,相对片面的聊一下看法:
1.上电初始化延时一会,我已经习惯这么操作。例如早期ST芯片 ...

大侠是个老司机了
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-23 21:47:04 | 显示全部楼层
廷润 发表于 2020-11-22 15:51
我一直是纯软件开发,相对片面的聊一下看法:
1.上电初始化延时一会,我已经习惯这么操作。例如早期ST芯片 ...

1、延时一会儿确实会有作用的,所以写驱动把时钟和串口开关分开来写,但是有时候错误出现在打开串口读写瞬间,一般写需要像硬汉哥那样打开瞬间清除一下标志,读必要的时候舍弃第一次空闲中断之前的数据2、数据不稳定主要是表现在用DMA+IDLE读写的出现串口的一些硬件错误,比如帧错误、噪声错误等,这些主要是由于总线上的干扰,按照数据格式来决定是否保留数据使用,则会频繁丢弃数据。所以需要加上拉以保证总线稳定
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2020-11-26 11:14:21 | 显示全部楼层
STM32V6之串口HAL库串口空闲中断接收不定长字节代码实现 http://www.armbbs.cn/forum.php?m ... 77&fromuid=8820 (出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 08:51 , Processed in 0.209471 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表