OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2826|回复: 3

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

[复制链接]

17

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2020-5-8
在线时间
153 小时
发表于 2020-6-21 15:30:37 | 显示全部楼层 |阅读模式
死磕到底——STM32F103驱动无FIFO无时钟ov7670
一、摄像头一定要提供时钟,我用定时器产生两个频率的时钟
      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.zip (8.37 MB, 下载次数: 350)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8691
金钱
8691
注册时间
2020-5-11
在线时间
4183 小时
发表于 2020-6-21 16:03:46 | 显示全部楼层
加油,图像处理还是挺好玩的。
专治疑难杂症
回复 支持 反对

使用道具 举报

17

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2020-5-8
在线时间
153 小时
 楼主| 发表于 2020-6-21 17:44:20 | 显示全部楼层
LcwSwust 发表于 2020-6-21 16:03
加油,图像处理还是挺好玩的。

摄像头设置为2分频,就容易处理了
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-3-13
在线时间
24 小时
发表于 2020-6-23 21:02:06 | 显示全部楼层
老哥,跟你例程对不上啊。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 10:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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