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

【MCU实战经验】 stm32f4 DMA任意长度buffer无停顿传输

[复制链接]
xxn599 发布时间:2014-4-23 00:04
最近闲来无事,玩起了之前自己打的一块f407开发板,做一些VGA分辨率下的模式识别.
我的板上外扩有2兆的SRAM,之前一直用QVGA作图像源,算法能跑到15帧,还算不错.
我的方式是dcmi数据DMA到外扩SRAM,SRAM中处理,结果拷贝到LCD.改到VGA分辨率后问题来了.
 
图像错乱,但局部图像可以看出摄像头正确的输出 ,整个画面像一张位置错乱的拼图。
据此排除了摄像头输出格式的问题,那么很有可能是显示遮盖造成的。到底是什么原因呢?
几经排查,发现当我修改DMA的buffer size 时,画面会呈现截然不同的组合,难道是DMA的问题?
查阅资料才发现,自己之前对于buffer size的认识是错误的。在地址自增模式下,buffer size实际决定了一次传输中操作内存区块的大小。
但是问题又来了,我一帧图像需要传输307200*16bit的数据,而buffer size最大为65535,实际映射的内存为65536*4byte,不够我一帧存储的!
于是想到了DMA传输完成中断,中断中改目标地址,这样就可以一段一段地传输整帧图像了。
但是这种方式并不完美,DMA完成中断时如果处理不当很容易造成图像停顿,运动情况下会导致撕裂。
有没有更好的方案呢?
这时候我注意到f407新增的double buffer模式,一般这种模式用来很方便的实现乒乓传输。
但粗略一算,即便是double buffer也刚好不够我传输一帧图像,还差一点。怎么办呢?
这时候我又想到了中断......
于是故事的结局相信大家也都猜到了
double buffer模式, DMA开传输完成中断,中断中检测当前访问区块,然后更改另一区块内存基址.
由于double buffer模式是不需要关闭DMA就可以重新配置非active区块的,所以整个过程无停顿!
完美解决!特此记录!
收藏 4 评论4 发布时间:2014-4-23 00:04

举报

4个回答
kccec 回答时间:2014-4-23 10:41:26

回复:【MCU实战经验】 stm32f4 DMA任意长度buffer无停顿传输

多谢分享,正有这方面的困惑。我也来试试看效果
kccec 回答时间:2014-4-23 12:03:09

回复:【MCU实战经验】 stm32f4 DMA任意长度buffer无停顿传输

你好,我看说明是在双缓存的情况下是不能用M2M模式的。但是要将SRAM的数据送往TFT不正是要用M2M模式吗?
楼主是怎么解决的?
碧云天书-1476595 回答时间:2014-7-2 19:44:02

RE:【MCU实战经验】 stm32f4 DMA任意长度buffer无停顿传输

好主意!马上去试试双缓存。
zyh991261 回答时间:2020-9-7 15:11:30
楼主你好,请问,如果发送的不是固定长度,假如需要发送50001,每次发送1000,最后一次怎么办?

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版