Discuss STM32 and TouchGFX implementations, including configuration, debugging, and optimization.
Most recent activity
We wish to always improve our documentation. The best reviews and critics always come from the people that read it, so we would like to use this post to collect your thoughts and feedbacks. Please share what you like, dislike, what you think is missing, etc ... /The TouchGFX team
TouchGFX 4.26.1 is now out. Please follow this link to download it.This version is a patch release and includes bugfixes of issues seen on TouchGFX Designer 4.26.1 version, as well as adding support of the new STM32H5F5 and Chrom-ART 2.Please visit our dedicated website for STM32H5 graphics to know more about high performance graphics on our most powerful Cortex-M33 MCU. Release details: Release date: March 2nd, 2026 New TouchGFX Designer Features Allow selecting a CMakeLists.txt file as the project file without requiring a STM32CubeMX .ioc file. Bugfixes in TouchGFX Designer Fix caching issue when changing text configurations and re-generating code. Fix outdated timestamp on files when importing a GUI. Fix faulty code generation when a Shape widget has two identical end points. Fix faulty code generation when a Shape widget uses an "interaction ended" callback. New TouchGFX Generator Features Support for STM32H5F5/E5 and STM32H5F4/E4 series with the
When creating a UI project, you may need widgets that are not part of the TouchGFX library. To create your own graphical element, the TouchGFX team suggests using the Custom Container approach. Since TouchGFX 4.20 it is possible to export and import Custom Containers into different projects. The TouchGFX team is working on developing new custom containers that could be useful for our own projects. You will find them under this post. The first widget is a keyboard. We hope that the idea will please you and that it will be useful for your projects ;)! We invite you to do the same. In the guide attached you will learn how to create your own widgets and how to export them. We wish to create a space where the community can find and share custom widgets. To keep this space a good place for collaboration between all of us, we invite you to share your project in a zip format which includes you widget (.tpkg) and a short document explaining your widget. Your post needs
Hey I came across this thread: Rotate text at any angle, where @Romain DIELEMAN mentioned a custom widget called TextArc (TextArc.cpp/hpp) demonstrating arbitrary text rotation.Unfortunately, the original demo files/links seem to be missing or broken. Does anyone still have a copy of this TextArc widget, or can ST re-upload the sample project?If this demo is no longer available or compatible with recent TouchGFX versions, what is the recommended approach to render/rotate text at arbitrary angles today?Thanks in advance!
In TouchGFX/target/generated/OSWrappers.cpp at row 38 & 39 the lines : static TX_SEMAPHORE frame_buffer_sem = { 0 };static TX_QUEUE vsync_q = { 0 };will produce a GCC compiler error when the compiler settings are set at -Werror. error: missing initializer for member 'TX_SEMAPHORE_STRUCT::tx_semaphore_name' [-Werror=missing-field-initializers]Compiled with these relevant flagsarm-none-eabi-g++ "../TouchGFX/target/generated/OSWrappers.cpp" -mcpu=cortex-m7 -std=gnu++17 -g3 -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-use-cxa-atexit -Wall -Wextra -Werror
I want to make the CustomScrollTimeTextCenter fully visible, without being cut off by anything else, and without leaving any extra gaps.But it's this kind of effect, I've tried adjusting all sorts of parameters, and I still can't get the effect I want.I want this kind of effect:Here's an introduction to the problem:I have two custom components of different heightsCustomScrollTimeTextCenter 70CustomScrollTimeText 44
Hello ST Community,I would like to share an improvement I made to one of my TouchGFX projects.BackgroundMy previous implementation used a login screen to demonstrate an on-screen keyboard. The login screen was created only as an example application to showcase the keyboard and its functionality.To provide a more familiar user experience, I also implemented features that are commonly found in modern desktop and web applications, including: Custom on-screen keyboard Password input field Show/Hide Password button Password masking User authentication flow Although these features worked well for the login example, the keyboard implementation was tightly coupled with the screen.The ProblemThe original custom container included: Keyboard Text area Input buffer Buttons Password controls Whenever the custom container was added to another screen, all of these UI elements were created together.This reduced flexibility because many applications only need the keyboard while using th
Hello everyone,I'm trying to interface a Waveshare 4.0" TFT Touch Shield (SKU13587) with an ILI9486 LCD controller using an STM32F767ZI.The display communicates over SPI, and the SPI bus is shared with the XPT2046 touch controller. At this stage I am testing only the LCD. The touchscreen is completely disabled and is not accessed by the software.HardwareMCU: STM32F767ZI Display: Waveshare 4.0" TFT Touch Shield (SKU13587) LCD Controller: ILI9486 Touch Controller: XPT2046 (not used during testing) Interface: SPI Current statusI wrote my own low-level ILI9486 driver.The following basic operations work correctly:LCD initialization Setting an address window Writing commands Writing data Drawing a single pixelA single pixel is always drawn at the correct position.ProblemThe problem appears only when I draw a filled rectangle (or any larger filled area).The rectangle itself is drawn correctly, but additional unwanted pixels appear beside the rectangle.The artifacts have some interesting cha
Hello ST Community,I am working with the STM32N657X0H32Q and configuring the LTDC with external memory. I am facing an issue with framebuffer writes.The external memory is connected to XSPI Port 1, and the read and write operations work correctly in Memory-Mapped mode at address 0x90000000. I am able to read from and write to this address without any issues.However, when I configure the LTDC to use the framebuffer at 0x90000000 with a resolution of 800 × 600, I observe that some bytes are missing or skipped during the framebuffer write operation.For example, I observe that approximately 1 KB of data is written, followed by around 300 bytes being skipped, and this pattern continues.Memory Configuration/* Memories definition */MEMORY{ ROM (xrw) : ORIGIN = 0x34180400, LENGTH = 255K RAM (xrw) : ORIGIN = 0x341C0000, LENGTH = 256K SCREEN_BUFFER_SRAM (xrw) : ORIGIN = 0x90000000, LENGTH = 20M}.screen_buffer (NOLOAD) :{ . = ALIGN(4); _screen_buffer_start = .; KEEP(*(.screen_b
[STM32U5G9] MJPEG video playback hangs intermittently with HAL_JPEG_ERROR_DMA — non-deterministic race conditionEnvironmentItem Value MCU STM32U5G9ZJT6Q Custom Board Yes (not STM32U5G9J-DK2) External Flash Macronix MX25L12833F on OCTOSPI (memory-mapped mode) Display 800×480 RGB565 LCD via LTDC TouchGFX 4.26.0 TouchGFX Generator 4.26.0 FreeRTOS V10.6.2 (CMSIS-RTOS2, via X-CUBE-FREERTOS 1.0.1) STM32CubeIDE 2.1.1 STM32CubeMX Latest STM32U5 HAL Driver V1.4+ Compiler arm-none-eabi-gcc 14.3.rel1 Issue DescriptionMJPEG intro video plays inconsistently. The first frame is partially decoded (top 16 pixel rows visible, rest of framebuffer shows stale main-screen content). The TouchGFX task then blocks indefinitely on SEM_WAIT(semDecodingDone) and the system enters the FreeRTOS idle task (prvCheckTasksWaitingTermination).Same code, same setup, three different runs produce three different outcomes:Run 1 (best case) dbg_jpeg_irq = 3dbg_gpdma_ch0_irq
Hi everyone!Can you guys help me to identify the reason of the strange screen distortions that I’m getting from time to time on my custom board based on stm32f746 with external SDRAM. The display is controlled by LTDC controller. Example of distortionsHas it something to do with LTDC controller or with SDRAM?I appreciate any help!THX
Creating your own custom reusable containers has its limitations. One of the, in my opionion, largest drawbacks is that you are not able to set multiple sizes in Designer for the same container (e.g. in the same screen add a MyCustomContainer with size 31x731 and a MyCustomContainer with size 61x13). Currently there are three options:(1) new container for every new sizeCreate a new custom container for every size variation you have. Add an abstract base class that implements some of the common code and let every container extend that base class. Pro: in Designer you can see roughly how your component will look like for all of the sizes. Con: you still have to copy paste code between the different containers that are actually all identical except for their size. If you have a lot of different sizes, this option is not viable.(2) single container but all components are invisibleCreate a custom container with all of its child components hidden and “override” Drawable::setWidthHeight(int16
Request: Add an option to the ModalWindow to hide the modal when the shade is pressed. Also add a switch in the Properties panel in DesignerThis can be implemented as simply as: namespace touchgfx{class ModalWindow: public Container{public: ModalWindow: // ... shadePressedCallback(this, &ModalWindow::shadePressedCallbackHandler), shadeWasPressed(false), hideOnShadePressed(false) { backgroundShade.setClickAction(shadePressedCallback); windowContainer.setTouchable(true); } // ... // some setter/getter for `hideOnShadePressed` void shadePressedCallbackHandler(const Box &box, const ClickEvent &event) { bool pressed = event.getType() == ClickEvent::PRESSED; if (hideOnShadePressed && &box == &backgroundShade && shadeWasPressed && !pressed) { hide(); } shadeWasPressed = pressed; }protected: // ... Callback<ModalWindow, const Box&
I have used the 70STM32H7 template in TouchGFX Designer 4.26.1 to create a project for a Riverdi RVT70 board.I've created a basic start screen, generated code and built it using CubeIDE 2.1.0.The code loads onto the target and runs as expected.If I open the project's .ioc file, I am told that the project uses V1.12.1 of the STM32Cube FW_H7 and V.13.0 is available. Upgrading to this version, saving and regenerating the code results in the project failing to build:In file included from ../../../CM7/USB_HOST/Target/usbh_conf.h:98, from ../../../Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h:27, from ../../../Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_bot.h:28, from C:/TouchGFXProjects/GFX/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c:27: ../../../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h:32:10: fatal error: cmsis_os2.h: No such file or directory 32 | #include "cmsis_os2.h"This can be fixed by adding a new i
Environment: TouchGFX 4.26.0, Windows, Ruby 3.0 (bundled MinGW env). Text database: texts.xml is 13.7 MB - 20 languages x 8,255 text entries = 165,100 translations. "remap": "yes" in application.config, binary translations and binary fonts both enabled for one of the passes. Symptom: make texts took ~181s cold on a developer machine, ~2min on our build server. Adding timing markers around each phase of Generator#run put 146s of it inside StringCollector#run. Cause: the fold that collects the translations, in framework/tools/textconvert/lib/string_collector.rb: all_strings = Array.new(languages.count, Array.new) text_entries.each do |text_entry| text_entry.translations.each_with_index do |translation, lang_index| all_strings[remap_global ? 0 : lang_index] += [translation] end end`a += [x]` allocates a new array and copies the whole accumulated contents on every iteration, so this is O(n^2) in the number of translations. With global remapping every language fold
Hi,As I tried to use the gauge Widget, the needle doesn’t display on the lcd nor the simulation.I also tested with the analog clock and experienced the same issue.Is there anything I need to change in my project configuration ?I am using an stm32h7a3zi-q Nucleo and a 320 x 240 LCD TFT screen.
TouchGFX Designer: 4.26.0I cannot share the project to reproduce the bug unfortunately.I removed several custom containers in the Container tab. In several places in the Screens tab a yellow dot appeared for some now incomplete screen interactions (expected behavior). However, when generating sources/saving the project I got the following error```txt2026-07-16 14:45:05,342 [1] ERROR TouchGFXDesigner.App: Object reference not set to an instance of an object.System.NullReferenceException: Object reference not set to an instance of an object. at TouchGFXDomainModel.LoadSave.Serial.ToSerial.Convert(TriggerCustom t) at TouchGFXDomainModel.LoadSave.Serial.ToSerial.Convert(Interaction i) at System.Linq.Enumerable.IListSelectIterator`2.ToList() at TouchGFXDomainModel.LoadSave.Serial.ToSerial.Convert(Screen s) at System.Linq.Enumerable.IListSelectIterator`2.ToList() at TouchGFXDomainModel.LoadSave.Serial.ToSerial.Convert(Application a) at TouchGFXDomainModel.LoadSave.Serial.ToSeri
Hello wonderful ST Community!Before I get into the question, a bit of background on this project. I'm creating a button panel HID gaming device for the space sim Elite Dangerous. Using its somewhat limited API I'm hoping to feed info about the game state back to a 9 inch screen on the HID device through USB CDC running composite with HID. Before I start getting into hardware dev I want to create a sim of the GUI to test two things:- size of display needed to show what I want to show- getting data out of the game (will be done with a USB CDC app/driver/python (I have not quite got this far) running on the host computer)It would be amazing to test these two aspects using the GFX simulator. I known it's theoretically possible to send data through some medium such as sockets but how does this work in practice?Is there some good documentation around how the simulator works and how I can feed data into my sims?I've been investigating using VSCode since GFX already has compatibility, but how
Hello,I need to speed up a image processing pipeline and want to offload image scaling to NeoChrom. It should be possible on STM32N6, however:I need nema_core.h and nema_graphics.h. I’ve downloaded TouchGFX via CubeMX, but I don’t see those files anywhere. I think, I need a /port/hardware config/ for STM32N6, but I don’t see any examples in https://github.com/STMicroelectronics/STM32CubeN6/tree/main/Projects/STM32N6570-DKHow should I proceed in this situation?
Hi! I have already trained my AI model using the STM32 Model Zoo Services, and the project is fully running on the STM32N6570-DK board. The model has been successfully deployed, and the object detection is working correctly with the camera.In parallel, I have also developed the graphical user interface using TouchGFX as a separate project. At this point, my goal is to integrate both projects into a single application: the TouchGFX interface and the AI inference application.I have read your article about integrating TouchGFX with the Camera Middleware, which was very helpful.However, I could not find information about integrating TouchGFX with an AI application generated from the STM32 Model Zoo Services.What I would like to achieve is the following workflow: the application starts with the TouchGFX interface, and when the user presses a button, the camera is initialized, the AI inference pipeline starts, and the model begins detecting objects in real time.Could you please advise on the
EnvironmentTouchGFX 4.26.1 (Engine + prebuilt library) LCD config: 8bpp, `LCD8bpp_ABGR2222`, 240x240 Reproduced on Windows simulator (MSVC), Linux simulator, and STM32U595 hardware. Same TouchGFX source across all three, so this is not platform-specific.SummaryWhen an ABGR2222 dynamic external bitmap is drawn with `LCD::drawPartialBitmap` and the source rect extends past the dirty (clip) rect on the Y axis, the clipping path writes the overhanging rows starting at the dirty rect's top (`dirtyRect.y`) instead of at the requested `screenY`. The result is a duplicated copy of those rows at the wrong vertical position.X-axis clipping is correct: `screenX` can be negative or off-screen with no issue. The defect is specific to vertical overhang. Trigger conditions (all must hold)Bitmap format `Bitmap::ABGR2222` (the other three 8bpp 2222 formats compile to identical code, so they are likely affected too) Bitmap registered with `Bitmap::dynamicBitmapCreateExternal` Drawn via `LCD::drawPartial
I made a custom board with STM32H7S7 , Touchgfx without OS, 2 framebuffers in psram(aps256xxn). At first ,after startthe debugging ,the display is normal,but after a while (random time),display is freezing. Then I pause the program,I foundit stuck at nema_wait_irq_cl. This is my screen:This is information when stuck:This project is a test project,the touchgfx code is simply rotate textureMapper1 and move red box on each frame
The problem described in https://community.st.com/stm32-mcus-touchgfx-and-gui-33/duplicit-include-paths-are-added-to-keil-project-when-touchgfx-project-is-regenerated-151799 ist still there. The topic was closed a year ago and it seems that nothing happened since then.Please provide a solution!
Hi Community, We are exploring the migration of our FreeRTOS-based firmware to Zephyr. Our current design heavily relies on TouchGFX (provided by ST) for controlling an 800×480 touch display. Here are some key details of our setup: TouchGFX with external SDRAM for a double frame buffer using the FMC peripheral Images, fonts, and text stored in external QSPI Flash LTDC controller in use DMA2D accelerator enabled RGB image compression utilized Is there any sample application or detailed documentation available for achieving this on Zephyr? I have already briefly reviewed the following resources: Abstraction Layer Architecture | TouchGFX Documentation and https://support.touchgfx.com/docs/basic-concepts/operating-system#touchgfx-os-wrappers However, I need more guidance, specifically: Examples or reference projects for TouchGFX on Zephyr Detailed documentation on integration steps We have a tig
Hi everyone,I am relatively new to the ST ecosystem, coming primarily from a web development and programmatic software background.I recently built a browser-based daily logic game tailored for my local market called hang 5. The core mechanics rely on a responsive visual letter grid, basic string matching for user inputs, and a specific vowel-penalty state machine.As a hobby project, I want to build a physical, standalone desktop version of this puzzle using an STM32 board and a small capacitive touch TFT display. I've been researching TouchGFX to handle the UI, as it seems more than capable of replicating the clean CSS grid layout I am currently using on the web version.Before I purchase my first board, I have two quick questions: Which STM32 Discovery kit would you recommend for a beginner wanting to utilize TouchGFX for a snappy, interactive 2D touch grid? The game requires a daily dictionary array of about 2,500 words. Is storing this plain text array directly in the internal flas
ST Community highlights – April to June 2026
Already have an account? Login
No account yet? Create an account
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.