cancel
Showing results for 
Search instead for 
Did you mean: 

TouchGFX gauge glitch

wlynn777
Associate III

Hi,
I'm using a custom H7 board, with QSPI + 16-bit SDRAM, and using RTOS.
However I run into an issue where there's glitching in my gauge in TouchGFX (see attached video...)


TouchGFX is using double buffer, also animationStorage:

 

setFrameBufferStartAddresses((void*)0xC0000000, (void*)0xC0177000, (void*)0xC0400000);

 

A few points:
- I'm able to read/write to QSPI & SDRAM correctly
- Static images appear correctly
- Glitch also appears on the whole screen during transition from one image to another

MPU:

 

static void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct;

  /* Disable the MPU */
  HAL_MPU_Disable();

  /* Configure the MPU attributes for region 0 */
  /* Configure the MPU attributes for SDRAM to normal memory*/
   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
   MPU_InitStruct.Number = MPU_REGION_NUMBER0; 
   MPU_InitStruct.BaseAddress = 0xC0000000;
   MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;
   MPU_InitStruct.SubRegionDisable = 0x0;
   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
   HAL_MPU_ConfigRegion(&MPU_InitStruct);

   /* Configure the MPU attributes for region 1 */
   /* Configure the MPU attributes for the frontbuffer to normal memory*/
    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    MPU_InitStruct.Number = MPU_REGION_NUMBER1;
    MPU_InitStruct.BaseAddress = 0xC0000000;
    MPU_InitStruct.Size = MPU_REGION_SIZE_1MB;
    MPU_InitStruct.SubRegionDisable = 0x0;
    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    HAL_MPU_ConfigRegion(&MPU_InitStruct);

    /* Configure the MPU attributes for region 2 */
    /* Configure the MPU attributes for the backbuffer to normal memory*/
     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
     MPU_InitStruct.Number = MPU_REGION_NUMBER2; 
     MPU_InitStruct.BaseAddress = 0xC0200000;
     MPU_InitStruct.Size = MPU_REGION_SIZE_1MB;
     MPU_InitStruct.SubRegionDisable = 0x0;
     MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
     MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
     HAL_MPU_ConfigRegion(&MPU_InitStruct);

     /* Configure the MPU attributes for region 3 */
     /* Configure the MPU attributes for Quad-SPI area to strongly ordered memory*/
      MPU_InitStruct.Enable = MPU_REGION_ENABLE;
      MPU_InitStruct.Number = MPU_REGION_NUMBER3;
      MPU_InitStruct.BaseAddress = 0x90000000;
      MPU_InitStruct.Size = MPU_REGION_SIZE_64MB;
      MPU_InitStruct.SubRegionDisable = 0x0;
      MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
      MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
      MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
      MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
      MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
      MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
      HAL_MPU_ConfigRegion(&MPU_InitStruct);


      /* Configure the MPU attributes for region 4 */
      /* Configure the MPU attributes for QSPI memory to normal memory*/
       MPU_InitStruct.Enable = MPU_REGION_ENABLE;
       MPU_InitStruct.Number = MPU_REGION_NUMBER4;
       MPU_InitStruct.BaseAddress = 0x90000000;
       MPU_InitStruct.Size = MPU_REGION_SIZE_16MB;
       MPU_InitStruct.SubRegionDisable = 0x0;
       MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
       MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RO;
       MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
       MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
       MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
       MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
       HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /* Enable the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}

 

Clock Configurations:
- System: 480 MHz
- FMC : 150 MHz
- LTDC : 20.15 MHz
- QUADSPI : 150 MHz

My LTDC & TouchGFX Configurations:

LTDCParams.png

LTDC.png

TGFXGenerator.png

Can anyone please tell me why this happens? Thanks..

25 REPLIES 25

Im not H7 expert, but i mean PNG is not supported for TGFX direct store and decode in hw. Instead TGFX decode png in generate process and compile choiced image format in flash. Try explain what you try do? SW png decoders exist , but is slow...

Hey @wlynn777,

Have you set your display to portrait in the TouchGFX Designer? 
Could you please (just for testing purposes) set your Display Type to RGB888 instead of ARGB888 in the LTDC settings? Pixel Format should be also set to RGB888. After applying these changes, the Framebuffer Pixel Format in TouchGFX Generator parameters should be changed to RGB888

 

Mohammad MORADI
ST Software Developer | TouchGFX

Yes, the display orientation is already portrait.
Have tried this too, no difference..

Thanks for the explanation. Actually it's not just with a PNG as there's also trouble with a simple square/box shape (see attached) where a line is visible on the top and bottom of the square, but not if it's in full height..

Are you sure your display have sync-porch 4 8 8 ?

Next source maybe pcb design, but primary check mmory real values ? Exist here lines or not.

Next issue i see in your screenshots Active width 832 , this is not normal when display is 800, but exist special configs with this shift... 
LTDC clock you set for lower framerate as 60Hz ...

Okay, I got it to work but without the DMA2D, and I switched to RGB565.
I also did these, which removed the glitches and artifacts:

- Initialized FMC_NBL0 and FMC_NBL1 pins (crucial, as it turns out...)
- Set MPU of the SDRAM to:

MPU_InitStruct.BaseAddress = 0xC0000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;

- Disabling the DCache also helped during troubleshooting.

Thanks to everyone who has helped answer.