Image processing YCbCr视频输入STM32F746
我正在开发基于STM32F746的定制板,该板集成了LCD和ADV7180视频解码器IC 我将ADV7180配置为在自由运行模式下运行。使用DCMI将相机数据获取到指定的缓冲区 我正在尝试将YCbCr 4:2:2数据转换为RBG数据。我正在接电话。 从实时事件中,我执行下面的代码将其转换为RGB,然后使用ARGB888将其加载到LCD LCD\帧\缓冲区0xC0000000 LCD\帧\缓冲层\层1 0xC0130000 摄像机\帧\缓冲器0xC0260000Image 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(
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);
}
几个小时前,这里出现了三个类似的问题:参见和。