STM32F746G-Discovery display memory problem
Dear community,
I have been looking for a very simple running display minimum example using HAL and BSP interfaces for quite some time. Unfortunately, I did not succeed and tested around. Finally, I found how to interface the display, but I wasn’t able to properly execute drawing functions like the BSP_LCD_DrawRect() function from the stm32746g_discovery_lcd.h library. I always got some strange display behavior when drawing something with those functions. I started to draw the most simple geometry one could think about by using the BSP_LCD_DrawPixel() function. Still, I am running into strange display behavior, which I think corresponds to a memory leak in my code:
Drawing a pixel to positions like (0,0) or (10,0) seems to work correctly. However, the pixels begin to flicker when increasing the x coordinate and especially the y coordinate:
[...] // Draw pixels BSP_LCD_SelectLayer(0); BSP_LCD_DrawPixel(0,0,0xffffffff); BSP_LCD_DrawPixel(5,0,0xff00ffff); BSP_LCD_DrawPixel(10,0,0xff0000ff); BSP_LCD_DrawPixel(20,0,0xffffffff); BSP_LCD_DrawPixel(40,0,0xffffffff); BSP_LCD_DrawPixel(80,0,0xffffffff); // begins to flicker BSP_LCD_DrawPixel(160,0,0xffffffff); // flickers significantly [...]
I would be very happy if anyone could explain me what I am doing wrong here. Please find the simple minimum example attached to this post:
/** ****************************************************************************** * @file main.cpp * @author Ac6 * @version V1.0 * @date 01-December-2013 * @brief Default main function. ****************************************************************************** */ //#define USE_HAL_DRIVER // redefined? #include "stm32f7xx.h" #include "stm32746g_discovery.h" #include "stm32746g_discovery_lcd.h" #include "stm32f7xx_hal.h" #include #include using namespace std; int main(void) { // HAL initialization SystemInit(); // task? (not required) HAL_Init(); // #include "stm32f7xx_hal.h" // LED configuration GPIO_InitTypeDef GPIO_InitStruct; __GPIOI_CLK_ENABLE(); // GPIO Ports Clock Enable GPIO_InitStruct.Pin = GPIO_PIN_1; // Configure GPIO pin : PI1 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); // LCD configuration BSP_LCD_Init(); uint32_t start_address = LCD_FB_START_ADDRESS; // LCD_FB_START_ADDRESS 0xC0000000 uint32_t lcd_size = (BSP_LCD_GetXSize() * BSP_LCD_GetYSize()* sizeof(uint32_t)); BSP_LCD_LayerDefaultInit(0, (uint32_t) (start_address + 0*lcd_size)); BSP_LCD_LayerDefaultInit(1, (uint32_t) (start_address + 1*lcd_size)); BSP_LCD_DisplayOn(); BSP_LCD_SelectLayer(0); BSP_LCD_Clear(LCD_COLOR_RED); BSP_LCD_SelectLayer(1); BSP_LCD_Clear(LCD_COLOR_GREEN); BSP_LCD_SetTransparency(0, 255); BSP_LCD_SetTransparency(1, 200); BSP_LCD_SetLayerVisible(0, ENABLE); BSP_LCD_SetLayerVisible(1, DISABLE); // Draw pixels BSP_LCD_SelectLayer(0); BSP_LCD_DrawPixel(0,0,0xffffffff); BSP_LCD_DrawPixel(5,0,0xff00ff00); BSP_LCD_DrawPixel(10,0,0xff0000ff); BSP_LCD_DrawPixel(20,0,0xffffffff); BSP_LCD_DrawPixel(40,0,0xffffffff); BSP_LCD_DrawPixel(80,0,0xffffffff); // begins to flicker BSP_LCD_DrawPixel(160,0,0xffffffff); // flickers significantly // Check LED to ensure functions were executed properly before while(1) { HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_1); HAL_Delay(250); } }
Thank you very much in advance and best regards.