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

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

[复制链接]
xxn599 发布时间:2014-4-23 00:04
最近闲来无事,玩起了之前自己打的一块f407开发板,做一些VGA分辨率下的模式识别.
( y: W) |' O- I% h( M% u) f3 t" b我的板上外扩有2兆的SRAM,之前一直用QVGA作图像源,算法能跑到15帧,还算不错.
- Z& m9 ~4 w3 c1 D3 v; W# u6 X我的方式是dcmi数据DMA到外扩SRAM,SRAM中处理,结果拷贝到LCD.改到VGA分辨率后问题来了.! \$ |% m+ S. M0 q: z) \
 
7 T5 E5 `% ]8 [5 g! I图像错乱,但局部图像可以看出摄像头正确的输出 ,整个画面像一张位置错乱的拼图。
8 N  ~( f) X# W据此排除了摄像头输出格式的问题,那么很有可能是显示遮盖造成的。到底是什么原因呢?4 ?& y0 L4 U' ?
几经排查,发现当我修改DMA的buffer size 时,画面会呈现截然不同的组合,难道是DMA的问题?
4 r; z  i7 u7 |, _0 @查阅资料才发现,自己之前对于buffer size的认识是错误的。在地址自增模式下,buffer size实际决定了一次传输中操作内存区块的大小。% h1 |- i; b# U" O. G/ S
但是问题又来了,我一帧图像需要传输307200*16bit的数据,而buffer size最大为65535,实际映射的内存为65536*4byte,不够我一帧存储的!
. L. _0 y6 _* a于是想到了DMA传输完成中断,中断中改目标地址,这样就可以一段一段地传输整帧图像了。- I, w/ R, z4 ]( g$ _4 O
但是这种方式并不完美,DMA完成中断时如果处理不当很容易造成图像停顿,运动情况下会导致撕裂。0 \& |' b0 F. N3 P
有没有更好的方案呢?
$ i% z; u$ u% d( C" w: G* c7 w这时候我注意到f407新增的double buffer模式,一般这种模式用来很方便的实现乒乓传输。
( L8 X9 s3 T# c4 W但粗略一算,即便是double buffer也刚好不够我传输一帧图像,还差一点。怎么办呢?" o1 \. o8 t+ n/ U! p; o
这时候我又想到了中断......
2 N6 Q* `# E6 p' e于是故事的结局相信大家也都猜到了6 c6 F- N' M( \2 v# Y
double buffer模式, DMA开传输完成中断,中断中检测当前访问区块,然后更改另一区块内存基址., E% Z" I/ e2 J3 w1 G
由于double buffer模式是不需要关闭DMA就可以重新配置非active区块的,所以整个过程无停顿!
# d4 D5 e# {  `  A1 ^* B  u' W2 a完美解决!特此记录!
收藏 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模式吗?
* [& T3 Y8 z2 Z. f6 a7 r- i楼主是怎么解决的?
碧云天书 回答时间:2014-7-2 19:44:02

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

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

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版