2019-07-20 13:49发布
DMA 接收来自 OV2640 的 JPEG 数据流,首先使用 M0AR(内存 1)来存储,当 M0AR 满了以后,自动切换到 M1AR(内存 2),同时程序读取 M0AR(内存 1)的数据到外部 SRAM;当 M1AR 满了以后,又切回 M0AR,同时程序读取 M1AR(内存 2)的数据到外部 SRAM;依次循环(此时的数据处理,是通过 DMA 传输完成中断实现的,在中断里面处理),直到帧中断,结束一帧数据的采集,读取剩余数据到外部 SRAM,完成一次 JPEG 数据的采集。 这里, M0AR, M1AR 所指向的内存,必须是内部内存,不过由于采用了双缓冲机制,我们就不必定义一个很大的数组,一次性接收所有 JPEG 数据了,而是可以分批次接收,数组可以定义的比较小。
zhangyuman 发表于 2016-6-3 14:45 为什么不直接存到外部sram里呢?
最多设置5个标签!
所以先用内部SRAM缓存一下
在内存有限的情况下,如果把几乎全部内存用于缓存JPEG数据,那其他任务就没法运行了。这个例子当中必须用到FATFS和SD卡,想必也要占用一些内存。所以采用双缓冲机制是个很好的办法。只要定义的缓冲大小合适,应该不会有影响。
你愿意的话也可以啊,原子只是给出一个示例而已。程序千变万化,只要搞懂原理了,自己可以任意调配资源,自由组合,不必拘泥。
如果是因为片外SRAM速度慢的原因,那么在DMA中断里把片内SRAM搬运到片外SRAM的过程同样快不了,还增加了CPU的开销
我想,是不是由于DMA的配置里最大传输数量只支持65535,导致不能传输过大的数据的原因呢。
视频讲解中确实提到是速度的原因,不知道原子哥的例程到底是出于什么考虑呢?
一周热门 更多>