打印
[应用相关]

STM32 USART RX使用DMA接收的话,如何判断接收完一帧数据呢

[复制链接]
43679|71
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
axiom|  楼主 | 2008-9-8 12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的USART1使用DMA方式接收数据,该如何判断是否接收完一帧数据呢,这个芯片没有看到有timeout中断
沙发
香水城| | 2008-9-8 12:17 | 只看该作者

这个问题以前讨论过,请查查旧帖

使用特权

评论回复
板凳
axiom|  楼主 | 2008-9-8 14:05 | 只看该作者

在旧贴中找到

1)通过上层协议对话确定数据包的长度。
2)通常数据长度都是在数据包的开始,你可以用中断或DMA先把数据包的长度字段接收下来,再配置DMA传送长度传送剩下的数据。
是不是这两段,没有timeout没办法了,只能这样搞

使用特权

评论回复
地板
香水城| | 2008-9-8 14:41 | 只看该作者

是的,这是保证高效正确地传输数据的有效方法

使用特权

评论回复
5
axiom|  楼主 | 2008-9-8 14:53 | 只看该作者

这样搞,很不爽

使用特权

评论回复
6
香水城| | 2008-9-8 15:17 | 只看该作者

是的,改变旧的不好的习惯确实不是一件容易的事情

但长痛不如短痛。

使用特权

评论回复
7
kl818bc| | 2008-9-8 23:04 | 只看该作者

香版太不厚道

明明是STM32功能上的缺陷,硬要说成是"旧的不好的习惯"

那么所有用16C550 TIMEOUT 功能的产品都是无法 "保证高效正确地传输数据" 的产品?

带FIFO的16C550出来了十几年,已经是串口的工业标准了,STM32没作到的功能,就算是"旧的不好的习惯"??

如果香版真的有作过通信产品,再来评论TIMEOUT这个功能也不迟

使用特权

评论回复
8
香水城| | 2008-9-9 09:37 | 只看该作者

我没有说UART带FIFO的功能不好,也没有说带TIMEOUT的功能不好

我是说传输不定长的数据包,需要依靠超时来保证正确地识别接收数据包,这样的习惯不好。

如果你看过以前的讨论,看过我以前的发言,就明白我的意思了。

使用特权

评论回复
9
农民讲习所| | 2008-9-9 09:42 | 只看该作者

香水城是对的

串口都是必定和一个队列连接的,标准的驱动程序设计。这样,用中断还是DMA,有什么关系吗?
怎么检测队列中的数据,不是驱动程序干的事情。

使用特权

评论回复
10
djyos| | 2008-9-9 09:43 | 只看该作者

香版主说得不对

timeout不是习惯问题,而是软件鲁棒性的问题。
假设由于干扰,你接收了错误的包长度,怎么办?
假设由于通信对方错误,发了一半就不发了,难道你等到地老天荒?
假设由于线路错误,传丢了一个字节,也一直等?
所以,包长度和timeout应该是同时使用的。

使用特权

评论回复
11
computer00| | 2008-9-9 09:59 | 只看该作者

串口应该按字节来接收啊,至于数据包的timeout,由应用程序

使用特权

评论回复
12
香水城| | 2008-9-9 10:03 | 只看该作者

哈哈,如果说到软件鲁棒性的问题,STM32中有大量的定时器可

不一定非要把Timeout绑到UART模块上。

如果按照10楼的说法,所有的通信端口(I2C、SPI、USB、以太网)模块岂不都要捆绑Timeout功能。

使用特权

评论回复
13
农民讲习所| | 2008-9-9 10:09 | 只看该作者

TIMEOUT主要体现在FIFO中

无FIFO和DMA,TIMEOUT就没意义了

使用特权

评论回复
14
djyos| | 2008-9-9 10:36 | 只看该作者

