F429 RGB屏幕显示OV5640图像异常问题
一、硬件环境STM32F429IGT6
4.3寸RGB屏幕800*480
OV5640使用DCMI直接连接
SDRAM作为显存
二、现有配置
屏幕像素时钟33mhz,SDRAM使用正点原子初始化序列测试正常,刷全屏颜色正常显示,OV5640 SCCB通讯正常,DCMI和LTDC引脚输出速度都设置为 VeryHigh
DCMI DMA配置如下图所示,中断均已开启
使用HAL_DCMI_Start_DMA API 直接将摄像头数据搬移至SDRAM显存地址,垂直同步中断重新开始新一帧传输,如下为主要代码
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中断中重新传输图像,即只接收一帧,发现这一帧大概率只能刷出一小部分区域图片,偶尔能刷出一整张图片,详见图片,我猜测这个应该是问题的根源
这个是我们的,供参考。DCMI DMA玩法都是一样的,这个没区别
https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
https://img.anfulai.cn/dz/attachment/forum/202303/05/102744ivy3vnwtk7hnuros.png
eric2013 发表于 2023-9-25 13:36
这个是我们的,供参考。DCMI DMA玩法都是一样的,这个没区别
https://www.armbbs.cn/forum.php?mod=viewth ...
为什么这个640*480分辨率的例程里HAL_DCMI_Start_DMA 搬移了640*240个像素呢?裁切又怎么能裁到600*400呢?
另外我也尝试下不直接将摄像头数据搬入显存中,手动用dma2d搬过去 四文鱼Max 发表于 2023-9-25 14:37
为什么这个640*480分辨率的例程里HAL_DCMI_Start_DMA 搬移了640*240个像素呢?裁切又怎么能裁到600*400呢 ...
结合我的那个例子看。现在的HAL库API已经处理了DMA传输次数操作65536的问题。
STM32H7的摄像头接口DCMI配套的函数HAL_DCMI_Start_DMA非常不错,支持大分辨率直接传输
https://www.armbbs.cn/forum.php?mod=viewthread&tid=91577&fromuid=58
(出处: 硬汉嵌入式论坛)
eric2013 发表于 2023-9-25 17:45
结合我的那个例子看。现在的HAL库API已经处理了DMA传输次数操作65536的问题。
STM32H7的摄像头接口DCM ...
发现问题所在了,800*480的数据量对于HAL_DCMI_Start_DMA还是太大了,每次传输到1/4 DMA都会卡死(应该是48000次传输,一次四个字节,总数据量192000字节),最后还是改成一行一行800个像素传输,然后在dcmi 行中断中用dma2d依次填充屏幕每行像素才成功。
但是我疑惑的是你的例程里既然能直接搬640*240*2=307200个字节也证明这个api没有问题啊,难不成就是因为h7比f4厉害呗 四文鱼Max 发表于 2023-9-26 15:55
发现问题所在了,800*480的数据量对于HAL_DCMI_Start_DMA还是太大了,每次传输到1/4 DMA都会卡死(应该是4 ...
才48000次,不应该有问题。
页:
[1]