cancel
Showing results for 
Search instead for 
Did you mean: 

TouchGFX- STM32F423ZHT6

Marudhupandian
Associate III

Hi,

STM32CubeIDE- 1.13.2

TouchGFX -  4.24.0

STM32F423ZHT6 evaluation board has lack of LTDC and DMA2D compare to other STM32F4 series. I want to turn on the LCD panel (NHD-2.8-240320AF-CSXP-FCTP-ND) and it display the white background. Can any one please guide me? How to do it.

1 ACCEPTED SOLUTION

Accepted Solutions
GaetanGodart
ST Employee

Hello @Marudhupandian ,

 

TouchGFX allows for a simple and quick control of a screen thanks to its framework but it is not plug and play for all boards.
For a few STM32F4 we have made a TBS (TouchGFX Board Setup) that allows those board to be plug and play but this is not available for the STM32F423HT6.
This means that you have to create your TBS yourself, basically giving TouchGFX the information about your board speed, communication protocol, screen technology, etc.

You can find how to make a TBS in our documentation : board-introduction 

Furthermore, you can check the other F4 series TBS by opening TouchGFX Designer, clicking on "Create new" and typing "f4" to see al the available TBS for F4 series boards:

GaetanGodart_0-1725270222676.png

You can also check some videos, here is a complete but long one : How to integrate TouchGFX in a custom board 

 

I hope this helps. :smiling_face_with_smiling_eyes:

If this message answer your question, I invite you to select it as "best answer".

 

Regards,

Gaetan Godart
Software engineer at ST (TouchGFX)

View solution in original post

14 REPLIES 14
GaetanGodart
ST Employee

Hello @Marudhupandian ,

 

TouchGFX allows for a simple and quick control of a screen thanks to its framework but it is not plug and play for all boards.
For a few STM32F4 we have made a TBS (TouchGFX Board Setup) that allows those board to be plug and play but this is not available for the STM32F423HT6.
This means that you have to create your TBS yourself, basically giving TouchGFX the information about your board speed, communication protocol, screen technology, etc.

You can find how to make a TBS in our documentation : board-introduction 

Furthermore, you can check the other F4 series TBS by opening TouchGFX Designer, clicking on "Create new" and typing "f4" to see al the available TBS for F4 series boards:

GaetanGodart_0-1725270222676.png

You can also check some videos, here is a complete but long one : How to integrate TouchGFX in a custom board 

 

I hope this helps. :smiling_face_with_smiling_eyes:

If this message answer your question, I invite you to select it as "best answer".

 

Regards,

Gaetan Godart
Software engineer at ST (TouchGFX)
Marudhupandian
Associate III

Thanks for your quick reply @GaetanGodart

I already watched that video https://youtu.be/SRQD8JMeg_k?si=oWqNTiEddbzsl_pj

Here, STM32F413ZHT6 does not have LTDC. So I'm using FSMC as a LCD interface.

Marudhupandian_0-1725277210389.png

 

I create a TouchGFX project via STM32CubeIDE-> TouchGFX-> ApplicationTemplate.touchgfx.part 

Then I created an example project.

Marudhupandian_2-1725277465562.png

 

Marudhupandian_1-1725277447458.png

 

Then I run a TouchGFX project and refresh it. After compile successfully. In between that where I put a LCD initialization code?

 

When I enter the Program and run target. I got failed message.

Like: 

Program and Run Target
    Generate
        Done
    Generate Assets
        make -f simulator/gcc/Makefile assets -j8
        Reading ./application.config
        Reading ./target.config
        Done
    Post Generate
        touchgfx update_project --project-file=simulator/msvs/Application.vcxproj
        Done
    Post Generate Target
        touchgfx update_project
        Writing STM32CubeIDE project file: ../.cproject
        Done
    Compile
        make -f ../gcc/Makefile -j8
        make: ../gcc/Makefile: No such file or directory
        make: *** No rule to make target '../gcc/Makefile'.  Stop.
        Failed
    Failed

 

Marudhupandian_4-1725277840736.png

 

No problem! :smiling_face_with_smiling_eyes:

The error happens during compilation.
Apparently, there is no Makefile.
Can you check that you have a Makefile in the gcc fodler?

If you don't, you should create one (you can get very inspired by the ones we created for boards similar to yours).

 

Regards,

Gaetan Godart
Software engineer at ST (TouchGFX)

This is my make file;

Marudhupandian_0-1725278758324.png

 

GaetanGodart
ST Employee

