打印
[应用相关]

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

[复制链接]
楼主: axiom
手机看帖
扫描二维码
随时随地手机跟帖
41
symbol6412| | 2010-10-14 11:34 | 只看该作者 回帖奖励 |倒序浏览
Idle line interruption  这个怎么用,我没试验出这个中断能被触发。

使用特权

评论回复
42
gooout| | 2010-10-14 12:07 | 只看该作者
记号

使用特权

评论回复
43
devenkong| | 2010-10-18 23:30 | 只看该作者
TimerOut功能肯定是存在的方便。对于USART_IT_IDLE: Idle line detection interrupt,倒是值得研究研究。我也是用到SPI的时候搜索到这个帖子的,以前串口也搜到过一次。。。

使用特权

评论回复
44
devenkong| | 2010-10-18 23:53 | 只看该作者
本帖最后由 devenkong 于 2010-10-18 23:56 编辑

无论是串口还是SPI口,作为通信接口有多种处理方式,没有说timeout和定长接收或者中断中处理一定是哪种好,也分场合,小结了一下有这么几种做法:
1.轮询,收到一个字节处理一个字节,每个字节的处理可以用一个状态机。这种处理方法适合于低速、ram较小的通信场合。
2.中断,在中断中直接处理每个字节的内容。这种方法适合于低速、ram较少的通信场合。
3.中断,数据存入软件的fifo队列,应用层通过读取软件的fifo来实现串口操作。这种方法适合于低速,ram足够的场合,且每帧具有固定的帧长度,或帧长度可以从固定长度的帧头获取。
4.DMA,每次接收定长数据。适合于高速通信,ram足够的场合,且每帧具有固定的帧长度,或帧长度可以从固定长度的帧头获取。(需要注意的是当帧由于某种原因一直没有接收满时,程序是否会死等在那里。说白了还是需要一个超时功能来保证程序的可靠性)
5.第一个字用中断,开启DMA接收剩余数据,并开启定时器。(这么做第一个字节之后可能会丢失一部分数据)。这种方法适合用在有前导字节的通信帧中,且需要整帧接收处理的情况下,适合处理传输速度较快的通信,占用cpu较少。
6.DMA+接收结束判断。这接收结束判断可以是字节的timeout,也可以是USART_IT_IDLE线路空闲的标志等。这种方式对于需要整帧接收,且通信速度较快或需要占用cpu较少的情况。
7.硬件fifo+接收结束判断。每次fifo到达阀值在终端中取一次数据,当超时时标示收完一帧。用于需要整帧接收,且通信速度较快或需要占用cpu较少的情况。

这里罗列了一些我能想到的用法。主要分3种用途:1.字节处理;2.规定长度的帧处理;3.不规定长度整帧处理。
如果你的通信协议能得到一帧数据长度的,为什么非得强求fifo或dma的TimeOut的方式呢?如果你本身就只有那么点内存资源的,为什么不用字节处理要用其它方式呢?当然,无论如何,为了程序健壮性,设置一个超时还是必要的。没有其他办法就用定时器做。

个人的一点想法,有什么需要补充说明的,把自己对通信接口使用的心得贴出来,最后整理一下。

使用特权

评论回复
评论
hugo0chen 2016-4-23 12:27 回复TA
总结到位 
45
cahwlx1982| | 2010-10-19 09:39 | 只看该作者
非常赞同49楼的说法:
是否采用DMA,还是FIFO,还是采用单个字节的传输,都是需要看实际应用情况而定。另外为了程序的健壮,在很多地方本身就需要自己添加一些必要的TIMEOUT进去。呵呵……,怎么说呢,很多东西是仁者见仁智者见智,才使用时还是需要根据所选的单片机来定,而没必要比较哪个好哪个好,只能说各有各的使用场所吧。

使用特权

评论回复
46
CECOYZY| | 2010-10-23 23:19 | 只看该作者
以前的ARM7,其他公司的CORTEX都有超时的功能!!!
但我的做法是:启用DMA接收数据,把接收缓冲区设置的大一些,然后定时(比如1ms,据波特率而定)中断监测已经接收到的数据的字节数(通过检测缓冲区还可以接收的数据数量),如果两次的数量相等并且不为0就证明接收已经超时了,这样每个USART需要一个定时器。
请大侠佐证探讨!!!
我的电话13882127010

使用特权

评论回复
47
mxh0506| | 2010-11-28 00:06 | 只看该作者
用DMA的目的就是减轻CPU的负担,如果还要开个定时中断来定期检查接收进度,就不如直接响应接收中断逐字节地处理了。
如果用通用定时器检查字节间超时,硬件上是不是应该提供每收到一个字节自动复位相应定时器的手段?就像DMA的计数需要受到这类控制一样?
赞同43L

使用特权

