cancel
Showing results for 
Search instead for 
Did you mean: 

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

vishnu_illikkal
Associate III

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****/
View more

 

 

 

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

 

@STTwo-32 

 

 

 

9 REPLIES 9
Andrew Neil
Super User

@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.
vishnu_illikkal
Associate III

ok will check.

vishnu_illikkal
Associate III

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

vishnu_illikkal
Associate III

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; }
View more

 

 


@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.

@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.
vishnu_illikkal
Associate III
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****/
View more

 

 

 


@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.

i will try.