使用dma2d传输一张图片到帧缓冲里,当图片分辨率与帧分辨率相同时图片可以正常显示,图片分辨率小于帧缓冲分辨率时显示不正常。 根据LCD显示效果似乎图片宽度被拉长到了帧缓存的宽度,查看dma2d初始化参数觉得可能是Dma2dHandle.Init.OutputOffset的参数设置问题。 以下是f746G disc的例程中初始化代码: 例程中采用的模式是DMA2D_M2M_BLEND,相比m2m增加图层混合功能。 其中 LCD_X_SIZE =480,是帧缓存的宽度; x_size =x_size_orig ,图片宽度, Dma2dHandle.Init.Mode = DMA2D_M2M_BLEND; /* DMA2D mode Memory to Memory with Pixel Format Conversion */ Dma2dHandle.Init.ColorMode = DMA2D_RGB565; /* DMA2D Output color mode is RGB565 (16 bpp) */ Dma2dHandle.Init.OutputOffset = (LCD_X_SIZE - x_size) ; /* No offset in output */ /* DMA2D Callbacks Configuration */ Dma2dHandle.XferCpltCallback = TransferComplete; Dma2dHandle.XferErrorCallback = TransferError; /* Foreground layer Configuration : layer 1 */ Dma2dHandle.LayerCfg[1].AlphaMode = DMA2D_COMBINE_ALPHA; Dma2dHandle.LayerCfg[1].InputAlpha = alpha; /* Alpha fully opaque */ Dma2dHandle.LayerCfg[1].InputColorMode = ColorMode; /* Layer 1 input format */ Dma2dHandle.LayerCfg[1].InputOffset = x_size_orig - x_size ; /* No offset in input */ /* Background layer Configuration */ Dma2dHandle.LayerCfg[0].AlphaMode = DMA2D_REPLACE_ALPHA; Dma2dHandle.LayerCfg[0].InputAlpha = 0xFF; /* 127 : semi-transparent */ Dma2dHandle.LayerCfg[0].InputColorMode = CM_RGB565; Dma2dHandle.LayerCfg[0].InputOffset = (LCD_X_SIZE - x_size) ; /* No offset in input */ LayerCfg[0]代表背景层,背景层宽度为帧缓存宽度,相比与与之混合的图片宽度x_size而言需要设置InputOffset = (LCD_X_SIZE - x_size)以便匹配帧缓存。 LayerCfg[1]代表前景层,这层就是输入的图片,该层输入的数据与传入图片宽度一致,所以offset设置为0。 OutputOffset 是输出设置,输出宽度同样为帧缓存宽度,也需要设置OutputOffset = (LCD_X_SIZE - x_size)来匹配宽度。 综合以上,还都是我的猜测,需要实验验证。 |