一、攝像頭一定要提供時鐘,我用定時器產生兩個頻率的時鐘
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)
2020-6-21 16:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|