pz攝像頭模塊開發(fā)手冊普中s開發(fā)板_第1頁
pz攝像頭模塊開發(fā)手冊普中s開發(fā)板_第2頁
pz攝像頭模塊開發(fā)手冊普中s開發(fā)板_第3頁
pz攝像頭模塊開發(fā)手冊普中s開發(fā)板_第4頁
pz攝像頭模塊開發(fā)手冊普中s開發(fā)板_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、開源共享攜手共進(jìn)普技: 技術(shù): 技術(shù)咨詢:(公司座機(jī))PZ-0V7670 攝像頭模塊開發(fā)手冊本手冊向大家介紹 PZ-OV7670 攝像頭模塊及其使用。本手冊使用 STM32 驅(qū)動 PZ-OV7670 攝像頭模塊,實(shí)現(xiàn)攝像頭功能。本章分為如下幾部分內(nèi)容:1OV7670 介紹2硬件設(shè)計3軟件設(shè)計4實(shí)驗現(xiàn)象1 OV7670 介紹1.1 OV7670 簡介OV7670 是 OV( OmniVision)公司生產(chǎn)的一顆 1/6 寸的 CMOS VGA 圖像傳感器。該傳感器體積小、工作電壓低,提供單片 VGA 攝像頭和影像處理器的所有功能。通過 SCCB 總線,可以輸出整幀、子采樣、取窗口等方式的各種分辨

2、率 8 位影像數(shù)據(jù)。該VGA 圖像最高達(dá)到 30 幀/秒。用戶可以完全圖像質(zhì)量、數(shù)據(jù)格式和傳輸方式。所有圖像處理功能過程包括曲線、白平衡、度、色度等都可以通過 SCCB 接口編程。 OmmiVision 圖像傳感器應(yīng)用獨(dú)有的傳感器技術(shù),通過減少或消除光學(xué)或電子缺陷如固定圖案噪聲、托尾、浮散等,提高圖像質(zhì)量,得到清晰的穩(wěn)定的彩色圖像。OV7670 的特點(diǎn)有:(1)高靈敏度、低電壓適合應(yīng)用(2)標(biāo)準(zhǔn)的 SCCB 接口,兼容 IIC 接口(3)支持 RawRGB、RGB(GBR4:2:2, RGB565/RGB555/RGB444), YUV(4:2:2)和 YCbCr( 4:2:2)輸出格式(4)

3、支持 VGA、 CIF,和從 CIF 到 40*30 的各種輸出(5)支持自動、自動增益、自動白平衡、自動消除燈光條紋、自動黑電平校準(zhǔn)等自動功能。同時支持色飽和度、色相、等設(shè)置。(6)支持閃光燈(7)支持圖像縮放OV7670 的功能框圖圖:1OV7670 傳感器包括如下一些功能模塊:1.感光整列( Image Array)OV7670 總共有 656*488 個像素,其中 640*480 個有效(即有效像素為30W)。2.時序發(fā)生器(Timing Generator)時序發(fā)生器具有的功能包括:整列和幀率發(fā)生( 7 種不同格式輸出)、內(nèi)部信號發(fā)生器和分布、幀率時序、自動、輸出外部時序( VSYN

4、C、HREF/HSYNC 和 PCLK)。3.模擬信號處理( Analog Processing)模擬信號處理所有模擬功能,并包括:自動增益( AGC)和自動白平衡( AWB)。4.A/D 轉(zhuǎn)換( A/D)原始的信號經(jīng)過模擬處理器模塊之后 ,分 G 和 BR進(jìn)入一個 10 位的A/D 轉(zhuǎn)換器,A/D 轉(zhuǎn)換器工作在 12M 頻率,與像素頻率完全同步(轉(zhuǎn)換的頻率和幀率有關(guān))。除 A/D 轉(zhuǎn)換器外,該模塊還有以下三個功能:黑電平校正( BLC)U/V 通道延遲A/D 范圍A/D 范圍乘積和 A/D 的范圍共同設(shè)置 A/D 的范圍和最大值用戶2根據(jù)應(yīng)用調(diào)整圖片的亮度。5.測試圖案發(fā)生器( Test P

5、attern Generator)測試圖案發(fā)生器功能包括:八色彩色條圖案、漸變至黑白彩色條圖案和輸出腳移位“ 1”。6.數(shù)字處理器( DSP)這個部分由原始信號插值到 RGB 信號的過程,并一些圖像質(zhì)量:邊緣銳化(二維濾波器)顏色空間轉(zhuǎn)換(原始信號到 RGB 或者 YUV/YCbYCr)RGB 色彩矩陣以消除串?dāng)_色相和飽和度的黑/白點(diǎn)補(bǔ)償降噪鏡頭補(bǔ)償可編程的十位到八位數(shù)據(jù)轉(zhuǎn)換7.縮放功能( Image Scaler)這個模塊按照預(yù)先設(shè)置的要求輸出數(shù)據(jù)格式,能將 YUV/RGB信號從 VGA 縮小到 CIF 以下的任何。8.數(shù)字接口( DigitalPort)通過寄存器 COM21:0,調(diào)節(jié) I

