Skip to main content
Associate III
June 26, 2024
Question

Code gets stuck at configASSERT(0); after running for few minutes

  • June 26, 2024
  • 5 replies
  • 2550 views

I am using the STM32H735G-DK board

When i tried the Debugging at this file the code gets stuck.

 

 

 

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * File Name : STM32TouchController.cpp
 ******************************************************************************
 * This file is generated by TouchGFX Generator 4.19.1.
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2022 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */

/* USER CODE BEGIN STM32TouchController */

#include <STM32TouchController.hpp>
#include <stm32h735g_discovery_ts.h>
#include <TouchGFXHAL.hpp>
#include <cmsis_os.h>

void STM32TouchController::init()
{
 TS_Init_t hTS;

 hTS.Orientation = TS_SWAP_XY;
 hTS.Accuracy = 0;
 hTS.Width = touchgfx::HAL::FRAME_BUFFER_WIDTH;
 hTS.Height = touchgfx::HAL::FRAME_BUFFER_HEIGHT;
 BSP_TS_Init(0, &hTS);
}

bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
{
 TS_State_t TS_State = { 0 };

 /* This should never fail !! */
 if (BSP_TS_GetState(0, &TS_State) != BSP_ERROR_NONE)
 {
 configASSERT(0);
 }

 if (TS_State.TouchDetected)
 {
 x = TS_State.TouchX;
 y = TS_State.TouchY;

 return true;
 }

 return false;
}

/* USER CODE END STM32TouchController */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

 

 

configASSERT(0);  is the line at which the code is 

 

@STTwo-32 

 

 

 

5 replies

Andrew Neil
Super User
June 26, 2024

@vishnu_illikkal wrote:

configASSERT(0);  is the line at which the code is 


Here:

 

 /* This should never fail !! */
 if (BSP_TS_GetState(0, &TS_State) != BSP_ERROR_NONE)
 {
 configASSERT(0);
 }

 

 So BSP_TS_GetState() is returning an error.

Take a look at what error it's returning.

Can you step into  BSP_TS_GetState() to see where it detects the error?

 

EDIT:

 


@vishnu_illikkal wrote:

after running for few minutes


So maybe try instrumenting BSP_TS_GetState() (eg, UART output) and see what changes when it stops working ...

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Associate III
June 26, 2024

ok will check.

Associate III
June 26, 2024

does anyone know how not to optimize out the values?
this is on by default.

Andrew Neil
Super User
June 26, 2024

@vishnu_illikkal wrote:

does anyone know how not to optimize out the values?


Change optimiser level.

Make sure the value is used - eg, in a printf.

Make the variable 'volatile'

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Associate III
June 26, 2024

i used snprintf and got to see the error

bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
{
 TS_State_t TS_State = { 0 };

 /* This should never fail !! */
 int err = BSP_TS_GetState(0, &TS_State);
 printf("%d",err);
 char buffer[50]; // Adjust the buffer size as needed

	snprintf(buffer, sizeof(buffer), "%d", err);
	printf("%s\n", buffer);

// event_log((char*)err, LOG_DEBUG);
 if (BSP_TS_GetState(0, &TS_State) != BSP_ERROR_NONE)
 {
 configASSERT(0);
 }

 if (TS_State.TouchDetected)
 {
 x = TS_State.TouchX;
 y = TS_State.TouchY;

 return true;
 }

 return false;
}




it was -5 which is BSP_ERROR_COMPONENT_FAILURE

 

/**
 * @brief Returns positions of a single touch screen.
 * Instance TS instance. Could be only 0.
 * TS_State Pointer to touch screen current state structure
 * @retval BSP status
 */
