cancel
Showing results for 
Search instead for 
Did you mean: 

Linker errors and "Run target" fails

idrissmc
Associate III

hi everyone,

i wanted to create a project with touchGFX but there are errors, i just create the graphic interface, i didn't add any code!

even though when i tried to upload to my card an example it said error too!

how can i resolve this?

 0690X00000BwBSfQAN.png

0690X00000BwBRIQA3.png0690X00000BwBRDQA3.png0690X00000BwBR8QAN.png

43 REPLIES 43

Yes @Martin KJELDSEN​  this is it! The touch won’t work if this file is empty even though the driver (ts) is here! But when I copy paste the code generated by TouchGFX Designer, the touch work so if this file is empty the touch won’t work! I want to know how it’s possible to make this file not empty with CubeIDE without “copy paste�??

or?

It's working as intended =) You're getting the right ideas now.

As i said, CubeMX does not know anything about touch controllers. This is BSP! It only does MCU configuration.

The application template comes with a working project. What we did is start from cubemx/generator (like you) and then manually made the touch controller work, manually configured SDRAM and QSPI, because that's how you would bring up a custom board. The touch controller is display/board specific! CubeMX has no clue, so you need to write the code yourself. And that's what we did for you, in all the application templates.

/Martin

You could then go on to say that you should NEVER create a new TouchGFX HAL for a well known stm32 board that is supported by the designer, unless you're just eager to learn. Otherwise we already did the work.

/Martin

Thank you @Martin KJELDSEN​ this is very cool! I have one more question please :smiling_face_with_smiling_eyes: in TouchGFX in interaction I used slide to change screen but when I debug and run the code there’s no slide it changes the screen without slide, what’s the problem?

Hi,

I think you'll have to be more specific. But my guess is that you do not have an "animation storage" buffer allocated. You allocate this when you configure the TouchGFX HAL.

/Martin

hi @Martin KJELDSEN​ ,

so i have to add the code as I did for SDRAM, QSPI & FMC?

Well, in this case you just need to configure your TouchGFX HAL differently. Here's the doc for HAL::setFrameBufferStartAddress()

    /**
     * @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)
  

The key here is to tell HAL to use an additional buffer (same size as framebuffer) for snapshots when doing screen animations.

Okay @Martin KJELDSEN​  ! But in which file I have to add this? TouchGFXGeneratedHAL.cpp or TouchGFXHAL.cpp because when I open these 2 files I already found setFrameBufferStartAddresss(void* framebuffer,void* doubleBuffer, void * aniamationStorage)

TouchGFXHAL.cpp, you cannot modify GeneratedHAL. You have your HAL::initialize() function there you can use to call the base class init (TouchGFXGeneratedHAL) and reconfigure what you want.

void TouchGFXHAL::initialize()
{
    // Calling parent implementation of initialize().
    //
    // To overwrite the generated implementation, omit call to parent function
    // and implemented needed functionality here.
    // Please note, HAL::initialize() must be called to initialize the framework.
 
    TouchGFXGeneratedHAL::initialize();
}

Reconfigure framebuffer addresses here. Use:;

* setFrameBufferStartAddress, with arguments (bitdepth, use animation storage, ...), if you want touchgfx to decide where to place the buffers

* setFrameBufferStartAddresses, if you want to supply the exact location of each buffer

I'm sorry @Martin KJELDSEN​  if I ask lots of question but I really want to learn

Is this correct?

I add :

TouchGFXGeneratedHAL::setFrameBufferStartAddresses(frameBuffer0, 0, (void*)USE_ANIMATION_STORAGE);

0690X00000BwcmNQAR.png