6、OL/IOH 的驅(qū)動電流,以適應(yīng)用戶的負(fù)載。9.SCCB 接口( SCCB Interface)SCCB 接 口圖 像 傳 感 器的 運(yùn) 行 , 詳 細(xì) 使 用 方 法 參 照 OmniVisionTechnologies Seril Camera Control Bus(SCCB) Specification這個文檔。10.LED和閃光燈的輸出( LED and Storbe Flash Control Output)OV7670有閃光燈模式,可以外接閃光燈或閃光 LED 的工作。OV7670的寄存器通過 SCCB 時序并設(shè)置, SCCB 時序和 IIC 時序十分類似,在這里我們不做介紹,請

7、大家參考模塊的相關(guān)文檔。接下來我們介紹一下 OV7670 的圖像數(shù)據(jù)輸出格式。首先我們簡單介紹幾個3定義:VGA,即分辨率為 640*480 的輸出模式;QVGA,即分辨率為 320*240 的輸出格式,也就是本手冊我們需要用到的格式;VGA,即分辨率為 160*120 的輸出格式;PCLK,即像素時鐘,一個 PCLK 時鐘,輸出一個像素(或半個像素)。VSYNC,即幀同步信號。HREF /HSYNC,即行同步信號。OV7670 的圖像數(shù)據(jù)輸出(通過 D7:0)就是在 PCLK, VSYNC 和 HREF/HSYNC 的下進(jìn)行的。首先看看行輸出時序,:從上圖可以看出,圖像數(shù)據(jù)在 HREF 為高

8、的時候輸出,當(dāng) HREF 變,每一個 PCLK 時鐘,輸出一個字節(jié)數(shù)據(jù)。比如我們采用 VGA 時序, RGB565 格式輸出,每 2 個字節(jié)組成一個像素的顏色(高字節(jié)在前,低字節(jié)在后),這樣每行輸出總共0*2 個 PCLK 周期,輸出 640*2 個字節(jié)。再來看看幀時序( VGA 模式),:4上圖清楚的表示了 OV7670 在 VGA 模式下的數(shù)據(jù)輸出,注意,圖中的 HSYNC和 HREF 其實(shí)是同一個引腳產(chǎn)生的信號,只是在不同場合下面,使用不同的信號方式,我們用到的是 HREF。因為 OV7670 的像素時鐘( PCLK)最高可達(dá) 24Mhz,我們用 STM32F103ZET6的 IO 口直

9、接抓取,是非常的,也十分占耗 CPU(可以通過降低 PCLK 輸出頻率,來實(shí)現(xiàn) IO 口抓取,但是不推薦這樣操作)。所以,我們并不是采取直接抓取來自 OV7670 的數(shù)據(jù),而是通過 FIFO,PZ-OV7670 攝像頭模塊自帶了一個 FIFO,用于暫存圖像數(shù)據(jù),有了這個,我們就可以很方便的獲取圖像數(shù)據(jù)了,而不再需要單片機(jī)具有高速 IO,也耗費(fèi)多少 CPU,可以說,只要是個單片機(jī),都可以通過 PZ-OV7670 攝像頭模塊實(shí)現(xiàn)拍照的功能。接下來我們介紹一下 PZ-OV7670 攝像頭模塊。該模塊的外觀:5模塊原理圖:從上圖可以看出,PZ-OV7670攝像頭模塊自帶了有源晶振 Y1,用于產(chǎn)生12M

