久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17764|回復: 34
打印 上一主題 下一主題
收起左側

STM32驅動攝像頭ov7670源程序

  [復制鏈接]
跳轉到指定樓層
樓主

本攝像頭ov7670驅動程序已經通過本人的驗證可以正常運行,不同的stm32開發板只需要修改引腳即可使用,所有內容打包下載:
stm32驅動攝像頭ov7670源程序.7z (380.01 KB, 下載次數: 637)

下面是部分源碼預覽:
  1. /*
  2. wangguanfu@163.com
  3. 未經過本人許可禁止任何商業用途
  4. */

  5. #include "Sensor.h"
  6. #include "delay.h"
  7. #include "Sensor_config.h"
  8. #include "stm32f10x.h"
  9. extern const char OV7670_reg[OV7670_REG_NUM][2];

  10. ////////////////////////////
  11. //功能:提供時鐘
  12. //guanfu_wang
  13. /*
  14. void XCLK_init_ON(void)//沒有用到的函數
  15. {
  16.   
  17.     GPIO_InitTypeDef GPIO_InitStructure;
  18.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  20.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;
  22.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  23.     RCC_MCOConfig(RCC_MCO_HSE  );//hsi
  24. }
  25. */
  26. /////////////////////////////
  27. //VSYNC GPIO INIT
  28. //guanfu_wang
  29. void Sensor_GPIO_Init(void)//
  30. {
  31.   
  32.   GPIO_InitTypeDef GPIO_InitStructure;
  33.    // Enable GPIOC  clock
  34.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  35.   GPIO_InitStructure.GPIO_Pin =  Sensor_VSYNC_BIT;
  36.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;////上拉
  37.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.   GPIO_Init(GPIOC, &GPIO_InitStructure);

  39. }

  40. //////////////////////////////////////////////////
  41. ////函數功能:中斷配制
  42. //guanfu_wang

  43. void Sensor_Interrupts_Config(void)//VSYNC 中斷
  44. {
  45.   NVIC_InitTypeDef NVIC_InitStructure;

  46.   


  47.   /* Configure one bit for preemption priority */
  48.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  49.   

  50.     /* Configure one bit for preemption priority */
  51.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  52.   
  53.   /* Enable the EXTI9_5 Interrupt */
  54.   NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  55.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  56.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  57.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  58.   NVIC_Init(&NVIC_InitStructure);
  59.   

  60.   

  61. }
  62. ////////////////////////////////////////////////////////////////////////
  63. void Sensor_EXTI_Config(void)//VSYNC 中斷
  64. {
  65.   EXTI_InitTypeDef EXTI_InitStructure;
  66.   

  67.   GPIO_EXTILineConfig(GPIO_PORT_SOURCE_VSYNC_CMOS, GPIO_PIN_SOURCE_VSYNC_CMOS);
  68.   EXTI_InitStructure.EXTI_Line = EXTI_LINE_VSYNC_CMOS;
  69.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  70.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  71.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  72.   EXTI_Init(&EXTI_InitStructure);
  73.   EXTI_GenerateSWInterrupt(EXTI_LINE_VSYNC_CMOS);

  74. }


  75. ///////////////////////////////////////////////////////////////////////////
  76. //功能:寫OV7660寄存器
  77. //返回:1-成功        0-失敗
  78. //guanfu_wang
  79. unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
  80. {
  81.                 startSCCB();//發送SCCB 總線開始傳輸命令
  82.         if(0==SCCBwriteByte(0x42))//寫地址
  83.         {
  84.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  85.                 return(0);//錯誤返回
  86.         }
  87.         delay_us(20);
  88.           if(0==SCCBwriteByte(regID))//積存器ID
  89.         {
  90.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  91.                 return(0);//錯誤返回
  92.         }
  93.         delay_us(20);
  94.           if(0==SCCBwriteByte(regDat))//寫數據到積存器
  95.         {
  96.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  97.                 return(0);//錯誤返回
  98.         }
  99.           stopSCCB();//發送SCCB 總線停止傳輸命令
  100.         
  101.           return(1);//成功返回
  102. }
  103. ////////////////////////////
  104. //功能:讀OV7660寄存器
  105. //返回:1-成功        0-失敗
  106. //guanfu_wang
  107. unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
  108. {
  109.         //通過寫操作設置寄存器地址
  110.         startSCCB();
  111.         if(0==SCCBwriteByte(0x42))//寫地址
  112.         {
  113.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  114.                 return(0);//錯誤返回
  115.         }
  116.         delay_us(20);
  117.           if(0==SCCBwriteByte(regID))//積存器ID
  118.         {
  119.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  120.                 return(0);//錯誤返回
  121.         }
  122.         stopSCCB();//發送SCCB 總線停止傳輸命令
  123.         
  124.         delay_us(20);
  125.         
  126.         //設置寄存器地址后,才是讀
  127.         startSCCB();
  128.         if(0==SCCBwriteByte(0x43))//讀地址
  129.         {
  130.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  131.                 return(0);//錯誤返回
  132.         }
  133.         delay_us(20);
  134.           *regDat=SCCBreadByte();//返回讀到的值
  135.           noAck();//發送NACK命令
  136.           stopSCCB();//發送SCCB 總線停止傳輸命令
  137.           return(1);//成功返回
  138. }




  139. /* Sensor_init() */
  140. //返回1成功,返回0失敗
  141. //guanfu_wang
  142. unsigned char Sensor_init(void)
  143. {
  144.         unsigned char temp;
  145.         
  146.         unsigned int i=0;
  147.    //      XCLK_init_ON();//開啟MCO功能 提供時鐘給CMOS傳感器
  148.         //uchar ovidmsb=0,ovidlsb=0;
  149.         Sensor_GPIO_Init();
  150.         SCCB_GPIO_Config();//io init..
  151.         
  152.         temp=0x80;
  153.         if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
  154.         {
  155.           return 0 ;//錯誤返回
  156.         }
  157.         Delay(1);
  158.         if(0==rd_Sensor_Reg(0x0b, &temp))//讀ID
  159.         {
  160.                 return 0 ;//錯誤返回
  161.         }
  162.       
  163.          if(temp==0x73)//OV7670
  164.          {
  165.            for(i=0;i<OV7670_REG_NUM;i++)
  166.            {
  167.                 if( 0==wr_Sensor_Reg(OV7670_reg[i][0],OV7670_reg[i][1]))
  168.                 {
  169.                         return 0;//錯誤返回
  170.                 }
  171.             }
  172.            
  173.           Sensor_EXTI_Config();
  174.           Sensor_Interrupts_Config();
  175.         }

  176.         return 0x01; //ok

  177.         
  178. }

  179. ///////////////////
