OV7670 STM32驱动 YUYV格式调试总结
前言
單片機只有能夠看見世界,才能真正的走向智能化,所以,用單片機驅動攝像頭很有必要。而在攝像頭當中,OV7670是比較經典的一款。
硬件準備
1 .STM32開發板;
2. OV7670模塊;
OV7670基礎知識
驅動源程序直接用某點原子的挺好,這里就不貼出來了。
1、存儲(OV7670往FIFO中寫數據)
戰艦OV7670模塊存儲圖像數據的過程為:main_等待OV767同步信號->main_幀同步信號觸發中斷->exti_FIFO寫指針復位->exti_FIFO寫使能->main_等待第二個同步信號(如果第一幀還沒處理完第二幀中斷到來則FIFO寫禁止)
之后攝像頭傳感器會自動快速存儲像素到FIFO
2、讀取(MCU從FIFO中讀取數據)
讀取過程:FIFO讀指針復位->給FIFO讀時鐘(FIFO RCLK)->讀取第一個像素高字節->給FIFO讀時鐘(FIFO RCLK)->讀取第一個像素低字節->給FIFO讀時鐘(FIFO RCLK)->讀取第二個像素高字節->循環讀取剩余像素->將所有像素值依次顯示在LCD上或存儲在數組里面
關于數據量,比如QVGA模式,RGB565格式,我們總共循環讀取3202402次,讀取一幀數據
然后FIFO就會按照從上到下,從左到右的順序依次輸出像素
調試記錄
1.配置灰度輸出遇到的問題以及解決辦法
在寄存器配置上,在正點原子代碼基礎上,更改寄存器配置
直接添加在OV7670.config文件末尾就行,就會得到YUYV格式的輸出,每個像素會傳來兩個字節,只要高字節,第2,4,6等字節直接扔掉不要,然后為了在LCD上得到顯示結果,需要將256灰度轉化為RGB565而在LCD上顯示,綜合代碼如下
OV7670_RCK_L;color=GPIOC->IDR&0XFF; //讀數據OV7670_RCK_H; color<<=8; OV7670_RCK_L;//color|=GPIOC->IDR&0XFF; //讀數據OV7670_RCK_H; color_r = color&0xf800;color_b = color>>11;color_g =(color>>5)&0x07e0; LCD->LCD_RAM= color_r + color_g + color_b;接下來會發現還有問題,那就是屏幕碎片化,閃動嚴重,原因有二:
第一是因為在正點原子代碼上有"FIFO"還沒有寫入完畢而提前被LCD讀取完了,LCD后半截時有時無,就造成了比較大但范圍又相似的抖動,正點原子代碼如下:
應該更正為:
if(ov_sta==0){ OV7670_WREN=1; //允許寫入FIFOOV7670_WRST=0; //復位寫指針 OV7670_WRST=1; ov_sta++; }else {OV7670_WREN=0; //禁止寫入FIFO OV7670_WRST=0; //復位寫指針 OV7670_WRST=1; }第二會發現屏幕有很多毛刺尖銳閃動,是因為屏幕刷新率太高,這是源代碼:
while(1)OV7670_camera_refresh();但是應該人為的減慢這個速度或者固定下來,比如改為10幀的刷新率,改進后的代碼為:
while(1){ delay_ms(100);OV7670_camera_refresh(); //更新顯示}LCD上的顯示完美輸出
總結
這種點對點的攝像頭,并不適合入門,資金充裕的話建議入手openmv,又快又方便。
總結
以上是生活随笔為你收集整理的OV7670 STM32驱动 YUYV格式调试总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: three.js 03-03 之 Spo
- 下一篇: SpringMVC相关面试题