stm32(SCCB)+ov7670摄像头输出图像程序

这篇具有很好参考价值的文章主要介绍了stm32(SCCB)+ov7670摄像头输出图像程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介:  

OV7670一般模块指低成本数字输出CMOS摄像头,其摄像头包含30w像素的CMOS图像感光芯片,3.6mm焦距的镜头和镜头座,板载CMOS芯片所需要的各种不同电源(电源要求详见芯片的数据文件),板子同时引出控制管脚和数据管脚,方便操作和使用。

sccb接口,单片机,stm32,嵌入式硬件,c++,c语言

二、管脚定义

3V3-----输入电源电压(推荐使用3.3,5V也可,但不推荐) 

GDN-----接地点 

SIO_C---SCCB接口的控制时钟(注意:部分低级单片机需要上拉控制,和I2C接口类似) SIO_D---SCCB接口的串行数据输入(出)端(注意:部分低级单片机需要上拉控制,和I2C接口类似) 

VSYNC---帧同步信号(输出信号) 

HREF----行同步信号(输出信号) 

PCLK----像素时钟(输出信号) 

XCLCK---时钟信号(输入信号,时钟速度可以高达24M) 

D0-D7---数据端口(输出信号) 

RESTE---复位端口(正常使用拉高) 

PWDN----功耗选择模式(正常使用拉低) 

三、SCCB通讯时序

其作用是设置芯片内部寄存器,以控制图像的各种所需功能。其时序和一般的I2C时序相似,部分低级单片机要接上拉电阻。

行输出时序 

行输出时序可用来控制一行像素的输出情况,HREF即一行输出的开始和结束信号,同时在像素时钟的同步下,输出8位的像素信号行输出时序图:

sccb接口,单片机,stm32,嵌入式硬件,c++,c语言

全帧输出下的时序情况: 

该图显示的是一副图像输出的情况下,各控制信号和数据信号的输出。图中,VGA=640X480大小情况下,帧同步信号,行同步信号(HREF或 者HSYNC,注:HSYNC在其它场合下使用,CMOS可以设置,更多时候用HREF即可)如图:

sccb接口,单片机,stm32,嵌入式硬件,c++,c语言

//ov7670.c

