硬汉嵌入式论坛

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

[摄像头] 通过stm32h750使用DMA传输图像数据存在问题

[复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 2023-7-14 22:30:13 | 显示全部楼层 |阅读模式
使用的是stm32h750,搭配摄像头ov5640进行图像采集,并将采集图像数据DMA传输给自定义的二维数组,对数组的图像数据进行图像处理,再通过数组DMA传输给显存,进行实时显示处理后的图像。现还没有进行图像处理,直接实时显示图像,但图像存在问题,只显示屏幕的三分之一左右。
下载 (10).png
第一个DMA部分,即数组接收数据是ok的,可能说明第二个DMA传输有问题,但一直没检查出哪里的问题,有大佬请教!!
整个代码都是根据h7的hal库例程改的,下面是第二个DMA传输部分:
下载 (11).png


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2023-7-15 07:58:38 | 显示全部楼层
大分辨率直传输,可以使用下面这个函数即可。

STM32H7的摄像头接口DCMI配套的函数HAL_DCMI_Start_DMA非常不错,支持大分辨率直接传输
https://www.armbbs.cn/forum.php? ... id=91577&fromuid=58
(出处: 硬汉嵌入式论坛)


当然,楼主位的方法也是可以的。

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*        函 数 名: CAM_Start
*        功能说明: 启动DMA和DCMI,开始传送图像数据到LCD显存
*        形    参: _uiDispMemAddr 显存地址
*        返 回 值: 无
*********************************************************************************************************
*/
void CAM_Start(uint32_t _uiDispMemAddr)
{        
        /* 使能DCMI */
        __HAL_RCC_DMA1_CLK_ENABLE();

        hdma_dcmi.Instance                 = DMA1_Stream7;           /* 使用的DMA1 Stream7 */
        hdma_dcmi.Init.Request             = DMA_REQUEST_DCMI;       /* DMA请求来自DCMI */  
        hdma_dcmi.Init.Direction           = DMA_PERIPH_TO_MEMORY;   /* 传输方向是从DCMI到存储器 */ 
        hdma_dcmi.Init.PeriphInc           = DMA_PINC_DISABLE;       /* 外设地址自增禁止 */  
        hdma_dcmi.Init.MemInc              = DMA_MINC_ENABLE;        /* 存储器地址自增使能 */  
        hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;    /* 外设数据传输位宽选择字,即32bit */  
        hdma_dcmi.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;    /* 存储器数据传输位宽选择字,即32bit */
        hdma_dcmi.Init.Mode                = DMA_CIRCULAR;           /* 循环模式 */   
        hdma_dcmi.Init.Priority            = DMA_PRIORITY_LOW;       /* 优先级低 */  
        hdma_dcmi.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;   /* 使能FIFO*/
        hdma_dcmi.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;/* 用于设置阀值 */
        hdma_dcmi.Init.MemBurst            = DMA_MBURST_SINGLE;      /* 单次突发,用于存储器突发 */
        hdma_dcmi.Init.PeriphBurst         = DMA_PBURST_SINGLE;      /* 单次突发,用于外设突发 */
        
        /* 初始化DMA */
        if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);
        }

        /* 摄像头句柄关联DMA句柄 */
        __HAL_LINKDMA(&hdcmi, DMA_Handle, hdma_dcmi);

        /* 使能DMA1 Stream7 中断 */
        HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);                
        
        /* 启动DCMI的DMA传输 */
        HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)_uiDispMemAddr, 640*240);

        g_tCam.CaptureOk = 0;                /* 全局标志 */
}

/* 后续启动传输,仅需调用函数HAL_DCMI_Start_DMA即可 */
void CAM_Start1(uint32_t _uiDispMemAddr)
{
        HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)_uiDispMemAddr, 640*240);        

        g_tCam.CaptureOk = 0;        /* 全局标志 */
}

/*
*********************************************************************************************************
*        函 数 名: CAM_Stop
*        功能说明: 停止DMA和DCMI
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void CAM_Stop(void)
{
        HAL_DCMI_Stop(&hdcmi);
}

void DMA1_Stream7_IRQHandler(void)
{
        HAL_DMA_IRQHandler(&hdma_dcmi);
}

void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
        /* 关闭摄像 */
        CAM_Stop();
        g_tCam.CaptureOk = 1;                /* 表示DMA传输结束 */
}

/*
*********************************************************************************************************
*        函 数 名: DCMI_IRQHandler
*        功能说明: DCMI中断服务程序
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void DCMI_IRQHandler(void)
{
        HAL_DCMI_IRQHandler(&hdcmi);
}




回复

使用道具 举报

2

主题

1

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2023-7-15 09:00:03 | 显示全部楼层
eric2013 发表于 2023-7-15 07:58
大分辨率直传输,可以使用下面这个函数即可。

STM32H7的摄像头接口DCMI配套的函数HAL_DCMI_Start_DMA非 ...

HAL_DCMI_Start_DMA是用了的,那是第一个dma部分,现在想知道第二个dma是哪出了问题导致屏幕显示问题的,还是说别的原因
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2023-7-15 19:12:13 | 显示全部楼层
lixin 发表于 2023-7-15 09:00
HAL_DCMI_Start_DMA是用了的,那是第一个dma部分,现在想知道第二个dma是哪出了问题导致屏幕显示问题的, ...

把使用的RAM空间读写Cache关闭了试试。

另外你的图形输出格式是RGB565吧,输出图形分辨率多大,800*480?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 01:17 , Processed in 0.172675 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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