1.硬件平臺:正點原子探索者STM32F407開發板2.軟件平臺:MDK5.13.固件庫版本:V1.4.0
ALIENTEK探索者STM32F4開發板具有DCMI接口,并板載了一個攝像頭接口(P8),該接口可以用來連接ALIENTEK OV2640等攝像頭模塊。本章,我們將使用STM32驅動ALIENTEK OV2640攝像頭模塊,實現攝像頭功能。本章分為如下幾個部分:
40.1 OV2640&DCMI簡介
40.2 硬件設計
40.3 軟件設計
40.4 下載驗證
40.1 OV2640&DCMI簡介
本節將分為兩個部分,分別介紹OV2640和STM32F4的DCMI接口。
40.1.1 OV2640簡介
OV2640是OV(OmniVision)公司生產的一顆1/4寸的CMOS UXGA(1632*1232)圖像傳感器。該傳感器體積小、工作電壓低,提供單片UXGA攝像頭和影像處理器的所有功能。通過SCCB 總線控制,可以輸出整幀、子采樣、縮放和取窗口等方式的各種分辨率8/10位影像數據。該產品UXGA圖像最高達到15幀/秒(SVGA可達30幀,CIF可達60幀)。用戶可以完全控制圖像質量、數據格式和傳輸方式。所有圖像處理功能過程包括伽瑪曲線、白平衡、對比度、色度等都可以通過SCCB接口編程。OmmiVision 圖像傳感器應用獨有的傳感器技術,通過減少或消除光學或電子缺陷如固定圖案噪聲、拖尾、浮散等,提高圖像質量,得到清晰的穩定的彩色圖像。
OV2640的特點有:
l 高靈敏度、低電壓適合嵌入式應用
l 標準的SCCB接口,兼容IIC接口
l 支持RawRGB、RGB(RGB565/RGB555)、GRB422、YUV(422/420)和YCbCr(422)輸出格式
l 支持UXGA、SXGA、SVGA以及按比例縮小到從SXGA到40*30的任何尺寸
l 支持自動曝光控制、自動增益控制、自動白平衡、自動消除燈光條紋、自動黑電平校準等自動控制功能。同時支持色飽和度、色相、伽馬、銳度等設置。
l 支持閃光燈
l 支持圖像縮放、平移和窗口設置
l 支持圖像壓縮,即可輸出JPEG圖像數據
l 自帶嵌入式微處理器
OV2640的功能框圖圖如圖40.1.1.1所示:
圖40.1.1.1 OV2640功能框圖
OV2640傳感器包括如下一些功能模塊。
1.感光整列(Image Array)
OV2640總共有1632*1232個像素,最大輸出尺寸為UXGA(1600*1200),即200W像素。
2.模擬信號處理(Analog Processing)
模擬信號處理所有模擬功能,并包括:模擬放大(AMP)、增益控制、通道平衡和平衡控制等。
3.10位A/D 轉換(A/D)
原始的信號經過模擬放大后,分G和BR兩路進入一個10 位的A/D 轉換器,A/D 轉換器工作頻率高達20M,與像素頻率完全同步(轉換的頻率和幀率有關)。除A/D轉換器外,該模塊還有黑電平校正(BLC)功能。
4.數字信號處理器(DSP)
這個部分控制由原始信號插值到RGB 信號的過程,并控制一些圖像質量:
l 邊緣銳化(二維高通濾波器)
l 顏色空間轉換(原始信號到RGB或者YUV/YCbYCr)
l RGB色彩矩陣以消除串擾
l 色相和飽和度的控制
l 黑/白點補償
l 降噪
l 鏡頭補償
l 可編程的伽瑪
l 十位到八位數據轉換
5.輸出格式模塊(Output Formatter)
該模塊按設定優先級控制圖像的所有輸出數據及其格式。
6.壓縮引擎(Compression Engine)
壓縮引擎框圖如圖40.1.1.2所示:
圖40.1.1.2 壓縮引擎框圖
從圖可以看出,壓縮引擎主要包括三部分:DCT、QZ和entropy encoder(熵編碼器),將原始的數據流,壓縮成jpeg數據輸出。
7.微處理器(Microcontroller)
OV2640自帶了一個8位微處理器,該處理器有512字節SRAM,4KB的ROM,它提供一個靈活的主機到控制系統的指令接口,同時也具有細調圖像質量的功能。
8.SCCB接口(SCCB Interface)
SCCB接口控制圖像傳感器芯片的運行,詳細使用方法參照光盤的《OmniVision Technologies Seril Camera Control Bus(SCCB) Specification》這個文檔
9.數字視頻接口(Digital Video Port)
OV2640擁有一個10位數字視頻接口(支持8位接法),其MSB和LSB可以程序設置先后順序,ALIENTEK OV2640模塊采用默認的8位連接方式,如圖40.1.1.3所示:
圖40.1.1.3 OV2640默認8位連接方式
OV2640的寄存器通過SCCB時序訪問并設置,SCCB時序和IIC時序十分類似,在本章我們不做介紹,請大家參考光盤《OmniVision Technologies Seril Camera Control Bus(SCCB) Specification》這個文檔。
接下來,我們介紹一下OV2640的傳感器窗口設置、圖像尺寸設置、圖像窗口設置和圖像輸出大小設置,這幾個設置與我們的正常使用密切相關,有必要了解一下。其中,除了傳感器窗口設置是直接針對傳感器陣列的設置,其他都是DSP部分的設置了,接下來我們一個個介紹。
傳感器窗口設置,該功能允許用戶設置整個傳感器區域(1632*1220)的感興趣部分,也就是在傳感器里面開窗,開窗范圍從2*2~1632*1220都可以設置,不過要求這個窗口必須大于等于隨后設置的圖像尺寸。傳感器窗口設置,通過:0X03/0X19/0X1A/0X07/0X17/0X18等寄存器設置,寄存器定義請看OV2640_DS(1.6).pdf這個文檔(下同)。
圖像尺寸設置,也就是DSP輸出(最終輸出到LCD的)圖像的最大尺寸,該尺寸要小于等于前面我們傳感器窗口設置所設定的窗口尺寸。圖像尺寸通過:0XC0/0XC1/0X8C等寄存器設置。
圖像窗口設置,這里起始和前面的傳感器窗口設置類似,只是這個窗口是在我們前面設置的圖像尺寸里面,再一次設置窗口大小,該窗口必須小于等于前面設置的圖像尺寸。該窗口設置后的圖像范圍,將用于輸出到外部。圖像窗口設置通過:0X51/0X52/0X53/0X54/0X55/0X57等寄存器設置。
圖像輸出大小設置,這是最終輸出到外部的圖像尺寸。該設置將圖像窗口設置所決定的窗口大小,通過內部DSP處理,縮放成我們輸出到外部的圖像大小。該設置將會對圖像進行縮放處理,如果設置的圖像輸出大小不等于圖像窗口設置圖像大小,那么圖像就會被縮放處理,只有這兩者設置一樣大的時候,輸出比例才是1:1的。
因為OmniVision 公司公開的文檔,對這些設置實在是沒有詳細介紹。只能從他們提供的初始化代碼(還得去linux源碼里面移植過來)里面去分析規律,所以,這幾個設置,都是作者根據OV2640的調試經驗,以及相關文檔總結出來的,不保證百分比正確,如有錯誤,還請大家指正。
以上幾個設置,光看文字可能不太清楚,這里我們畫一個簡圖有助于大家理解,如圖40.1.1.4所示:
圖40.1.1.4 OV2640圖像窗口設置簡圖
上圖,最終紅色框所示的圖像輸出大小,才是OV2640輸出給外部的圖像尺寸,也就是顯示在LCD上面的圖像大小。當圖像輸出大小與圖像窗口不等時,會進行縮放處理,在LCD上面看到的圖像將會變形。
最后,我們介紹一下OV2640的圖像數據輸出格式。首先我們簡單介紹一些定義:
UXGA,即分辨率位1600*1200的輸出格式,類似的還有:SXGA(1280*1024)、WXGA+(1440*900)、XVGA(1280*960)、WXGA(1280*800)、XGA(1024*768)、SVGA(800*600)、VGA(640*480)、CIF(352*288)、WQVGA(400*240)、QCIF(176*144)和QQVGA(160*120)等。
PCLK,即像素時鐘,一個PCLK時鐘,輸出一個像素(或半個像素)。
VSYNC,即幀同步信號。
HREF /HSYNC,即行同步信號。
OV2640的圖像數據輸出(通過Y[9:0])就是在PCLK,VSYNC和HREF/ HSYNC的控制下進行的。首先看看行輸出時序,如圖40.1.1.5所示:
圖40.1.1.5 OV2640行輸出時序
從上圖可以看出,圖像數據在HREF為高的時候輸出,當HREF變高后,每一個PCLK時鐘,輸出一個8位/10位數據。我們采用8位接口,所以每個PCLK輸出1個字節,且在RGB/YUV輸出格式下,每個tp=2個Tpclk,如果是Raw格式,則一個tp=1個Tpclk。比如我們采用UXGA時序,RGB565格式輸出,每2個字節組成一個像素的顏色(高低字節順序可通過0XDA寄存器設置),這樣每行輸出總共有1600*2個PCLK周期,輸出1600*2個字節。
再來看看幀時序(UXGA模式),如圖40.1.1.6所示:
圖40.1.1.6 OV2640幀時序
上圖清楚的表示了OV2640在UXGA模式下的數據輸出。我們按照這個時序去讀取OV2640的數據,就可以得到圖像數據。
最后說一下OV2640的圖像數據格式,我們一般用2種輸出方式:RGB565和JPEG。當輸出RGB565格式數據的時候,時序完全就是上面兩幅圖介紹的關系。以滿足不同需要。而當輸出數據是JPEG數據的時候,同樣也是這種方式輸出(所以數據讀取方法一模一樣),不過PCLK數目大大減少了,且不連續,輸出的數據是壓縮后的JPEG數據,輸出的JPEG數據以:0XFF,0XD8開頭,以0XFF,0XD9結尾,且在0XFF,0XD8之前,或者0XFF,0XD9之后,會有不定數量的其他數據存在(一般是0),這些數據我們直接忽略即可,將得到的0XFF,0XD8~0XFF,0XD9之間的數據,保存為.jpg/.jpeg文件,就可以直接在電腦上打開看到圖像了。
OV2640自帶的JPEG輸出功能,大大減少了圖像的數據量,使得其在網絡攝像頭、無線視頻傳輸等方面具有很大的優勢。OV2640我們就介紹到這。
圖40.1.2.3 ALIENTEK OV2640攝像頭模塊外觀圖
模塊原理圖如圖40.1.2.4所示:
這些線的連接,探索者STM32F4開發板的內部已經連接好了,我們只需要將OV2640攝像頭模塊插上去就好了。特別注意:DCMI攝像頭接口和I2S接口、DAC、SDIO以及1WIRE_DQ等有沖突,使用的時候,必須分時復用才可以,不可同時使用。實物連接如圖40.2.2所示:
圖40.2.2 OV2640攝像頭模塊與開發板連接實物圖
40.3 軟件設計
軟件設計請直接下載附件的pdf講解和實驗工程。
40.4 下載驗證
在代碼編譯成功之后,我們通過下載代碼到ALIENTEK探索者STM32F4開發板上,在OV2640初始化成功后,屏幕提示選擇模式,此時我們可以按KEY0,進入RGB565模式測試,也可以按KEY1,進入JPEG模式測試。
當按KEY0后,選擇RGB565模式,LCD滿屏顯示壓縮放后的圖像(有變形),如圖40.4.1所示:
圖40.4.1 RGB565模式測試圖片
此時,可以按KEY_UP切換為1:1顯示(不變形)。同時還可以通過KEY0按鍵,設置對比度;KEY1按鍵,設置飽和度;KEY2,可以設置特效。
當按KEY1后,選擇JPEG模式,此時屏幕顯示JPEG數據傳輸進程,如圖40.4.2所示:
圖40.4.2 JPEG模式測試圖
默認條件下,圖像分辨率是QVGA(320*240)的,硬件上:我們需要一根RS232串口線連接開發板的COM2(注意要用跳線帽將P9的:COM2_RX連接在PA2(TX))。如果沒有RS232線,也可以借助我們開發板板載的USB轉串口實現(有2個辦法:1,改代碼;2,杜邦線連接P9的PA2(TX)和P6的RX)。
我們打開上位機軟件:串口攝像頭.exe(路徑:光盤à\6,軟件資料à軟件à串口攝像頭軟件à串口攝像頭.exe),選擇正確的串口,然后波特率設置為115200,打開即可收到下位機傳過來的圖片了,如圖40.4.3所示:
圖40.4.3 串口攝像頭軟件接收并顯示JPEG圖片
我們可以通過KEY_UP設置輸出圖像的尺寸(QQVGA~UXGA)。通過KEY0按鍵,設置對比度;KEY1按鍵,設置飽和度;KEY2按鍵,設置特效。
同時,你還可以在串口,通過USMART調用SCCB_WR_Reg等函數,來設置OV2640的各寄存器,達到調試測試OV2640的目的,如圖40.4.4所示:
圖40.4.4 USMART調試OV2640
從上圖還可以看出,幀率為15幀,這和我們前面介紹的OV2640在UXGA模式,輸出幀率是15幀是一致的。
|