This make file seems to only be good to run the simulator as it seems to call "make generated/simulator/gcc/Makefile".
I could be wrong though.

Do you have a Mafekile in generated/simulator/gcc?

Gaetan Godart
Software engineer at ST (TouchGFX)

Yes, I've Makefile in generated/simulator/gcc

Marudhupandian_0-1725338626849.png

# Get identification of this system
ifeq ($(OS),Windows_NT)
UNAME := MINGW32_NT-6.2
else
UNAME := $(shell uname -s)
endif
 
board_name := $(UNAME)
 
.PHONY: all clean assets
 
# Directories containing application-specific source and header files.
# Additional components can be added to this list. make will look for
# source files recursively in comp_name/src and setup an include directive
# for comp_name/include.
components := gui simulator generated/gui_generated generated/simulator
 
# Location of folder containing bmp/png files.
asset_images_input := assets/images
 
# Location of folder to search for ttf font files
asset_fonts_input := assets/fonts
 
# Location of folder where the texts.xml is placed
asset_texts_input := assets/texts
 
# Location of folder where video files are places
asset_videos_input := assets/videos
 
build_root_path := build
object_output_path := $(build_root_path)/$(board_name)
binary_output_path := $(build_root_path)/bin
 
# Location of output folders where autogenerated code from assets is placed
asset_root_path := generated
asset_images_output := $(asset_root_path)/images
asset_fonts_output := $(asset_root_path)/fonts
asset_texts_output := $(asset_root_path)/texts
asset_videos_output := $(asset_root_path)/videos
 
#include application specific configuration
include config/gcc/app.mk
 
### END OF USER SECTION. THE FOLLOWING SHOULD NOT BE MODIFIED ###
 
ifeq ($(UNAME), Linux)
library_path := $(touchgfx_path)/3rdparty/libjpeg/lib/linux $(touchgfx_path)/lib/linux $(ADDITIONAL_LIBRARY_PATHS)
libraries := touchgfx SDL2 SDL2_image jpeg rt m pthread dl $(ADDITIONAL_LIBRARIES)
libstart := -Wl,--start-group
libend := -Wl,--end-group
libextra :=
library_includes += $(touchgfx_path)/3rdparty/libjpeg/include
linker_options_local := -Xlinker -rpath -Xlinker $(touchgfx_path)/3rdparty/libjpeg/lib/linux
resource_file :=
imageconvert_executable := $(touchgfx_path)/framework/tools/imageconvert/build/linux/imageconvert.out
fontconvert_executable := $(touchgfx_path)/framework/tools/fontconvert/build/linux/fontconvert.out
simulator_executable := simulator.out
linker_options += -static-libgcc -Xlinker --no-as-needed
else
sdl_library_path := $(touchgfx_path)/lib/sdl2/win32
jpeg_library_path := $(touchgfx_path)/3rdparty/libjpeg/lib/win32
library_path := $(sdl_library_path) $(jpeg_library_path) $(touchgfx_path)/lib/win/mingw32 $(ADDITIONAL_LIBRARY_PATHS)
libraries := touchgfx SDL2 SDL2_image jpeg-8 m pthread mingw32 $(ADDITIONAL_LIBRARIES)
libstart := -Wl,--start-group
libend := -Wl,--end-group
libextra := -Wl,--subsystem,windows
library_includes += $(touchgfx_path)/framework/include/platform/hal/simulator/sdl2/vendor $(touchgfx_path)/3rdparty/libjpeg/include
resource_file := generated/simulator/touchgfx.res
imageconvert_executable := $(touchgfx_path)/framework/tools/imageconvert/build/win/imageconvert.out
fontconvert_executable := $(touchgfx_path)/framework/tools/fontconvert/build/win/fontconvert.out
simulator_executable := simulator.exe
$(resource_file): $(resource_file:%.res=%.rc) $(resource_file:%.res=%.ico)
	@echo Creating Windows resource file with program icon
	@windres $(resource_file:%.res=%.rc) -O coff -o $@
linker_options += -static-libgcc -static-libstdc++
endif
 
c_compiler           := g++
c_compiler_options   += -DSIMULATOR='' -g
cpp_compiler         := g++
cpp_compiler_options += -g -DSIMULATOR='' -DENABLE_LOG
linker               := g++
 
WARN = error all extra write-strings init-self cast-qual \
       pointer-arith strict-aliasing format=2 uninitialized \
       missing-declarations no-long-long no-unused-parameter \
       no-variadic-macros no-format-extra-args \
       no-conversion no-overloaded-virtual
