12000|5

56

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32的dma能不能实现fifo?i2c甚至spi没fifo浪费时间了啊. [复制链接]

dma有半当中和到底两个中断,按说cpu一次可以处理一半数据,但没硬件指针,不到一半的数据是不是就无法处理呢?可以跟踪dma指针么?
要是数据溢出是不是也不知道呢?
此帖出自stm32/stm8论坛

最新回复

                                     详情 回复 发表于 2008-1-5 21:41
点赞 关注
 

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

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。
此帖出自stm32/stm8论坛
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

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

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 

可以使用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的初始大小。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 

用dma不方便

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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 

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

                                  
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表