2024-06-26 03:57 AM - edited 2024-06-26 04:02 AM
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
2024-06-26 04:21 AM - edited 2024-06-26 04:28 AM
@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 ...
2024-06-26 04:40 AM
ok will check.
2024-06-26 05:42 AM
2024-06-26 05:51 AM - edited 2024-06-26 05:54 AM
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;
}
2024-06-26 06:10 AM
@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'
2024-06-26 06:13 AM
@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.
2024-06-26 10:05 PM
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>© 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****/
2024-06-27 01:24 AM
@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.
2024-06-29 03:34 AM
i will try.