打印

stm32的dma能不能实现fifo?i2c甚至spi没fifo浪费时间了啊.

[复制链接]
9100|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
s99060|  楼主 | 2007-12-21 02:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
dma有半当中和到底两个中断,按说cpu一次可以处理一半数据,但没硬件指针,不到一半的数据是不是就无法处理呢?可以跟踪dma指针么?
要是数据溢出是不是也不知道呢?
沙发
lut1lut| | 2007-12-21 13:57 | 只看该作者

stm32的dma用作fifo

stm32的spi、i2c没有fifo,可以用dma作为其fifo。

1。
“stm32的dma能不能实现fifo?i2c甚至spi没fifo浪费时间了啊.”

就拿spi来说,没有fifo,如果不用dma来发送和接收,每发一个数据之前要判断TXE,发送buffer为空才可以往spi->DR中写数据,判断RXNE,接收buffer不为空,才可以接收读取spi->DR,这样的效率确实很低。因此采用dma来提高通信效率。

2。
“按说cpu一次可以处理一半数据,但没硬件指针,不到一半的数据是不是就无法处理呢?”

比如一次想从spi发送并接收10个数据,启动相应两个DMA channel以及对应DMA request,将dma的buffersize设置为10。firmware准备好待发的10个数据后,启动DMA。如果用transfer complete标志和中断,就在10个数据通信完毕触发中断,由firmware来处理接收到的数据。如果用half transfer标志和中断,则在发完5个数据或者接收完5个数据后,触发中断,firmware可以处理收到的5个数据。如果想收到4个或者3个数据就让cpu来处理,应该不行。

3。
“要是数据溢出是不是也不知道呢?”

哪里的数据溢出?没有fifo,有的是作为DMA接收和发送的buffer,其size是事先固定好的,同样事先指定好的发送和接收数据所在的memory。

使用特权

评论回复
板凳
s99060|  楼主 | 2007-12-21 16:24 | 只看该作者

主要是接收时,发的时候容易控制点儿

比如buffersize是10,包括half中断,这样每收到5个会有中断,dma循环着往这10个buffer里装,如果处理不够及时,应该就覆盖了未处理的数据,fifo管这叫溢出,是不是没法知道这种情况?

使用特权

评论回复
地板
lut1lut| | 2007-12-24 14:01 | 只看该作者

可以使用DMA的circular模式

可以使用DMA的circular模式。

比如接收512个数据。先开辟一个512大小的Buffer,使能HT和TC中断。当收到256个数据了,进入HT中断;由firmware来处理buffer[0]到buffer[255]。与此同时,DMA在继续并行地填充buffer[256]到buffer[511]。当TC中断到来,由firmware处理后256个数据。同时由于使用了DMA的circular模式,后续来的数据又会继续存在buffer[0]开始的位置。

只要处理256个数据的时间比DMA传输256个数据的时间短,就不会出现溢出。所以根据实际情况,调整buffer的初始大小。

使用特权

评论回复
5
rogetxu| | 2007-12-24 20:40 | 只看该作者

用dma不方便

在UART里,用DMA来当fifo很不方便的。发送问题不大,因为长度可控。
在接受就太勉强了。在很多时候长度是不定的。特别在Command Line Interface处理时,需要判断特征吗时,感觉很别扭的。
在有fifo时,recvice中断只管收数据送到buffer中,再发message通知TASK即可。
DMA还是比较适合用于已知长度的数据块的传输。
ST的UART DMA demo program 正在看,看看是否有好的方法。

使用特权

评论回复
6
hotpower| | 2008-1-5 21:41 | 只看该作者

关注此主题:"stm32的dma用作fifo"

使用特权

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

本版积分规则

40

主题

224

帖子

0

粉丝