Skip to main content
Associate III
Jun 26, 2024 10:57 AM UTC
Question

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

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 

 

 

 

This topic has been closed for replies.

9 replies

Andrew Neil
Super User
Jun 26, 2024 11:21 AM UTC

@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
Jun 26, 2024 11:40 AM UTC

ok will check.

Associate III
Jun 26, 2024 12:42 PM UTC

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

Andrew Neil
Super User
Jun 26, 2024 1:10 PM UTC

@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
Jun 26, 2024 12:51 PM UTC

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
Jun 26, 2024 1:13 PM UTC

@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
Jun 27, 2024 5:05 AM UTC
 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
Jun 27, 2024 8:24 AM UTC

@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
Jun 29, 2024 10:34 AM UTC

i will try.