10、 時鐘作為 OV7670 的 XCLK 輸入。同時自帶了穩(wěn)壓,用于提供OV7670穩(wěn)定的 2.8V 工作電壓,并帶有一個 FIFO(AL422B),該 FIFO的容量是 384K 字節(jié),足夠2 幀 QVGA 的圖像數(shù)據(jù)。模塊通過一個 2*9的雙排6排針(P1)與外部通信,該管腳功能:1.2 PZ-OV7670 模塊使用方法下面我們來看看如何使用 PZ-OV7670 攝像頭模塊(以 QVGA 模式,RGB565格式為例)。對于該模塊,我們只關(guān)心兩點(diǎn): 1,如何圖像數(shù)據(jù); 2,如何圖像數(shù)據(jù)。(1)如何圖像數(shù)據(jù)。PZ-OV7670 攝像頭模塊圖像數(shù)據(jù)的過程為:等待 OV7670 同步信號FIFO 寫

11、指針復(fù)位FIFO 寫使能等待第二個 OV7670 同步信號FIFO 寫禁止。通過以上 5 個步驟,我們就完成了 1 幀圖像數(shù)據(jù)的。(2)如何圖像數(shù)據(jù)。在完一幀圖像以后,我們就可以開始圖像數(shù)據(jù)了。過程為:FIFO 讀指針復(fù)位給 FIFO 讀時鐘( FIFO_RCLK)第一個像素高字節(jié)給 FIFO 讀時鐘第一個像素低字節(jié)給 FIFO 讀時鐘第二個像素高字節(jié)循環(huán)剩余像素結(jié)束??梢钥闯觯琍Z-OV7670 攝像頭模塊數(shù)據(jù)的也是十分簡單,比如 QVGA 模式,RGB565 格式,我們總共循環(huán)320*240*2 次,就可以1 幀圖像數(shù)據(jù),把這些數(shù)據(jù)寫入 LCD 模塊,我們就可以看到攝像頭捕捉到的畫面了。O

12、V7670 還可以對輸出圖像進(jìn)行各種設(shè)置,詳見模塊資料 OV7670 softwareapplication note文檔,對 AL422B 的操作時序,請大家參考 AL422B 的數(shù)據(jù)手冊。了解了 OV7670 模塊的數(shù)據(jù)和,我們就可以開始設(shè)計程序了,本實(shí)驗我們用一個外部中斷來捕捉幀同步信號( VSYNC),然后在中斷里面啟動7OV7670 模塊的圖像數(shù)據(jù),等待下一次 VSHNC 信號到來,我們就關(guān)閉數(shù)據(jù)存儲,然后一幀數(shù)據(jù)就完成了,在主函數(shù)里面就可以慢慢的將這一幀數(shù)據(jù)讀出來,放到 LCD 即可顯示了,同時開始第二幀數(shù)據(jù)的,如此循環(huán),實(shí)現(xiàn)攝像頭功能。本實(shí)驗使用攝像頭模塊的 QVGA 輸出( 3

13、20*240),這個在我們使用的 TFTLCD 模塊分辨率范圍內(nèi)。注意:PZ-OV7670 攝像頭模塊自帶的 FIFO 是沒辦法緩存一幀的 VGA 圖像的,如果使用 VGA 輸出,那么你必須在 FIFO 寫前開始讀 FIFO 數(shù)據(jù),保證數(shù)據(jù)不被覆蓋。2 硬件設(shè)計本實(shí)驗使用到硬件如下:(1)D1 指示燈(2)K_UP、K_DOWN、K_LEFT、K_RIGHT 按鍵(3)串口 1(4)TFTLCD 模塊(5)PZ-OV7670 攝像頭模塊前四部分電路在前面章節(jié)都介紹過, 這里就不多說, 下面我們來看下PZ-OV7670 攝像頭模塊與開發(fā)板如何連接的。前面我們介紹了該模塊的接口管腳功能,如果您的開

14、發(fā)板未含攝像頭接口,我們可以通過線將 PZ-OV7670 攝像頭模塊與 STM32 開發(fā)板的管腳連接,連接關(guān)系:8注意:由于之前 STM32F1 開發(fā)板版本上沒有攝像頭接口,所以連接的導(dǎo)線較多,特別注意,使用線連接攝像頭模塊時,注意將數(shù)據(jù)線單獨(dú)綁起來,信號線單獨(dú)綁起來,其他的 SDA 和 SCL 及 GND、3.3V 綁在一起,如果沒有綁在一起,可能會出現(xiàn)干擾等導(dǎo)致畫面顯示不清楚??紤]到客戶的接線問題,在后面的 STM32F1 開發(fā)板中,我們已集成了攝像頭接口,如下圖所示:我們只需將 PZ-0V7670 攝像頭模塊的管腳與開發(fā)板上接口對應(yīng)即可,非常方便,而且顯示畫面也比較清晰。3 軟件設(shè)計本實(shí)

