LS027B7DH01 (400x240 pixels.) not work urgent

I try to interface stm32l4 with LS027B7DH01 (400x240 pixels.) but not work can please check my code:

#define SHARP_MIP_HEADER 0
#define SHARP_MIP_UPDATE_RAM_FLAG (1 << 7) /* (M0) Mode flag : H → update memory, L → maintain memory /
#define SHARP_MIP_COM_INVERSION_FLAG (1 << 6) /
(M1) Frame inversion flag : relevant when EXTMODE = L, /
#define LV_HOR_RES_MAX 400 /
H → outputs VCOM = H, L → outputs VCOM = L */
#define LV_VER_RES_MAX 240

void lv_port_disp_init(void)
{
/--------------------
* Initialize display
* ------------------
/
sharp_mip_init();

/*-----------------------------
 * Create a buffer for drawing
 *----------------------------*/

// static lv_disp_buf_t sharp_mip_disp_buf; // originale
static lv_disp_draw_buf_t draw_buf_dsc_1; // FRA
static uint8_t sharp_mip_buf[(LV_VER_RES_MAX / 2) * (2 + (LV_HOR_RES_MAX / 8)) + 2];
// lv_disp_buf_init(&sharp_mip_disp_buf, sharp_mip_buf, NULL, LV_VER_RES_MAX * LV_HOR_RES_MAX / 2);// orig
lv_disp_draw_buf_init (&draw_buf_dsc_1, sharp_mip_buf, NULL, LV_VER_RES_MAX * LV_HOR_RES_MAX / 2); //FRA
/*-----------------------------------
* Register the display in LittlevGL
----------------------------------/
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);

/*Set the resolution of the display*/
disp_drv.hor_res = LV_HOR_RES_MAX;
disp_drv.ver_res = LV_VER_RES_MAX;

/*Set up the functions to access display*/
disp_drv.flush_cb   = sharp_mip_flush;
disp_drv.set_px_cb  = sharp_mip_set_px;
disp_drv.rounder_cb = sharp_mip_rounder;

/*Set a display buffer*/

// disp_drv.buffer = &sharp_mip_disp_buf; // orig
disp_drv.draw_buf = &draw_buf_dsc_1;
lv_disp_drv_register(&disp_drv);
}
void sharp_mip_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{

/Return if the area is out the screen/
if(area->y2 < 0) return;
if(area->y1 > 240 - 1) return;

/Truncate the area to the screen/
uint16_t act_y1 = area->y1 < 0 ? 0 : area->y1;
//uint16_t act_y2 = area->y2 > SHARP_MIP_VER_RES - 1 ? SHARP_MIP_VER_RES - 1 : area->y2;
uint16_t act_y2 = area->y2 > 240 - 1 ? 240 - 1 : area->y2;
uint8_t * buf = (uint8_t *) color_p; /Get the buffer address/
uint16_t buf_h = (act_y2 - act_y1 + 1); /Number of buffer lines/
// uint16_t buf_size = buf_h * (2 + SHARP_MIP_HOR_RES / 8) + 2; /*Buffer size in bytes */
uint16_t buf_size = buf_h * (2 + 400 / 8) + 2; /Buffer size in bytes /
/
Set lines to flush dummy byte & gate address in draw_buf
/
for(uint16_t act_y = 0 ; act_y < buf_h ; act_y++) {
buf[BUFIDX(0, act_y) - 1] = SHARP_MIP_REV_BYTE((act_y1 + act_y + 1));
buf[BUFIDX(0, act_y) - 2] = 0;
}

/* Set last dummy two bytes in draw_buf */
buf[BUFIDX(0, buf_h) - 1] = 0;
buf[BUFIDX(0, buf_h) - 2] = 0;

/* Set frame header in draw_buf */
buf[0] = SHARP_MIP_HEADER |
SHARP_MIP_UPDATE_RAM_FLAG;

/* Write the frame on display memory */
LV_DRV_DISP_SPI_CS(1);

HAL_SPI_Transmit(&hspi2, buf, buf_size,HAL_MAX_DELAY) ;

LV_DRV_DISP_SPI_CS(0);

lv_disp_flush_ready(disp_drv);
}

main.c
.
.
.
.
lv_init();
lv_port_disp_init();
lv_obj_t * label1 = lv_label_create(lv_scr_act()); // First parameters (scr) is the parent
lv_label_set_text(label1, “HELLO WORLD”); // Set the text
lv_obj_set_pos(label1, 20, 20);
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

  lv_task_handler();

 HAL_Delay(5);

}
When execute the code I obtain:
/**

  • @brief This function handles Hard fault interrupt.
    /
    void HardFault_Handler(void)
    {
    /
    USER CODE BEGIN HardFault_IRQn 0 */

/* USER CODE END HardFault_IRQn 0 /
while (1)
{
/
USER CODE BEGIN W1_HardFault_IRQn 0 /
/
USER CODE END W1_HardFault_IRQn 0 */
}
}

Thanks!!!

STM hardfault is result when your hw config code or memory code is in big issue.
In showed code i dont see any trouble.