void CLK_init_ON(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ; 
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    RCC_MCOConfig(RCC_MCO_HSE  );//hsi
}
void CLK_init_OFF(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void OV7670_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  0X0BFF;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_AF_OD  GPIO_Mode_AF_PP GPIO_Mode_IPU    GPIO_Mode_IN_FLOATING   
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void OV7670_GPIO_CONTRL_CONFIG(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = LCD_HREF_BIT|LCD_VSYNC_BIT|LCD_PCLK_BIT;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    RCC_MCOConfig(RCC_MCO_HSE  );//hsi
}

//功能:写OV7670寄存器
//返回:1-成功    0-失败
unsigned char wrOV7670Reg(unsigned char regID, unsigned char regDat)
{
    startSCCB();
    if(0==SCCBwriteByte(0x42))
    {
        stopSCCB();
        return(0);
    }
    delay_us(100);
      if(0==SCCBwriteByte(regID))
    {
        stopSCCB();
        return(0);
    }
    delay_us(100);
      if(0==SCCBwriteByte(regDat))
    {
        stopSCCB();
        return(0);
    }
      stopSCCB();
    
      return(1);
}

//功能:读OV7670寄存器
//返回:1-成功    0-失败
unsigned char rdOV7670Reg(unsigned char regID, unsigned char *regDat)
{
    //通过写操作设置寄存器地址
    startSCCB();
    if(0==SCCBwriteByte(0x42))
    {
        stopSCCB();
        return(0);
    }
    delay_us(100);
      if(0==SCCBwriteByte(regID))
    {
        stopSCCB();
        return(0);
    }
    stopSCCB();
    
    delay_us(100);
    
    //设置寄存器地址后,才是读
    startSCCB();
    if(0==SCCBwriteByte(0x43))
    {
        stopSCCB();
        return(0);
    }
    delay_us(100);
      *regDat=SCCBreadByte();
      noAck();
      stopSCCB();
      return(1);
}
//(140,16,640,480) is good for VGA
//(272,16,320,240) is good for QVGA
/* config_OV7670_window */
void OV7670_config_window(unsigned int startx,unsigned int starty,unsigned int width, unsigned int height)
{
    unsigned int endx;
    unsigned int endy;// "v*2"必须
    unsigned char temp_reg1, temp_reg2;
    unsigned char temp=0;
    endx=(startx+width);
    endy=(starty+height+height);// "v*2"必须
        rdOV7670Reg(0x03, &temp_reg1 );
    temp_reg1 &= 0xf0;
    rdOV7670Reg(0x32, &temp_reg2 );
    temp_reg2 &= 0xc0;
    // Horizontal
    temp = temp_reg2|((endx&0x7)<<3)|(startx&0x7);
    wrOV7670Reg(0x32, temp );
    temp = (startx&0x7F8)>>3;
    wrOV7670Reg(0x17, temp );
    temp = (endx&0x7F8)>>3;
    wrOV7670Reg(0x18, temp );
    // Vertical
    temp =temp_reg1|((endy&0x3)<<2)|(starty&0x3);
    wrOV7670Reg(0x03, temp );
    temp = starty>>2;
    wrOV7670Reg(0x19, temp );
    temp = endy>>2;
    wrOV7670Reg(0x1A, temp );
}

set_OV7670reg(void)
{
    wrOV7670Reg(0x8c, 0x00);
    wrOV7670Reg(0x3a, 0x04);
    wrOV7670Reg(0x40, 0xd0);
    wrOV7670Reg(0x8c, 0x00);
    wrOV7670Reg(0x12, 0x14);
    wrOV7670Reg(0x32, 0x80);
    wrOV7670Reg(0x17, 0x16);
    wrOV7670Reg(0x18, 0x04);
    wrOV7670Reg(0x19, 0x02);
    wrOV7670Reg(0x1a, 0x7b);
    wrOV7670Reg(0x03, 0x06);
    wrOV7670Reg(0x0c, 0x04);
    wrOV7670Reg(0x3e, 0x00);
    wrOV7670Reg(0x70, 0x3a);
    wrOV7670Reg(0x71, 0x35); 
    wrOV7670Reg(0x72, 0x11); 
    wrOV7670Reg(0x73, 0x00);
    wrOV7670Reg(0xa2, 0x00);
    wrOV7670Reg(0x11, 0xff); 
    //wrOV7670Reg(0x15 , 0x31);
    wrOV7670Reg(0x7a, 0x20); 
    wrOV7670Reg(0x7b, 0x1c); 
    wrOV7670Reg(0x7c, 0x28); 
    wrOV7670Reg(0x7d, 0x3c);
    wrOV7670Reg(0x7e, 0x55); 
    wrOV7670Reg(0x7f, 0x68); 
    wrOV7670Reg(0x80, 0x76);
    wrOV7670Reg(0x81, 0x80); 
    wrOV7670Reg(0x82, 0x88);
    wrOV7670Reg(0x83, 0x8f);
    wrOV7670Reg(0x84, 0x96); 
    wrOV7670Reg(0x85, 0xa3);
    wrOV7670Reg(0x86, 0xaf);
    wrOV7670Reg(0x87, 0xc4); 
    wrOV7670Reg(0x88, 0xd7);
    wrOV7670Reg(0x89, 0xe8);
     
    wrOV7670Reg(0x32,0xb6);
    
    wrOV7670Reg(0x13, 0xff); 
    wrOV7670Reg(0x00, 0x00);
    wrOV7670Reg(0x10, 0x00);
    wrOV7670Reg(0x0d, 0x00);
    wrOV7670Reg(0x14, 0x4e);
    wrOV7670Reg(0xa5, 0x05);
    wrOV7670Reg(0xab, 0x07); 
    wrOV7670Reg(0x24, 0x75);
    wrOV7670Reg(0x25, 0x63);
    wrOV7670Reg(0x26, 0xA5);
    wrOV7670Reg(0x9f, 0x78);
    wrOV7670Reg(0xa0, 0x68);
//    wrOV7670Reg(0xa1, 0x03);//0x0b,
    wrOV7670Reg(0xa6, 0xdf);
    wrOV7670Reg(0xa7, 0xdf);
    wrOV7670Reg(0xa8, 0xf0); 
    wrOV7670Reg(0xa9, 0x90); 
    wrOV7670Reg(0xaa, 0x94); 
    //wrOV7670Reg(0x13, 0xe5); 
    wrOV7670Reg(0x0e, 0x61);
    wrOV7670Reg(0x0f, 0x43);
    wrOV7670Reg(0x16, 0x02); 
    wrOV7670Reg(0x1e, 0x37);
    wrOV7670Reg(0x21, 0x02);
    wrOV7670Reg(0x22, 0x91);
    wrOV7670Reg(0x29, 0x07);
    wrOV7670Reg(0x33, 0x0b);
    wrOV7670Reg(0x35, 0x0b);
    wrOV7670Reg(0x37, 0x3f);
    wrOV7670Reg(0x38, 0x01);
    wrOV7670Reg(0x39, 0x00);
    wrOV7670Reg(0x3c, 0x78);
    wrOV7670Reg(0x4d, 0x40);
    wrOV7670Reg(0x4e, 0x20);
    wrOV7670Reg(0x69, 0x00);
    wrOV7670Reg(0x6b, 0x4a);
    wrOV7670Reg(0x74, 0x19);
    wrOV7670Reg(0x8d, 0x4f);
    wrOV7670Reg(0x8e, 0x00);
    wrOV7670Reg(0x8f, 0x00);
    wrOV7670Reg(0x90, 0x00);
    wrOV7670Reg(0x91, 0x00);
    wrOV7670Reg(0x92, 0x00);
    wrOV7670Reg(0x96, 0x00);
    wrOV7670Reg(0x9a, 0x80);
    wrOV7670Reg(0xb0, 0x84);
    wrOV7670Reg(0xb1, 0x0c);
    wrOV7670Reg(0xb2, 0x0e);
    wrOV7670Reg(0xb3, 0x82);
    wrOV7670Reg(0xb8, 0x0a);
    wrOV7670Reg(0x43, 0x14);
    wrOV7670Reg(0x44, 0xf0);
    wrOV7670Reg(0x45, 0x34);
    wrOV7670Reg(0x46, 0x58);
    wrOV7670Reg(0x47, 0x28);
    wrOV7670Reg(0x48, 0x3a);
    
    wrOV7670Reg(0x59, 0x88);
    wrOV7670Reg(0x5a, 0x88);
    wrOV7670Reg(0x5b, 0x44);
    wrOV7670Reg(0x5c, 0x67);
    wrOV7670Reg(0x5d, 0x49);
    wrOV7670Reg(0x5e, 0x0e);
    
    wrOV7670Reg(0x64, 0x04);
    wrOV7670Reg(0x65, 0x20);
    wrOV7670Reg(0x66, 0x05);

    wrOV7670Reg(0x94, 0x04);
    wrOV7670Reg(0x95, 0x08);     

    wrOV7670Reg(0x6c, 0x0a);
    wrOV7670Reg(0x6d, 0x55);
    wrOV7670Reg(0x6e, 0x11);
    wrOV7670Reg(0x6f, 0x9f); 

    wrOV7670Reg(0x6a, 0x40);
    wrOV7670Reg(0x01, 0x40);
    wrOV7670Reg(0x02, 0x40);
    
    //wrOV7670Reg(0x13, 0xe7);
    wrOV7670Reg(0x15, 0x00);
    wrOV7670Reg(0x4f, 0x80);
    wrOV7670Reg(0x50, 0x80);
    wrOV7670Reg(0x51, 0x00);
    wrOV7670Reg(0x52, 0x22);
    wrOV7670Reg(0x53, 0x5e);
    wrOV7670Reg(0x54, 0x80);
    wrOV7670Reg(0x58, 0x9e);

    wrOV7670Reg(0x41, 0x08);
    wrOV7670Reg(0x3f, 0x00);
    wrOV7670Reg(0x75, 0x05);
    wrOV7670Reg(0x76, 0xe1);

    wrOV7670Reg(0x4c, 0x00);
    wrOV7670Reg(0x77, 0x01);
    
    wrOV7670Reg(0x3d, 0xc1);
    wrOV7670Reg(0x4b, 0x09);
    wrOV7670Reg(0xc9, 0x60);
    //wrOV7670Reg(0x41, 0x38);    
    wrOV7670Reg(0x56, 0x40);
    wrOV7670Reg(0x34, 0x11);
    wrOV7670Reg(0x3b, 0x02);
    wrOV7670Reg(0xa4, 0x89);
    
    wrOV7670Reg(0x96, 0x00);
    wrOV7670Reg(0x97, 0x30);
    wrOV7670Reg(0x98, 0x20);
    wrOV7670Reg(0x99, 0x30);
    wrOV7670Reg(0x9a, 0x84);
    wrOV7670Reg(0x9b, 0x29);
    wrOV7670Reg(0x9c, 0x03);
    wrOV7670Reg(0x9d, 0x4c);
    wrOV7670Reg(0x9e, 0x3f);    

    wrOV7670Reg(0x09, 0x00);
    wrOV7670Reg(0x3b, 0xc2);

}

/* OV7670_init() */
//返回1成功,返回0失败
unsigned char OV7670_init(void)
{
    unsigned char temp;    
    unsigned int i=0;

    OV7670_GPIO_Init();
    OV7670_GPIO_CONTRL_CONFIG();
    SCCB_GPIO_Config(); // io init..

    CLK_init_ON();
    temp=0x80;
    if(0==wrOV7670Reg(0x12, temp)) //Reset SCCB
    {
        return 0 ;
    }
    delay_ms(100);
      set_OV7670reg();  OV7670_config_window(272,12,320,240);// set 240*320
    return 0x01; //ok              

//main.c

    while(1!=OV7670_init());    
    while(1) 
    {
        TimerCnt = 0;
        temp7670 = 0;
        CLK_init_ON(); // OV7670 XCLK 开
        while(value & 0x0800)    value = GPIOC->IDR;   // Vsync=H    
        while((~value) & 0x0800) value = GPIOC->IDR;   // Vhync=L 
        CLK_init_OFF(); //OV7670 XCLK 关
        while(TimerCnt < 76800)
        {
            XCLK_L; 
            XCLK_H;
            value = GPIOC->IDR;
            temp7670 ++;
            if(value & 0x0100) // HREF = H ||(LCD_PCLK_STATE)
            {   
               if((temp7670 == 1))// 高字节||(value & 0x0200) ||(LCD_PCLK_STATE) 
                {
                      val1=value& 0x00ff;

                }
                else // 低字节     if((temp7670 != 1)||(LCD_PCLK_STATE))  
                {
                       val2= value<<8  ;      //
            val =ili9320_BGR2RGB(val1|val2);
                    temp7670 = 0;
                    LCD_WriteRAM(val); //TFT GRAM 数据
                    TimerCnt ++;
                }
            } 
        
                
        }
  }  文章来源地址https://www.toymoban.com/news/detail-638189.html

到了这里,关于stm32(SCCB)+ov7670摄像头输出图像程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32连接OV2640摄像头串口方式在PyQt5界面上展示视频界面 以及使用MQTT方式进行展示

    STM32连接OV2640 视频源接入到PyQt5界面中 作为AI模型的输入,视频流是非常重要的。在本文中,我们将介绍如何将STM32连接到OV2640摄像头,并将视频流接入到PyQt5界面中。 硬件连接 首先,我们需要将OV2640摄像头连接到STM32上。我们可以使用以下连接方式: OV2640 | STM32 ------|------

    2024年02月06日
    浏览(56)
  • OV5640 摄像头的图像拉普拉斯锐化处理和边缘提取

    如图所示,这是整个视频采集系统的原理框图。         上电初始,FPGA 需要通过 IIC 接口对 CMOS Sensor 进行寄存器初始化配置。这些初始化的基本参数,即初始化地址对应的初始化数据都存储在一个预先配置好的 FPGA 片内 ROM中。在初始化配置完成后,CMOS Sensor 就能够持续

    2024年02月01日
    浏览(53)
  • AX7A200教程(9): ov5640摄像头输出显示720p视频

    ov5640摄像头视频通过ddr3缓存后,最后使用hdmi接口进行输出显示 2.1,像头硬件管脚 如下图所示,一共18个管脚 2.2,摄像头电源初始化时序 因这个ov5640摄像头是买的老摄像头,所以需要对Reset和PWDN的电源上电进行控制,控制时序如下图所示。 2.3,电源初始化程序 其中cmos_pwd

    2024年01月23日
    浏览(57)
  • 33、基于STM32单片机车牌识别系统摄像头图像处理系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、程序源码 七、资料包括 随着汽车工业的迅猛发展,我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展,

    2024年02月15日
    浏览(41)
  • 76、基于STM32单片机车牌识别摄像头图像处理扫描设计(程序+原理图+PCB源文件+相关资料+参考PPT+元器件清单等)

    单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。其片内的4K程序存储器是FLASH工艺的,这种单

    2024年02月12日
    浏览(53)
  • 【FPGA】摄像头模块OV5640

    开发板:正点原子的达芬奇开发板(或MicroPhase的Z7-Lite 7020开发板) FPGA型号:XC7A35TFGG484-2(或XC7Z020CLG400-2) Vivado版本:2020.2 参考课程链接:正点原子手把手教你学FPGA-基于达芬奇开发板 A7 OV5640模块:正点原子ATK-OV5640   OV5640是OV(OMNIVISION)公司设计的一款CMOS图像传感器,

    2024年03月21日
    浏览(47)
  • RK3568-android11-适配ov13850摄像头

    参考链接 相关概念 相关接口 相关协议 图像格式

    2024年02月09日
    浏览(74)
  • RK3568驱动OV13850摄像头模组调试过程

    品牌:Omnivision 型号:CMK-OV13850 接口: MIPI 像素:1320W OV13850彩色图像传感器是一款低电压、高性能1/3.06英寸1320万像素 CMOS图像传感器 ,使用OmniBSI+?技术提供了单-1320万像素(4224×3136)摄像头的功能。通过串行摄像头控制总线(SCCB)接口的控制,它提供了全帧、下采样、开窗的

    2023年04月27日
    浏览(53)
  • FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议

    目录        前言 OV7725引脚及功能框图 参数指标 引脚 功能框图 SCCB时序及读写操作  SCCB时序特点 读写实现 OV7725寄存器常用配置参数              摄像头采集是图像处理的第一步,本章节分为多部分,旨在让大家学会如何使用OV7725采集图像,并且使用VGA协议显示出来。

    2023年04月08日
    浏览(54)
  • 基于RK3399 Android11适配OV13850 MIPI摄像头

      从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤MCLK使用的是GPIO3_B7 ⑥需要保证红色框框的供电电源正常。   结合RK提供的文档,如下摄像头数据采集拓扑图所示,我们

    2024年03月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包