15、驗所實(shí)現(xiàn)的功能為:開機(jī)后,初始化攝像頭模塊( OV7670),如果初始化,則在 LCD 模塊上面顯示攝像頭模塊所拍攝到的內(nèi)容。我們可以通過K_UP 鍵設(shè)置光照模式( 5 種模式)、通過 K_DOWN 鍵設(shè)置色飽和度,通過 K_LEFT鍵設(shè)置亮度,通過 K_RIGHT 鍵設(shè)置對比度。通過串口我們可以查看當(dāng)前的幀率(這里是指 LCD 顯示的幀率,而不是指 OV7670 的輸出幀率)。 D1 指示燈提示系統(tǒng)運(yùn)行狀態(tài)。我們打開本實(shí)驗工程,可以看到我們的工程 APP 列表中多了 ov7670.c 和sccb.c 源文件,以及頭文件 ov7670.h、sccb.h 和 ov7670cfg.h 等 5 個文

16、件。本實(shí)驗工程代碼比較多,我們就不一一列出了,僅挑兩個重要的地方進(jìn)行講解。首先,我們來看 ov7670.c 里面的 OV7670_Init 函數(shù),該函數(shù)代碼如下:/初始化 OV76709/返回 0:/返回其他值:錯誤代碼u8 OV7670_Init(void)u8 temp;u16 i=0;/設(shè)置 IOGPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOE|RCC_AP

17、B2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/速度為 50MGPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPI

18、O_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=0xff;GPIO_Init(GPIOF, &GPIO_InitStructure);10GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_Init(GPIO

19、E, &GPIO_InitStructure);GPIO_SetBits(GPIOE,GPIO_Pin_6);GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3);SCCB_Init();/初始化 SCCB 的 IO 口if(SCCB_WR_Reg(0x12,0x80)retur

20、n 1;/復(fù)位 SCCBdelay_ms(50);/型號temp=SCCB_RD_Reg(0x0b);if(temp!=0x73)return 2;temp=SCCB_RD_Reg(0x0a);if(temp!=0x76)return 2;/初始化序列for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl0);i+)SCCB_WR_Reg(ov7670_init_reg_tbli0,ov7670_init_reg_tbli1);return 0x00;/ok此部分代碼先初始化 OV7670 相關(guān)的 IO 口(包括

21、SCCB_Init),然后最主要的是完成 OV7670 的寄存器序列初始化。 OV7670 的寄存器特別多(上百來11個),配置非常麻煩,幸好廠家有提供參考配置序列(詳見 OV7670 softwareapplication note),本實(shí)驗我們用到的配置序列,存放在 ov7670_init_reg_tbl這個數(shù)組里面,該數(shù)組是一個 2 維數(shù)組,初始化序列寄存器及其對應(yīng)的值,該數(shù)組存放在 ov7670cfg.h 里面。接下來, 我們看看 ov7670cfg.h 里面ov7670_init_reg_tbl 的內(nèi)容,ov7670cfg.h 文件的代碼如下:/初始化寄存器序列及其對應(yīng)的值const

22、 u8 ov7670_init_reg_tbl2=/*以下為 OV7670 QVGA RGB565 參數(shù)*/0x3a,0x04,/dummy0x40,0xd0,/5650x12,0x14,/QVGA,RGB 輸出/輸出窗口設(shè)置0x32,0x80,/HREF control bit2:0 HREF start3LSBbit5:3 HSTOP HREF end 3LSB0x17,0x16,/HSTART start high 8-bitMSB0x18,0x04,/5 HSTOP end high8-bit0x19,0x02,0x1a,0x7b,/0x7a,0x03,0x06,/0x0a,幀豎直方向

23、0x0c,0x00,0x15,0x00,/0x000x3e,0x00,/100x70,0x3a,0x71,0x35,0x72,0x11,120x73,0x00,/0xa2,0x02,/150x11,0x81,/時鐘分頻設(shè)置,0,不分頻.0x7a,0x20,0x7b,0x1c,0x7c,0x28,0x7d,0x3c,/200x7e,0x55,0x7f,0x68,0x80,0x76,0x81,0x80,0x82,0x88,0x83,0x8f,0x84,0x96,0x85,0xa3,0x86,0xaf,0x87,0xc4,/300x88,0xd7,0x89,0xe8,0x13,0xe0,0x00,0

