一、硬件环境
STM32F429IGT6
4.3寸RGB屏幕800*480
OV5640使用DCMI直接连接
SDRAM作为显存
二、现有配置
屏幕像素时钟33mhz,SDRAM使用正点原子初始化序列测试正常,刷全屏颜色正常显示,OV5640 SCCB通讯正常,DCMI和LTDC引脚输出速度都设置为 VeryHigh
DCMI DMA配置如下图所示,中断均已开启
使用HAL_DCMI_Start_DMA API 直接将摄像头数据搬移至SDRAM显存地址,垂直同步中断重新开始新一帧传输,如下为主要代码
[C] 纯文本查看 复制代码 void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
{
HAL_DCMI_Start_DMA(hdcmi, DCMI_MODE_CONTINUOUS,(uint32_t)ltdc_lcd_framebuf,800*480*2/4);
}
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
}
void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
{
}
//RGB565测试
//RGB数据直接显示在LCD上面
void rgb565_test(void)
{
HAL_DCMI_Stop(&hdcmi);
LCD_Clear(RED);
//自动对焦初始化
OV5640_RGB565_Mode(); //RGB565模式
OV5640_Focus_Init();
OV5640_Light_Mode(0); //自动模式
OV5640_Color_Saturation(3);//色彩饱和度0
OV5640_Brightness(4); //亮度0
OV5640_Contrast(3); //对比度0
OV5640_Sharpness(33); //自动锐度
OV5640_Focus_Constant();//启动持续对焦
OV5640_OutSize_Set(0,0,800,480);//lcddev.width,lcddev.height); //满屏缩放显示
LCD_Clear(BLACK);
// DCMI_MODE_CONTINUOUS
// DCMI_MODE_SNAPSHOT
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS,(uint32_t)ltdc_lcd_framebuf,800*480*2/4);
}
三、问题
有画面,偶尔能完整刷出一张完整图片,图像整体被割裂成了四块,详见图片
四、尝试的解决方法
更改LTDC时钟频率,改快改慢都无效
更改摄像头输出分辨率,问题依旧
尝试不整帧传输图像,单行传输没成功
另外我尝试不在vsync中断中重新传输图像,即只接收一帧,发现这一帧大概率只能刷出一小部分区域图片,偶尔能刷出一整张图片,详见图片,我猜测这个应该是问题的根源
|