基於STM32的OV7670攝像頭總結

2021-01-11 電子產品世界

  一、OV7670模塊:

本文引用地址:http://www.eepw.com.cn/article/201709/364999.htm

  介紹一下OV7670傳感器:CMOS器件;標準的SCCB接口,兼容IIC接口;內置感光陣列,時序發生器,AD轉換器,模擬信號處理,數位訊號處理器.....

  大致工作過程:光照射到感光陣列產生相應電荷,傳輸到相應的模擬信號處理單元,再由AD轉換為數位訊號,在經由數位訊號處理器插值到RGB信號,最後傳輸到屏幕上......

  先了解一下基礎知識:現在市面上的OV7670模塊分兩種:1、帶FIFO晶片;2、不帶FIFO晶片。當然帶FIFO的要貴一點~下面介紹帶FIFO和不帶FIFO的工作原理:

    

  圖1:不帶FIFO

  圖2:帶FIFO

  下面就講解這兩種方式的適用範圍:

  不帶FIFO:這種方法最簡單,最直接,但是最不好實現的方法,原因是多數的CMOS晶片(如OV7670)的時鐘速度可以高達24M,一般單片機的IO口速度根本達不到(stm32的IO速度,寄存器比庫函數快,博主之前測,用庫函數IO口速度好像是2.5Mhz,而用寄存器IO口速度是8M吧,速度相差較大~)。當然,高級的MCU,如ARM9以上或者DSP圖像處理晶片等,本身處理速度快,內存大而且有的還帶camera接口,可以不用帶FIFO。主要是人家價格也高啊~

  但也不是不是完全沒有辦法在低速上實現採集,方法也很簡單,那麼就是降低CMOS 的輸出速度,不過這需要靠外部的晶振和內部的PLL 電路以及像素時鐘速度,幀速等多個寄存器共同設置,並且要和MCU 的IO 速度匹配才可實現。但不建議這麼做,原因是:這種寄存器設置將帶來更多的學習困難和理解困難,並導致硬體圖像的採集速度可能下降到0.5 幀以下,同時帶來圖像失真的可能。

  還有一種方法就是DMA方式採集,代碼複雜,速度在5-10幀左右。(博主本來想用該方法的,可是基礎差,調試困難。會接著調試~)

  註:部分CMOS 時鐘速度不快,可以單片機直接採集,如OV7660,但該晶片已經停產。

  帶FIFO:由於採用了FIFO 做為數據緩衝,數據採集大大簡便,用戶只需要關心是如何讀取即可,不需要關心具體數據是如何採集到的,這樣可減小甚至不用關心CMOS 的控制以及時序關係,就能夠實現圖像的採集。

  注意:FIFO不具備地址功能,因此他也就不具備數據的定位(選址)讀取功能,所以不可能有真正的數據處理能力!

  總的來說:帶FIFO比不帶FIFO操作起來更簡單,8位MCU也能勝任。下面我們參考戰艦攝像頭實驗(帶FIFO的OV7670模塊)

  二、OV7670的圖像數據輸出格式:(參考戰艦開發指南)

  先簡單了解幾個定義:

  VGA:解析度為640*480的輸出模式

  QVGA:解析度為320*240的輸出格式

  QQVGA:解析度為160*120的輸出格式

  PCLK:像素時鐘,一個PCLK時鐘,輸出1個像素或半個像素

  VSYNC:幀同步信號

  HREF/HSYNC:行同步信號

  先看行輸出時序:

    

  圖3:OV7670行輸出時序

  圖3中,圖像數據在HREF為高的時候輸出,當HREF變高后,每一個PCLK時鐘,輸出一個字節數據。比如我們採用VGA時序,RGB565格式輸出,每兩個字節組成一個像素的顏色(高字節在前,低字節在後),這樣每行輸出總共有640*2個PCLK周期,輸出640*2個字節。

  在來看幀時序:

    

  圖4:OV7670幀時序

  在圖4中,VSYNC位高時產生一個幀同步信號,故當產生兩個幀同步信號時,一幀數據輸出完成。注意:圖中的HSYNC和HREF其實是一個引腳產生的信號,只是在不同的場合下面,使用不同的信號方式。

  三、戰艦OV7670模塊原理圖講解:

    

 

 

  圖5:戰艦OP7670模塊原理圖

  在圖5中,我們用3種顏色的線,將OV7670模塊原理圖中幾個重要晶片同MCU「連」了起來。不多說,看圖~

  四、存儲和讀取圖像數據的過程及程序講解(參考原子哥的開發指南和代碼)

  對於該模塊,我們只關心兩點:1、如何存儲圖像數據;2、如何讀取圖像數據

  1、存儲(OV7670往FIFO中寫數據)

  戰艦OV7670模塊存儲圖像數據的過程為:等待OV767同步信號->FIFO寫指針復位->FIFO寫使能->等待第二個同步信號->FIFO寫禁止,通過以上5個步驟就可以完成一幀圖像的存儲

  2、讀取(MCU從FIFO中讀取數據)

  讀取過程:FIFO讀指針復位->給FIFO讀時鐘(FIFO RCLK)->讀取第一個像素高字節->給FIFO讀時鐘(FIFO RCLK)->讀取第一個像素低字節->給FIFO讀時鐘(FIFO RCLK)->讀取第二個像素高字節->循環讀取剩餘像素->結束

  比如QVGA模式,RGB565格式,我們總共循環讀取320*240*2次,就可以讀取一幀數據,把這些數據寫入LCD模塊,就可以看到攝像頭的畫面了。

  程序講解:(主要是OV7670對FIFO的寫控制和MCU從FIFO中讀取數據)

  1、利用外部中斷來對OV7670進行寫操作控制

    

  圖6:外部中斷對OV7670進行寫控制

  詳細解釋請看代碼注釋~

  2、MCU從FIFO中讀取數據(更新LCD顯示)

  圖7:更新LCD顯示函數(MCU讀取FIFO數據)

  詳細請看代碼注釋~

