cancel
Showing results for 
Search instead for 
Did you mean: 

TouchGFX 4.25.0 now available with latest updates and fixes

Amelie ACKERMANN
Community manager
Community manager

We are pleased to announce the release of TouchGFX 4.25.0, a significant update packed with new core functionalities and numerous bug fixes to enhance your development experience.

Here’s a glimpse of what’s new:

LTDC-driven display: emulated framebuffer

This major feature introduces memory savings by using the MCU’s memory instead of external RAM. By allocating memory for only a subregion of the display and synchronizing between the LCD controller and graphics framework, full screen storage is unnecessary. This is ideal for static UIs but may require adjustments for animations to avoid screen tearing. Check out the blog article and the dedicated page in our documentation.

Bitmap font compression

TouchGFX 4.25.0 introduces bitmap font compression, which can drastically reduce flash usage for applications with extensive font usage. You can enable 4Bpp bitmap font compression in the Designer under the Typography tab in the “Text” menu and configure the “Compressed Font Cache Size” in the Text Configuration Tab in the “Config” menu.

Translations in external unmapped flash

Building on our support for translations in external mapped flash, this version extends support to unmapped flash. Translations are copied into RAM for mapping. Enable this by checking “Copy translations to RAM” in the Text Configuration Tab in the “Config” menu.

Improved designer performance

TouchGFX Designer now operates efficiently without a persistent internet connection, making it usable even in remote locations. Additionally, project opening and creation times have been significantly reduced, even for large projects.

Simplified importing of custom containers

Importing custom containers is now streamlined. If conflicts arise during import, you can select specific files to import, allowing updates to existing containers or the use of pre-existing assets.

Configurable partial framebuffer block size

You can now configure the block dimension of your partial framebuffer, crucial for project setup.

CMake support

TouchGFX now supports CMake projects. Detailed setup, build, and debug instructions are available in our documentation.

Enhanced rotated display features: this will address the requests in the forum here and here.

Two new features for rotated displays:

  1. Single smart framebuffer mode: now supported, resolving previous coordinate reference issues.
  2. Video support: videos with different orientations than the screen are now supported with minimal extra render time.

Other features:

  • New libraries compatible with IAR9 Libcpp (C/C++17 runtime) projects
  • Support for VectorRenderer::setStrokeMiterLimit(), VectorRenderer::setStrokeLineJoin() VectorRenderer::setStrokeLineCap() functionality on NemaP and NemaPVG platforms
  • Added getText() to TextButtonStyle
  • New method HAL::InvalidateTextureCache()
  • New hooks waitUntilTransmitEnd() and    waitUntilCanTransferBlock(uint16_t bottom) to PartialFrameBufferManager
  • Improved render performance on NemaP and NemaPVG platforms

 Bugfixes:

  • Fixed erroneous Static- and DynamicGraph code generation when named 'graph'
  • Fixed Wipe and Cover transition on GPU2D in rotate90
  • Fixed ToggleButton pressed and released images from presets being switched
  • Fixed invalidated areas in Wipe and Cover transition
  • Fixed LCD32bpp::fillBuffer when no alpha in background 
  • Fixed numeric fractions when writing RTL text
  • Fixed SVG stroke in rotated display
  • Fixed SVG gradient in rotated display
  • Fixed bug in translation.rb to better handle extra columns  
  • Fixed warning in translation.rb related to document classifications
  • Videoconvert.rb generated old assembly syntax to include video data for Cortex-M55 on Keil
  • Fixed bug where ImageConverter would fail to generate assets if Thumbs.db files were in the asset folder
  • Fixed compiler warnings in CWRUtil::toQ5() and CWRUtil::toQ10() functions
  • Fixed bug where ImageConverter would compress RGB images in a wrong pixel format compared to framebuffer pixel format
  • Fixed issue with unaligned access in GeneratedFont::getPixelData()
  • Fixed Vector Font render error
  • Fixed issue where Texture Mappers on NemaP platforms could draw wrong pixels  
  • Fixed bug where Graph widget did not clear correctly

