DSP

摄像头和SD卡(一)

2019-07-13 20:24发布

摄像头+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