|
最近闲来无事,玩起了之前自己打的一块f407开发板,做一些VGA分辨率下的模式识别." N* A5 g# P% S6 p$ X 我的板上外扩有2兆的SRAM,之前一直用QVGA作图像源,算法能跑到15帧,还算不错.( r+ I& I$ Z3 i# J6 d/ O0 Q# y 我的方式是dcmi数据DMA到外扩SRAM,SRAM中处理,结果拷贝到LCD.改到VGA分辨率后问题来了. 图像错乱,但局部图像可以看出摄像头正确的输出 ,整个画面像一张位置错乱的拼图。8 B! Z# [/ h7 e2 k: X, N 据此排除了摄像头输出格式的问题,那么很有可能是显示遮盖造成的。到底是什么原因呢?+ u, W u3 \( @4 o! i* z 几经排查,发现当我修改DMA的buffer size 时,画面会呈现截然不同的组合,难道是DMA的问题? 查阅资料才发现,自己之前对于buffer size的认识是错误的。在地址自增模式下,buffer size实际决定了一次传输中操作内存区块的大小。! E5 U) g. w4 t, C+ \ 但是问题又来了,我一帧图像需要传输307200*16bit的数据,而buffer size最大为65535,实际映射的内存为65536*4byte,不够我一帧存储的!" H: D- ]$ D3 F 于是想到了DMA传输完成中断,中断中改目标地址,这样就可以一段一段地传输整帧图像了。 但是这种方式并不完美,DMA完成中断时如果处理不当很容易造成图像停顿,运动情况下会导致撕裂。$ S3 }; D2 T" N# ?# Q# G0 Q 有没有更好的方案呢?+ _# u! y$ y- ]6 U6 @+ @; R% v 这时候我注意到f407新增的double buffer模式,一般这种模式用来很方便的实现乒乓传输。 但粗略一算,即便是double buffer也刚好不够我传输一帧图像,还差一点。怎么办呢?* B. Q+ p* Z5 n/ [* r8 _ 这时候我又想到了中断......+ q6 B, _( v- b/ y9 G 于是故事的结局相信大家也都猜到了8 E9 m( G- v0 g double buffer模式, DMA开传输完成中断,中断中检测当前访问区块,然后更改另一区块内存基址.3 j# N* l8 a* a8 r 由于double buffer模式是不需要关闭DMA就可以重新配置非active区块的,所以整个过程无停顿!5 Z9 q8 l, ]7 H 完美解决!特此记录! |
微信公众号
手机版
回复:【MCU实战经验】 stm32f4 DMA任意长度buffer无停顿传输
回复:【MCU实战经验】 stm32f4 DMA任意长度buffer无停顿传输
楼主是怎么解决的?
RE:【MCU实战经验】 stm32f4 DMA任意长度buffer无停顿传输