2020-02-24 12:34 AM
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.
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.
Solved! Go to Solution.
2020-02-24 01:24 AM
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
2020-02-24 01:24 AM
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
2020-02-24 01:38 AM
/**
* @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
2020-02-24 11:30 PM
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
2020-02-25 01:12 AM
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
2020-02-26 12:20 AM
Dear Martin,
It works perfectly with PSRAM!! Thank you so much~~
J.Park
2020-02-26 01:01 AM
Glad it's working! :)
2021-01-27 10:21 AM
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?
2021-01-28 12:02 AM
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.