评论回复
48
heuyck| | 2011-1-19 09:59 | 只看该作者
本帖最后由 heuyck 于 2011-1-19 10:10 编辑

简直有点强词夺理。比如协议中有起始字符和结尾字符的包,没有总长度且总长度不确定,超时根本没法用DMA+定时器来做。一个包有可能几个字节,也有可能上千个字节,你的TIMEOUT要设置成多少呢?

FIFO的TIMEOUT是基于收到字符后的超时,你用DMA用另外定时器是基于整个DMA接收过程的超时。两者不是一个基础的。
FIFO的TIMEOUT可以做到很精确,一般是4.5个字符的超时,所以精确到能分辨出只间隔5个字符时间的两个包。
用DMA用定时器只能分辨DMA最大长度包的间隔,比如你的包最大可能有1000字节,那么只能分辨出上千个字符时间间隔的两个包。。。。发送间隔少一点的2个包,都被DMA和定时器判断为同一个包传输到一个内存区里。

当然你说应用层也可以做TIMEOUT,也可以把两个包分辨开来,不过能用MCU做的为什么不用呢?
为什么人家MCU提供可用TIMEOUT,你却不提供还说可以用户可以自己用定时器来做。
5个串口要5个定时器,你又没凭空比别人多5个定时器。

说起应用驱动分离的就是站着说话不腰疼的,做得象LINUX那样很好,不过就象楼上有人提到的“何不食肉糜”。

使用特权

评论回复
49
yddoo| | 2011-1-27 22:31 | 只看该作者
我知道了,有人或许根本没有明白 这里说的TIMEOUT功能的具体行为是什么。 应该解释一下。或者把ATMEL的ARM手册里的原话贴到这里,不然 有人根本就是在自以为是的胡说八道。

使用特权

评论回复
50
陈永宾0| | 2011-4-23 09:17 | 只看该作者
MARK

使用特权

评论回复
51
xiepengchenghn| | 2011-7-7 20:34 | 只看该作者
mark

使用特权

评论回复
52
zhonggx| | 2012-2-19 23:10 | 只看该作者
首先有一点,没有超时是真的不方便,说什么的理由的都是费话。不过用STM32的一般都跑RTOS吧,比如uCOS。祼奔就只能用定时中断了。我建议用以下方法。1、确定你能一个你能实现的超时(轮询)时间,如10MS。
2、结合你的波特率,确定一个能接收你两倍超时时间的接收BUF,如19200下,20MS大概最多传35字节。
3、把你的DMA设成循环模式,再设一个读指针,初始化时为BUF的起始地址。
4、用OS或定时中断,每10MS去收数据,如果DMX当前指针和读指针不一样,就开始收数据就成了。这时用法和FIFO用法一样,程序基本和FIFO时一样,只不过FIFO中断变成超时中断了。而且这个FIFO可以很大,用这种方法DMA可以说在大部分时候比FIFO要好用。

使用特权

评论回复
53
haixiang811| | 2012-2-20 09:45 | 只看该作者
可以查看接收到空闲帧的标志来判断接收完一帧数据,这个方法尝试过,可行

使用特权

评论回复
54
inurl| | 2013-2-20 20:22 | 只看该作者
本帖最后由 inurl 于 2013-2-21 09:07 编辑

  挖个坟 ,可惜后人以及提出了很好的解决方法了。
  楼主被这些版主的固执己见给耽误了!
http://www.amobbs.com/thread-5486343-1-1.html《STM32 UART DMA实现未知数据长度接收》UPUP



使用特权

评论回复
55
inurl| | 2013-2-21 09:08 | 只看该作者
UP!

使用特权

评论回复
56
henryzheng| | 2013-2-21 10:05 | 只看该作者
这么久了,  还没沉。

使用特权

评论回复
57
tycho41| | 2013-4-15 17:37 | 只看该作者
MARK,学习了

使用特权

评论回复
58
cout| | 2013-8-26 16:42 | 只看该作者
inurl 发表于 2013-2-20 20:22
挖个坟 ,可惜后人以及提出了很好的解决方法了。
  楼主被这些版主的固执己见给耽误了!!
...

其实楼主说的是SPI。
对于usart,可以通过idle方式来判断结束,遗憾的是,这种方法不适合spi通信。
对于stm32作为从机,通过spi通信,接收未知长度的数据时,很不给力。
为了避免一次一次的中断,可以更改一下电路,将clk引脚接到定时器的一个输入端。

使用特权

评论回复
59
trumpxp| | 2013-8-26 19:29 | 只看该作者
还是香主比较给力   讲的很透彻   谢谢了  

使用特权

评论回复
60
trumpxp| | 2013-8-26 19:29 | 只看该作者
另外   绝对是学习帖子   需要好好消化消化   顶一个   很不错哦

使用特权

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

本版积分规则