CXXWARN = non-virtual-dtor ctor-dtor-privacy
 
c_compiler_options_local   += -pedantic $(addprefix -W,$(WARN))
cpp_compiler_options_local += -pedantic $(addprefix -W,$(WARN) $(CXXWARN))
 
#include everything + specific vendor folders
framework_includes := $(touchgfx_path)/framework/include
 
#only take in the source we want to build for this sim
framework_files := $(touchgfx_path)/framework/source/platform/driver/touch/SDL2TouchController.cpp
framework_source := $(touchgfx_path)/framework/source/platform/hal/simulator/sdl2
 
#this needs to change when assset include folder changes.
all_components := $(components) \
	$(asset_fonts_output) \
	$(asset_images_output) \
	$(asset_texts_output) \
	$(asset_videos_output)
 
#keep framework include and source out of this
include_paths := $(library_includes) $(foreach comp, $(all_components), $(comp)/include) $(framework_includes) $(ADDITIONAL_INCLUDE_PATHS)
source_paths = $(foreach comp, $(all_components), $(comp)/src) $(framework_source) simulator
 
# Finds files that matches the specified pattern. The directory list
# is searched recursively. It is safe to invoke this function with an
# empty list of directories.
#
# Param $(1): List of directories to search
# Param $(2): The file pattern to search for
define find
	$(foreach dir,$(1),$(foreach d,$(wildcard $(dir)/*),\
		$(call find,$(d),$(2))) $(wildcard $(dir)/$(strip $(2))))
endef
unexport find
 
fontconvert_ttf_lower_files := $(call find, $(asset_fonts_input), *.ttf)
fontconvert_ttf_upper_files := $(call find, $(asset_fonts_input), *.TTF)
fontconvert_otf_lower_files := $(call find, $(asset_fonts_input), *.otf)
fontconvert_otf_upper_files := $(call find, $(asset_fonts_input), *.OTF)
fontconvert_bdf_lower_files := $(call find, $(asset_fonts_input), *.bdf)
fontconvert_bdf_upper_files := $(call find, $(asset_fonts_input), *.BDF)
fontconvert_font_files := $(fontconvert_ttf_lower_files) \
			  $(fontconvert_ttf_upper_files) \
			  $(fontconvert_otf_lower_files) \
			  $(fontconvert_otf_upper_files) \
			  $(fontconvert_bdf_lower_files) \
			  $(fontconvert_bdf_upper_files)
 
source_files := $(call find, $(source_paths),*.cpp) $(framework_files) $(ADDITIONAL_SOURCES)
c_source_files := $(call find, $(source_paths),*.c)
 
object_files := $(source_files:$(touchgfx_path)/%.cpp=$(object_output_path)/touchgfx/%.o) $(c_source_files:$(touchgfx_path)/%.c=$(object_output_path)/touchgfx/%.o)
object_files := $(object_files:%.cpp=$(object_output_path)/%.o)
object_files := $(object_files:%.c=$(object_output_path)/%.o)
dependency_files := $(object_files:%.o=%.d)
 
textconvert_script_path := $(touchgfx_path)/framework/tools/textconvert
videoconvert_script_path := $(touchgfx_path)/framework/tools/videoconvert
 
text_database := $(asset_texts_input)/texts.xml
 
.PHONY: all clean assets generate_assets build_executable
 
all: generate_assets
 
generate_assets: assets
	@$(MAKE) -f generated/simulator/gcc/Makefile -r -s $(MFLAGS) build_executable
 
build_executable: $(binary_output_path)/$(simulator_executable) post_build
 
$(binary_output_path)/$(simulator_executable): $(object_files) $(resource_file)
	@echo Linking $(@)
	@mkdir -p $(@D)
	@mkdir -p $(object_output_path)
	@$(file >$(build_root_path)/objects.tmp) $(foreach F,$(object_files),$(file >>$(build_root_path)/objects.tmp,$F))
	@$(linker) \
		$(linker_options) $(linker_options_local) \
		$(patsubst %,-L%,$(library_path)) \
		@$(build_root_path)/objects.tmp -o $@ $(resource_file) \
		$(libstart) $(patsubst %,-l%,$(libraries)) $(libend) $(libextra)
	@rm -f $(build_root_path)/objects.tmp
	# Remove old images
	@rm -f $(binary_output_path)/*.bin
	@if ls $(asset_videos_output)/bin/*.bin >/dev/null 2>&1; then cp $(asset_videos_output)/bin/*.bin $(binary_output_path); fi
ifneq ($(UNAME), Linux)
	@if [ ! -f $(binary_output_path)/SDL2.dll ]; then cp $(sdl_library_path)/SDL2.dll $(binary_output_path); fi
	@if [ ! -f $(binary_output_path)/SDL2_image.dll ]; then cp $(sdl_library_path)/SDL2_image.dll $(binary_output_path); fi
	@if [ ! -f $(binary_output_path)/libpng16-16.dll ]; then cp $(sdl_library_path)/libpng16-16.dll $(binary_output_path); fi
	@if [ ! -f $(binary_output_path)/zlib1.dll ]; then cp $(sdl_library_path)/zlib1.dll $(binary_output_path); fi
	@if [ ! -f $(binary_output_path)/libjpeg-8.dll ]; then cp $(jpeg_library_path)/libjpeg-8.dll $(binary_output_path); fi
endif
 
.PHONY: post_build
post_build:
	@mkdir -p $(binary_output_path)
	@if [ -f simulator/landscape.png ]; then cp simulator/landscape.png $(binary_output_path); else rm -f $(binary_output_path)/landscape.png; fi
	@if [ -f simulator/portrait.png ]; then cp simulator/portrait.png $(binary_output_path); else rm -f $(binary_output_path)/portrait.png; fi
 
$(object_output_path)/touchgfx/%.o: $(touchgfx_path)/%.cpp config/gcc/app.mk
	@echo Compiling $<
	@mkdir -p $(@D)
	@$(cpp_compiler) \
		-MMD -MP $(cpp_compiler_options) $(cpp_compiler_options_local) $(user_cflags) \
		$(patsubst %,-I%,$(include_paths)) \
		-c $< -o $@
 
$(object_output_path)/%.o: %.cpp config/gcc/app.mk
	@echo Compiling $<
	@mkdir -p $(@D)
	@$(cpp_compiler) \
		-MMD -MP $(cpp_compiler_options) $(cpp_compiler_options_local) $(user_cflags) \
		$(patsubst %,-I%,$(include_paths)) \
		-c $< -o $@
 
$(object_output_path)/%.o: %.c config/gcc/app.mk
	@echo Compiling $<
	@mkdir -p $(@D)
	@$(c_compiler) \
		-MMD -MP $(c_compiler_options) $(c_compiler_options_local) $(user_cflags) \
		$(patsubst %,-I%,$(include_paths)) \
		-c $< -o $@
 
ifeq ($(MAKECMDGOALS),build_executable)
$(firstword $(dependency_files)): config/gcc/app.mk
	@rm -rf $(object_output_path)
-include $(dependency_files)
endif
 
assets: images texts videos
 
.PHONY: images
images:
	@$(imageconvert_executable) -r $(asset_images_input) -w $(asset_images_output)
 
.PHONY: texts
texts:
	@ruby $(textconvert_script_path)/main.rb $(text_database) $(fontconvert_executable) $(asset_fonts_output) $(asset_texts_output) $(asset_fonts_input) .
 
.PHONY: videos
videos:
	@ruby $(videoconvert_script_path)/videoconvert.rb $(asset_videos_input) $(asset_videos_output)
 
clean:
	@echo Cleaning
	@rm -rf $(build_root_path)
	# Do not remove gui_generated
	@rm -rf $(asset_images_output)
	@rm -rf $(asset_fonts_output)
	@rm -rf $(asset_texts_output)
	@rm -rf $(asset_videos_output)
	# Create directory to avoid error if it does not exist
	@mkdir -p $(asset_root_path)
	# Remove assets folder if it is empty (i.e. no gui_generated folder)
	@rmdir --ignore-fail-on-non-empty $(asset_root_path)
GaetanGodart
ST Employee

Hello @Marudhupandian ,

 

Are you sure that you have a gcc folder and a Makefile in it?
When I look at your screenshots, I see that you have the TouchGFX folder but I do not see the gcc folder.
The TouchGFX and gcc folder should be at the same level :

GaetanGodart_0-1725352188364.png

Can you double check that please?

Regards,

Gaetan Godart
Software engineer at ST (TouchGFX)

Hi @GaetanGodart 

You are correct. I don't have gcc file. How to make gcc file.

Marudhupandian_0-1725357836319.png

What is the next step to complete my project? How can I do to turn on my LCD display?