1. 程式人生 > >攝像頭影象獲取、顯示

攝像頭影象獲取、顯示

1  攝像頭配置

       用i2c匯流排往攝像頭暫存器中寫暫存器;

      i2c匯流排為:一條時鐘線,一條資料線,遵循i2c協議來寫;

      攝像頭的sccb介面對應i2c介面;兩協議類似;

      其中涉及的主要內容是i2c協議讀寫資料的時序;開始訊號、終止訊號、裝置地址;

寫入訊號後可以再用i2c讀取訊號的內容,以確定的確寫入了;

      用示波器測量攝像頭的輸入時鐘(xclk)、輸出畫素時鐘(pclk)、行同步訊號(hs)、場同步訊號(vs)、輸出資料管腳;如果管腳和預期類似說明攝像頭已經開始工作了;

      gpio模仿i2c也很簡單,就是符合協議的控制電平跳變;

          

2 攝像頭資料讀取

微控制器的DCMI口對接攝像頭的輸出口;

攝像頭配置的輸出時序為數字攝像頭時序;

攝像頭介面也stm32的DCMI介面對接;

DCMI介面配置時要小心其讀取視訊資料的中斷函式是高電平有效還是低電平有效;

         DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;//DCMI_VSPolarity_High;
         DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;//DCMI_HSPolarity_Low;  

DCMI中的FIFO緩衝接收到的資料、重組資料;比如攝像頭口是8位的,而DCMI的資料暫存器是32位的,FIFO將接受到的八位的資料快取為32位的;而在液晶上顯示的是rgb565的是16位的,在DMA傳輸時一次傳輸16為,資料才不會亂;這種情況下DMA傳輸的源資料寬度為32、目的資料寬度為16位;

DCMI有幀中斷、行中斷;其中斷服務函式都指向DMA傳輸;

攝像頭的原始資料是RGB RAW格式,這個原始資料的排列格式是 RGRG/GBGB排列的,我們叫做 Bayer pattern(這個最最常見)。




3 DMA傳輸視訊資料到視訊記憶體

DMA是從DCMI的資料暫存器(0x50050028)搬移資料到視訊記憶體地址(液晶會自動顯示該地址的內容);

DCMI中的FIFO緩衝接收到的資料、重組資料;比如攝像頭口是8位的,而DCMI的資料暫存器是32位的,FIFO將接受到的八位的資料快取為32位的;而在液晶上顯示的是rgb565的是16位的,在DMA傳輸時一次傳輸16為,資料才不會亂;這種情況下DMA傳輸的源資料寬度為32、目的資料寬度為16位;一次傳輸16位(一個RGB)可以防止畫素亂序;

我們在程式設計時一般都會明確指定一個傳輸數量,在完成一次數目傳輸後DMA_SxNDTR計數值就會自減,當達到零時就說明傳輸完成。
    /*行中斷到來時、一行一行將資料傳輸到視訊記憶體,行中斷來了一定是新一行的資料,FSMC_LCD_ADDRESS + lcd_width*2*line_num保證為液晶屏的新一行的開始地址;一行影象的位元組為 
img_width*2/4;*/

    OV2640_DMA_Config(FSMC_LCD_ADDRESS + lcd_width*2*line_num,img_width*2/4);  //  +(lcd_width*2*(lcd_height-line_num-1))
    DCMI_ClearITPendingBit(DCMI_IT_LINE); 

   ///液晶屏的解析度
     uint16_t lcd_width=800, lcd_height=480;
   ///攝像頭採集影象的大小
      uint16_t img_width=1280, img_height=800;




4 stm32時鐘樹

倍頻器形狀:

分頻器形狀;

選擇器形狀: