一、摄像头一定要提供时钟,我用定时器产生两个频率的时钟
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)
|