To take full advantage of the features in this new version, we recommend using the last version of STM32CubeMX, STM32CubeProgrammer, and STM32CubeIDE.

You can download TouchGFX 4.25.0 here (release date: 03/03/2025).

First published on Mar 4, 2025

11 Comments
GS1
Senior III

Hi,

I updated my project to 4.25.0 and get a linker error for the "new feature   invalidateTextureCache()":

 


linking...
xProTT\xProTT_TFT.axf: Error: L6218E: Undefined symbol touchgfx::paint::invalidateTextureCache() (referred from compressedfontcache.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 1 error messages.

 

When searching for this function, I get 4 refernces in my project:  

Searching for 'invalidateText'...
C:\TouchGFXProjects\xProTT\touchgfx\generated\fonts\src\CompressedUnmappedFontCache.cpp(256) : paint::invalidateTextureCache();
C:\TouchGFXProjects\xProTT\touchgfx\generated\fonts\src\CompressedFontCache.cpp(174) : paint::invalidateTextureCache();
C:\TouchGFXProjects\xProTT\middlewares\st\touchgfx\framework\include\touchgfx\hal\Paint.hpp(46) : void invalidateTextureCache();
C:\TouchGFXProjects\xProTT\middlewares\st\touchgfx\framework\include\touchgfx\hal\HAL.hpp(1388) : virtual void InvalidateTextureCache()
Lines matched: 4 Files matched: 4 Total files searched: 1603

 

Half Solution:

I added an empty function in STM32DMA.cpp (namepace paint), and this fixes the linker error.

However I guess there has to be done something to actually invalidate the Cache, right? 

 

Please advise what to include in this function.

 

Thank you for assisance.

 

Hi GS1

You have it all figured out!

This new function is called to invalidate the texture cache. This cache is present on some MCUs with GPU2D. The main function of this cache is to cache data from OSPI flash (normally images). But it can also cache data in RAM like dynamic bitmaps and compressed fonts.

On H7S7 CubeMX generates this function:

/**
* @fn void invalidateTextureCache();
*
* @brief Flushes the data cache if used.
*/
void invalidateTextureCache()
{
// This function is used when decompressing data to invalidate
// the currently decoded data in RAM to allow the GPU2D texture
// cache to render the pixels correctly.
HAL_ICACHE_Invalidate();
}

On F7 for example, just an empty function.

Generating Code in MX should give you this function.

Thanks for sharing.

 

GS1
Senior III

Good morning,

We use STM32H7A3 in this system and there was no function created at all.

I updated STM32CubeMX to Version 6.14.0. and also the HAL to 1.12.0. But I had to include the function on my own to get the firmware linked.

 

So do I need to call HAL_ICACHE_Invalidate for STM32H7A3? We use OSPI Flash (HyperFlash) for the images.

Thanks in advance!

Best regards

GS

Good morning.

Can you confirm that you clicked "Generate Code" in CubeMX after installing XCubeTouchGFX 4.25?

Empty function is fine with H7A3.

Thanks again.

GS1
Senior III

YES I did generate code in CubeMX and in the Designer after installing all updates. I even did restart my PC and did generate code again after booting to make sure all changes are registered on my system.

 

Thanks.

Can you check the version in MX:

FlemmingGramCHRISTENSEN_0-1741167686972.png

Best Regards

GS1
Senior III

GS1_0-1741168007633.png

I did install it using "From Local" and selected the installationfile for TouchGFS 4.25.0

 

Thanks for verifying. We will investigate on our side and try to replicate the problems.

Your empty function fine.

GS1
Senior III

Thank you for your assistance!!!

 

One last thing to check:

When you have two versions of an XCube installed in MX, you should check which version is selected:

FlemmingGramCHRISTENSEN_0-1741169092491.jpeg

and

FlemmingGramCHRISTENSEN_1-1741169104139.jpeg

Please check when it is convenient.

Thanks

GS1
Senior III

I did never use that selector, but it automatically switched to the correct version:

 

GS1_0-1741171930482.png