24、x00,/AGC0x10,0x00,0x0d,0x00,/全窗口,位5:4: 01 半窗口,101/4 窗口,11 1/4窗口130x14,0x28,/0x38,limitthemaxgain0xa5,0x05,0xab,0x07,0x24,0x75,/400x25,0x63,0x26,0xA5,0x9f,0x78,0xa0,0x68,0xa1,0x03,/0x0b,0xa6,0xdf,/0xd8,0xa7,0xdf,/0xd8,0xa8,0xf0,0xa9,0x90,0xaa,0x94,/500x13,0xe5,0x0e,0x61,0x0f,0x4b,0x16,0x02,0x1e,0x27,

25、/圖像輸出鏡像.0x070x21,0x02,0x22,0x91,0x29,0x07,0x33,0x0b,0x35,0x0b,/60140x37,0x1d,0x38,0x71,0x39,0x2a,0x3c,0x78,0x4d,0x40,0x4e,0x20,0x69,0x00,0x6b,0x40,/PLL*4=48Mhz0x74,0x19,0x8d,0x4f,0x8e,0x00,/700x8f,0x00,0x90,0x00,0x91,0x00,0x92,0x00,/0x19,/0x660x96,0x00,0x9a,0x80,0xb0,0x84,0xb1,0x0c,0xb2,0x0e,0xb3,0x

26、82,/800xb8,0x0a,0x43,0x14,0x44,0xf0,0x45,0x34,150x46,0x58,0x47,0x28,0x48,0x3a,0x59,0x88,0x5a,0x88,0x5b,0x44,/900x5c,0x67,0x5d,0x49,0x5e,0x0e,0x64,0x04,0x65,0x20,0x66,0x05,0x94,0x04,0x95,0x08,0x6c,0x0a,0x6d,0x55,0x4f,0x80,0x50,0x80,0x51,0x00,0x52,0x22,0x53,0x5e,0x54,0x80,/0x54, 0x40,/110160x09,0x03,/

27、驅(qū)動能力最大0x6e,0x11,/1000x6f,0x9f,/0x9e for advance AWB0x55,0x00,/亮度0x56,0x40,/對比度 0x400x57,0x40,/0x40,change according to Jim's request/以下部分代碼由開源電子網(wǎng)網(wǎng)友:duanzhang512 提出/添加此部分代碼將可以獲得更好的成像效果,但是最下面一行會有的抖動./ 如 不 想 要 , 可 以此 部 分 代 碼 . 然后將:OV7670_Window_Set(12,176,240,320);/改為:OV7670_Window_Set(12,174,240,3

28、20);,即可去掉最下一行的抖動0x6a,0x40,0x01,0x40,0x02,0x40,0x13,0xe7,0x15,0x00,0x58,0x9e,0x41,0x08,0x3f,0x00,170x75,0x05,0x76,0xe1,0x4c,0x00,0x77,0x01,0x3d,0xc2,0x4b,0x09,0xc9,0x60,0x41,0x38,0x34,0x11,0x3b,0x02,0xa4,0x89,0x96,0x00,0x97,0x30,0x98,0x20,0x99,0x30,0x9a,0x84,0x9b,0x29,0x9c,0x03,0x9d,0x4c,0x9e,0x3f,0x

29、78,0x04,0x79,0x01,0xc8,0xf0,0x79,0x0f,0xc8,0x00,0x79,0x10,180xc8,0x7e,0x79,0x0a,0xc8,0x80,0x79,0x0b,0xc8,0x01,0x79,0x0c,0xc8,0x0f,0x79,0x0d,0xc8,0x20,0x79,0x09,0xc8,0x80,0x79,0x02,0xc8,0xc0,0x79,0x03,0xc8,0x40,0x79,0x05,0xc8,0x30,0x79,0x26,0x09,0x00,/;以上代碼,我們大概了解下結(jié)構(gòu),每個條目的第一個字節(jié)為寄存器號(也就是寄存器地址),第二個字節(jié)為要

