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

查看: 2507|回复: 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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版