你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2513|回复: 8

STM32 想说爱你不容易。。。

[复制链接]

5

主题

34

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2012-5-21 23:05:33 | 显示全部楼层 |阅读模式
 
STM32 是一个性价比很高的处理器,学习一段时间,终于开始做项目,但是串口的问题对于第一次接触它的人来说,真让人头痛。我的项目需要从PC获得大的数据流,而且数量不确定,检测到特定结束字符时终止。几天来,用中断接收,没有一次是成功的,总是会丢失数据!通过几天的时间摸索,发现STM32的串口不同于AVR。只有一个缓冲器位于总线和移位寄存器这间,在传输大文件流的时候,靠中断接收很容易丢失数据。硬件RTS控制也有问题!
 
333副本.jpg

 

上传的手册图中可以看到,RTS在接收到停止位并RXNE置位后被拉高,通知PC端暂停发送。但是PC接到这个信号以及处理这个信号都需要时间,在响应这个信号这前,PC串口的移位寄存器一直在工作的,所以上图中的“空闲”时间,实际上是没有的,后面直接就是下个数据的起始位,从而RTS又被拉低,被允许接收数据了。这样一来,RTS就没有用了,形同虚设。我实际测试中,用硬件流控去接收数据流,稍有延迟就会丢失数据。我觉得,应该设计成这样:当检测到有效起始位的时候就将RTS拉高,而当数据被读走的时候(RXNE清空),RTS再拉低,允许接收数据,就比较合理了。因为在接收的过程中,RTS信号有足够的时间传到PC并被响应。也许我的测试程序有问题,大家自己可以试试大的文件流,用中断方式接收,在中断里USART_ReceiveData后稍稍延时(模拟用于处理数据的时间),再将数据由这个或别的串口发送到PC端,再比较两者的数据就可以发现数据丢失了,延时越久丢的数据越多。

      解决的办法,想出来一个,但是还没有测试。我想把原RTS脚设置成普通的IO口,用于模拟RTS功能。USART中断不用,改为DMA中断处理数据。设立接收缓冲区大小为100字节,用于存放DMA接收的到数据。DMA传输的数据的大小设为160个字节。打开DMA接收一半时的中断响应,不用DMA全部接收的中断响应。为什么这样呢,因为当DMA接收完成后会自动关闭DMA通道,这样还是回到以前的老问题,关闭通道后,数据依然在传输!如果来不及接收,就会丢失。所以在DMA传输一半的时候响应中断,进入中断后先拉高RTS信号,通知PC不要传了,然后循环检查RXNE,不断接收数据,直到RXNE为零后退出中断(这里应该加个数限制,一般几个左右,排除RTS传输线路故障,造成的不断接收数据不退出的情况),一组数据接收完成了!设定接收160个数据,在接收到80个的位置中断了,并暂停传输,加上我们处理的时间,所以预留了20个空间,应该够用了,如果不够就设160个得了。不知道是否成功,明天测试。。。
<
回复

使用道具 举报

21

主题

30

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2012-5-22 07:50:57 | 显示全部楼层

RE:STM32 想说爱你不容易。。。

感谢楼主分享经验,等待楼主的“测试报告”
回复 支持 反对

使用道具 举报

5

主题

34

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2012-5-22 08:25:27 | 显示全部楼层

RE:STM32 想说爱你不容易。。。

希望有同感的都到这里来,分享一下你们的解决办法!写测试程序之前,我又发现一个问题:如果最后一批数据达不到缓冲数量的一半,即无法产生DMA接收一半的中断,导致不能检测到终止字符,无法断判断整个数据流是否传输结束。,到底怎么办才好啊,项目时紧啊,欲哭无泪。。。
回复 支持 反对

使用道具 举报

25

主题

446

回帖

0

蝴蝶豆

中级会员

最后登录
2019-12-10
发表于 2012-5-22 09:30:24 | 显示全部楼层

回复:STM32 想说爱你不容易。。。

要不你搞成单片机接收处理好了数据再发送一个指令要 PC机发送下一个数据吧,这样可靠性高,只是传输速度就慢了
回复 支持 反对

使用道具 举报

5

主题

34

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2012-5-22 09:38:52 | 显示全部楼层

RE:STM32 想说爱你不容易。。。

本来是升级原来的单片机,你这方法是项目不允许的
回复 支持 反对

使用道具 举报

89

主题

485

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2012-5-22 10:41:43 | 显示全部楼层

回复:STM32 想说爱你不容易。。。

james 加油,喜欢你标题中的精神!~顶!
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-5-22 16:15:00 | 显示全部楼层

RE:STM32 想说爱你不容易。。。

这个还是要程序处理的,即便试用DMA,如果数据量大的话也会发生这样的情况。另外,你也要注意一下,数据处理的时候,在转移数据的时候做好处理。可以试用队列的方式来存放数据,新数据在进入以后,如果发现缓冲区满了,就把前面的数据删除掉,用来保存你新的数据。建议参考队列方式。
回复 支持 反对

使用道具 举报

5

主题

34

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2012-5-23 20:07:40 | 显示全部楼层

RE:STM32 想说爱你不容易。。。

现在问题得到解决了,我把RTS脚,用软件模拟了。DMA传输,缓冲用了队列方式,谢谢楼上的管理员 安 以及帮助我的朋友们,以后多交流。
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-5-12 17:34:51 | 显示全部楼层

RE:STM32 想说爱你不容易。。。

楼主,能把你改进的给我发一份学习一下吗?泪求了,qq:785653421
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版