Skip to main content
JPark.14
Associate III
February 24, 2020
Solved

No slide transition effect for STM32L4R9 Discovery ? Please help me!!

  • February 24, 2020
  • 3 replies
  • 1670 views

Dear All,

I have tried to make the slide transition effect when a screen is changed to another screen. I set all "Interactions" in TouchGFX designer.

  • Change screen
  • Transition : Slide
  • Transition Direction : East
  • other setting are all good.

But the screen transition act like "None" transition option.

"Cover" transition option ==> it works.

"Slide" transition option ==> it acts like "None"

But one thing, the simulator works fine for evey options.

Why "Slide" transition option doen't work? Please give me some advises about this matter.

Thanks in advance.

FYI, I don't use GFXmmu and I use DMA2D.

This topic has been closed for replies.
Best answer by Martin KJELDSEN

You're missing an "animation storage" buffer - The slide transition takes a snapshot of the current framebuffer it uses to create the transition. If you do not want to use a buffer you can use "cover transition".

How did you create the project?

/Martin

3 replies

Martin KJELDSEN
Martin KJELDSENBest answer
Principal III
February 24, 2020

You're missing an "animation storage" buffer - The slide transition takes a snapshot of the current framebuffer it uses to create the transition. If you do not want to use a buffer you can use "cover transition".

How did you create the project?

/Martin

Martin KJELDSEN
Principal III
February 24, 2020
 /**
 * @fn virtual void HAL::setFrameBufferStartAddress(void* adr, uint16_t depth = 16, bool useDoubleBuffering = true, bool useAnimationStorage = true)
 *
 * @brief Sets the address used for frame buffers, usually located in external memory.
 *
 * Sets the address used for frame buffers, usually located in external memory. Will
 * reserve memory for one or two frame buffers based on display size. Will optionally
 * also reserve memory for a third frame buffer used for animationStorage.
 *
 * @param [in] adr Starting address to use for frame buffers.
 * @param depth (Optional) Depth of each pixel in bits, default is 16.
 * @param useDoubleBuffering (Optional) If true, reserve memory for an extra frame buffer.
 * @param useAnimationStorage (Optional) If true, reserve memory for animation storage.
 *
 * @deprecated Use the setFramaBufferStartAddress with 'format' parameter instead of 'depth'
 */
 virtual void setFrameBufferStartAddress(void* adr, uint16_t depth = 16, bool useDoubleBuffering = true, bool useAnimationStorage = true);

e.g.

hal.setFrameBufferStartAddress((uint16_t*)frameBuf0, bitdepth, true, true);

/Martin

JPark.14
JPark.14Author
Associate III
February 25, 2020

Dear Martin,

Thank you very much for your quick response. I could learn one more about TouchGFX from your reply.

You ment that I have to set another framebuffer for using AnimationStorage. Right?

My code is from cubeMX and the initialization code is like the below.

// from MyProject\TouchGFX\target\generated\TouchGFXGeneratedHAL.cpp

void TouchGFXGeneratedHAL::initialize()

{

   HAL::initialize();

   registerEventListener(*(touchgfx::Application::getInstance()));

   setFrameBufferStartAddresses((void*)FRAME_BUFFER0, (void*)FRAME_BUFFER, (void*)0);

   lockDMAToFrontPorch(false);

}

I have to use double buffering and I already use 400Kbyte for frame buffer. I think I cannot afford to use another 200kbyte for framebuffer.

(STM32L4R9 has just internal 640K SRM. and I have to use the remained 140K for the other usage.)

So, I have a question about this matter. Can I use external PSRAM for the animation storage frame buffer? OR I have to use only internal SRAM for frame buffer?

Thanks in advance!!

J.Park

Martin KJELDSEN
Principal III
February 25, 2020

You can use SDRAM or PSRAM just fine. Just supply a pointer to where you want the storage to be located.

setFrameBufferStartAddresses((void*)FRAME_BUFFER0, (void*)FRAME_BUFFER, (void*)ANIMATION_STORAGE);

/Martin

ZRego.1
Associate
January 27, 2021

Hi!

I have a similar problem on STM32F74G-DISCO board. My default code looks like that:

setFrameBufferStartAddresses((void*)0xC0000000, (void*)0xC003FC00, (void*)0);

0xC0000000 is the address of external SDRAM that is available on the DISCO board.

How do I know what is the next available address which I can use for animation storage?

I can estimate that the second buffer at address 0xC003FC00 is same size as the first at 0xC0000000, which results into 0xC007F800 being available for the third (animation) buffer. However that is not the case, because part of the image on display becomes corrupted, probably because the RAM is overwritten. So how do I effectively determine the next available RAM address?

Martin KJELDSEN
Principal III
January 28, 2021

You determine it as you say - If something is getting overwritten something else must be wrong. TouchGFX should keep within the confines of a buffer based on the dimensions and depth of the application.