2019-07-20 21:02发布
HenryYam 发表于 2016-7-11 22:10 我是用DMA+DCMI来读取OV2640的图像数据到内存,然后处理一下再送LCD显示。 这样是不是需要在内存中开辟 ...
HenryYam 发表于 2016-7-12 12:29 谢谢回复! 我想存一幅 640*480大小的RGB565图片,处理后再送LCD显示。所以需要600KB大小的缓存。外部 ...
最多设置5个标签!
这样是不是需要在内存中开辟一帧数据的空间作缓存?DMA支持这么大的缓存吗?
当然要在内存中开辟空间做缓存,比如定义一个数组。具体大小要看你要用多少和内存的大小(受内存大小限制)。
如果是内部SRAM,F407是192k,去了程序用到,你试试你用来做缓存的有多大,我试过220*280*2=120K
如果是外部SRAM,探索者是1M。但应该注意以下几点(原子哥原话)
1,设置存储器地址自增。
2,传输长度为1(参考我们摄像头例程)。
3,注意在每一帧传输完成后,重新设置存储器首地址。
4,注意降低OV2640的输出速率,否则SRAM存储不过来。
1、如果传输长度为1,是不是每次只传一个像素就完了?
这里的“传输长度”是指每次的搬运数据量,直至把一帧的所有数据搬运完毕才停止。
2、如何在帧中断内重设存储器首地址?请详述为盼。
把修改DMA的地址寄存器的代码加到帧中断内,如你定义的数组为:buf_CAM,则
DMA2_Stream1->M0AR = (u32)&buf_CAM;//(寄存器版本)
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&buf_CAM;//(库函数版本)
3、OV2640的输出速率可设置?如何设置?
通过对OV2640的0xD3寄存器(DSP设置区)、0x11寄存器(Sensor设置区)设置,对时钟进行降频,从而改变了OV2640的输出速率(VSYNC周期)。
本人没有进行相关测试,这有原子的代码,供你参考调试。
//OV2640速度控制
//根据LCD分辨率的不同,设置不同的参数
void ov2640_speed_ctrl(void)
{
u8 clkdiv,pclkdiv; //时钟分频系数和PCLK分频系数
if(lcddev.width==240) //2.8寸LCD
{
clkdiv=1;
pclkdiv=28;
}else if(lcddev.width==320) //3.5寸LCD
{
clkdiv=3;
pclkdiv=15;
}else //4.3/7寸LCD
{
clkdiv=15;
pclkdiv=4;
}
SCCB_WR_Reg(0XFF,0X00);
SCCB_WR_Reg(0XD3,pclkdiv); //设置PCLK分频
SCCB_WR_Reg(0XFF,0X01);
SCCB_WR_Reg(0X11,clkdiv); //设置CLK分频
}
一周热门 更多>