打印
[STM32F4]

关于HAL库的DMA 双缓存模式,求版主帮忙。

[复制链接]
5419|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大师,帮忙解决一个问题。
我使用的是F429,用的是1.3 HAL库。
现在通过DCMI读取OV2640 800*600到SDRAM,然后再上传到上位机显示。
采集的数据是RGB565格式。所以数据量比较大。
第一张图片是开机后采集到的第一次图片。显示正常。


第二张图片是按下快门键后,采集的第二次图像。


出现的怪异现象如下:
图片分为4层读取。第2,4层显示正常。本为第三层的图像跑到第一层。 第三层的图像没有更新。

我自己的分析如下:

在DCMI的采集函数中,由于我的Lenth长度为 800*600*2/4,长度大于0XFFFF,
所以 使用的是 DCMI_DOUBLE_BUFFER Mode模式。
经过函数的计算,图片将会分4层接收。


HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length)
{  
  /* Initialise the second memory address */
  uint32_t SecondMemAddress = 0;

  /* Check function parameters */
  assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode));

  /* Process Locked */
  __HAL_LOCK(hdcmi);

  /* Lock the DCMI peripheral state */
  hdcmi->State = HAL_DCMI_STATE_BUSY;

  /* Check the parameters */
  assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode));

  /* Configure the DCMI Mode */
  hdcmi->Instance->CR &= ~(DCMI_CR_CM);
  hdcmi->Instance->CR |=  (uint32_t)(DCMI_Mode);

  /* Set the DMA memory0 conversion complete callback */
  hdcmi->DMA_Handle->XferCpltCallback = DCMI_DMAConvCplt;

  /* Set the DMA error callback */
  hdcmi->DMA_Handle->XferErrorCallback = DCMI_DMAError;

  if(Length <= 0xFFFF)
  {
    /* Enable the DMA Stream */
    HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, Length);
  }
  else /* DCMI_DOUBLE_BUFFER Mode */
  {
    /* Set the DMA memory1 conversion complete callback */
    hdcmi->DMA_Handle->XferM1CpltCallback = DCMI_DMAConvCplt;

    /* Initialise transfer parameters */
    hdcmi->XferCount = 1;
    hdcmi->XferSize = Length;
    hdcmi->pBuffPtr = pData;

    /* Get the number of buffer */
    while(hdcmi->XferSize > 0xFFFF)
    {
      hdcmi->XferSize = (hdcmi->XferSize/2);
      hdcmi->XferCount = hdcmi->XferCount*2;
    }

    /* Update DCMI counter  and transfer number*/
    hdcmi->XferCount = (hdcmi->XferCount - 2);
    hdcmi->XferTransferNumber = hdcmi->XferCount;

    /* Update second memory address */
    SecondMemAddress = (uint32_t)(pData + (4*hdcmi->XferSize));

    /* Start DMA multi buffer transfer */
    HAL_DMAEx_MultiBufferStart_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, SecondMemAddress, hdcmi->XferSize);
  }

  /* Enable Capture */
  DCMI->CR |= DCMI_CR_CAPTURE;

  /* Return function status */
  return HAL_OK;
}


现在问题是:第二次之后的图像显示都不正常。配置DMA的双缓存模式需要哪些初始化?还是跟单缓存接收的一样呢?
请各位帮帮忙?

代码不方便发上来,抱歉。




沙发
colin2135|  楼主 | 2015-1-5 17:16 | 只看该作者
顶起来

使用特权

评论回复
板凳
colin2135|  楼主 | 2015-1-6 10:03 | 只看该作者

顶起来

使用特权

评论回复
地板
colin2135|  楼主 | 2015-1-7 18:37 | 只看该作者
最后还是自己解决了问题,但是也拖了两天时间。如果有人需要帮助,可以联系我。

使用特权

评论回复
5
hanshow2016| | 2017-6-13 15:15 | 只看该作者
colin2135 发表于 2015-1-7 18:37
最后还是自己解决了问题,但是也拖了两天时间。如果有人需要帮助,可以联系我。 ...

怎么联系你,我想寻求帮助

使用特权

评论回复
6
colin2135|  楼主 | 2017-6-14 11:00 | 只看该作者
hanshow2016 发表于 2017-6-13 15:15
怎么联系你,我想寻求帮助

你遇到什么问题了?

使用特权

评论回复
7
电气章陈勇| | 2017-6-26 15:15 | 只看该作者
同学,我也是正在学cubemx 做摄像头,能不能把你的代码分享一下,万分感谢,437677973@qq.com

使用特权

评论回复
8
电气章陈勇| | 2017-6-26 15:16 | 只看该作者
同学,我也是正在学cubemx 做摄像头,能不能把你的代码分享一下,万分感谢

使用特权

评论回复
9
电气章陈勇| | 2017-7-2 21:57 | 只看该作者
同学在不?有个问题,关于DCMI双缓存模式使用,请教一下!437677973

使用特权

评论回复
10
colin2135|  楼主 | 2017-7-3 08:42 | 只看该作者
电气章陈勇 发表于 2017-7-2 21:57
同学在不?有个问题,关于DCMI双缓存模式使用,请教一下!437677973

另一个帖子里回复你了。

使用特权

评论回复
11
mintspring| | 2017-7-3 09:46 | 只看该作者
最后怎么解决的?

使用特权

评论回复
12
colin2135|  楼主 | 2017-7-3 11:03 | 只看该作者
mintspring 发表于 2017-7-3 09:46
最后怎么解决的?

最后不需要考虑双缓存的事情,HAL库已经实现了,只要正常的调用接口就行了。

使用特权

评论回复
13
fengxu0217| | 2019-4-12 22:23 | 只看该作者
老兄,尝试过改变OV2640的快门,使其在弱光条件下拍摄移动对象不拖影吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

533

帖子

8

粉丝