STM32
直播中

李维嘉

7年用户 1414经验值
私信 关注
[问答]

HAL库摄像头DCMI—DMA配置后,屏幕只显示一半是怎么回事啊?

DCMI配置如下所示:

void DCMI_Init(void)
{
    __HAL_RCC_DCMI_CLK_ENABLE();

    DCMI_Handle.Instance              = DCMI;   
    DCMI_Handle.Init.SynchroMode      = DCMI_SYNCHRO_HARDWARE;
    DCMI_Handle.Init.PCKPolarity      = DCMI_PCKPOLARITY_RISING;
    DCMI_Handle.Init.VSPolarity       = DCMI_VSPOLARITY_LOW;
    DCMI_Handle.Init.HSPolarity       = DCMI_HSPOLARITY_LOW;
    DCMI_Handle.Init.CaptureRate      = DCMI_CR_ALL_FRAME;
    DCMI_Handle.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
    HAL_DCMI_Init( DCMI_Handle);     

    HAL_NVIC_SetPriority(DCMI_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(DCMI_IRQn);     
   
}
DMA配置如下:

void OV2640_DMA_Config(uint32_t DMA_Memory0BaseAddr,uint32_t DMA_BufferSize)
{

  __HAL_RCC_DMA2_CLK_ENABLE();
    __HAL_LINKDMA( DCMI_Handle, DMA_Handle, DMA_Handle_dcmi);
   
  DMA_Handle_dcmi.Instance = DMA2_Stream1;
  DMA_Handle_dcmi.Init.Channel = DMA_CHANNEL_1;  
  DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;
  DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;
  DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE;           
  DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR;                              
  DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_HIGH;
  DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
  DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  DMA_Handle_dcmi.Init.MemBurst = DMA_MBURST_INC8;
  DMA_Handle_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;
  HAL_DMA_Init( DMA_Handle_dcmi);
  
  HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
  
  HAL_DCMI_Start_DMA( DCMI_Handle, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Memory0BaseAddr,DMA_BufferSize);
  
}

主函数调用
DCMI_Init()
OV2640_DMA_Config(LCD_FB_START_ADDRESS,LCD_GetXSize()*LCD_GetYSize()/2);
LCD_FB_START_ADDRESS为LCD显存首地址,LCD_GetXSize()*LCD_GetYSize()/2为像素个数
屏幕只显示一半是怎么回事啊??代码哪里出了问题??

回帖(2)

李颖

2024-4-29 09:53:55
检查下是不是硬件连接问题
举报

李鸿

2024-4-29 18:12:35
根据您提供的代码片段和描述,您在使用HAL库配置DCMI(数字相机接口)时遇到了屏幕只显示一半的问题。为了解决这个问题,我们需要逐步检查和分析可能的原因。

1. 首先,确保您的摄像头硬件连接正确,包括数据线、时钟线和电源线。

2. 检查DCMI初始化配置。您提供的代码片段不完整,但我会根据您提供的代码进行分析。以下是一些可能的问题和建议:

   a. SynchroMode:您设置了DCMI_SYNCHRO_HARDWARE,这意味着DCMI将使用硬件同步信号。请确保您的摄像头支持硬件同步,并检查硬件连接是否正确。

   b. PCKPolarity:您设置了DCMI_PCKPOLARITY_RISING,这意味着像素时钟在上升沿有效。请确保您的摄像头支持这种极性,并检查硬件连接是否正确。

   c. VSPolarity:您提供的代码片段中缺少了VSPolarity的设置。VSPolarity决定了垂直同步信号的极性。您需要设置DCMI_Handle.Init.VSPolarity为DCMI_VSPOLARITY_HIGH或DCMI_VSPOLARITY_LOW,具体取决于您的摄像头。

3. 检查DMA配置。确保您正确配置了DMA通道,以便将DCMI接收到的数据传输到内存。以下是一些可能的问题和建议:

   a. DMA通道选择:确保您选择了正确的DMA通道,并且该通道没有被其他设备占用。

   b. DMA传输方向:确保您设置了正确的DMA传输方向,例如DMA_PERIPH_TO_MEMORY。

   c. DMA数据宽度和地址增量:确保您根据摄像头的数据宽度和内存布局设置了正确的DMA数据宽度和地址增量。

4. 检查显示配置。确保您的显示驱动和缓冲区设置正确,以便正确地显示DCMI接收到的图像数据。

5. 如果以上步骤都无法解决问题,您可能需要检查摄像头的数据手册,以确保您的DCMI和DMA配置与摄像头的规格相匹配。

总之,要解决屏幕只显示一半的问题,您需要逐步检查和分析DCMI初始化配置、DMA配置以及显示配置。确保所有设置都与您的摄像头规格相匹配,并检查硬件连接是否正确。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分