我在用F103驱动OV2640采集图像后利用LCD进行显示,现在的问题是LCD显示的图像是花的,我用示波器测试OV2640的VSYNC信号,HREF信号和PCLK信号,如下图所示。OV2640的时钟由12MHz的有源晶振提供,最后,贴出部分代码,请问造成以上现象的原因是什么?
[mw_shl_code=c,true]#include "stm32f10x.h"
#include <stdio.h>
#include "SysTick.h"
#include "platform_config.h"
#include "lcd.h"
#include "ov2640.h"
#include "led.h"
#include "malloc.h"
#include "dma.h"
#include "string.h"
#define ov2640_JPEG_WITH 1024 // JPEG拍照的宽度
#define ov2640_JPEG_HEIGHT 768 // JPEG拍照的高度
u8 *ov2640_framebuf; // ov2640的帧缓存
u8 ov_framebuf = 0; // 拍照的帧数
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* ov2640的速度控制 */
// 根据LCD尺寸的不同,设置不同的参数
void ov2640_Speed_Ctrl(void)
{
u8 clkdiv; // 时钟分频系数
u8 pclkdiv; // PCLK分频系数
if(lcddev.width==240) // 2.8寸LCD
{
clkdiv = 1;
pclkdiv = 28;
}
else if(lcddev.width==320) // 3.5寸LCD
{
clkdiv = 3;
pclkdiv = 30;
}
else // 4.3寸和7寸LCD
{
clkdiv = 15;
pclkdiv = 4;
}
ov2640_WriteReg(0xff, 0x00);
ov2640_WriteReg(0xd3, pclkdiv); // 设置PCLK分频
ov2640_WriteReg(0xff, 0x01);
ov2640_WriteReg(0x11, clkdiv); // 设置XCLK分频
}
int main(void)
{
#ifdef DEBUG
debug();
#endif
u16 linecnt; // 行数统计
u16 pixcnt; // 像素统计
RCC_Configuration();
NVIC_Config(NVIC_PriorityGroup_2);
LED_Init();
SysTick_Init();
LCD_Init();
Delay_ms(100);
my_mem_init(SRAMIN);
ov2640_framebuf = mymalloc(SRAMIN, 40*1024); // 为ov2640申请帧缓存
while(!ov2640_framebuf)
{
LCD_ShowString(20,150,300,16,16,"Memory distributed error.");
}
while(ov2640_Init()!=0)
{
LCD_ShowString(20,100,300,16,16,"Camera initalize error.");
Delay_ms(1000);
LCD_Fill(0,0,239,319,WHITE);
Delay_ms(1000);
LCD_Fill(0,0,239,319,BLACK);
Delay_ms(1000);
LEDs_Blink(500);
}
LCD_ShowString(10,100,300,16,16,"Camera initalize successfully.");
ov2640_RGB565Config();
ov2640_Outsize_Set(lcddev.width, lcddev.height);
ov2640_Speed_Ctrl();
DMA_SRAMLCD_Init((u32)ov2640_framebuf);
while (1)
{
// LEDs_Run(200);
while(ov2640_VSYNC);
while(!ov2640_VSYNC)
{
LCD_SetCursor(0,0); // LCD设置坐标
LCD_WriteGRAM_Prepare(); // 开始写GRAM
linecnt = 0;
pixcnt = 0;
while(linecnt<lcddev.height)
{
while(ov2640_HREF)
{
while(ov2640_PCLK==0);
ov2640_framebuf[pixcnt++] = ov2640_DATA;
while(ov2640_PCLK==1);
while(ov2640_PCLK==0);
ov2640_framebuf[pixcnt++] = ov2640_DATA;
while(ov2640_PCLK==1);
}
if(pixcnt)
{
DMA_SRAMLCD_Enable(); // 启动DMA数据传输
pixcnt = 0;
linecnt++;
}
}
}
}//end while(1)
}//end main()
#ifdef DEBUG[/mw_shl_code]
PCLK波形图:
HREF波形图3:
HREF波形图2:
HREF波形图1:
VSYNC波形图:
LCD显示效果图:
|