Initialization & flushing process -> hard fault

Description

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

STM32F103RCT6

What do you want to achieve?

initialize my TFT LCD (128*160, rgb565) & connect LCD driver (st7735) with LVGL

What have you tried so far?

I made the initialization code, but doesn’t work
I think I’ve done my job.
while debugging, hard fault error occurred.
when Digging it, I guess the error occurs in lv_disp_drv_register(&disp_drv), and static void remove_free_block in lv_tlsf.c.

please help me :frowning:

Code to reproduce

Add the relevant code snippets here.

The code block(s) should be between ```c and ``` tags:


// in main.c, I run my other performance in App_Start() func.
  App_Start();
  while(1)
  {

	    	HAL_Delay(10);
	        lv_tick_inc(10);
	        lv_task_handler();
  }
// App_Start() func. initialize lcd
  void App_Start(void)
  {
                // initialize
		lv_init();
		lv_config_main();
  }
void lv_config_main(void)
{
    static lv_disp_draw_buf_t disp_buf;
    static lv_color_t buf_1[LV_HOR_RES_MAX * 10];
    //static lv_color_t buf_2[LV_HOR_RES_MAX * 10];
    lv_disp_draw_buf_init(&disp_buf, buf_1, NULL, LV_HOR_RES_MAX * 10);

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf = &disp_buf;	
    disp_drv.flush_cb = LCD_flush;	
    lv_disp_drv_register(&disp_drv);
}

// lcd flush func and for connection lcd driver and lvgl
// DEV_Digital_Write() sets/resets I/O pins

#define DEV_Digital_Write(_pin, _value) 	HAL_GPIO_WritePin(_pin, _value == 0? GPIO_PIN_RESET:GPIO_PIN_SET)

void LCD_flush(lv_disp_drv_t * drv, const lv_area_t * area,  lv_color_t * color_map)
{
    int32_t x, y;
    for(y = area->y1; y <= area->y2; y++) {
        for(x = area->x1; x <= area->x2; x++) {
        	LCD_ClearWindow((uint16_t)area->x1, (uint16_t)area->y1, (uint16_t)area->x2, (uint16_t)area->y2, (void*)color_map);
        }
    }
	lv_disp_flush_ready(drv);
	DEV_Digital_Write(DEV_CS_PIN, 1);
}

void LCD_ClearWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD color)
{
	UWORD i,j;
	LCD_SetWindow(Xstart, Ystart, Xend-1,Yend-1);
	for(i = Ystart; i <= Yend-1; i++){
		for(j = Xstart; j <= Xend-1; j++){
			LCD_WriteData_Word(color);
		}
	}
}

void LCD_SetWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD  Yend)
{
	// column addresses
	LCD_Write_Command(0x2a);
	LCD_WriteData_Byte(Xstart >> 8);
	LCD_WriteData_Byte(Xstart);
	LCD_WriteData_Byte(Xend >> 8);
	LCD_WriteData_Byte(Xend );

	// page addresses
	LCD_Write_Command(0x2b);
	LCD_WriteData_Byte(Ystart >> 8);
	LCD_WriteData_Byte(Ystart);
	LCD_WriteData_Byte(Yend >> 8);
	LCD_WriteData_Byte(Yend);

	// memory write
	LCD_Write_Command(0x2C);
}

static void LCD_Write_Command(UBYTE data)
{
	DEV_Digital_Write(DEV_CS_PIN, 0);
	DEV_Digital_Write(DEV_DC_PIN, 0);
	DEV_SPI_WRITE(data);
}

static void LCD_WriteData_Byte(UBYTE data)
{
	DEV_Digital_Write(DEV_CS_PIN, 0);
	DEV_Digital_Write(DEV_DC_PIN, 1);
	DEV_SPI_WRITE(data);
	DEV_Digital_Write(DEV_CS_PIN,1);
}

In your lv_config_main function you call lv_disp_draw_buf_init.
I can’t find this function. I only know of lv_disp_buf_init

When I tried lv_disp_buf_init function, it was undeclared.
The latest lvgl library is used, I thought that lv_disp_draw_buf_init equals with lv_disp_buf_init.
lv_disp_draw_buf_init func is below.

void lv_disp_draw_buf_init(lv_disp_draw_buf_t * draw_buf, void * buf1, void * buf2, uint32_t size_in_px_cnt)
{
    lv_memset_00(draw_buf, sizeof(lv_disp_draw_buf_t));

    draw_buf->buf1    = buf1;
    draw_buf->buf2    = buf2;
    draw_buf->buf_act = draw_buf->buf1;
    draw_buf->size    = size_in_px_cnt;
}


I tried one of examples in lib, hard fault error occurs in ‘obj create function’, such as lv_label_create(btn, NULL).

void lv_example_get_started_1(void)
{
    lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);     /*Add a button the current screen*/
    lv_obj_set_pos(btn, 10, 10);                            /*Set its position*/
    lv_obj_set_size(btn, 120, 50);                          /*Set its size*/
    lv_obj_add_event_cb(btn, btn_event_cb, NULL);           /*Assign a callback to the button*/

    lv_obj_t * label = lv_label_create(btn, NULL);          /*Add a label to the button*/
    lv_label_set_text(label, "Button");                     /*Set the labels text*/
    lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
}