把问题放大一点说

    timeout功能并不是串行通信专用,这是一种高可靠性软件设计习惯的问题。比如你申请一块内存,申请不到则阻塞,良好的习惯会顺手设定一个阻塞timeout时间,时间到以后,无论内存是否成功申请到,均退出阻塞状态。串口接收也一样,你需要接收一个20字节的数据包,你就把DMA配置成收到20字节就引发中断,而接收程序则被阻塞,CPU干别的事去了,良好的习惯会设定一个timeout,如果超时收不到20字节,则要做一些善后工作了。从这点说,timeout是系统设计的问题,与具体硬件并无关系,只要系统设计工程师要求,软硬件工程师就必须予以实现,即使硬件不支持,也要通过软件实现,不知所长为何要把timeout与fifo联系在一起。
    至于timeout功能在哪里实现,是由应用程序查询呢?还是由DMA模块实现?还是用专用定时器实现?还是绑定在uart模块中?则要根据实际的硬件和软件来决定。我个人感觉是timeout绑定在uart上最方便,楼主感觉不爽是有道理的,不是什么不良习惯。
    如果哪个CPU在I2C、SPI、USB、以太网这些模块中绑定timeout功能,这肯定是一个实用的功能。

使用特权

评论回复
15
香水城| | 2008-9-9 11:04 | 只看该作者

好!15楼说的很好

我非常赞同djyos的分析,非阻塞的程序设计是一个良好的习惯。

关于Timeout功能是否与硬件通讯模块绑定,这的确是一个芯片设计的问题,我也曾经提出过这个问题,也向设计工程师提出过,但我相信他们也考虑过这个问题。


从硬件设计的角度可以有这样的考虑:与其说把Timeout的功能绑定到各个硬件通讯模块上,不如单独把所有这些功能所占用的芯片面积集中起来,多做2个通用定时器;要知道,STM32上有多达5个UART,如果每一个都要绑定Timeout计时器,先不说能有多少精度,它们肯定占用不少芯片面积,如果一个应用中没有使用或较少使用UART,这部分功能就不能很好地被利用起来;现在我们单独把定时功能抽出来,由用户在需要的时候自由组合,提供灵活的空间,也不失为一个好的设计。

这样的设计可以比喻为软件上的通用子程序调用,而把Timeout的功能绑定到UART上相当于软件上函数的inline调用。通用子程序调用节省了代码空间,但执行速度和使用的方便程度比函数的inline调用方式略低,但一旦完成了这样的设计,下次使用只是简单地调用现成函数的问题了。

开始构造一个函数时可能麻烦些,但构造好函数后,用起来就很爽了。

使用特权

评论回复
16
axiom|  楼主 | 2008-9-9 11:39 | 只看该作者

呵呵,兜个圈圈用定时器做timeout,肯定没有UART里面的timeout爽

使用特权

评论回复
17
zyok| | 2008-9-9 11:45 | 只看该作者

有timeout,做Modbus_RTU协议就很方便了,没有就用定时器得了..

使用特权

评论回复
18
农民讲习所| | 2008-9-9 11:48 | 只看该作者

15楼:没分清此TimeOut和彼TimeOut

FIFO的TimeOut,是防止接收数据没达到FIFO的阀值,又有接收数据需要处理的情况下的一种解决方法。大家都知道,使用FIFO可以大幅度提高接收效率,FIFO的阀值要能接受范围内越高越好,但实际应用场合,比如单字节命令,只接收一个字节并需要处理时,FIFO阀值是总不触发的,这时候Timeout就可以起辅助作用。

15楼的彼TimeOut,是上层处理的TimeOut,比如TCP/IP的TimeOut。这是由其它方式产生的,比如查询、定时,队列阀值触发。

这是两个层次的问题,不能混为一谈。

使用特权

评论回复
评论
waitmoney 2013-11-18 08:12 回复TA
ding 
19
kl818bc| | 2008-9-9 17:52 | 只看该作者

21楼错了

timeout是字节和下一个字节间的超时

timeout对于FIFO和DMA是同样的观念,差别在于FIFO是固定可选的几个值的,DMA的长度则是可变的

但是有timeout可以增加系统的鲁棒性,并不是有了DMA就不用timeout

使用特权

评论回复
20
农民讲习所| | 2008-9-9 23:15 | 只看该作者

怎么可能DMA有Timeout特性?

俺从来没见过。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

18

帖子

0

粉丝