int32_t BSP_TS_GetState(uint32_t Instance, TS_State_t *TS_State)
{
 int32_t ret = BSP_ERROR_NONE;
 uint32_t x_oriented, y_oriented;
 uint32_t x_diff, y_diff;

 if(Instance >= TS_INSTANCES_NBR)
 {
 ret = BSP_ERROR_WRONG_PARAM;
 }
 else
 {
 FT5336_State_t state;

 /* Get each touch coordinates */
 if(Ts_Drv->GetState(Ts_CompObj[Instance], &state) < 0)
 {
 ret = BSP_ERROR_COMPONENT_FAILURE;
 }/* Check and update the number of touches active detected */
 else if(state.TouchDetected != 0U)
 {
 x_oriented = state.TouchX;
 y_oriented = state.TouchY;

 if((Ts_Ctx[Instance].Orientation & TS_SWAP_XY) == TS_SWAP_XY)
 {
 x_oriented = state.TouchY;
 y_oriented = state.TouchX;
 }

 if((Ts_Ctx[Instance].Orientation & TS_SWAP_X) == TS_SWAP_X)
 {
 x_oriented = Ts_Ctx[Instance].MaxX - state.TouchX - 1UL;
 }

 if((Ts_Ctx[Instance].Orientation & TS_SWAP_Y) == TS_SWAP_Y)
 {
 y_oriented = Ts_Ctx[Instance].MaxY - state.TouchY;
 }

 /* Apply boundary */
 TS_State->TouchX = (x_oriented * Ts_Ctx[Instance].Width) / Ts_Ctx[Instance].MaxX;
 TS_State->TouchY = (y_oriented * Ts_Ctx[Instance].Height) / Ts_Ctx[Instance].MaxY;
 /* Store Current TS state */
 TS_State->TouchDetected = state.TouchDetected;

 /* Check accuracy */
 x_diff = (TS_State->TouchX > Ts_Ctx[Instance].PreviousX[0])?
 (TS_State->TouchX - Ts_Ctx[Instance].PreviousX[0]):
 (Ts_Ctx[Instance].PreviousX[0] - TS_State->TouchX);

 y_diff = (TS_State->TouchY > Ts_Ctx[Instance].PreviousY[0])?
 (TS_State->TouchY - Ts_Ctx[Instance].PreviousY[0]):
 (Ts_Ctx[Instance].PreviousY[0] - TS_State->TouchY);


 if ((x_diff > Ts_Ctx[Instance].Accuracy) || (y_diff > Ts_Ctx[Instance].Accuracy))
 {
 /* New touch detected */
 Ts_Ctx[Instance].PreviousX[0] = TS_State->TouchX;
 Ts_Ctx[Instance].PreviousY[0] = TS_State->TouchY;
 }
 else
 {
 TS_State->TouchX = Ts_Ctx[Instance].PreviousX[0];
 TS_State->TouchY = Ts_Ctx[Instance].PreviousY[0];
 }
 }
 else
 {
 TS_State->TouchDetected = 0U;
 TS_State->TouchX = Ts_Ctx[Instance].PreviousX[0];
 TS_State->TouchY = Ts_Ctx[Instance].PreviousY[0];
 }
 }

 return ret;
}

 

 

Andrew Neil
Super User
June 26, 2024

@vishnu_illikkal wrote:

i used snprintf and got to see the error

it was -5 which is BSP_ERROR_COMPONENT_FAILURE


So that must be happening here:

 /* Get each touch coordinates */
 if(Ts_Drv->GetState(Ts_CompObj[Instance], &state) < 0)
 {
 ret = BSP_ERROR_COMPONENT_FAILURE;
 }

So, again, instrument  that GetState function to see what it's returning, and why.

 

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Associate III
June 27, 2024
 int err = Ts_Drv->GetState(Ts_CompObj[Instance], &state);
 char buffer[50] = {0};
	snprintf(buffer, sizeof(buffer), "%d", err);
	printf("%s\n", buffer);
 if(Ts_Drv->GetState(Ts_CompObj[Instance], &state) < 0)
 {
 ret = BSP_ERROR_COMPONENT_FAILURE;

I found the error as -1 
but i couldn't fine the function 
i could only find the ts.h header file

/**
 ******************************************************************************
 * @file ts.h
 * @author MCD Application Team
 * @brief This file contains all the functions prototypes for the Touch Screen driver.
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
 * All rights reserved.</center></h2>
 *
 * This software component is licensed by ST under BSD 3-Clause license,
 * the "License"; You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 * opensource.org/licenses/BSD-3-Clause
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef TS_H
#define TS_H

#ifdef __cplusplus
 extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h> 

/** @addtogroup BSP
 * @{
 */

/** @addtogroup Components
 * @{
 */
 
/** @addtogroup TS
 * @{
 */

/** @defgroup TS_Exported_Types
 * @{
 */

/** @defgroup TS_Driver_structure Touch Sensor Driver structure
 * @{
 */
typedef struct
{ 
 int32_t ( *Init ) (void *); 
 int32_t ( *DeInit ) (void *);
 int32_t ( *GestureConfig ) (void *, void*);
 int32_t ( *ReadID ) (void *, uint32_t *); 
 int32_t ( *GetState ) (void *, void*);
 int32_t ( *GetMultiTouchState ) (void *, void*);
 int32_t ( *GetGesture ) (void *, void*);
 int32_t ( *GetCapabilities ) (void *, void*); 
 int32_t ( *EnableIT ) (void *);
 int32_t ( *DisableIT ) (void *);
 int32_t ( *ClearIT ) (void *);
 int32_t ( *ITStatus ) (void *);
}TS_Drv_t;

 
/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* TS_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

 

 

Andrew Neil
Super User
June 27, 2024

@vishnu_illikkal wrote:

but i couldn't fine the function 


It's a function pointer - so you'd have to find where that Ts_Drv structure gets initialised to know what actual function it's pointing to.

But there's no need for that: just use the debugger's "Step Into" and that will, as the name suggests step into the function - whatever it is.

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Associate III
June 29, 2024

i will try.