30、設(shè)置的值,比如0x3a, 0x04,就表示在0X03地址,寫入 0X04 這個值。通過這么一長串( 110 多個)寄存器的配置,我們就完成了 OV7670的初始化,本實(shí)驗我們配置 OV7670 工作在 QVGA 模式, RGB565 格式輸出。在完成初始化之后,我們既可以開始OV7670 的數(shù)據(jù)了。19OV7670 文件夾里面的其他代碼我們就不逐個介紹了,請大家參考該例程源碼。因?qū)嶒炍覀冞€用到了幀率( LCD 顯示的幀率)統(tǒng)計和中斷處理,所以我們還需要修改 time.c、 time.h、 exti.c 及 exti.h 這幾個文件。在 time.c 里面,我們使用 TIM4 用于統(tǒng)計幀率,其代

31、碼如下:/*函 數(shù) 名: TIM4_Init*函數(shù)功能: TIM4 初始化函數(shù)*輸入: per:重裝載值psc:分頻系數(shù)*輸出: 無*/void TIM4_Init(u16 per,u16 psc)TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);/ 使能 TIM4時鐘TIM_TimeBaseInitStructure.TIM_Period=per;/自動裝載值TIM_Ti

32、meBaseInitStructure.TIM_Prescaler=psc; /分頻系數(shù)TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;/設(shè)置向上計數(shù)模式TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);20TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); /開啟定時器中斷TIM_ClearITPendingBit(TI

33、M4,TIM_IT_Update);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;/定時器中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;/ 搶 占優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;/子優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/IRQ通道使能NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM4,ENABLE)

34、; /使能定時器u8 ov_frame; /統(tǒng)計幀數(shù)/*函 數(shù) 名: TIM4_IRQHandler*函數(shù)功能: TIM4 中斷函數(shù)*輸入: 無*輸出: 無*/void TIM4_IRQHandler(void)if(TIM_GetITStatus(TIM4,TIM_IT_Update)21led2=!led2;printf("frame:%dfpsrn",ov_frame);/打印幀率ov_frame=0;TIM_ClearITPendingBit(TIM4,TIM_IT_Update);這里我們用到通用定時器 TIM4 來統(tǒng)計幀率,也就是 1 秒鐘中斷一次,打印 ov_

35、frame 的值, ov_frame 用于統(tǒng)計 LCD 幀率。在exti.c 里面添加 EXTI7_Init 和 EXTI9_5_IRQHandler 函數(shù), 用于OV7670模塊的 FIFO 寫, exti.c 文件新增部分代碼如下:u8ov_sta;/幀中斷標(biāo)記/外部中斷 59 服務(wù)程序void EXTI9_5_IRQHandler(void)if(EXTI_GetITStatus(EXTI_Line7)=SET) /是 8 線的中斷OV7670_WRST=0;/復(fù)位寫指針OV7670_WRST=1;OV7670_WREN=1;/寫入 FIFOov_sta+;/幀中斷加 1EXTI_Cle

36、arITPendingBit(EXTI_Line7);/清除 EXTI8 線路掛起位/外部中斷 7 初始化void EXTI7_Init(void)EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;22RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource7);EXTI_InitStructure.EXTI_Line=EXTI_Line7;EX

37、TI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);/ 根據(jù) EXTI_InitStruct 中指定的參數(shù)初始化外設(shè) EXTI 寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;/使能按鍵所在的外部中斷通道NVIC_InitStructure.N

38、VIC_IRQChannelPreemptionPriority = 0;/搶占優(yōu)先級 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;/子優(yōu)先級 0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/使能外部中斷通道NVIC_Init(&NVIC_InitStructure);/ 根據(jù) NVIC_InitStruct 中指定的參數(shù)初始化外設(shè) NVIC 寄存器因為 OV7670 的幀同步信號( OV_VSYNC)接在 PA7 上面,所以我們這里配置 PA7 作為中斷輸入,因為 STM32

39、的外部中斷 59 共用一個中斷服務(wù)函數(shù)( EXTI9_5_IRQHandler),所以在該函數(shù)里面,我們需要先中斷是不是來自中斷線 7 的,然后再做處理。中斷處理部分很簡單,通過一個 ov_sta 來OV7670 模塊的 FIFO 寫操作。當(dāng) ov_sta=0 的時候,表示 FIFO的數(shù)據(jù)已經(jīng)被了( ov_sta 在23讀完 FIFO 數(shù)據(jù)的時候被清零),然后只要 OV_VSYNC 信號到來,我們就先復(fù)位一下寫指針,然后 ov_sta=1,標(biāo)志著寫指針已經(jīng)復(fù)位,目前正在往 FIFO 里面寫數(shù)據(jù)。再等下一個 OV_VSYNC 到來,也就表明一幀數(shù)據(jù)已經(jīng)完畢了,此時我們設(shè)置 OV7670_WREN

