/** * @brief Initialize the LTDC * @param None * @retval None */ void LTDC_Init(void) { /* DeInit */ HAL_LTDC_DeInit(&hltdc_eval); /* LTDC Config */ /* Timing and polarity */ hltdc_eval.Init.HorizontalSync = HSYNC; hltdc_eval.Init.VerticalSync = VSYNC; hltdc_eval.Init.AccumulatedHBP = HSYNC+HBP; hltdc_eval.Init.AccumulatedVBP = VSYNC+VBP; hltdc_eval.Init.AccumulatedActiveH = VSYNC+VBP+VACT; hltdc_eval.Init.AccumulatedActiveW = HSYNC+HBP+HACT; hltdc_eval.Init.TotalHeigh = VSYNC+VBP+VACT+VFP; hltdc_eval.Init.TotalWidth = HSYNC+HBP+HACT+HFP; /* background value */ hltdc_eval.Init.Backcolor.Blue = 0; hltdc_eval.Init.Backcolor.Green = 0; hltdc_eval.Init.Backcolor.Red = 0; /* Polarity */ hltdc_eval.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc_eval.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc_eval.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc_eval.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc_eval.Instance = LTDC; HAL_LTDC_Init(&hltdc_eval); }
/* LTDC init function */ void MX_LTDC_Init(void) { LTDC_LayerCfgTypeDef pLayerCfg; LTDC_LayerCfgTypeDef pLayerCfg1; hltdc.Instance = LTDC; hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc.Init.HorizontalSync = 7; hltdc.Init.VerticalSync = 3; hltdc.Init.AccumulatedHBP = 14; hltdc.Init.AccumulatedVBP = 5; hltdc.Init.AccumulatedActiveW = 654; hltdc.Init.AccumulatedActiveH = 485; hltdc.Init.TotalWidth = 660; hltdc.Init.TotalHeigh = 487; hltdc.Init.Backcolor.Blue = 0; hltdc.Init.Backcolor.Green = 0; hltdc.Init.Backcolor.Red = 0; HAL_LTDC_Init(&hltdc); pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 0; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = 0; pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; pLayerCfg.Alpha = 0; pLayerCfg.Alpha0 = 0; pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg.FBStartAdress = 0; pLayerCfg.ImageWidth = 0; pLayerCfg.ImageHeight = 0; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0); pLayerCfg1.WindowX0 = 0; pLayerCfg1.WindowX1 = 0; pLayerCfg1.WindowY0 = 0; pLayerCfg1.WindowY1 = 0; pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; pLayerCfg1.Alpha = 0; pLayerCfg1.Alpha0 = 0; pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg1.FBStartAdress = 0; pLayerCfg1.ImageWidth = 0; pLayerCfg1.ImageHeight = 0; pLayerCfg1.Backcolor.Blue = 0; pLayerCfg1.Backcolor.Green = 0; pLayerCfg1.Backcolor.Red = 0; HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, 1); }
/** * @brief Initializes the LCD. * @retval LCD state */ uint8_t BSP_LCD_Init(void) { /* Select the used LCD */ /* The RK043FN48H LCD 480x272 is selected */ /* Timing Configuration */ hLtdcHandler.Init.HorizontalSync = (RK043FN48H_HSYNC - 1); hLtdcHandler.Init.VerticalSync = (RK043FN48H_VSYNC - 1); hLtdcHandler.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1); hLtdcHandler.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1); hLtdcHandler.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1); hLtdcHandler.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1); hLtdcHandler.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1); hLtdcHandler.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1); /* LCD clock configuration */ BSP_LCD_ClockConfig(&hLtdcHandler, NULL); /* Initialize the LCD pixel width and pixel height */ hLtdcHandler.LayerCfg->ImageWidth = RK043FN48H_WIDTH; hLtdcHandler.LayerCfg->ImageHeight = RK043FN48H_HEIGHT; /* Background value */ hLtdcHandler.Init.Backcolor.Blue = 0; hLtdcHandler.Init.Backcolor.Green = 0; hLtdcHandler.Init.Backcolor.Red = 0; /* Polarity */ hLtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL; hLtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL; hLtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL; hLtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hLtdcHandler.Instance = LTDC; if(HAL_LTDC_GetState(&hLtdcHandler) == HAL_LTDC_STATE_RESET) { /* Initialize the LCD Msp: this __weak function can be rewritten by the application */ BSP_LCD_MspInit(&hLtdcHandler, NULL); } HAL_LTDC_Init(&hLtdcHandler); /* Assert display enable LCD_DISP pin */ HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET); /* Assert backlight LCD_BL_CTRL pin */ HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET); #if !defined(DATA_IN_ExtSDRAM) /* Initialize the SDRAM */ BSP_SDRAM_Init(); #endif /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); return LCD_OK; }
/* LTDC init function */ static void MX_LTDC_Init(void) { LTDC_LayerCfgTypeDef pLayerCfg; hltdc.Instance = LTDC; hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc.Init.Backcolor.Blue = 0; hltdc.Init.Backcolor.Green = 0; hltdc.Init.Backcolor.Red = 0; hltdc.Init.HorizontalSync = LCD_800_480_HSYNC; hltdc.Init.VerticalSync = LCD_800_480_VSYNC; hltdc.Init.AccumulatedHBP = LCD_800_480_HSYNC + LCD_800_480_HBP; hltdc.Init.AccumulatedVBP = LCD_800_480_VSYNC + LCD_800_480_VBP; hltdc.Init.AccumulatedActiveW = RT_HW_LCD_WIDTH + LCD_800_480_HSYNC + LCD_800_480_HBP; hltdc.Init.AccumulatedActiveH = RT_HW_LCD_HEIGHT + LCD_800_480_VSYNC + LCD_800_480_VBP; hltdc.Init.TotalWidth = RT_HW_LCD_WIDTH + LCD_800_480_HSYNC + LCD_800_480_HBP + LCD_800_480_HFP; hltdc.Init.TotalHeigh = RT_HW_LCD_HEIGHT + LCD_800_480_VSYNC + LCD_800_480_VBP + LCD_800_480_VFP; hltdc.LayerCfg->ImageHeight = RT_HW_LCD_HEIGHT; hltdc.LayerCfg->ImageWidth = RT_HW_LCD_WIDTH; if (HAL_LTDC_Init(&hltdc) != HAL_OK) { RT_ASSERT(RT_NULL); } lcd_framebuffer = rt_malloc_align(sizeof(rt_uint16_t) * RT_HW_LCD_WIDTH * RT_HW_LCD_HEIGHT, 32); RT_ASSERT(lcd_framebuffer != RT_NULL); rt_memset(lcd_framebuffer, 0, sizeof(rt_uint16_t) * RT_HW_LCD_WIDTH * RT_HW_LCD_HEIGHT); pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = RT_HW_LCD_WIDTH; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = RT_HW_LCD_HEIGHT; pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; pLayerCfg.Alpha = 0xFF; pLayerCfg.Alpha0 = 0xFF; pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.FBStartAdress = (uint32_t)lcd_framebuffer; pLayerCfg.ImageWidth = RT_HW_LCD_WIDTH; pLayerCfg.ImageHeight = RT_HW_LCD_HEIGHT; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) { RT_ASSERT(RT_NULL); } }
/** * @brief Initializes the LCD. * @retval LCD state */ uint8_t BSP_LCD_Init(void) { /* Timing Configuration */ ltdc_handle.Init.HorizontalSync = (RK043FN48H_HSYNC - 1); ltdc_handle.Init.VerticalSync = (RK043FN48H_VSYNC - 1); ltdc_handle.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1); ltdc_handle.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1); ltdc_handle.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1); ltdc_handle.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1); ltdc_handle.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1); ltdc_handle.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1); /* LCD clock configuration */ BSP_LCD_ClockConfig(<dc_handle, NULL); /* Initialize the LCD pixel width and pixel height */ ltdc_handle.LayerCfg->ImageWidth = RK043FN48H_WIDTH; ltdc_handle.LayerCfg->ImageHeight = RK043FN48H_HEIGHT; /* Background value */ ltdc_handle.Init.Backcolor.Blue = 0; ltdc_handle.Init.Backcolor.Green = 0; ltdc_handle.Init.Backcolor.Red = 0; /* Polarity */ ltdc_handle.Init.HSPolarity = LTDC_HSPOLARITY_AL; ltdc_handle.Init.VSPolarity = LTDC_VSPOLARITY_AL; ltdc_handle.Init.DEPolarity = LTDC_DEPOLARITY_AL; ltdc_handle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; ltdc_handle.Instance = LTDC; if (HAL_LTDC_GetState(<dc_handle) == HAL_LTDC_STATE_RESET) { BSP_LCD_MspInit(<dc_handle, NULL); } HAL_LTDC_Init(<dc_handle); /* allocate the framebuffer */ size_t fb_size_pages = PAGE_ALIGN(RK043FN48H_WIDTH * RK043FN48H_HEIGHT * 4) / PAGE_SIZE; void *fb_address = novm_alloc_pages(fb_size_pages, NOVM_ARENA_SECONDARY); if (!fb_address) panic("failed to allocate framebuffer for LCD\n"); BSP_LCD_LayerDefaultInit(0, (uint32_t)fb_address); BSP_LCD_SelectLayer(0); /* clear framebuffer */ memset((void *)ltdc_handle.LayerCfg[active_layer].FBStartAdress, 0, BSP_LCD_GetXSize() * BSP_LCD_GetYSize() * BSP_LCD_PixelSize()); /* turn the display on */ BSP_LCD_DisplayOn(); return LCD_OK; }
/* Private functions */ static void TM_LCD_INT_InitLTDC(void) { RCC_PeriphCLKInitTypeDef periph_clk_init_struct; /* Enable LTDC and DMA2D clocks */ __HAL_RCC_DMA2D_CLK_ENABLE(); __HAL_RCC_LTDC_CLK_ENABLE(); /* Disable LTDC */ LTDC->GCR &= ~LTDC_GCR_LTDCEN; /* Timing configuration */ LTDCHandle.Init.HorizontalSync = LCD_HSYNC - 1; LTDCHandle.Init.VerticalSync = LCD_VSYNC - 1; LTDCHandle.Init.AccumulatedHBP = LCD_HSYNC + LCD_HBP - 1; LTDCHandle.Init.AccumulatedVBP = LCD_VSYNC + LCD_VBP - 1; LTDCHandle.Init.AccumulatedActiveH = LCD_PIXEL_HEIGHT + LCD_VSYNC + LCD_VBP - 1; LTDCHandle.Init.AccumulatedActiveW = LCD_PIXEL_WIDTH + LCD_HSYNC + LCD_HBP - 1; LTDCHandle.Init.TotalWidth = LCD_PIXEL_WIDTH + LCD_HSYNC + LCD_HBP + LCD_HFP - 1; LTDCHandle.Init.TotalHeigh = LCD_PIXEL_HEIGHT + LCD_VSYNC + LCD_VBP + LCD_VFP - 1; /* Configure PLLSAI prescalers for LCD */ /* Enable Pixel Clock */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAI_R = 192/2 = 96 Mhz */ /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 96/4 = 24 Mhz */ periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; periph_clk_init_struct.PLLSAI.PLLSAIN = 192; periph_clk_init_struct.PLLSAI.PLLSAIR = LCD_FREQUENCY_DIV; periph_clk_init_struct.PLLSAIDivR = RCC_PLLSAIDIVR_4; HAL_RCCEx_PeriphCLKConfig(&periph_clk_init_struct); /* Initialize the LCD pixel width and pixel height */ LTDCHandle.LayerCfg->ImageWidth = LCD_PIXEL_WIDTH; LTDCHandle.LayerCfg->ImageHeight = LCD_PIXEL_HEIGHT; /* Background value */ LTDCHandle.Init.Backcolor.Blue = 0; LTDCHandle.Init.Backcolor.Green = 0; LTDCHandle.Init.Backcolor.Red = 0; /* Polarity */ LTDCHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; LTDCHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; LTDCHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; LTDCHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; LTDCHandle.Instance = LTDC; /* Init LTDC */ HAL_LTDC_Init(<DCHandle); }
/* LTDC init function */ static void MX_LTDC_Init(void) { LTDC_LayerCfgTypeDef pLayerCfg; ili9341_Init(); hltdc.Instance = LTDC; hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc.Init.HorizontalSync = 9; hltdc.Init.VerticalSync = 1; hltdc.Init.AccumulatedHBP = 29; hltdc.Init.AccumulatedVBP = 3; hltdc.Init.AccumulatedActiveW = 269; hltdc.Init.AccumulatedActiveH = 323; hltdc.Init.TotalWidth = 279; hltdc.Init.TotalHeigh = 327; hltdc.Init.Backcolor.Blue = 0; hltdc.Init.Backcolor.Green = 0; hltdc.Init.Backcolor.Red = 0; if (HAL_LTDC_Init(&hltdc) != HAL_OK) { Error_Handler(); } pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 240; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = 320; pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; pLayerCfg.Alpha = 255; pLayerCfg.Alpha0 = 0; pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg.FBStartAdress = 0xd0000000; pLayerCfg.ImageWidth = 240; pLayerCfg.ImageHeight = 320; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 255; pLayerCfg.Backcolor.Red = 0; if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) { Error_Handler(); } }
/** * @brief LCD Configuration. * @note This function Configure tha LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 1 : * - ARGB8888 as pixel format * - The frame buffer is located at internal RAM : The output of DMA2D transfer * - The Layer size configuration : 300x120 * 4) Configure the LTDC Layer 2 : * - ARGB4444 as pixel format * - The frame buffer is located at internal RAM : The output of DMA2D transfer * - The Layer size configuration : 300x120 * @retval * None */ static void LCD_Config(void) { static RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; static LTDC_HandleTypeDef LtdcHandle; LTDC_LayerCfgTypeDef pLayerCfg; LTDC_LayerCfgTypeDef pLayerCfg1; /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration */ /* Horizontal synchronization width = Hsync - 1 */ LtdcHandle.Init.HorizontalSync = 40; /* Vertical synchronization height = Vsync - 1 */ LtdcHandle.Init.VerticalSync = 9; /* Accumulated horizontal back porch = Hsync + HBP - 1 */ LtdcHandle.Init.AccumulatedHBP = 42; /* Accumulated vertical back porch = Vsync + VBP - 1 */ LtdcHandle.Init.AccumulatedVBP = 11; /* Accumulated active width = Hsync + HBP + Active Width - 1 */ LtdcHandle.Init.AccumulatedActiveH = 283; /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ LtdcHandle.Init.AccumulatedActiveW = 522; /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ LtdcHandle.Init.TotalHeigh = 285; /* Total width = Hsync + HBP + Active Width + HFP - 1 */ LtdcHandle.Init.TotalWidth = 524; /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/5 = 38.4 Mhz */ /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 = 38.4/4 = 9.6Mhz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; PeriphClkInitStruct.PLLSAI.PLLSAIR = 3; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Configure R,G,B component values for LCD background color */ LtdcHandle.Init.Backcolor.Blue = 0; LtdcHandle.Init.Backcolor.Green = 0; LtdcHandle.Init.Backcolor.Red = 0; LtdcHandle.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* WindowX0 = Horizontal start WindowX1 = Horizontal stop WindowY0 = Vertical start WindowY1 = Vertical stop */ pLayerCfg.WindowX0 = 90; pLayerCfg.WindowX1 = 390; pLayerCfg.WindowY0 = 15; pLayerCfg.WindowY1 = 135; /* Pixel Format configuration*/ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; /* Start Address configuration : frame buffer is located at FLASH memory */ pLayerCfg.FBStartAdress = (uint32_t)&ARGB8888_300x120; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg.Alpha0 = 0; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = 300; pLayerCfg.ImageHeight = 120; /* Layer2 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* In this case all the active display area is used to display a picture */ pLayerCfg1.WindowX0 = 90; pLayerCfg1.WindowX1 = 390; pLayerCfg1.WindowY0 = 137; pLayerCfg1.WindowY1 = 257; /* Pixel Format configuration*/ pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444; /* Start Address configuration : frame buffer is located at FLASH memory */ pLayerCfg1.FBStartAdress = (uint32_t)&aBufferResult; /* Alpha constant (255 totally opaque) */ pLayerCfg1.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg1.Alpha0 = 0; pLayerCfg1.Backcolor.Blue = 0; pLayerCfg1.Backcolor.Green = 0; pLayerCfg1.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg1.ImageWidth = 300; pLayerCfg1.ImageHeight = 120; /* Configure the LTDC */ if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Background Layer*/ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, 0) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Foreground Layer*/ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg1, 1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } }
/** * @brief LCD configuration. * @note This function Configure tha LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 2 : * - ARGB4444 as pixel format * - The frame buffer is located at internal RAM : The output of DMA2D transfer * - The Layer size configuration : 150x150 * @retval * None */ static void LCD_Config(void) { static LTDC_HandleTypeDef hltdc_F; static LTDC_LayerCfgTypeDef pLayerCfg; /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ hltdc_F.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ hltdc_F.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ hltdc_F.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ hltdc_F.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration */ if(stmpe811_ts_drv.ReadID(TS_I2C_ADDRESS) == STMPE811_ID) { /* The AMPIRE LCD 480x272 is selected */ /* Timing Configuration */ hltdc_F.Init.HorizontalSync = (AMPIRE480272_HSYNC - 1); hltdc_F.Init.VerticalSync = (AMPIRE480272_VSYNC - 1); hltdc_F.Init.AccumulatedHBP = (AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); hltdc_F.Init.AccumulatedVBP = (AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); hltdc_F.Init.AccumulatedActiveH = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); hltdc_F.Init.AccumulatedActiveW = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); hltdc_F.Init.TotalHeigh = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP + AMPIRE480272_VFP - 1); hltdc_F.Init.TotalWidth = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP + AMPIRE480272_HFP - 1); } else { /* The AMPIRE LCD 640x480 is selected */ /* Timing configuration */ hltdc_F.Init.HorizontalSync = (AMPIRE640480_HSYNC - 1); hltdc_F.Init.VerticalSync = (AMPIRE640480_VSYNC - 1); hltdc_F.Init.AccumulatedHBP = (AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_F.Init.AccumulatedVBP = (AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_F.Init.AccumulatedActiveH = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_F.Init.AccumulatedActiveW = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_F.Init.TotalHeigh = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP + AMPIRE640480_VFP - 1); hltdc_F.Init.TotalWidth = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP + AMPIRE640480_HFP - 1); } /* Configure R,G,B component values for LCD background color */ hltdc_F.Init.Backcolor.Blue = 0; hltdc_F.Init.Backcolor.Green = 0; hltdc_F.Init.Backcolor.Red = 0; hltdc_F.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* WindowX0 = Horizontal start WindowX1 = Horizontal stop WindowY0 = Vertical start WindowY1 = Vertical stop */ pLayerCfg.WindowX0 = 245; pLayerCfg.WindowX1 = 395; pLayerCfg.WindowY0 = 165; pLayerCfg.WindowY1 = 315; /* Pixel Format configuration*/ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444; /* Start Address configuration : frame buffer is located at FLASH memory */ pLayerCfg.FBStartAdress = (uint32_t)&aBufferResult; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg.Alpha0 = 0; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = LAYER_SIZE_X; pLayerCfg.ImageHeight = LAYER_SIZE_Y; /* Configure the LTDC */ if(HAL_LTDC_Init(&hltdc_F) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Layer*/ if(HAL_LTDC_ConfigLayer(&hltdc_F, &pLayerCfg, 1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } }
/** * @brief Initializes the LCD. * @param PclkConfig : pixel clock profile * @retval LCD state */ uint8_t BSP_LCD_InitEx(uint32_t PclkConfig) { PCLK_profile = PclkConfig; /* Select the used LCD */ /* The AMPIRE 480x272 does not contain an ID register then we check the availability of AMPIRE 480x640 LCD using device ID of the STMPE811 mounted on MB1046 daughter board */ if(stmpe811_ts_drv.ReadID(TS_I2C_ADDRESS) == STMPE811_ID) { /* The AMPIRE LCD 480x272 is selected */ /* Timing Configuration */ hltdc_eval.Init.HorizontalSync = (AMPIRE480272_HSYNC - 1); hltdc_eval.Init.VerticalSync = (AMPIRE480272_VSYNC - 1); hltdc_eval.Init.AccumulatedHBP = (AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); hltdc_eval.Init.AccumulatedVBP = (AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); hltdc_eval.Init.AccumulatedActiveH = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); hltdc_eval.Init.AccumulatedActiveW = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); hltdc_eval.Init.TotalHeigh = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP + AMPIRE480272_VFP - 1); hltdc_eval.Init.TotalWidth = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP + AMPIRE480272_HFP - 1); /* Initialize the LCD pixel width and pixel height */ hltdc_eval.LayerCfg->ImageWidth = AMPIRE480272_WIDTH; hltdc_eval.LayerCfg->ImageHeight = AMPIRE480272_HEIGHT; } else { /* The LCD AMPIRE 640x480 is selected */ /* Timing configuration */ hltdc_eval.Init.HorizontalSync = (AMPIRE640480_HSYNC - 1); hltdc_eval.Init.VerticalSync = (AMPIRE640480_VSYNC - 1); hltdc_eval.Init.AccumulatedHBP = (AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_eval.Init.AccumulatedVBP = (AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_eval.Init.AccumulatedActiveH = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_eval.Init.AccumulatedActiveW = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_eval.Init.TotalHeigh = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP + AMPIRE640480_VFP - 1); hltdc_eval.Init.TotalWidth = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP + AMPIRE640480_HFP - 1); /* Initialize the LCD pixel width and pixel height */ hltdc_eval.LayerCfg->ImageWidth = AMPIRE640480_WIDTH; hltdc_eval.LayerCfg->ImageHeight = AMPIRE640480_HEIGHT; } /* Background value */ hltdc_eval.Init.Backcolor.Blue = 0; hltdc_eval.Init.Backcolor.Green = 0; hltdc_eval.Init.Backcolor.Red = 0; /* Polarity */ hltdc_eval.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc_eval.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc_eval.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc_eval.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc_eval.Instance = LTDC; /* LCD clock configuration */ BSP_LCD_ClockConfig(&hltdc_eval, &PCLK_profile); MspInit(); HAL_LTDC_Init(&hltdc_eval); #if !defined(DATA_IN_ExtSDRAM) /* Initialize the SDRAM */ BSP_SDRAM_Init(); #endif /* DATA_IN_ExtSDRAM */ /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); return LCD_OK; }
/** * @brief LCD configuration. * @note This function Configure tha LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 2 : * - RGB565 as pixel format * - The frame buffer is located at internal RAM : The output of DMA2D transfer * - The Layer size configuration : 240x160 * @retval * None */ static void LCD_Config(void) { RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; LTDC_LayerCfgTypeDef pLayerCfg; static LTDC_HandleTypeDef LtdcHandle; /* Initializaton of ILI9341 component*/ ili9341_Init(); /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration (Typical configuration from ILI9341 datasheet) HSYNC=10 (9+1) HBP=20 (29-10+1) ActiveW=240 (269-20-10+1) HFP=10 (279-240-20-10+1) VSYNC=2 (1+1) VBP=2 (3-2+1) ActiveH=320 (323-2-2+1) VFP=4 (327-320-2-2+1) */ /* Timing configuration */ /* Horizontal synchronization width = Hsync - 1 */ LtdcHandle.Init.HorizontalSync = 9; /* Vertical synchronization height = Vsync - 1 */ LtdcHandle.Init.VerticalSync = 1; /* Accumulated horizontal back porch = Hsync + HBP - 1 */ LtdcHandle.Init.AccumulatedHBP = 29; /* Accumulated vertical back porch = Vsync + VBP - 1 */ LtdcHandle.Init.AccumulatedVBP = 3; /* Accumulated active width = Hsync + HBP + Active Width - 1 */ LtdcHandle.Init.AccumulatedActiveH = 323; /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ LtdcHandle.Init.AccumulatedActiveW = 269; /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ LtdcHandle.Init.TotalHeigh = 327; /* Total width = Hsync + HBP + Active Width + HFP - 1 */ LtdcHandle.Init.TotalWidth = 279; /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDIVR_8 = 48/8 = 6 Mhz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; PeriphClkInitStruct.PLLSAI.PLLSAIR = 4; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Configure R,G,B component values for LCD background color */ LtdcHandle.Init.Backcolor.Blue = 0; LtdcHandle.Init.Backcolor.Green = 0; LtdcHandle.Init.Backcolor.Red = 0; LtdcHandle.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* WindowX0 = Horizontal start WindowX1 = Horizontal stop WindowY0 = Vertical start WindowY1 = Vertical stop */ pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 240; pLayerCfg.WindowY0 = 80; pLayerCfg.WindowY1 = 240; /* Pixel Format configuration*/ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; /* Start Address configuration : frame buffer is located at FLASH memory */ pLayerCfg.FBStartAdress = (uint32_t)&aBlendedImage; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg.Alpha0 = 0; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = 240; pLayerCfg.ImageHeight = 160; /* Configure the LTDC */ if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Layer*/ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, 1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } }
/** * @brief LCD Configuration. * @note This function Configure tha LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 1 : * - The frame buffer is located at FLASH memory * - The Layer size configuration : 480x272 */ static void LCD_Config(void) { static LTDC_HandleTypeDef hltdc_F; LTDC_LayerCfgTypeDef pLayerCfg; // LTDC Initialization --------------------------------------------- // Polarity configuration // Initialize the horizontal synchronization polarity as active low hltdc_F.Init.HSPolarity = LTDC_HSPOLARITY_AL; // Initialize the vertical synchronization polarity as active low hltdc_F.Init.VSPolarity = LTDC_VSPOLARITY_AL; // Initialize the data enable polarity as active low hltdc_F.Init.DEPolarity = LTDC_DEPOLARITY_AL; // Initialize the pixel clock polarity as input pixel clock hltdc_F.Init.PCPolarity = LTDC_PCPOLARITY_IPC; // The RK043FN48H LCD 480x272 is selected // Timing Configuration hltdc_F.Init.HorizontalSync = (RK043FN48H_HSYNC - 1); hltdc_F.Init.VerticalSync = (RK043FN48H_VSYNC - 1); hltdc_F.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1); hltdc_F.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1); hltdc_F.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1); hltdc_F.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1); hltdc_F.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1); hltdc_F.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1); // Configure R,G,B component values for LCD background color : all // black background hltdc_F.Init.Backcolor.Blue = 0; hltdc_F.Init.Backcolor.Green = 0; hltdc_F.Init.Backcolor.Red = 0; hltdc_F.Instance = LTDC; // Layer1 Configuration ------------------------------------------- // Windowing configuration /* In this case all the active display area is used to display a * picture then : * Horizontal start = * horizontal synchronization + Horizontal back porch = 43 * Vertical start = * vertical synchronization + vertical back porch = 12 * Horizontal stop = Horizontal start + window width -1 = 43 + 480 -1 * Vertical stop = Vertical start + window height -1 = 12 + 272 -1 */ pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 480; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = 272; // Pixel Format configuration pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; // Start Address configuration : frame buffer is located at FLASH memory pLayerCfg.FBStartAdress = (uint32_t)&RGB565_480x272; // Alpha constant (255 == totally opaque) pLayerCfg.Alpha = 255; // Default Color configuration (configure A,R,G,B component values) : // no background color pLayerCfg.Alpha0 = 0; // fully transparent pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg.ImageWidth = 480; pLayerCfg.ImageHeight = 272; if(HAL_LTDC_Init(&hltdc_F) != HAL_OK) { Error_Handler(); } if(HAL_LTDC_ConfigLayer(&hltdc_F, &pLayerCfg, 1) != HAL_OK) { Error_Handler(); } }
/** * @brief LCD Configuration. * @note This function Configure the LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 1 : * - ARGB8888 as pixel format * - The frame buffer is located in internal Flash : original image 300x120 in ARGB8888 format * - The Layer size configuration : 300x120 * 4) Configure the LTDC Layer 2 : * - ARGB4444 as pixel format * - The frame buffer is located at internal SRAM : The output of DMA2D transfer * - The Layer size configuration : 300x120 * @retval * None */ static void LCD_Config(void) { HAL_StatusTypeDef hal_status = HAL_OK; static LTDC_HandleTypeDef LtdcHandle; static LTDC_LayerCfgTypeDef pLayerCfg; static LTDC_LayerCfgTypeDef pLayerCfg1; /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration for RK043FN48H 480x272 LCD */ /* Horizontal synchronization width = Hsync - 1 */ LtdcHandle.Init.HorizontalSync = 40; /* Vertical synchronization height = Vsync - 1 */ LtdcHandle.Init.VerticalSync = 9; /* Accumulated horizontal back porch = Hsync + HBP - 1 */ LtdcHandle.Init.AccumulatedHBP = 53; /* Accumulated vertical back porch = Vsync + VBP - 1 */ LtdcHandle.Init.AccumulatedVBP = 11; /* Accumulated active width = Hsync + HBP + Active Width - 1 */ LtdcHandle.Init.AccumulatedActiveH = 283; /* Accumulated active height = Vsync + VBP + Active Height - 1 */ LtdcHandle.Init.AccumulatedActiveW = 533; /* Total height = Vsync + VBP + Active Height + VFP - 1 */ LtdcHandle.Init.TotalHeigh = 285; /* Total width = Hsync + HBP + Active Width + HFP - 1 */ LtdcHandle.Init.TotalWidth = 565; /* Configure R,G,B component values for LCD background color */ LtdcHandle.Init.Backcolor.Blue = 0; /* All black background color */ LtdcHandle.Init.Backcolor.Green = 0; LtdcHandle.Init.Backcolor.Red = 0; LtdcHandle.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* WindowX0 = Horizontal start WindowX1 = Horizontal stop WindowY0 = Vertical start WindowY1 = Vertical stop */ pLayerCfg.WindowX0 = 90; /* Translation by vector (90, 15) for display on LCD of layer 1 */ pLayerCfg.WindowX1 = 390; pLayerCfg.WindowY0 = 15; pLayerCfg.WindowY1 = 135; /* Pixel Format configuration*/ /* Layer 1 is the original image ARGB8888 of size 300x120 from Flash */ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; /* Start Address configuration : frame buffer is located at FLASH memory */ /* Display original buffer from Flash in ARGB8888 on LCD */ pLayerCfg.FBStartAdress = (uint32_t)&ARGB8888_300x120; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg.Alpha0 = 0; /* default color is fully transparent */ pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = LAYER_SIZE_X; pLayerCfg.ImageHeight = LAYER_SIZE_Y; /* Layer2 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* In this case all the active display area is used to display a picture */ pLayerCfg1.WindowX0 = 90; /* Translation by vector (90, 137) for display on LCD of layer 2 */ pLayerCfg1.WindowX1 = 390; pLayerCfg1.WindowY0 = 137; pLayerCfg1.WindowY1 = 257; /* Pixel Format configuration*/ pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444; /* Start Address configuration : frame buffer is located at FLASH memory */ /* This is the output buffer in ARGB4444 of the DMA2D with PFC of original buffer in ARGB8888 from Flash */ pLayerCfg1.FBStartAdress = (uint32_t)&aBufferResult; /* Alpha constant (255 totally opaque) */ pLayerCfg1.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg1.Alpha0 = 0; /* fully transparent */ pLayerCfg1.Backcolor.Blue = 0; pLayerCfg1.Backcolor.Green = 0; pLayerCfg1.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg1.ImageWidth = LAYER_SIZE_X; pLayerCfg1.ImageHeight = LAYER_SIZE_Y; /* Configure the LTDC */ hal_status = HAL_LTDC_Init(&LtdcHandle); OnError_Handler(hal_status != HAL_OK); /* Assert display enable LCD_DISP pin */ HAL_GPIO_WritePin(GPIOI, GPIO_PIN_12, GPIO_PIN_SET); /* Assert backlight LCD_BL_CTRL pin */ HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_SET); /* Configure the Background Layer : layer 0 of LTDC : display original image ARGB8888 300x120 */ hal_status = HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, 0); OnError_Handler(hal_status != HAL_OK); /* Configure the Foreground Layer : layer 1 of LTDC */ /* Which is DMA2D output image in ARGB4444 of size 300x120 */ hal_status = HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg1, 1); OnError_Handler(hal_status != HAL_OK); }
/** * @brief Initializes the LCD. * @retval LCD state */ uint8_t BSP_LCD_Init(void) { /* On STM32F429I-DISCO, it is not possible to read ILI9341 ID because */ /* PIN EXTC is not connected to VDD and then LCD_READ_ID4 is not accessible. */ /* In this case, ReadID function is bypassed.*/ /*if(ili9341_drv.ReadID() == ILI9341_ID)*/ /* LTDC Configuration ----------------------------------------------------*/ LtdcHandler.Instance = LTDC; /* Timing configuration (Typical configuration from ILI9341 datasheet) HSYNC=10 (9+1) HBP=20 (29-10+1) ActiveW=240 (269-20-10+1) HFP=10 (279-240-20-10+1) VSYNC=2 (1+1) VBP=2 (3-2+1) ActiveH=320 (323-2-2+1) VFP=4 (327-320-2-2+1) */ /* Configure horizontal synchronization width */ LtdcHandler.Init.HorizontalSync = ILI9341_HSYNC; /* Configure vertical synchronization height */ LtdcHandler.Init.VerticalSync = ILI9341_VSYNC; /* Configure accumulated horizontal back porch */ LtdcHandler.Init.AccumulatedHBP = ILI9341_HBP; /* Configure accumulated vertical back porch */ LtdcHandler.Init.AccumulatedVBP = ILI9341_VBP; /* Configure accumulated active width */ LtdcHandler.Init.AccumulatedActiveW = 269; /* Configure accumulated active height */ LtdcHandler.Init.AccumulatedActiveH = 323; /* Configure total width */ LtdcHandler.Init.TotalWidth = 279; /* Configure total height */ LtdcHandler.Init.TotalHeigh = 327; /* Configure R,G,B component values for LCD background color */ LtdcHandler.Init.Backcolor.Red= 0; LtdcHandler.Init.Backcolor.Blue= 0; LtdcHandler.Init.Backcolor.Green= 0; /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 48/4 = 6Mhz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; PeriphClkInitStruct.PLLSAI.PLLSAIR = 4; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Polarity */ LtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL; LtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL; LtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL; LtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC; BSP_LCD_MspInit(); HAL_LTDC_Init(&LtdcHandler); /* Select the device */ LcdDrv = &ili9341_drv; /* LCD Init */ LcdDrv->Init(); /* Initialize the SDRAM */ BSP_SDRAM_Init(); /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); return LCD_OK; }
static void LCD_Config(void) { LTDC_LayerCfgTypeDef pLayerCfg; /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration */ /* Horizontal synchronization width = Hsync - 1 */ LtdcHandle.Init.HorizontalSync = 40; /* Vertical synchronization height = Vsync - 1 */ LtdcHandle.Init.VerticalSync = 9; /* Accumulated horizontal back porch = Hsync + HBP - 1 */ LtdcHandle.Init.AccumulatedHBP = 42; /* Accumulated vertical back porch = Vsync + VBP - 1 */ LtdcHandle.Init.AccumulatedVBP = 11; /* Accumulated active width = Hsync + HBP + Active Width - 1 */ LtdcHandle.Init.AccumulatedActiveH = 283; /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ LtdcHandle.Init.AccumulatedActiveW = 522; /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ LtdcHandle.Init.TotalHeigh = 285; /* Total width = Hsync + HBP + Active Width + HFP - 1 */ LtdcHandle.Init.TotalWidth = 524; /* Configure R,G,B component values for LCD background color */ LtdcHandle.Init.Backcolor.Blue = 0; LtdcHandle.Init.Backcolor.Green = 0; LtdcHandle.Init.Backcolor.Red = 0; LtdcHandle.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* In this case all the active display area is used to display a picture then : Horizontal start = horizontal synchronization + Horizontal back porch = 43 Vertical start = vertical synchronization + vertical back porch = 12 Horizontal stop = Horizontal start + window width -1 = 43 + 480 -1 Vertical stop = Vertical start + window height -1 = 12 + 272 -1 */ pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 480; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = 272; /* Pixel Format configuration*/ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444; /* Start Address configuration : frame buffer is located at FLASH memory */ pLayerCfg.FBStartAdress = (uint32_t)&ARGB4444_480x272; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg.Alpha0 = 0; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = 480; pLayerCfg.ImageHeight = 272; /* Configure the LTDC */ if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Layer */ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, 1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } }
/** * @brief LCD Configuration. * @note This function Configure the LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 1 : * - ARGB8888 as pixel format * - The frame buffer is located in internal Flash : original image 300x120 in ARGB8888 format * - The Layer size configuration : 300x120 * 4) Configure the LTDC Layer 2 : * - ARGB4444 as pixel format * - The frame buffer is located at internal SRAM : The output of DMA2D transfer * - The Layer size configuration : 300x120 * @retval * None */ static void LCD_Config(void) { static LTDC_HandleTypeDef LtdcHandle; static LTDC_LayerCfgTypeDef pLayerCfg; static LTDC_LayerCfgTypeDef pLayerCfg1; /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration */ if(stmpe811_ts_drv.ReadID(TS_I2C_ADDRESS) == STMPE811_ID) { /* The AMPIRE LCD 480x272 is selected */ /* Timing Configuration */ LtdcHandle.Init.HorizontalSync = (AMPIRE480272_HSYNC - 1); LtdcHandle.Init.VerticalSync = (AMPIRE480272_VSYNC - 1); LtdcHandle.Init.AccumulatedHBP = (AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); LtdcHandle.Init.AccumulatedVBP = (AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); LtdcHandle.Init.AccumulatedActiveH = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); LtdcHandle.Init.AccumulatedActiveW = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); LtdcHandle.Init.TotalHeigh = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP + AMPIRE480272_VFP - 1); LtdcHandle.Init.TotalWidth = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP + AMPIRE480272_HFP - 1); } else { /* The AMPIRE LCD 640x480 is selected */ /* Timing configuration */ LtdcHandle.Init.HorizontalSync = (AMPIRE640480_HSYNC - 1); LtdcHandle.Init.VerticalSync = (AMPIRE640480_VSYNC - 1); LtdcHandle.Init.AccumulatedHBP = (AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); LtdcHandle.Init.AccumulatedVBP = (AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); LtdcHandle.Init.AccumulatedActiveH = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); LtdcHandle.Init.AccumulatedActiveW = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); LtdcHandle.Init.TotalHeigh = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP + AMPIRE640480_VFP - 1); LtdcHandle.Init.TotalWidth = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP + AMPIRE640480_HFP - 1); } /* Configure R,G,B component values for LCD background color */ LtdcHandle.Init.Backcolor.Blue = 0; /* All black background color */ LtdcHandle.Init.Backcolor.Green = 0; LtdcHandle.Init.Backcolor.Red = 0; LtdcHandle.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* WindowX0 = Horizontal start WindowX1 = Horizontal stop WindowY0 = Vertical start WindowY1 = Vertical stop */ pLayerCfg.WindowX0 = 170; /* Translation by vector (90, 15) for display on LCD of layer 1 */ pLayerCfg.WindowX1 = 470; pLayerCfg.WindowY0 = 115; pLayerCfg.WindowY1 = 235; /* Pixel Format configuration*/ /* Layer 1 is the original image ARGB8888 of size 300x120 from Flash */ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; /* Start Address configuration : frame buffer is located at FLASH memory */ /* Display original buffer from Flash in ARGB8888 on LCD */ pLayerCfg.FBStartAdress = (uint32_t)&ARGB8888_300x120; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg.Alpha0 = 0; /* default color is fully transparent */ pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = LAYER_SIZE_X; pLayerCfg.ImageHeight = LAYER_SIZE_Y; /* Layer2 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* In this case all the active display area is used to display a picture */ pLayerCfg1.WindowX0 = 170; /* Translation by vector (90, 137) for display on LCD of layer 2 */ pLayerCfg1.WindowX1 = 470; pLayerCfg1.WindowY0 = 237; pLayerCfg1.WindowY1 = 357; /* Pixel Format configuration*/ pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444; /* Start Address configuration : frame buffer is located at FLASH memory */ /* This is the output buffer in ARGB4444 of the DMA2D with PFC of original buffer in ARGB8888 from Flash */ pLayerCfg1.FBStartAdress = (uint32_t)&aBufferResult; /* Alpha constant (255 totally opaque) */ pLayerCfg1.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg1.Alpha0 = 0; /* fully transparent */ pLayerCfg1.Backcolor.Blue = 0; pLayerCfg1.Backcolor.Green = 0; pLayerCfg1.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg1.ImageWidth = LAYER_SIZE_X; pLayerCfg1.ImageHeight = LAYER_SIZE_Y; /* Configure the LTDC */ if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Background Layer : layer 0 of LTDC : display orginal image ARGB8888 300x120 */ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, 0) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Foreground Layer : layer 1 of LTDC */ /* Which is DMA2D output image in ARGB4444 of size 300x120 */ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg1, 1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } }
/** * @brief LCD Configuration. * @note This function Configure the LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 1 : * - direct color (RGB565) as pixel format * - The frame buffer is located at FLASH memory * - The Layer size configuration : 240x160 * 4) Configure the LTDC Layer 2 : * - direct color (RGB565) as pixel format * - The frame buffer is located at FLASH memory * - The Layer size configuration : 240x160 * @retval * None */ static void LCD_Config(void) { LTDC_LayerCfgTypeDef pLayerCfg; LTDC_LayerCfgTypeDef pLayerCfg1; /* Initialization of ILI9341 component*/ ili9341_Init(); /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration (Typical configuration from ILI9341 datasheet) HSYNC=10 (9+1) HBP=20 (29-10+1) ActiveW=240 (269-20-10+1) HFP=10 (279-240-20-10+1) VSYNC=2 (1+1) VBP=2 (3-2+1) ActiveH=320 (323-2-2+1) VFP=4 (327-320-2-2+1) */ /* Timing configuration */ /* Horizontal synchronization width = Hsync - 1 */ LtdcHandle.Init.HorizontalSync = 9; /* Vertical synchronization height = Vsync - 1 */ LtdcHandle.Init.VerticalSync = 1; /* Accumulated horizontal back porch = Hsync + HBP - 1 */ LtdcHandle.Init.AccumulatedHBP = 29; /* Accumulated vertical back porch = Vsync + VBP - 1 */ LtdcHandle.Init.AccumulatedVBP = 3; /* Accumulated active width = Hsync + HBP + Active Width - 1 */ LtdcHandle.Init.AccumulatedActiveH = 323; /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ LtdcHandle.Init.AccumulatedActiveW = 269; /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ LtdcHandle.Init.TotalHeigh = 327; /* Total width = Hsync + HBP + Active Width + HFP - 1 */ LtdcHandle.Init.TotalWidth = 279; /* Configure R,G,B component values for LCD background color */ LtdcHandle.Init.Backcolor.Blue = 0; LtdcHandle.Init.Backcolor.Green = 0; LtdcHandle.Init.Backcolor.Red = 0; LtdcHandle.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 240; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = 160; /* Pixel Format configuration*/ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; /* Start Address configuration : frame buffer is located at FLASH memory */ pLayerCfg.FBStartAdress = (uint32_t)&ST_LOGO_1; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg.Alpha0 = 0; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = 240; pLayerCfg.ImageHeight = 160; /* Layer2 Configuration ------------------------------------------------------*/ /* Windowing configuration */ pLayerCfg1.WindowX0 = 0; pLayerCfg1.WindowX1 = 240; pLayerCfg1.WindowY0 = 160; pLayerCfg1.WindowY1 = 320; /* Pixel Format configuration*/ pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; /* Start Address configuration : frame buffer is located at FLASH memory */ pLayerCfg1.FBStartAdress = (uint32_t)&ST_LOGO_2; /* Alpha constant (255 totally opaque) */ pLayerCfg1.Alpha = 200; /* Default Color configuration (configure A,R,G,B component values) */ pLayerCfg1.Alpha0 = 0; pLayerCfg1.Backcolor.Blue = 0; pLayerCfg1.Backcolor.Green = 0; pLayerCfg1.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Configure the number of lines and number of pixels per line */ pLayerCfg1.ImageWidth = 240; pLayerCfg1.ImageHeight = 160; /* Configure the LTDC */ if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Background Layer*/ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, 0) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Foreground Layer*/ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg1, 1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } }
/* LTDC init function */ void MX_LTDC_Init(void) { LTDC_LayerCfgTypeDef pLayerCfg; LTDC_LayerCfgTypeDef pLayerCfg1; /* Timing configuration (Typical configuration from ILI9341 datasheet) HSYNC=10 (9+1) HBP=20 (29-10+1) ActiveW=240 (269-20-10+1) HFP=10 (279-240-20-10+1) VSYNC=2 (1+1) VBP=2 (3-2+1) ActiveH=320 (323-2-2+1) VFP=4 (327-320-2-2+1) */ hltdc.Instance = LTDC; hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Configure horizontal synchronization width */ hltdc.Init.HorizontalSync = ILI9341_HSYNC; /* Configure vertical synchronization height */ hltdc.Init.VerticalSync = ILI9341_VSYNC; /* Configure accumulated horizontal back porch */ hltdc.Init.AccumulatedHBP = ILI9341_HBP; /* Configure accumulated vertical back porch */ hltdc.Init.AccumulatedVBP = ILI9341_VBP; /* Configure accumulated active width */ hltdc.Init.AccumulatedActiveW = 269; /* Configure accumulated active height */ hltdc.Init.AccumulatedActiveH = 323; /* Configure total width */ hltdc.Init.TotalWidth = 279; /* Configure total height */ hltdc.Init.TotalHeigh = 327; /* LCD clock configuration */ //elsewhere. Choose 6MHz. /* Configure R,G,B component values for LCD background color */ hltdc.Init.Backcolor.Blue = 0x0; hltdc.Init.Backcolor.Green = 0xFF; hltdc.Init.Backcolor.Red = 0x0; HAL_LTDC_Init(&hltdc); pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 0; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = 0; pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; pLayerCfg.Alpha = 0; pLayerCfg.Alpha0 = 0; pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg.FBStartAdress = 0; pLayerCfg.ImageWidth = 0; pLayerCfg.ImageHeight = 0; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0); pLayerCfg1.WindowX0 = 0; pLayerCfg1.WindowX1 = 0; pLayerCfg1.WindowY0 = 0; pLayerCfg1.WindowY1 = 0; pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; pLayerCfg1.Alpha = 0; pLayerCfg1.Alpha0 = 0; pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg1.FBStartAdress = 0; pLayerCfg1.ImageWidth = 0; pLayerCfg1.ImageHeight = 0; pLayerCfg1.Backcolor.Blue = 0; pLayerCfg1.Backcolor.Green = 0; pLayerCfg1.Backcolor.Red = 0; HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, 1); }
/** * @brief Initializes the LCD. * @param None * @retval LCD state */ uint8_t BSP_LCD_Init(void) { static RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; /* Select the used LCD */ /* The AMPIRE 480x272 does not contain an ID register then we check the availability of AMPIRE 480x640 LCD using device ID of the STMPE811 mounted on MB1046 daughter board */ if(stmpe811_ts_drv.ReadID(TS_I2C_ADDRESS) == STMPE811_ID) { /* The AMPIRE LCD 480x272 is selected */ /* Timing Configuration */ hltdc_eval.Init.HorizontalSync = (AMPIRE480272_HSYNC - 1); hltdc_eval.Init.VerticalSync = (AMPIRE480272_VSYNC - 1); hltdc_eval.Init.AccumulatedHBP = (AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); hltdc_eval.Init.AccumulatedVBP = (AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); hltdc_eval.Init.AccumulatedActiveH = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE640480_VBP - 1); hltdc_eval.Init.AccumulatedActiveW = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE640480_HBP - 1); hltdc_eval.Init.TotalHeigh = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP + AMPIRE480272_VFP - 1); hltdc_eval.Init.TotalWidth = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP + AMPIRE480272_HFP - 1); /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/5 = 38.4 Mhz */ /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 = 38.4/4 = 9.6Mhz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; PeriphClkInitStruct.PLLSAI.PLLSAIR = AMPIRE480272_FREQUENCY_DIVIDER; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Initialize the LCD pixel width and pixel height */ hltdc_eval.LayerCfg->ImageWidth = AMPIRE480272_WIDTH; hltdc_eval.LayerCfg->ImageHeight = AMPIRE480272_HEIGHT; } else { /* The LCD AMPIRE 640x480 is selected */ /* Timing configuration */ hltdc_eval.Init.HorizontalSync = (AMPIRE640480_HSYNC - 1); hltdc_eval.Init.VerticalSync = (AMPIRE640480_VSYNC - 1); hltdc_eval.Init.AccumulatedHBP = (AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_eval.Init.AccumulatedVBP = (AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_eval.Init.AccumulatedActiveH = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_eval.Init.AccumulatedActiveW = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_eval.Init.TotalHeigh = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP + AMPIRE640480_VFP - 1); hltdc_eval.Init.TotalWidth = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP + AMPIRE640480_HFP - 1); /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 108 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 108/3 = 36 Mhz */ /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_2 = 36/2 = 18 Mhz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 108; PeriphClkInitStruct.PLLSAI.PLLSAIR = AMPIRE640480_FREQUENCY_DIVIDER; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Initialize the LCD pixel width and pixel height */ hltdc_eval.LayerCfg->ImageWidth = AMPIRE640480_WIDTH; hltdc_eval.LayerCfg->ImageHeight = AMPIRE640480_HEIGHT; } /* Background value */ hltdc_eval.Init.Backcolor.Blue = 0; hltdc_eval.Init.Backcolor.Green = 0; hltdc_eval.Init.Backcolor.Red = 0; /* Polarity */ hltdc_eval.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc_eval.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc_eval.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc_eval.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc_eval.Instance = LTDC; MspInit(); HAL_LTDC_Init(&hltdc_eval); #if !defined(DATA_IN_ExtSDRAM) /* Initialize the SDRAM */ BSP_SDRAM_Init(); #endif /* DATA_IN_ExtSDRAM */ /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); return LCD_OK; }
/** * @brief LCD configuration. * @note This function Configure the LTDC peripheral : * 1) Configure the Pixel Clock for the LCD * 2) Configure the LTDC Timing and Polarity * 3) Configure the LTDC Layer 1 : * - The frame buffer is located in FLASH memory * - The Layer size configuration : 480x272 and format ARGB4444 (16 bits/pixel) * 4) Configure the Color Keying for Layer 1. * @retval * None */ static void LCD_Config(void) { LTDC_LayerCfgTypeDef pLayerCfg; /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* Initialize the vertical synchronization polarity as active low */ LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* Initialize the data enable polarity as active low */ LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* Initialize the pixel clock polarity as input pixel clock */ LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; /* Timing configuration */ if(stmpe811_ts_drv.ReadID(TS_I2C_ADDRESS) == STMPE811_ID) { /* The AMPIRE LCD 480x272 is selected */ /* Timing Configuration */ LtdcHandle.Init.HorizontalSync = (AMPIRE480272_HSYNC - 1); LtdcHandle.Init.VerticalSync = (AMPIRE480272_VSYNC - 1); LtdcHandle.Init.AccumulatedHBP = (AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); LtdcHandle.Init.AccumulatedVBP = (AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); LtdcHandle.Init.AccumulatedActiveH = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); LtdcHandle.Init.AccumulatedActiveW = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); LtdcHandle.Init.TotalHeigh = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP + AMPIRE480272_VFP - 1); LtdcHandle.Init.TotalWidth = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP + AMPIRE480272_HFP - 1); } else { /* The LCD AMPIRE 640x480 is selected */ /* Timing configuration */ LtdcHandle.Init.HorizontalSync = (AMPIRE640480_HSYNC - 1); LtdcHandle.Init.VerticalSync = (AMPIRE640480_VSYNC - 1); LtdcHandle.Init.AccumulatedHBP = (AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); LtdcHandle.Init.AccumulatedVBP = (AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); LtdcHandle.Init.AccumulatedActiveH = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); LtdcHandle.Init.AccumulatedActiveW = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); LtdcHandle.Init.TotalHeigh = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP + AMPIRE640480_VFP - 1); LtdcHandle.Init.TotalWidth = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP + AMPIRE640480_HFP - 1); } /* Configure R,G,B component values for LCD background color : all black */ LtdcHandle.Init.Backcolor.Blue = 0; LtdcHandle.Init.Backcolor.Green = 0; LtdcHandle.Init.Backcolor.Red = 0; LtdcHandle.Instance = LTDC; /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* In this case all the active display area is used to display a picture then : Horizontal start = horizontal synchronization + Horizontal back porch = 43 Vertical start = vertical synchronization + vertical back porch = 12 Horizontal stop = Horizontal start + window width -1 = 43 + 480 -1 Vertical stop = Vertical start + window height -1 = 12 + 272 -1 */ pLayerCfg.WindowX0 = 0; pLayerCfg.WindowX1 = 480; pLayerCfg.WindowY0 = 0; pLayerCfg.WindowY1 = 272; /* Pixel Format configuration */ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444; /* Start Address configuration : frame buffer is located in FLASH memory */ pLayerCfg.FBStartAdress = (uint32_t)&ARGB4444_480x272; /* Alpha constant (255 totally opaque) */ pLayerCfg.Alpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ /* default color == all transparent pixel */ pLayerCfg.Alpha0 = 0; /* completely transparent */ pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 0; /* Configure blending factors */ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; /* Configure the number of lines and number of pixels per line */ pLayerCfg.ImageWidth = 480; pLayerCfg.ImageHeight = 272; /* Configure the LTDC */ if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Layer 1 */ if(HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, LTDC_LAYER_1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } }
static uint8_t LCD_Init(void) { DSI_PLLInitTypeDef dsiPllInit; static RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; uint32_t LcdClock = 19200; uint32_t Clockratio = 0; uint32_t laneByteClk_kHz = 0; uint32_t VSA; /*!< Vertical start active time in units of lines */ uint32_t VBP; /*!< Vertical Back Porch time in units of lines */ uint32_t VFP; /*!< Vertical Front Porch time in units of lines */ uint32_t VACT; /*!< Vertical Active time in units of lines = imageSize Y in pixels to display */ uint32_t HSA; /*!< Horizontal start active time in units of lcdClk */ uint32_t HBP; /*!< Horizontal Back Porch time in units of lcdClk */ uint32_t HFP; /*!< Horizontal Front Porch time in units of lcdClk */ uint32_t HACT; /*!< Horizontal Active time in units of lcdClk = imageSize X in pixels to display */ /* Toggle Hardware Reset of the DSI LCD using * its XRES signal (active low) */ BSP_LCD_Reset(); /* Call first MSP Initialize only in case of first initialization * This will set IP blocks LTDC, DSI and DMA2D * - out of reset * - clocked * - NVIC IRQ related to IP blocks enabled */ BSP_LCD_MspInit(); /*************************DSI Initialization***********************************/ /* Base address of DSI Host/Wrapper registers to be set before calling De-Init */ hdsi_eval.Instance = DSI; HAL_DSI_DeInit(&(hdsi_eval)); #if !defined(USE_STM32469I_DISCO_REVA) dsiPllInit.PLLNDIV = 125; dsiPllInit.PLLIDF = DSI_PLL_IN_DIV2; dsiPllInit.PLLODF = DSI_PLL_OUT_DIV1; #else dsiPllInit.PLLNDIV = 100; dsiPllInit.PLLIDF = DSI_PLL_IN_DIV5; dsiPllInit.PLLODF = DSI_PLL_OUT_DIV1; #endif laneByteClk_kHz = 62500; /* 500 MHz / 8 = 62.5 MHz = 62500 kHz */ /* Set number of Lanes */ hdsi_eval.Init.NumberOfLanes = DSI_TWO_DATA_LANES; /* TXEscapeCkdiv = f(LaneByteClk)/15.62 = 4 */ hdsi_eval.Init.TXEscapeCkdiv = laneByteClk_kHz/15620; HAL_DSI_Init(&(hdsi_eval), &(dsiPllInit)); Clockratio = laneByteClk_kHz/LcdClock; /* Timing parameters for all Video modes * Set Timing parameters of LTDC */ /* lcd_orientation == LCD_ORIENTATION_LANDSCAPE */ VSA = OTM8009A_800X480_VSYNC; /* 12 */ VBP = OTM8009A_800X480_VBP; /* 12 */ VFP = OTM8009A_800X480_VFP; /* 12 */ HSA = OTM8009A_800X480_HSYNC; /* 120 */ HBP = OTM8009A_800X480_HBP; /* 120 */ HFP = OTM8009A_800X480_HFP; /* 120 */ HACT = OTM8009A_800X480_WIDTH; /* 800 */ VACT = OTM8009A_800X480_HEIGHT; /* 480 */ hdsivideo_handle.VirtualChannelID = LCD_OTM8009A_ID; hdsivideo_handle.ColorCoding = LCD_DSI_PIXEL_DATA_FMT_RBG888; hdsivideo_handle.VSPolarity = DSI_VSYNC_ACTIVE_HIGH; hdsivideo_handle.HSPolarity = DSI_HSYNC_ACTIVE_HIGH; hdsivideo_handle.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH; hdsivideo_handle.Mode = DSI_VID_MODE_BURST; /* Mode Video burst ie : one LgP per line */ hdsivideo_handle.NullPacketSize = 0xFFF; hdsivideo_handle.NumberOfChunks = 0; hdsivideo_handle.PacketSize = HACT; /* Value depending on display orientation choice portrait/landscape */ hdsivideo_handle.HorizontalSyncActive = HSA*Clockratio; hdsivideo_handle.HorizontalBackPorch = HBP*Clockratio; hdsivideo_handle.HorizontalLine = (HACT + HSA + HBP + HFP)*Clockratio; /* Value depending on display orientation choice portrait/landscape */ hdsivideo_handle.VerticalSyncActive = VSA; hdsivideo_handle.VerticalBackPorch = VBP; hdsivideo_handle.VerticalFrontPorch = VFP; hdsivideo_handle.VerticalActive = VACT; /* Value depending on display orientation choice portrait/landscape */ /* Enable or disable sending LP command while streaming is active in video mode */ hdsivideo_handle.LPCommandEnable = DSI_LP_COMMAND_ENABLE; /* Enable sending commands in mode LP (Low Power) */ /* Largest packet size possible to transmit in LP mode in VSA, VBP, VFP regions */ /* Only useful when sending LP packets is allowed while streaming is active in video mode */ hdsivideo_handle.LPLargestPacketSize = 64; /* Largest packet size possible to transmit in LP mode in HFP region during VACT period */ /* Only useful when sending LP packets is allowed while streaming is active in video mode */ hdsivideo_handle.LPVACTLargestPacketSize = 64; /* Specify for each region of the video frame, if the transmission of command in LP mode is allowed in this region */ /* while streaming is active in video mode */ hdsivideo_handle.LPHorizontalFrontPorchEnable = DSI_LP_HFP_ENABLE; /* Allow sending LP commands during HFP period */ hdsivideo_handle.LPHorizontalBackPorchEnable = DSI_LP_HBP_ENABLE; /* Allow sending LP commands during HBP period */ hdsivideo_handle.LPVerticalActiveEnable = DSI_LP_VACT_ENABLE; /* Allow sending LP commands during VACT period */ hdsivideo_handle.LPVerticalFrontPorchEnable = DSI_LP_VFP_ENABLE; /* Allow sending LP commands during VFP period */ hdsivideo_handle.LPVerticalBackPorchEnable = DSI_LP_VBP_ENABLE; /* Allow sending LP commands during VBP period */ hdsivideo_handle.LPVerticalSyncActiveEnable = DSI_LP_VSYNC_ENABLE; /* Allow sending LP commands during VSync = VSA period */ /* Configure DSI Video mode timings with settings set above */ HAL_DSI_ConfigVideoMode(&(hdsi_eval), &(hdsivideo_handle)); /* Enable the DSI host and wrapper : but LTDC is not started yet at this stage */ HAL_DSI_Start(&(hdsi_eval)); /*************************End DSI Initialization*******************************/ /************************LTDC Initialization***********************************/ /* Timing Configuration */ hltdc_eval.Init.HorizontalSync = (HSA - 1); hltdc_eval.Init.AccumulatedHBP = (HSA + HBP - 1); hltdc_eval.Init.AccumulatedActiveW = (HACT + HSA + HBP - 1); hltdc_eval.Init.TotalWidth = (HACT + HSA + HBP + HFP - 1); /* Initialize the LCD pixel width and pixel height */ hltdc_eval.LayerCfg->ImageWidth = HACT; hltdc_eval.LayerCfg->ImageHeight = VACT; /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 384 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 384 MHz / 7 = 54.857 MHz */ /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_2 = 54.857 MHz / 2 = 27.429 MHz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 384; PeriphClkInitStruct.PLLSAI.PLLSAIR = 5; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Background value */ hltdc_eval.Init.Backcolor.Blue = 0; hltdc_eval.Init.Backcolor.Green = 0; hltdc_eval.Init.Backcolor.Red = 0; hltdc_eval.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc_eval.Instance = LTDC; /* Get LTDC Configuration from DSI Configuration */ HAL_LTDC_StructInitFromVideoConfig(&(hltdc_eval), &(hdsivideo_handle)); /* Initialize the LTDC */ HAL_LTDC_Init(&hltdc_eval); #if !defined(DATA_IN_ExtSDRAM) /* Initialize the SDRAM */ BSP_SDRAM_Init(); #endif /* DATA_IN_ExtSDRAM */ /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); /************************End LTDC Initialization*******************************/ /***********************OTM8009A Initialization********************************/ /* Initialize the OTM8009A LCD Display IC Driver (KoD LCD IC Driver) * depending on configuration set in 'hdsivideo_handle'. */ OTM8009A_Init(hdsivideo_handle.ColorCoding, LCD_ORIENTATION_LANDSCAPE); /***********************End OTM8009A Initialization****************************/ return LCD_OK; }