復制代碼
  1. /*
  2. wangguanfu@163.com
  3. 未經過本人許可禁止任何商業用途
  4. */

  5. #include "sccb.h"
  6. #include "delay.h"
  7. #include "stm32f10x.h"
  8. /*
  9. -----------------------------------------------
  10.    功能: 初始化模擬SCCB接口
  11.    參數: 無
  12. 返回值: 無
  13. -----------------------------------------------
  14. */
  15. void SCCB_GPIO_Config(void)
  16. {
  17.   GPIO_InitTypeDef GPIO_InitStructure;
  18.    /* Enable GPIOC  clock */
  19.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  20.   GPIO_InitStructure.GPIO_Pin =  SCCB_SIC_BIT|SCCB_SID_BIT;
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  22.   GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
  23.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  24.   
  25. }
  26. void SCCB_SID_GPIO_OUTPUT(void)
  27. {
  28.   GPIO_InitTypeDef GPIO_InitStructure;
  29.    /* Enable GPIOC  clock */
  30.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  31.   GPIO_InitStructure.GPIO_Pin =  SCCB_SID_BIT;
  32.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  33.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  35. }
  36. void SCCB_SID_GPIO_INPUT(void)
  37. {
  38.   GPIO_InitTypeDef GPIO_InitStructure;
  39.    /* Enable GPIOC  clock */
  40.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  41.   GPIO_InitStructure.GPIO_Pin =  SCCB_SID_BIT;
  42.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉 若無外部上拉電阻 必須內部有上拉
  43.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  44.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  45. }

  46. /*
  47. -----------------------------------------------
  48.    功能: start命令,SCCB的起始信號
  49.    參數: 無
  50. 返回值: 無
  51. -----------------------------------------------
  52. */
  53. void startSCCB(void)
  54. {
  55.     SCCB_SID_H();     //數據線高電平
  56.     delay_us(50);

  57.     SCCB_SIC_H();           //在時鐘線高的時候數據線由高至低
  58.     delay_us(50);

  59.     SCCB_SID_L();
  60.     delay_us(50);

  61.     SCCB_SIC_L();         //數據線恢復低電平,單操作函數必要
  62.     delay_us(50);


  63. }
  64. /*
  65. -----------------------------------------------
  66.    功能: stop命令,SCCB的停止信號
  67.    參數: 無
  68. 返回值: 無
  69. -----------------------------------------------
  70. */
  71. void stopSCCB(void)
  72. {
  73.     SCCB_SID_L();
  74.     delay_us(50);

  75.     SCCB_SIC_H();        
  76.     delay_us(50);
  77.   

  78.     SCCB_SID_H();        
  79.     delay_us(50);
  80.    
  81. }

  82. /*
  83. -----------------------------------------------
  84.    功能: noAck,用于連續讀取中的最后一個結束周期
  85.    參數: 無
  86. 返回值: 無
  87. -----------------------------------------------
  88. */
  89. void noAck(void)
  90. {
  91.         
  92.         SCCB_SID_H();        
  93.         delay_us(50);
  94.         
  95.         SCCB_SIC_H();        
  96.         delay_us(50);
  97.         
  98.         SCCB_SIC_L();        
  99.         delay_us(50);
  100.         
  101.         SCCB_SID_L();        
  102.         delay_us(50);

  103. }

  104. /*
  105. -----------------------------------------------
  106.    功能: 寫入一個字節的數據到SCCB
  107.    參數: 寫入數據
  108. 返回值: 發送成功返回1,發送失敗返回0
  109. -----------------------------------------------
  110. */
  111. unsigned char SCCBwriteByte(unsigned char m_data)
  112. {
  113.         unsigned char j,tem;

  114.         for(j=0;j<8;j++) //循環8次發送數據
  115.         {
  116.                 if((m_data<<j)&0x80)
  117.                 {
  118.                         SCCB_SID_H();        
  119.                 }
  120.                 else
  121.                 {
  122.                         SCCB_SID_L();        
  123.                 }
  124.                 delay_us(50);
  125.                 SCCB_SIC_H();        
  126.                 delay_us(50);
  127.                 SCCB_SIC_L();        
  128.                 delay_us(2);

  129.         }
  130.         //delay_us(50);
  131.         SCCB_SID_IN;/*設置SDA為輸入*/
  132.         delay_us(10);
  133.         SCCB_SIC_H();        
  134.         delay_us(80);
  135.         if(SCCB_SID_STATE){tem=0;}   //SDA=1發送失敗,返回0}
  136.         else {tem=1;}   //SDA=0發送成功,返回1
  137.         SCCB_SIC_L();        
  138.         delay_us(50);        
  139.         SCCB_SID_OUT;/*設置SDA為輸出*/

  140.         return (tem);  
  141. }

  142. /*
  143. -----------------------------------------------
  144.    功能: 一個字節數據讀取并且返回
  145.    參數: 無
  146. 返回值: 讀取到的數據
  147. -----------------------------------------------
  148. */
  149. unsigned char SCCBreadByte(void)
  150. {
  151.         unsigned char read,j;
  152.         read=0x00;
  153.         
  154.         SCCB_SID_IN;/*設置SDA為輸入*/
  155.         delay_us(50);
  156.         for(j=8;j>0;j--) //循環8次接收數據
  157.         {                     
  158.                 //delay_us(100);
  159.                 SCCB_SIC_H();
  160.                 delay_us(50);
  161.                 read=read<<1;
  162.                 if(SCCB_SID_STATE)
  163.                 {
  164.                         read=read+1;
  165.                 }
  166.                 SCCB_SIC_L();
  167.                 delay_us(50);
  168.         }        
  169.         SCCB_SID_OUT;/*設置SDA為輸出*/
  170.         return(read);
  171. }
