硬汉嵌入式论坛

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

[STM32H7] 关于LTDC显示OV5640画面的问题

[复制链接]

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-12-1 16:47:29 | 显示全部楼层 |阅读模式
我在用正点原子的ov5640配置表配置了摄像头然后启动摄像头,图像数组放在内部sram中,uint16_t ov5640_buffer[240*240];
这里的话我启动了色块测试模式,理论上画面应该是彩条
[C] 纯文本查看 复制代码
HAL_DCMI_Stop(&hdcmi);
    OV5640_RESET_RESET;
    OV5640_POWER_ON;
    HAL_Delay(10);
    OV5640_RESET_SET;
    HAL_Delay(10);
    OV5640_POWER_ON;
    OV5640_WG(0X3008,0X82);        //软复位
    HAL_Delay(10);
    uint16_t id;
    id=OV5640_RG(OV5640_CHIPIDH)<<8|OV5640_RG(OV5640_CHIPIDL);
    if(id==OV5640_ID)
    LOAD("Read Sensor Id:%X\r\n",id);
    else{
    ERROR("OV5640 NOT FOUND WITH %X\r\n",id);
    }
    HAL_Delay(10);
    for(int i=0;i<sizeof(ov5640_init_reg_tbl)/4;i++)
    {
    OV5640_WG(ov5640_init_reg_tbl[i][0],ov5640_init_reg_tbl[i][1]);
    }
    //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,240,240);
    OV5640_RGB565_Mode();
    OV5640_Test_Pattern(2);
    //INFO("Use mem of %p---%p\r\n",ov5640_buffer,(&ov5640_buffer[640*480]));
    if(HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)ov5640_buffer,120*240)!=HAL_OK)
        ERROR("Start Fail\r\n");

然后在Frame中断中再次开启DCMI_IT_FRAME中断,同时使用DMA2D搬运图像数组到显存
[C] 纯文本查看 复制代码
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{   
    HAL_DCMI_Stop(hdcmi);
    __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME);
    LTDC_Color_Fill(0,0,240,240,ov5640_buffer);
}

然后在DMA2D的中断中再次开启摄像,但是在ltdc显示是就会出现这样的情况
IMG_20241201_163454.jpg IMG_20241201_163450.jpg


这是我的LTDC填充函数
[C] 纯文本查看 复制代码
void LTDC_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color)
{
    uint32_t psx,psy,pex,pey;        //以LCD面板为基准的坐标系,不随横竖屏变化而变化
    uint16_t offline;
    uint32_t addr; 
    //坐标系转换
    if(lcdltdc.dir)        //横屏
    {
        psx=sx;psy=sy;
        pex=ex;pey=ey;
    }else                        //竖屏
    {
        psx=sy;psy=lcdltdc.pheight-ex-1;
        pex=ey;pey=lcdltdc.pheight-sx-1;
    }
    offline=lcdltdc.pwidth-(pex-psx+1);
    addr=((uint32_t)ltdc_framebuf[lcdltdc.activelayer]+lcdltdc.pixsize*(lcdltdc.pwidth*psy+psx));
    RCC->AHB3ENR|=1<<4;                                //使能DMA2D时钟
    DMA2D->CR&=~(1<<0);                                //先停止DMA2D
    DMA2D->CR=0<<16;                                //存储器到存储器模式
    DMA2D->FGPFCCR=LCD_PIXFORMAT;        //设置颜色格式
    DMA2D->FGOR=0;                                        //前景层行偏移为0
    DMA2D->OOR=offline;                                //设置行偏移 
    DMA2D->FGMAR=(uint32_t)color;                //源地址
    DMA2D->OMAR=addr;                                //输出存储器地址
    DMA2D->NLR=(pey-psy+1)|((pex-psx+1)<<16);        //设定行数寄存器 
    __HAL_DMA2D_ENABLE_IT(&hdma2d,DMA2D_IT_TC);
    __HAL_DMA2D_ENABLE(&hdma2d);
    // DMA2D->CR|=1<<0;                                //启动DMA2D
} 

求教一下,我感觉是搬运函数有问题,但是不知道怎么修改

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-2 00:07:33 | 显示全部楼层
帮顶

这个我们的OV7670, 使用DCMI DMA,并使用DMA2D加速绘制到LCD。

V7-030和V7-031

https://forum.anfulai.cn/forum.p ... &extra=page%3D1



回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2025-1-16 23:03:08 | 显示全部楼层
eric2013 发表于 2024-12-2 00:07
帮顶

这个我们的OV7670, 使用DCMI DMA,并使用DMA2D加速绘制到LCD。

已经解决了 和一个寄存器配置有关系,OV5640_WG(0x3023,0x01);,这个寄存器数据手册上面没提到,但是参考正点原子的摄像头聚焦代码有用到,问Chatgpt说是和vsync信号宽度有关
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2025-1-16 23:13:52 | 显示全部楼层
另外我想把缓冲区放到sdram中,同时使用ltdc+dma2d显示图片,但是dcmi一直发生overrun数据搬运不过来,感觉是sdram速度不够吗还有就是有个问题,像stm32h743 内部有1m内存,但是被划分为几个区,指令区128kb 用户d1域500kb d2 128+128,如果说我需要一个很大的缓冲区能否跨区域使用呢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 04:15 , Processed in 0.041623 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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