四文鱼Max 发表于 2023-9-25 12:54:16

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中断中重新传输图像,即只接收一帧,发现这一帧大概率只能刷出一小部分区域图片,偶尔能刷出一整张图片,详见图片,我猜测这个应该是问题的根源





eric2013 发表于 2023-9-25 13:36:05

这个是我们的,供参考。DCMI DMA玩法都是一样的,这个没区别
https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980




https://img.anfulai.cn/dz/attachment/forum/202303/05/102744ivy3vnwtk7hnuros.png

四文鱼Max 发表于 2023-9-25 14:37:55

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搬过去

eric2013 发表于 2023-9-25 17:45:44

四文鱼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
(出处: 硬汉嵌入式论坛)

四文鱼Max 发表于 2023-9-26 15:55:16

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厉害呗

eric2013 发表于 2023-9-26 16:34:20

四文鱼Max 发表于 2023-9-26 15:55
发现问题所在了,800*480的数据量对于HAL_DCMI_Start_DMA还是太大了,每次传输到1/4 DMA都会卡死(应该是4 ...

才48000次,不应该有问题。
页: [1]
查看完整版本: F429 RGB屏幕显示OV5640图像异常问题