Skip to main content
Associate
August 15, 2023
Solved

DMA2D signals transfer completion too soon?

  • August 15, 2023
  • 1 reply
  • 1221 views

I used STM32CubeIDE to create the LCD_DSI_CmdMode_DoubleBuffer for the STM32F769I-DISCOVERY board. It works fine, but I made some modifications to just draw a rectangle: 

 

 

 

if 1
 BSP_LCD_SetTextColor(LCD_COLOR_RED);
 BSP_LCD_FillRect(0, 0, 800, 240);
#else
 /* Display example brief */
 LCD_BriefDisplay();

 /* Copy Buffer 0 into buffer 1, so only image area to be redrawn later */
 CopyBuffer((uint32_t *)Buffers[0], (uint32_t *)Buffers[1], 0, 0, 800, 480);

 /*Draw first image */
 CopyBuffer((uint32_t *)Images[ImageIndex++], (uint32_t *)Buffers[front_buffer], 240, 160, 320, 240);
 pend_buffer = 0;
#endif

 /* Send Display On DCS Command to display */
 HAL_DSI_ShortWrite(&(hdsi_discovery),
 0,
 DSI_DCS_SHORT_PKT_WRITE_P1,
 OTM8009A_CMD_DISPON,
 0x00);

 /* Refresh the LCD display*/
 HAL_DSI_Refresh(&hdsi_discovery);

#if 1
 /* Infinite loop */
 while (1);
#else
 /* Infinite loop */
 while (1)
 {
 if(pend_buffer < 0)
 {
 /* Prepare back buffer */
 CopyBuffer((uint32_t *)Images[ImageIndex++], (uint32_t *)Buffers[1- front_buffer], 240, 160, 320, 240);
 pend_buffer = 1- front_buffer;

 if(ImageIndex >= 2)
 {
 ImageIndex = 0;
 }

 /* Refresh the display */
 HAL_DSI_Refresh(&hdsi_discovery);

 /* Wait some time before switching to next stage */
 HAL_Delay(2000);
 }
 }
#endif

 

 

 

 However the red rectangle is only partially drawn (it's supposed to take up half the screen): 

20230815_080956.jpg

If I put a HAL_Delay before the refresh, it draws the whole rectangle. This suggests the DMA2D isn't finishing the transfer to the framebuffer even though it says it is (HAL_DMA2D_PollForTransfer() is returning in LL_FillBuffer()), but I'm really not sure as I'm pretty new to this stuff.

Thanks in advance.

This topic has been closed for replies.
Best answer by _Nick

Turns out if I add a delay right after turning on the display, it works fine: 

 /* Send Display On DCS Command to display */
 HAL_DSI_ShortWrite(&(hdsi_discovery),
 0,
 DSI_DCS_SHORT_PKT_WRITE_P1,
 OTM8009A_CMD_DISPON,
 0x00);
 HAL_Delay(1);

 BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
 BSP_LCD_FillRect(0, 0, 800, 240);

 /* Refresh the LCD display*/
 HAL_DSI_Refresh(&hdsi_discovery);

 My guess is that there's an issue with the refresh occurring so soon after turning on the display.

1 reply

_NickAuthorBest answer
Associate
August 16, 2023

Turns out if I add a delay right after turning on the display, it works fine: 

 /* Send Display On DCS Command to display */
 HAL_DSI_ShortWrite(&(hdsi_discovery),
 0,
 DSI_DCS_SHORT_PKT_WRITE_P1,
 OTM8009A_CMD_DISPON,
 0x00);
 HAL_Delay(1);

 BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
 BSP_LCD_FillRect(0, 0, 800, 240);

 /* Refresh the LCD display*/
 HAL_DSI_Refresh(&hdsi_discovery);

 My guess is that there's an issue with the refresh occurring so soon after turning on the display.