硬汉嵌入式论坛

 找回密码
 立即注册
查看: 766|回复: 5
收起左侧

F429 RGB屏幕显示OV5640图像异常问题

[复制链接]
回帖奖励 4 个金币 回复本帖可获得 1 个金币奖励! 每人限 1 次

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2023-9-25 12:54:16 | 显示全部楼层 |阅读模式
一、硬件环境

STM32F429IGT6
4.3寸RGB屏幕800*480
OV5640使用DCMI直接连接
SDRAM作为显存

二、现有配置
屏幕像素时钟33mhz,SDRAM使用正点原子初始化序列测试正常,刷全屏颜色正常显示,OV5640 SCCB通讯正常,DCMI和LTDC引脚输出速度都设置为 VeryHigh
DCMI DMA配置如下图所示,中断均已开启

dcmi_dma.png

使用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);
}


三、问题

有画面,偶尔能完整刷出一张完整图片,图像整体被割裂成了四块,详见图片

img.jpg

四、尝试的解决方法

更改LTDC时钟频率,改快改慢都无效
更改摄像头输出分辨率,问题依旧
尝试不整帧传输图像,单行传输没成功
另外我尝试不在vsync中断中重新传输图像,即只接收一帧,发现这一帧大概率只能刷出一小部分区域图片,偶尔能刷出一整张图片,详见图片,我猜测这个应该是问题的根源


img2.jpg


img2.jpg
img.jpg
dcmi_dma.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-9-25 13:36:05 | 显示全部楼层

回帖奖励 +1 个金币

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

QQ截图20230925133627.png




回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 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搬过去
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 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? ... 1577&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 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厉害呗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-9-26 16:34:20 | 显示全部楼层
四文鱼Max 发表于 2023-9-26 15:55
发现问题所在了,800*480的数据量对于HAL_DCMI_Start_DMA还是太大了,每次传输到1/4 DMA都会卡死(应该是4 ...

才48000次,不应该有问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 19:35 , Processed in 0.321123 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表