搜索
查看: 14923|回复: 4

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

[复制链接]

该用户从未签到

1

主题

3

帖子

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-4-23 00:04:34 | 显示全部楼层 |阅读模式
最近闲来无事,玩起了之前自己打的一块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区块的,所以整个过程无停顿!
完美解决!特此记录!
回复

使用道具 举报

该用户从未签到

0

主题

3

帖子

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-4-23 10:41:26 | 显示全部楼层

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

多谢分享,正有这方面的困惑。我也来试试看效果
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

0

主题

3

帖子

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-4-23 12:03:09 | 显示全部楼层

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

你好,我看说明是在双缓存的情况下是不能用M2M模式的。但是要将SRAM的数据送往TFT不正是要用M2M模式吗?
楼主是怎么解决的?
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

15

帖子

0

蝴蝶豆

初级会员

最后登录
2018-5-16
发表于 2014-7-2 19:44:02 | 显示全部楼层

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

好主意!马上去试试双缓存。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

蝴蝶豆

新手上路

最后登录
2020-10-8
发表于 2020-9-7 15:11:30 | 显示全部楼层
楼主你好,请问,如果发送的不是固定长度,假如需要发送50001,每次发送1000,最后一次怎么办?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 05:56 , Processed in 1.208084 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表