復制代碼

評分

參與人數 2黑幣 +10 收起 理由
sq524594846 + 5
Ayanami——Rei + 5 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏24 分享淘帖 頂8 踩
回復

使用道具 舉報

沙發
ID:169681 發表于 2017-3-10 16:50 | 只看該作者
這個資料來的太及時了!!
回復

使用道具 舉報

板凳
ID:184406 發表于 2017-3-29 15:59 | 只看該作者
這個資料很好,關于攝像頭的資料不多
回復

使用道具 舉報

地板
ID:201854 發表于 2017-5-17 16:54 | 只看該作者
不錯,謝謝分享了!!!!!
回復

使用道具 舉報

5#
ID:219592 發表于 2017-7-14 10:22 | 只看該作者
我想看看 但是積分不夠   
回復

使用道具 舉報

6#
ID:224495 發表于 2017-8-3 19:24 | 只看該作者
同積分不夠
回復

使用道具 舉報

7#
ID:224871 發表于 2017-8-5 03:52 | 只看該作者
SBBC.C中 SCCB_SID_L()的GPIOB->BRR這個是什么寄存器,在32手冊上無法找到,只在串口中才有BRR這個寄存器
回復

使用道具 舉報

8#
ID:194871 發表于 2017-8-5 12:08 | 只看該作者
謝謝樓主
回復

使用道具 舉報

9#
ID:225118 發表于 2017-8-6 09:40 | 只看該作者
好像學習啊
回復

使用道具 舉報

10#
ID:225449 發表于 2017-8-7 13:54 | 只看該作者
感謝,不過積分不夠啊
回復

使用道具 舉報

11#
ID:205446 發表于 2017-9-26 09:09 | 只看該作者
國內就少開源的精神
回復

