找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4078|回复: 3
收起左侧

死磕到底—STM32F103驱动无FIFO无时钟ov7670

  [复制链接]
ID:716413 发表于 2020-6-21 15:28 | 显示全部楼层 |阅读模式
一、摄像头一定要提供时钟,我用定时器产生两个频率的时钟
      1、18M供初始化用,我反复试验我的这个摄像头,12M不能工作,18M到24M都行。
void XCLK_Output_ON(void
{
   // 利用TIM3_CH2在PA7上为摄像头XCLK提供18MHz的时钟        12M不行
        
  RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
  //AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_1;  //设置TIM3_CH2部分重映射到PB5上不映射就在PA7。
  //GPIOB->CRL = (GPIOB->CRL & 0xff0fffff) | 0xb00000; // PB5设为复用推挽输出
  GPIOA->CRL = (GPIOA->CRL & 0x0fffffff) | 0xb0000000; // PA7设为复用推挽输出
        
  TIM3->ARR = 3; // 72MHz/(3+1)=18MHz (5+1=12M)
  TIM3->PSC = 0; // 不分频
  TIM3->EGR = TIM_EGR_UG;

  TIM3->CCR2 = 1; // 决定占空比
  TIM3->CCMR1 = TIM_CCMR1_OC2M; // PWM2模式
  TIM3->CCER = TIM_CCER_CC2E; // 打开输出比较
  TIM3->CR1 = TIM_CR1_CEN; // 打开定时器
}        

   2、摄像头工作用时钟,当然低点好,但是72M/26=2.76M不稳定,再低就不能工作,用72M/25=2.88M
void XCLK_Output_ON8(void) // 关定时器
{        
   // 利用TIM3_CH2在PA7上为摄像头XCLK提供2.88MHz的时钟        取数用
                TIM3->CR1 = TIM_CR1_UDIS ; // 关定时器
        
  RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
  //AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_1;  //设置TIM3_CH2部分重映射到PB5上不映射就在PA7。
  //GPIOB->CRL = (GPIOB->CRL & 0xff0fffff) | 0xb00000; // PB5设为复用推挽输出
  GPIOA->CRL = (GPIOA->CRL & 0x0fffffff) | 0xb0000000; // PA7设为复用推挽输出
        
  TIM3->ARR = 24; // 72MHz/(24+1) =
  TIM3->PSC = 0; // 分频(72/9/8)=1
  TIM3->EGR = TIM_EGR_UG;

  TIM3->CCR2 = 1; // 决定占空比
  TIM3->CCMR1 = TIM_CCMR1_OC2M; // PWM2模式
  TIM3->CCER = TIM_CCER_CC2E; // 打开输出比较
  TIM3->CR1 = TIM_CR1_CEN; // 打开定时器
}


二、摄像头取数据是关键,越快越好,我把无关的都减掉,可移动的语句移到前边去,
      本来要取连续的两个数,我也只取一个,只能得到一个红色的图像。

while(1){
                while(OV7670_VSYNC==0);//
                while(OV7670_VSYNC==1);//                只有在VSYNC为低时,才传输数据
                          GPIOB->CRL=0X88888888; //上拉下拉输入        GPIOB
        
                for(i=0;i<240;i++)               
                {
                        while(OV7670_HREF==0);
                        for(j=0;j<320;j++)
                        {                                 
                          // GPIOB->CRL=0X88888888; //上拉下拉输入
                                while(OV7670_PCLK==0);                        
                                color=OV7670_DATA;                //读数据
                                //while(OV7670_PCLK==1);
                                color<<=8;
                                color &=0xf800;
                           //while(OV7670_PCLK==0);   
                          //color|=OV7670_DATA;                //读数据               
                           //while(OV7670_PCLK==1);
                                // GPIOB->CRL=0X33333333;                //推挽输出50M                                          
                        LCD_WriteData_Color(color);
                         }         
                 }                                          
  }

     这部分在MAIN文件中,这个文件二级优化,可以加快速度。我的开发板显示二级优化会出问题,所以只优化这个文件。
     我也是在优化后才建立的信心。
    编译,运行,图像出来了,红色的,数据还有些错误,大概是个影子吧。
   贴上整个项目,欢迎大家交流!
pzOV7670.7z (534.39 KB, 下载次数: 128)

评分

参与人数 2黑币 +80 收起 理由
残...月 + 30 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:716413 发表于 2020-6-21 17:45 | 显示全部楼层
摄像头设置为2分频,就容易处理了
回复

使用道具 举报

ID:970326 发表于 2021-10-9 17:31 | 显示全部楼层
目前还没学到这么高级的呢,等能力再提升提升再来看。
回复

使用道具 举报

ID:970600 发表于 2021-10-10 18:23 | 显示全部楼层
请问怎么把数据传到PC端
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表