Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing YCbCr视频输入STM32F746_Image Processing_Stm32_Stm32f7_Ycbcr - Fatal编程技术网

Image processing YCbCr视频输入STM32F746

Image processing YCbCr视频输入STM32F746,image-processing,stm32,stm32f7,ycbcr,Image Processing,Stm32,Stm32f7,Ycbcr,我正在开发基于STM32F746的定制板,该板集成了LCD和ADV7180视频解码器IC 我将ADV7180配置为在自由运行模式下运行。使用DCMI将相机数据获取到指定的缓冲区 我正在尝试将YCbCr 4:2:2数据转换为RBG数据。我正在接电话。 从实时事件中,我执行下面的代码将其转换为RGB,然后使用ARGB888将其加载到LCD LCD\帧\缓冲区0xC0000000 LCD\帧\缓冲层\层1 0xC0130000 摄像机\帧\缓冲器0xC0260000 void LCD_LL_Test(

我正在开发基于STM32F746的定制板,该板集成了LCD和ADV7180视频解码器IC

我将ADV7180配置为在自由运行模式下运行。使用DCMI将相机数据获取到指定的缓冲区

我正在尝试将YCbCr 4:2:2数据转换为RBG数据。我正在接电话。 从实时事件中,我执行下面的代码将其转换为RGB,然后使用ARGB888将其加载到LCD

LCD\帧\缓冲区0xC0000000 LCD\帧\缓冲层\层1 0xC0130000 摄像机\帧\缓冲器0xC0260000

void LCD_LL_Test(void *pSrc, void *pDst, uint32_t lcd_offset, uint32_t cam_offset)
{ 

  uint32_t * pTempDest = (uint32_t *)(LCD_FRAME_BUFFER_LAYER1);
  uint32_t * pTempSource = (uint32_t *)(CAMERA_FRAME_BUFFER+cam_offset);

  uint32_t * pFinalDest = (uint32_t *)(LCD_FRAME_BUFFER+lcd_offset);
  uint32_t * pFinalSource = (uint32_t *)(LCD_FRAME_BUFFER_LAYER1);

  for(uint32_t i = 0; i < (480/2) ; i++ ){
    uint32_t te =  *pTempSource;   
    // CB Y1 CR , RESULT  
    toRGB( (te>>0),(te>>8),(te>>16) ,(uint32_t *)pTempDest);
    pTempDest++;
    // CB Y2 CR , RESULT 
    toRGB( (te>>0),(te>>24),(te>>16) ,(uint32_t *)pTempDest);
    pTempDest++;
    pTempSource++;
  }
  static DMA2D_HandleTypeDef hDma2dEval;  

  hDma2dEval.Init.Mode         = DMA2D_M2M_PFC;
  hDma2dEval.Init.ColorMode    = DMA2D_OUTPUT_ARGB8888;
  hDma2dEval.Init.OutputOffset = 0;     

  hDma2dEval.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
  hDma2dEval.LayerCfg[1].InputAlpha = 0xFF;
  hDma2dEval.LayerCfg[1].InputColorMode = DMA2D_RGB888;
  hDma2dEval.LayerCfg[1].InputOffset = 0;

  hDma2dEval.Instance = DMA2D; 

  /* DMA2D Initialization */
  if(HAL_DMA2D_Init(&hDma2dEval) == HAL_OK) 
  {
    if(HAL_DMA2D_ConfigLayer(&hDma2dEval, 1) == HAL_OK) 
    {
      if (HAL_DMA2D_Start(&hDma2dEval, (uint32_t)pFinalSource, (uint32_t )(pFinalDest), BSP_LCD_GetXSize()*4, 1) == HAL_OK)
      {
        /* Polling For DMA transfer */  
        HAL_DMA2D_PollForTransfer(&hDma2dEval, 10);
      }
    }
  } 
}
void-LCD-LL-u测试(void*pSrc、void*pDst、uint32-t-LCD-u偏移、uint32-t-cam-u偏移)
{ 
uint32\u t*pTempDest=(uint32\u t*)(液晶显示帧缓冲层1);
uint32\u t*pTempSource=(uint32\u t*)(摄像机帧缓冲+摄像机偏移);
uint32\u t*pFinalDest=(uint32\u t*)(液晶显示帧缓冲区+液晶显示帧偏移);
uint32\u t*pFinalSource=(uint32\u t*)(液晶显示帧缓冲层1);
对于(uint32_t i=0;i<(480/2);i++){
uint32_t te=*pTempSource;
//CB Y1 CR,结果
toRGB((te>>0),(te>>8),(te>>16),(uint32_t*)pTempDest);
pTempDest++;
//CB Y2 CR,结果
toRGB((te>>0),(te>>24),(te>>16),(uint32_t*)pTempDest);
pTempDest++;
pTempSource++;
}
静态DMA2D_手柄类型定义hDma2dEval;
hDma2dEval.Init.Mode=DMA2D_M2M_PFC;
hDma2dEval.Init.ColorMode=DMA2D_输出_argb888;
hDma2dEval.Init.OutputOffset=0;
hDma2dEval.LayerCfg[1]。AlphaMode=DMA2D\u NO\u MODIF\u ALPHA;
hDma2dEval.LayerCfg[1]。输入LPHA=0xFF;
hDma2dEval.LayerCfg[1]。InputColorMode=DMA2D_RGB888;
hDma2dEval.LayerCfg[1]。InputOffset=0;
hDma2dEval.Instance=DMA2D;
/*DMA2D初始化*/
if(HAL_DMA2D_Init(&hDma2dEval)=HAL_OK)
{
如果(HAL_DMA2D_配置层(&hDma2dEval,1)=HAL_正常)
{
如果(HAL_DMA2D_启动(&hDma2dEval,(uint32_t)pFinalSource,(uint32_t)(pFinalDest),BSP_LCD_GetXSize()*4,1)=HAL_正常)
{
/*DMA传输轮询*/
HAL_DMA2D_PollForTransfer(&hDma2dEval,10);
}
}
} 
}
我已经用LCD\u FRAME\u BUFFER初始化了LCD,我只使用单层

我正在转换数据,并使用中间LCD\U FRAME\U BUFFER\U LAYER1 BUFFER将其复制到LCD\U FRAME\U BUFFER

DCMI-->摄像头\帧\缓冲区-->转换-->LCD\帧\缓冲区\层1-->DMA->LCD\帧\缓冲区

但是,我没有得到自由运行模式屏幕作为蓝屏


当您使用0xC0000000配置为外部RAM时,确保FMC已配置并初始化为自刷新

确保FMC配置为FMC\u SDRAM\u CAS\u延迟\u 3

尝试在FMC init的末尾添加附加函数

void MX_SDRAM_InitEx(void)
{
  __IO uint32_t tmpmrd = 0;

  /* Step 1: Configure a clock configuration enable command */
  Command.CommandMode            = FMC_SDRAM_CMD_CLK_ENABLE;
  Command.CommandTarget          =  FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber      = 1;
  Command.ModeRegisterDefinition = 0;

  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

  /* Step 2: Insert 100 us minimum delay */
  /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
  HAL_Delay(1);

  /* Step 3: Configure a PALL (precharge all) command */
  Command.CommandMode            = FMC_SDRAM_CMD_PALL;
  Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber      = 1;
  Command.ModeRegisterDefinition = 0;

  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

  /* Step 4: Configure an Auto Refresh command */
  Command.CommandMode            = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber      = 8;
  Command.ModeRegisterDefinition = 0;

  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

  /* Step 5: Program the external memory mode register */
  tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |\
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |\
                     SDRAM_MODEREG_CAS_LATENCY_3           |\
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |\
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

  Command.CommandMode            = FMC_SDRAM_CMD_LOAD_MODE;
  Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber      = 1;
  Command.ModeRegisterDefinition = tmpmrd;

  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

  /* Step 6: Set the refresh rate counter */
  /* Set the device refresh rate */
  HAL_SDRAM_ProgramRefreshRate(&hsdram1, REFRESH_COUNT);
}

几个小时前,这里出现了三个类似的问题:参见和。