使用道具 舉報

12#
ID:229527 發表于 2017-9-28 14:01 | 只看該作者
厲害了,值得學習!
回復

使用道具 舉報

13#
ID:235925 發表于 2017-9-28 21:08 | 只看該作者
這個資料很好,關于攝像頭的資料不多
回復

使用道具 舉報

14#
ID:241034 發表于 2017-10-19 19:18 | 只看該作者
非常好
回復

使用道具 舉報

15#
ID:241273 發表于 2017-10-20 15:14 | 只看該作者
這是不是正點原子的資料a
回復

使用道具 舉報

16#
ID:254958 發表于 2017-11-29 13:01 來自手機 | 只看該作者
好啊,非常有用
回復

使用道具 舉報

17#
ID:233062 發表于 2018-1-23 10:34 | 只看該作者
樓主你好,你用的攝像頭是自帶FIFO的OV7670嗎?
回復

使用道具 舉報

18#
ID:111339 發表于 2018-2-18 19:20 | 只看該作者
引腳是如何連接的呢?
回復

使用道具 舉報

19#
ID:68875 發表于 2018-2-19 00:18 | 只看該作者
good job!!!
回復

使用道具 舉報

20#
ID:284925 發表于 2018-2-23 11:38 | 只看該作者
想看,積分不夠
回復

使用道具 舉報

21#
ID:285281 發表于 2018-2-24 20:55 | 只看該作者
賺賺積分! 想看!
回復

使用道具 舉報

22#
ID:310833 發表于 2018-4-28 21:20 | 只看該作者
可不可以給個引腳連接?1371177469@qq.com
回復

使用道具 舉報

23#
ID:371712 發表于 2018-11-17 09:40 | 只看該作者
樓主這個攝像頭引腳是幾個,有直接以VCC GND RX TX 連出的串口攝像頭的嗎?直接以串口形式輸出
回復

使用道具 舉報

24#
ID:435355 發表于 2018-12-21 19:37 | 只看該作者
樓主用的攝像頭帶有fifo嗎
回復

使用道具 舉報

25#
ID:457096 發表于 2018-12-28 10:46 | 只看該作者
剛好要用這東西
回復

使用道具 舉報

26#
ID:267330 發表于 2019-1-23 08:42 | 只看該作者
這個資料很好,關于攝像頭的資料不多
回復

使用道具 舉報

27#
ID:271847 發表于 2019-5-12 23:42 | 只看該作者
謝謝,學習了
回復

使用道具 舉報

28#
ID:474606 發表于 2019-5-13 11:11 | 只看該作者
感謝樓主的熱心分享
回復

使用道具 舉報

29#
ID:317628 發表于 2019-5-16 16:21 | 只看該作者
資料已下載。等配件回來試試
回復

使用道具 舉報

30#
ID:515069 發表于 2019-7-18 16:52 | 只看該作者
絕世好帖
回復

使用道具 舉報

31#
ID:56665 發表于 2019-7-19 16:22 | 只看該作者
有原理圖就好了。
回復

使用道具 舉報

32#
ID:584195 發表于 2023-11-12 14:42 | 只看該作者
太感謝了,這個是基于普通IO接收的嗎?
回復

使用道具 舉報

33#
ID:1051190 發表于 2025-1-8 16:24 | 只看該作者
這個資料很好,關于攝像頭的資料不多。
回復

使用道具 舉報

34#
ID:1145041 發表于 2025-3-8 08:44 | 只看該作者
新手前來學習,感謝分享!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人一区二区 | 亚洲欧美一区二区三区国产精品 | 日本高清视频网站 | 黄色片在线网站 | www.日韩在线 | 日本激情视频中文字幕 | 亚洲午夜视频在线观看 | 成人免费片 | 国产三级一区二区 | 色婷婷av久久久久久久 | 国产高清免费 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 精品欧美一区免费观看α√ | 国产视频在线观看一区二区三区 | 一色桃子av一区二区 | 亚洲综合视频 | 国产亚洲精品久久午夜玫瑰园 | 久久久精品在线 | 精品影院 | 成人精品国产免费网站 | 久久av.com| 国产精品国产精品国产专区不卡 | 精品久久亚洲 | 亚洲国产精品日韩av不卡在线 | www成年人视频 | 免费h视频 | 久久精品一区 | 精品亚洲一区二区三区 | 国产精品99久久久久久www | 91久久精品一区二区二区 | 日韩在线视频一区 | 亚洲精品一区国语对白 | 熟女毛片 | 99国产精品99久久久久久 | 久久久精品久 | 一区二区在线不卡 | 欧美视频一区二区三区 | 麻豆av一区二区三区久久 | 国产精品美女一区二区 | 久久人爽爽人爽爽 | 欧洲一区二区三区 |