相關焦點

  • 13個基於STM32的經典項目設計實例,全套資料~
    今天總結了幾篇電路城上關於STM32 的製作,不能說每篇都是經典,但都是在其他地方找不到的,很有學習參考意義的設計實例。尤其對於新手,是一個學習stm32單片機的“活生生”的範例。
  • 7個基於STM32單片機的精彩設計實例,附原理圖、代碼等相關資料
    今天總結了幾篇電路城上關於STM32的製作,不能說每篇都是經典,但都是在其他地方找不到的,很有學習參考意義的設計實例。尤其對於新手,是一個學習stm32單片機的「活生生」的範例。2.採用STM32單片機基於uCOS II系統控制VS1053B語音晶片製作的MP3播放器一看到uCOS II,就覺得是個高級貨,絕對不是一般的小打小鬧。該製作耗時半年能完成製作,不得不佩服作者的堅持。
  • STM32——PWM輸出總結
    學習後發現stm32的定時器功能確實很強大,小總結一下方便以後使用的時候做參考。今天我主要是用定時器做pwm輸出,所以總結也主要是針對pwm方面的。 先大致說下通用和高級定時器的區別。通用的可以輸出四路pwm信號互不影響。高級定時器可以輸出三對互補pwm信號外加ch4通道,也就是一共七路。所以這樣算下來stm32一共可以生成4*5+7*2=30路pwm信號。
  • stm32屬於arm嗎_arm和stm32的區別
    打開APP stm32屬於arm嗎_arm和stm32的區別 發表於 2017-10-10 11:34:35        stm32
  • 基於STM32的 USB設計 --單片機程序篇
    下面具體從usb的中斷輸入輸出來講述基於keil C mdk開發環境的stm32的USB接口單片機程序設計。值得一提的是,st或相關公司給我們提供許多封裝函數和相關例子,我們可以根據其中的例子並進行修改即可實現我們自己需要的usb通訊程序。  1.usb描述符配置  從上面的講述可以看出,usb描述符是usb通訊的前提。
  • 基於STM32的USB設計 (單片機程序篇)
    下面具體從usb的中斷輸入輸出來講述基於keil C mdk開發環境的stm32的USB接口單片機程序設計。值得一提的是,st或相關公司給我們提供許多封裝函數和相關例子,我們可以根據其中的例子並進行修改即可實現我們自己需要的usb通訊程序。1.usb描述符配置從上面的講述可以看出,usb描述符是usb通訊的前提。主機必須先了解設備後才能與其進行通訊。
  • 關於stm32通信協議:軟體模擬SPI、軟體模擬I2C的總結
    趁著幫老師代上嵌入式實驗課的機會,又重新熟悉了一遍stm32的通信協議:串口協議、SPI協議、I2C協議、RS485協議。大概半年前,是過了一遍的,但也只停留於讀了遍代碼,跑了下例程,最近又過了一遍(自己仔細的看了一遍,老師還給我們講了一遍,自己又講了一遍),然後還寫了一遍軟體模擬SPI、軟體模擬I2C的代碼,才徹底的懂了個皮毛 ,:)。
  • STM32複習三:什麼是埠復用和埠重映射?
    我們可以查詢stm32的數據手冊,可以了解具體I/O口可以復用為什麼功能引腳。可參考stm32中文參考手冊8.1.11外設GPIO配置:TIM3舉例配置過程:1、 使能GPIO時鐘;2、 使能功能外設時鐘;3、 使能AFIO時鐘;4、 開啟重映射:GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);總結
  • ucosii在stm32上的移植詳解1
    雖然目前網上已經有不少關於ucosii在stm32上的移植版本,包括micrium也有官方移植版本。但這些版本具體是怎麼移植出來的,又該怎麼基於移植好的ucosii開發應用軟體,網上介紹的並不多。這裡介紹一下我的移植經歷,希望對大家有所幫助。 我的移植基本上是從零開始的。
  • 技術培訓 | STM32MP1產品入門與異構多核通信開發
    STM32MP1異構多核通信開發與調試應用基於STM32MP157C-DK2+ STM32CubeMX+STM32 CubeProgrammer+ SW4 STM32環境搭建為了保證實驗課程的順利進行,請根據選用的作業系統,事先安裝下列軟體相應的版本
  • Ubuntu系統下安裝stm32官方開發工具STM32CubeIDE
    大家好,遊學電子科技為您帶來:Ubuntu系統下安裝stm32官方開發工具STM32CubeIDE。STM32CubeIDE是st意法官方提供的stm32開發工具,這款工具在編譯速度上具有比較高的優勢,尤其是跟keil5相比真是沒得說。
  • STM32關於GPIO的問題
    問:stm32中GPIO口的最大輸出速度如何理解?答:1、是這樣的,2M、10M和50M是指GPIO口的採樣頻率。不知這樣理解對不對,我就是這樣做的。 2、我通過PB6採集80KBPS/S的方波,通過中斷計採集,完全勝任。9、STM32 GPIO 弱上拉能做輸入輸出嗎問:STM32 GPIO 弱上拉能做輸入輸出嗎?答:32隻有上拉輸入,用在外部連接的是下路輸出的,這樣才能正確讀取。
  • stm32通過spi連接esp8266的hspi 開發
    剛剛做了stm32通過spi連接esp8266的開發,目前已經解決了遇到的大多數問題,基本可以交付使用了,寫一篇文章留作記錄,也可以給以後做這個的朋友做為參考。1,stm32 spi驅動開發我使用了stm32的標準庫,並沒用hal庫,因為之前stm32的大部分其它的程序用的都是標準庫開發的,所以沒有改為hal庫。對於spi協議,可以參考另外的文檔,我已經將其傳到了CSDN上可以到我的CSDN的資源頁中下載。如果下載不到可以email 聯繫我,abc_123_ok at 163.com。
  • 基於手勢識別技術的智能電視遙控系統
    6圖像收集和處理基於stm32高位單片機通過軟體編程設置OV5640攝像頭內部參數果集圖像,並將採集到的圖像轉換為數位訊號存儲。項目可行性分析隨著人機互動技術的發展,人與設備之間的交互體驗越發簡單和自然。
  • stm32為什麼短短幾年就佔領了單片機的大半江山?來了解一下
    大學教材也是以51來入門,雖然此時Atmel系列51單片機已經不太常見了,但國產51任佔據著90%的國內51市場,可謂是51單片機經久不衰,低端8位機市場基本不可替代,經得住了歷史的考驗,當時8位機還有avr,16位機有msp430,其他廠家單片機還有pic,高端嵌入式處理器等市場有arm7,arm9等,各種單片機都「安分守己,各守其位,一片祥和」,可是到了14年,當我再次進行單片機開發的時候,發展stm32
  • STM32cubeMX 基於stm32的定時器實現定時1秒LED閃爍
    LED1_GPIO_Port,LED1_Pin);        HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);    }}/* USER CODE END 1 */ 關鍵字:STM32cubeMX  stm32
  • stm32與pic單片機比較_哪個好
    其基於專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M內核,同時具有一流的外設:1μs的雙12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表現,當然和MSP430的功耗比起來是稍微遜色的一些,但這並不影響工程師們對它的熱捧程度,由於其簡單的結構和易用的工具再配合其強大的功能在行業中赫赫有名…其強大的功能主要表現在:
  • stm32mp157開發板入門使用教程
    《第四章 開發板板載功能測試》第二章 100ask_stm32mp157開發板簡介2.1 100ask_stm32mp157 全功能開發板硬體資源簡介2.2 100ask_stm32mp157Buildroot基於 Buildroot 2020.02 LTS,針對 100ask_stm32mp157 開發板進行適配,增加 busybox systemV systemD 系統服務支持,讓系統啟動速度更快,系統鏡像更小,並在裡面加入各種常用軟體包等工具
  • 吃透單片機編程軟體,IAR單片機編程軟體創建stm32工程
    本文中,將為大家講解IAR單片機編程軟體建立stm32工程的詳細方法,希望大家通過本文能夠有所收穫哦。版本1:stm32是一個當下非常流行的微控制器,很多人都加入了學習stm32的行列中,常用的stm32編譯器有IAR和mdk兩種,接下來是利用stm32固件庫3.5在IAR下的建立的工程模板歷程:1、在常用的文件夾下新建立一個文件夾,根據個人喜好,分別建立如下幾個文件夾,用於分別存放固件庫中的文件和用戶自己的文件。
  • IAR STM32 函數和變量的絕對地址定位
    經過查找資料和反覆實驗,終於實現了,現總結如下:1) 把函數定位在FLASH高端的指定位置,以後更新,只更新那小塊地方就可以了。方法一: IAR裡面進行函數定位, 必須要在.icf裡面,進行定義。## ## Output file=E:\stm32\software4.45.2\Debug\Exe\software.out ## Map file =E:\stm32\software4.45.2\Debug\List\software.map ## Command line =E:\stm32\software4.45.2