40、 為 0,再往 OV7670 寫入數(shù)據(jù),此時 ov_sta 自增為 2。其他程序,只要讀到 ov_sta 為 2,就表示一幀數(shù)據(jù)已經(jīng)準(zhǔn)備好了,可以讀出,在讀完數(shù)據(jù)之后,程序設(shè)置 ov_sta 為 0,則開啟下一輪FIFO數(shù)據(jù)。最后我們看下 main.c 文件,代碼如下:extern u8 ov_sta;/在 exit.c 里面定義extern u8 ov_frame; /在 time.c 里面定義/更新 LCD 顯示void camera_refresh(void)u32j;u16i;u16color;u16temp;if(ov_sta)/有幀中斷更新?/LCD_Set_Window(tftl

41、cd_data.width-320)/2,(tftlcd_data.height-240)/2,320,240-1);/將顯示區(qū)域設(shè)置到屏幕LCD_Set_Window(0,(tftlcd_data.height-240)/2,320-1,240-1);/ 將顯示區(qū)域設(shè)置到屏幕24OV7670_RRST=0;/開始復(fù)位讀指針OV7670_RCK_L;OV7670_RCK_H;OV7670_RCK_L;OV7670_RRST=1;/復(fù)位讀指針結(jié)束OV7670_RCK_H;/*for(i=0;i<240;i+)/此種方式可以兼容任何彩屏,但是速度很慢for(j=0;j<320;j+)O

42、V7670_RCK_L;color=GPIOF->IDR&0XFF; /讀數(shù)據(jù)OV7670_RCK_H;color<<=8;OV7670_RCK_L;color|=GPIOF->IDR&0XFF; /讀數(shù)據(jù)OV7670_RCK_H;LCD_DrawFRONT_COLOR(j,i,color);*/for(j=0;j<76800;j+)/此種方式需清楚TFT 內(nèi)部顯示方向寄存器值速度較快OV7670_RCK_L;color=GPIOF->IDR&0XFF;/讀數(shù)據(jù)OV7670_RCK_H;color<<=8;OV7670_R

43、CK_L;25color|=GPIOF->IDR&0XFF; /讀數(shù)據(jù)OV7670_RCK_H;LCD_WriteData_Color(color);/printf("%x",color);/if(j%20=0)printf("rn");/delay_us(50);ov_sta=0;/清零幀中斷標(biāo)記ov_frame+;const u8*LMODE_TBL5="Auto","Sunny","Cloudy","Office","Home"cons

44、tu8*EFFECTS_TBL7="Normal","Negative","B&W","Redish","Greenish","Bluish","Antique" /7 種特效int main()u8i=0;u8key;u8lightmode=0,saturation=2,brightness=2,contrast=2;u8effect=0;u8sbuf15;u8count;SysTick_Init(72);26NVIC_PriorityGroup

45、Config(NVIC_PriorityGroup_2);/ 中斷優(yōu)先級分組 分 2 組LED_Init();USART1_Init(9600);TFTLCD_Init();/LCD 初始化KEY_Init();EN25QXX_Init();/初始化 EN25Q128my_mem_init(SRAMIN);/初始化內(nèi)部內(nèi)存池FRONT_COLOR=RED;/設(shè)置字體為紅色/ while(SD_Init()!=0)/ /LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,16,"SDCard Error!");/

46、FATFS_Init();/為 fatfs 相關(guān)變量申請內(nèi)存/f_mount(fs0,"0:",1);/掛載 SD 卡/f_mount(fs1,"1:",1);/掛載 FLASH.LCD_ShowFont12Char(10,10,"普技");LCD_ShowFont12Char(10,30,"");LCD_ShowFont12Char(10,50,"攝像頭應(yīng)用-OV7670");i=OV7670_Init();printf("i=%dn",i);while(OV7670_Init()/初始化 OV767027LCD_ShowString(10,80,tftlcd_data.width,tftlcd_data.height,16,"OV7670 Error!");delay_ms(200);LCD_Fill(10,80,239,206,WHITE);delay_ms(200);LCD_ShowString(10,80,tftlcd_da

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論