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