Touch event error

What MCU/Processor/Board and compiler are you using?

STM32F103RCT6 (RAM 48 KB, custom board)
display: 128*160, RGB565(16 bit), ST7735/ST7789 lcd driver, SPI comm.
IDE: STM32CubeIDE
touch driver: xpt2046

What LVGL version are you using?

the latest one (v8.0)

What do you want to achieve?

When I add lv examples that have event callback function, it makes hard fault error, I don’t know the reason.
Do I need another custom function in main.c?

What have you tried so far?

Code to reproduce

main function

void App_Start(void)
{
// lcd init
			lv_init();
			LCD_Init();
			HAL_Delay(5);

// function for setting lcd and touch configuration
			lv_disp_config();
			lv_touch_config();

// put button example function 
            lv_example_btn_1();
}

indev setting

void lv_touch_config(void)
{
	static lv_indev_drv_t indev_drv;
	lv_indev_drv_init(&indev_drv);		// basic initialization
	indev_drv.type = LV_INDEV_TYPE_POINTER;

	static lv_indev_data_t* data;
	my_input_read(&indev_drv, &data);
	indev_drv.read_cb = my_input_read;
	lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv);
}

my_input_read()

bool my_input_read(lv_indev_drv_t * drv, lv_indev_data_t*data)
{
	static int8_t lastX = 0;
	static int8_t lastY = 0;

	if(XPT2046_TouchPressed())
	{
		XPT2046_TouchGetCoordinates(&lastX, &lastY);
		data->state = LV_INDEV_STATE_PRESSED;
	}
	else
	{
		data->point.x = lastX;
		data->point.y = lastY;
		data->state = LV_INDEV_STATE_RELEASED;
	}
	return false;
}

get coordinate function

I deleted the real code for getting coordinates, because the touched data is incorrect.
I just put the code that check if the touch signal exists or not.

#define READ_X 0xD0
#define READ_Y 0x90

    static const uint8_t cmd_read_x[] = { READ_X };
    static const uint8_t cmd_read_y[] = { READ_Y };
    static const uint8_t zeroes_tx[] = { 0x00, 0x00 };

bool XPT2046_TouchGetCoordinates(uint16_t* x, uint16_t* y)
{
// chip selection reset function
    XPT2046_TouchSelect();

    uint32_t avg_x = 0;
    uint32_t avg_y = 0;
    uint8_t nsamples = 0;

    for(uint8_t i = 0; i < 16; i++)
    {
// check if lcd is touched
        if(!XPT2046_TouchPressed())
            break;
        DEV_SPI_WRite(&hspi1, (uint8_t*)cmd_read_y, sizeof(cmd_read_y), HAL_MAX_DELAY);
    }

    XPT2046_TouchUnselect();
}

lv_example_btn_1.c

static void event_handler(lv_obj_t * obj, lv_event_t event)
{
    LV_UNUSED(obj);
    if(event == LV_EVENT_CLICKED) {
        LV_LOG_USER("Clicked");
    }
    else if(event == LV_EVENT_VALUE_CHANGED) {
        LV_LOG_USER("Toggled");
    }
}
void lv_example_btn_1(void)
{
    lv_obj_t * label;

    lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);
    lv_obj_set_pos(btn1, 10, 10);
    lv_obj_set_size(btn1, 80, 50);
    lv_obj_add_event_cb(btn1, event_handler, NULL);
    //lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, -40);

    label = lv_label_create(btn1, NULL);
    lv_label_set_text(label, "Button");

    lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), NULL);
    lv_obj_add_event_cb(btn2, event_handler, NULL);
    lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 0, 40);
    lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
    lv_obj_set_height(btn2, LV_SIZE_CONTENT);

    label = lv_label_create(btn2, NULL);
    lv_label_set_text(label, "Toggle");
}
#endif

Screenshot and/or video

my spi comm setting
123 1234 12345