摄像头+SD卡综述:
《STM32F407开发指南-寄存器版本》:
OV7640的寄存器通过SCCB时序访问并设置,SCCB时序和IIC时序十分类似。
OV7670的传感器串口设置、图像尺寸设置、图像窗口设置和图像输出大小设置,这几个设置于我们的正常使用密切相关,有必要了解一下。除了****传感器窗口设置****是直接针对传感器阵列的设置,其他都是DSP部分的设置。
对于RGB和jpeg两种输出模式,前一种模式显示到LCD液晶上,所有要初始化DCMI.
后一种是利用串口显示到电脑软件上,所以要初始化
摄像头的数据传输与DCMI/DMA的关系:
1.DCMI 的 8 位数据宽度,通过设置 DCMI_CR 中的 EDM[1:0]=00 设置。
2.每次需要 4 个像素时钟来捕获一个 32 位数据。捕获的第一个数据存放在 32 位字的 LSB 位置,第 四个数据存放在 32 位字的 MSB 位置。
3.STM32F407的DCMI接口,接收的数据是低字节在前,高字节在后的,所以,要求摄像头输出的数据也是低字节在前,高字节在后。
4.DCMI支持DMA传输,当DCMI_CR寄存器中的CAPTURE位置1时,激活DMA接口。
总结:摄像头输出过来每4个像素时钟来捕获一个32为字到DCMI->DR寄存器中。
这些数据被放到32位数据寄存器(DCMI_DR)中,然后通过通用DMA进行传输。图像缓冲区由
DMA管理,而不是有摄像头管理。
*************
在DCMI_DMA_Init()传递的参数memaddr初始化LCD->RAM为存储器地址,DAM2_Stream1->PAR=(u32)&DCMI->DR
为外设地址,其中DMA2_Stream1->CR |= 0<<9指定了存储方向。
同时在DCMI_Start()中启动了DMA2_Stream1->CR |=1<<0部分,开始了DCMI->DR的接受。
*************
为什么DMCI->传输数据mem0addr或者mem1addr上时,会触发中断?
*************
当DCMI->NDTR至0时,会触发一个传输完成的中断标志。在DMA_SxCR[4] = DCIF中设置传输完成中断。
在DMA_LISR或者DMA_HISR中有传输完成中断标志。DMA_LIFCR或者DMA_HIFCR中传输完成中断标志。
所以在DCMI_DMA_Init()中有判断语句,在bmp和jpeg不同情况是否使用双缓冲形式:
if(mem1addr)//双缓冲的时候,才需要开启
{
DMA2_Stream1->CR|=1<<18;
//双缓冲模式
DMA2_Stream1->CR|=1<<4;
//开启传输完成中断
MY_NVIC_Init(0,0,DMA2_Stream1_IRQn,2);
//抢占1,子优先级3,组2
}
*************
为什么DCMI_Start后,当每一frame的数据完成怎么知道的?
*************
在DCMI->DISR和DCMI->IER中的FRAME_MIS、FRAME_IE位设置了当接受到每frame的数据后,产生一个中断请求,而我们的DCIM_IRQHandler中断函数中将对接受到frame(帧)的情况进行处理,同时在其中有个接受frame的变量ov_frame产生计数vo_frame++,在定时器TIMER3达到1秒时,打印出全局变量ov_frame的1秒接收帧计数值(rgb时为15,jpeg时为30),然后清零。
*************
SD卡部分:
f_open()函数的作用:如果函数成功,则创建一个文件对象。该文件对象被后续的读/写函数用来访问文件。如果想要关闭一个打开的文件对象,则使用f_close函数。如果不关闭修改后的文件,那么文件可能会崩溃。
BMP图片部分:
bmp图片主要有两个部分:BITMAPINFO hbmp和databuf。头部中结构体中有三个参数:bmiHeader、 bmfHeader和RGB_MASK。
对于第一个bmiHeader中有一个Bmp图片的重要参数:
biSizeImage(数据区大小)=biHeight*biWidth*biBitCount/8;
biBitCount为16,表示bmp为16为 {MOD}bmp.
第二个bmfHeader中的两个bmp图片的重要参数:
biOffBits = bmpheadsize; //hbmp头造成的偏移,后为数据区
bmpheadsize的值的大小为:sizeof(hbmp)。
bfsize = bmpheadsize + hbmp.bmiHeader.biSizeImage;
其整个bmp的大小就是:bmp头+databuf数据区。
FIL *f_bmp = (FIL *)pic_memalloc(FIL)
u8 *databuf=(u8 *)pic_memalloc(1024);
由于从DCMI->DR为32为的寄存器,每次读出的数位4字节。那么从DCMI->DR到LCD->RAM上,每次读取打LCD上是2个像素,每个像素16,即总4字节。就算设置的bmp的图片行不为4的倍数,也要
width=201 bi4width=404 bi4width/2=202=pixcnt(多余模式) biWidth=201
width=202 bi4width=408 bi4width/2=204=pixcnt(多余模式) biWidth=202
实验步骤:
视频+串口
视频+SD卡
视频+USB
视频+以太网
视频+网页
视频+linux