2025-02-15 11:05 AM - edited 2025-02-15 11:20 AM
Hi, I stumbled on a little issue regarding DMA2D and a NUCLEO-F767ZI.
I used STM32CubeMX 6.13.0, STM32CubeIDE 1.17.0, firmware FW_F7 1.17.2.
DMA2D needs RGB888 input color but I configured as RGB565. (I think)
The outputs also is RGB565 and seems fine.
/**
* @brief Fill rectangle
* [in] x
* [in] y
* [in] width
* [in] height
* [in] color
* [in] frameBufferPtr
* @return None
*/
uint8_t Display_Fill_Rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint32_t Color, uint32_t *frameBufferPtr)
{
HAL_StatusTypeDef hal_status = HAL_OK;
hdma2d.Instance = DMA2D;
hdma2d.Init.Mode = DMA2D_R2M; /* Mode Register to Memory */
hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565; /* DMA2D Output color format */
hdma2d.Init.OutputOffset = (uint32_t)(DISPLAY_SIZE_X - width); /* Offset in output */
/* Foreground Configuration */
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].AlphaMode = DMA2D_NO_MODIF_ALPHA;
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputAlpha = 0x00; /* 0xFF = Fully opaque */
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputColorMode = DMA2D_INPUT_RGB565; /* DMA2D Input color format */
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputOffset = 0; /* skip 70 pixels on left when reading addrSrc : the left margin */
hal_status = HAL_DMA2D_Init(&hdma2d);
if (hal_status != HAL_OK)
{
return 1;
}
hal_status = HAL_DMA2D_ConfigLayer(&hdma2d, DMA2D_FOREGROUND_LAYER);
if (hal_status != HAL_OK)
{
return 1;
}
hal_status = HAL_DMA2D_Start(
&hdma2d,
(uint32_t)Color, /* Color value in Register to Memory DMA2D mode */
(uint32_t)frameBufferPtr + (uint32_t)(x + y * DISPLAY_SIZE_X) * 2, /* DMA2D output buffer */
(uint32_t)width, /* width of buffer in pixels */
(uint32_t)height); /* height of buffer in lines */
if (hal_status != HAL_OK)
{
return 1;
}
/* Polling For DMA transfer */
hal_status = HAL_DMA2D_PollForTransfer(&hdma2d, 100);
if (hal_status != HAL_OK)
{
return 1;
}
return 0;
}
/* DMA2D init function */
void MX_DMA2D_Init(void)
{
hdma2d.Instance = DMA2D;
hdma2d.Init.Mode = DMA2D_M2M;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
hdma2d.Init.OutputOffset = 0;
hdma2d.LayerCfg[1].InputOffset = 0;
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
hdma2d.LayerCfg[1].InputAlpha = 0;
hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;
if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
{
Error_Handler();
}
if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
{
Error_Handler();
}
}
This line doesn't care what value is assigned to InputColorMode, and even can be left out.
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputColorMode = DMA2D_INPUT_RGB565;
I think there's something wrong.
Or what else did I overlook? Thanks for bearing with me.
2025-02-17 05:25 AM
Hello @Jack3
>> DMA2D needs RGB888 input color but I configured as RGB565. (I think)
Please ensure that you are certain about the settings you report.
Could you please share your project with us so that we can assist you more effectively?