void TM_LCD9341_InitLTDC(void) { LTDC_InitTypeDef LTDC_InitStruct; /* Enable the LTDC Clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE); /* Enable the DMA2D Clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE); /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; /* Initialize the vertical synchronization polarity as active low */ LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; /* Initialize the data enable polarity as active low */ LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; /* Initialize the pixel clock polarity as input pixel clock */ LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC; /* Configure R,G,B component values for LCD background color */ LTDC_InitStruct.LTDC_BackgroundRedValue = 0; LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; /* 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/4 = 96 Mhz */ /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 96/4 = 24 Mhz */ RCC_PLLSAIConfig(192, 7, 4); RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4); /* Enable PLLSAI Clock */ RCC_PLLSAICmd(ENABLE); /* Wait for PLLSAI activation */ while (RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET) { } /* Timing configuration */ /* Configure horizontal synchronization width */ LTDC_InitStruct.LTDC_HorizontalSync = 9; /* Configure vertical synchronization height */ LTDC_InitStruct.LTDC_VerticalSync = 1; /* Configure accumulated horizontal back porch */ LTDC_InitStruct.LTDC_AccumulatedHBP = 29; /* Configure accumulated vertical back porch */ LTDC_InitStruct.LTDC_AccumulatedVBP = 3; /* Configure accumulated active width */ LTDC_InitStruct.LTDC_AccumulatedActiveW = 269; /* Configure accumulated active height */ LTDC_InitStruct.LTDC_AccumulatedActiveH = 323; /* Configure total width */ LTDC_InitStruct.LTDC_TotalWidth = 279; /* Configure total height */ LTDC_InitStruct.LTDC_TotalHeigh = 327; LTDC_Init(<DC_InitStruct); }
/* * initialize LTCD peripheral */ static void lcd_init_ltcd (void) { LTDC_InitTypeDef LTDC_InitStruct; NVIC_InitTypeDef NVIC_InitStructure; // Clock enable RCC_APB2PeriphClockCmd (RCC_APB2Periph_LTDC, ENABLE); RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_DMA2D, ENABLE); lcd_init_af (); // set PLLSAI to 6 MHz RCC_PLLSAIConfig (192, 7, 4); RCC_LTDCCLKDivConfig (RCC_PLLSAIDivR_Div8); RCC_PLLSAICmd (ENABLE); while (RCC_GetFlagStatus (RCC_FLAG_PLLSAIRDY) == RESET); /* configure timer * * BP = back porch, FP = front porch * * HSync = 10 VSync = 2 * HBP = 20 VBP = 2 * HFP = 10 VFP = 4 * * portrait mode: W = 240, H = 320 */ LTDC_StructInit (<DC_InitStruct); LTDC_InitStruct.LTDC_HorizontalSync = 9; // HSync - 1 LTDC_InitStruct.LTDC_VerticalSync = 1; // VSync - 1 LTDC_InitStruct.LTDC_AccumulatedHBP = 29; // HSync + HBP - 1 LTDC_InitStruct.LTDC_AccumulatedVBP = 3; // VSync + VBP - 1 LTDC_InitStruct.LTDC_AccumulatedActiveW = 269; // HSync + HBP + W - 1 LTDC_InitStruct.LTDC_AccumulatedActiveH = 323; // VSync + VBP + H - 1 LTDC_InitStruct.LTDC_TotalWidth = 279; // HSync + HBP + W + HFP - 1 LTDC_InitStruct.LTDC_TotalHeigh = 327; // VSync + VBP + H + VFP - 1 LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC; LTDC_InitStruct.LTDC_BackgroundRedValue = 0; LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; LTDC_Init (<DC_InitStruct); /* configure interrupts */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannel = LTDC_IRQn; NVIC_Init (&NVIC_InitStructure); }
/* Private functions */ static void TM_LCD_INT_InitLTDC(void) { LTDC_InitTypeDef LTDC_InitStruct; /* Enable LTDC and DMA2D clocks */ RCC->APB2ENR |= RCC_APB2ENR_LTDCEN; RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN; /* Disable LTDC */ LTDC->GCR &= ~LTDC_GCR_LTDCEN; /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; /* Initialize the vertical synchronization polarity as active low */ LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; /* Initialize the data enable polarity as active low */ LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; /* Initialize the pixel clock polarity as input pixel clock */ LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC; /* Configure R,G,B component values for LCD background color */ LTDC_InitStruct.LTDC_BackgroundRedValue = 0; LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; /* 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 */ RCC_PLLSAIConfig(192, 7, 2); RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4); /* Enable PLLSAI Clock */ RCC_PLLSAICmd(ENABLE); /* Wait for PLLSAI activation */ while (RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET); /* Timing configuration */ LTDC_InitStruct.LTDC_HorizontalSync = 29; LTDC_InitStruct.LTDC_VerticalSync = 2; LTDC_InitStruct.LTDC_AccumulatedHBP = 143; LTDC_InitStruct.LTDC_AccumulatedVBP = 34; LTDC_InitStruct.LTDC_AccumulatedActiveW = 783; LTDC_InitStruct.LTDC_AccumulatedActiveH = 514; LTDC_InitStruct.LTDC_TotalWidth = 799; LTDC_InitStruct.LTDC_TotalHeigh = 524; /* Init LTDC peripheral */ LTDC_Init(<DC_InitStruct); }
/** * @brief Initializes the DSI LCD. * The ititialization is done as below: * - DSI PLL ititialization * - DSI ititialization * - LTDC ititialization * - OTM8009A LCD Display IC Driver ititialization * @param None * @retval LCD state */ static uint8_t LCD_Init(void) { /* 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(); /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 417 Mhz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 417 MHz / 5 = 83.4 MHz */ /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_2 = 83.4 / 2 = 41.7 MHz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 417; PeriphClkInitStruct.PLLSAI.PLLSAIR = 5; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Base address of DSI Host/Wrapper registers to be set before calling De-Init */ hdsi_eval.Instance = DSI; HAL_DSI_DeInit(&(hdsi_eval)); dsiPllInit.PLLNDIV = 100; dsiPllInit.PLLIDF = DSI_PLL_IN_DIV5; dsiPllInit.PLLODF = DSI_PLL_OUT_DIV1; hdsi_eval.Init.NumberOfLanes = DSI_TWO_DATA_LANES; hdsi_eval.Init.TXEscapeCkdiv = 0x4; HAL_DSI_Init(&(hdsi_eval), &(dsiPllInit)); /* Configure the DSI for Command mode */ CmdCfg.VirtualChannelID = 0; CmdCfg.HSPolarity = DSI_HSYNC_ACTIVE_HIGH; CmdCfg.VSPolarity = DSI_VSYNC_ACTIVE_HIGH; CmdCfg.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH; CmdCfg.ColorCoding = DSI_RGB888; CmdCfg.CommandSize = HACT; CmdCfg.TearingEffectSource = DSI_TE_DSILINK; CmdCfg.TearingEffectPolarity = DSI_TE_RISING_EDGE; CmdCfg.VSyncPol = DSI_VSYNC_FALLING; CmdCfg.AutomaticRefresh = DSI_AR_ENABLE; CmdCfg.TEAcknowledgeRequest = DSI_TE_ACKNOWLEDGE_ENABLE; HAL_DSI_ConfigAdaptedCommandMode(&hdsi_eval, &CmdCfg); LPCmd.LPGenShortWriteNoP = DSI_LP_GSW0P_ENABLE; LPCmd.LPGenShortWriteOneP = DSI_LP_GSW1P_ENABLE; LPCmd.LPGenShortWriteTwoP = DSI_LP_GSW2P_ENABLE; LPCmd.LPGenShortReadNoP = DSI_LP_GSR0P_ENABLE; LPCmd.LPGenShortReadOneP = DSI_LP_GSR1P_ENABLE; LPCmd.LPGenShortReadTwoP = DSI_LP_GSR2P_ENABLE; LPCmd.LPGenLongWrite = DSI_LP_GLW_ENABLE; LPCmd.LPDcsShortWriteNoP = DSI_LP_DSW0P_ENABLE; LPCmd.LPDcsShortWriteOneP = DSI_LP_DSW1P_ENABLE; LPCmd.LPDcsShortReadNoP = DSI_LP_DSR0P_ENABLE; LPCmd.LPDcsLongWrite = DSI_LP_DLW_ENABLE; HAL_DSI_ConfigCommand(&hdsi_eval, &LPCmd); /* Initialize LTDC */ LTDC_Init(); /* Start DSI */ HAL_DSI_Start(&(hdsi_eval)); /* Initialize the OTM8009A LCD Display IC Driver (KoD LCD IC Driver)*/ OTM8009A_Init(OTM8009A_COLMOD_RGB888, LCD_ORIENTATION_LANDSCAPE); /* Reconfigure the DSI for HS Command mode */ LPCmd.LPGenShortWriteNoP = DSI_LP_GSW0P_DISABLE; LPCmd.LPGenShortWriteOneP = DSI_LP_GSW1P_DISABLE; LPCmd.LPGenShortWriteTwoP = DSI_LP_GSW2P_DISABLE; LPCmd.LPGenShortReadNoP = DSI_LP_GSR0P_DISABLE; LPCmd.LPGenShortReadOneP = DSI_LP_GSR1P_DISABLE; LPCmd.LPGenShortReadTwoP = DSI_LP_GSR2P_DISABLE; LPCmd.LPGenLongWrite = DSI_LP_GLW_DISABLE; LPCmd.LPDcsShortWriteNoP = DSI_LP_DSW0P_DISABLE; LPCmd.LPDcsShortWriteOneP = DSI_LP_DSW1P_DISABLE; LPCmd.LPDcsShortReadNoP = DSI_LP_DSR0P_DISABLE; LPCmd.LPDcsLongWrite = DSI_LP_DLW_DISABLE; HAL_DSI_ConfigCommand(&hdsi_eval, &LPCmd); HAL_DSI_ConfigFlowControl(&hdsi_eval, DSI_FLOW_CONTROL_BTA); /* Refresh the display */ HAL_DSI_Refresh(&hdsi_eval); 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 1 : * - The frame buffer is located at FLASH memory * - The Layer size configuration : 480x272 * @retval * None */ static void LCD_Config(void) { LTDC_InitTypeDef LTDC_InitStruct; LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct; /* Enable Pixel Clock --------------------------------------------------------*/ /* Configure PLLSAI prescalers for LCD */ /* 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/3 = 64 Mhz */ /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 64/8 = 8 Mhz */ RCC_PLLSAIConfig(192, 7, 3); RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8); /* Enable PLLSAI Clock */ RCC_PLLSAICmd(ENABLE); /* Wait for PLLSAI activation */ while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET) { } /* Enable the LTDC Clock -----------------------------------------------------*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE); /* Configure the LCD Control pins --------------------------------------------*/ LCD_AF_GPIOConfig(); /* LTDC Initialization -------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; /* Initialize the vertical synchronization polarity as active low */ LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; /* Initialize the data enable polarity as active low */ LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; /* Initialize the pixel clock polarity as input pixel clock */ LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC; /* Timing configuration */ /* Horizontal synchronization width = Hsync - 1 */ LTDC_InitStruct.LTDC_HorizontalSync = 40; /* Vertical synchronization height = Vsync - 1 */ LTDC_InitStruct.LTDC_VerticalSync = 9; /* Accumulated horizontal back porch = Hsync + HBP - 1 */ LTDC_InitStruct.LTDC_AccumulatedHBP = 42; /* Accumulated vertical back porch = Vsync + VBP - 1 */ LTDC_InitStruct.LTDC_AccumulatedVBP = 11; /* Accumulated active width = Hsync + HBP + Active Width - 1 */ LTDC_InitStruct.LTDC_AccumulatedActiveW = 522; /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ LTDC_InitStruct.LTDC_AccumulatedActiveH = 283; /* Total width = Hsync + HBP + Active Width + HFP - 1 */ LTDC_InitStruct.LTDC_TotalWidth = 524; /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ LTDC_InitStruct.LTDC_TotalHeigh = 285; /* Configure R,G,B component values for LCD background color */ LTDC_InitStruct.LTDC_BackgroundRedValue = 0; LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; /* Initialize LTDC */ LTDC_Init(<DC_InitStruct); /* LTDC initialization end ---------------------------------------------------*/ /* 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 */ LTDC_Layer_InitStruct.LTDC_HorizontalStart = 43; LTDC_Layer_InitStruct.LTDC_HorizontalStop = (480 + 43 - 1); LTDC_Layer_InitStruct.LTDC_VerticalStart = 12; LTDC_Layer_InitStruct.LTDC_VerticalStop = (272 + 12 - 1); /* Pixel Format configuration*/ LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565; /* Alpha constant (255 totally opaque) */ LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0; /* Configure blending factors */ LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA; LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA; /* Start Address configuration : frame buffer is located at FLASH memory */ LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)&RGB565_480x272; /* the length of one line of pixels in bytes + 3 then : Line Lenth = Active high width x number of bytes per pixel + 3 Active high width = 480 number of bytes per pixel = 2 (pixel_format : RGB565) */ LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((480 * 2) + 3); /* the pitch is the increment from the start of one line of pixels to the start of the next line in bytes, then : Pitch = Active high width x number of bytes per pixel */ LTDC_Layer_InitStruct.LTDC_CFBPitch = (480 * 2); /* Configure the number of lines */ LTDC_Layer_InitStruct.LTDC_CFBLineNumber = 272; /* Initializes the Layer */ LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct); /* Layer1 Configuration end --------------------------------------------------*/ }
/** * @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 : * - indirect color (L8) as pixel format * - The frame buffer is located at FLASH memory * - The Layer size configuration : 320x240 * 4) Configure the LTDC Layer 2 : * - The frame buffer is located at FLASH memory * - The Layer size configuration : 320x240 * 5) Load 256 colors in CLUT address for Layer 1 * @retval * None */ static void LCD_Config(void) { LTDC_InitTypeDef LTDC_InitStruct; LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct; LTDC_CLUT_InitTypeDef LTDC_CLUT_InitStruct; uint32_t uwCounter = 0; /* Enable Pixel Clock --------------------------------------------------------*/ /* Configure PLLSAI prescalers for LCD */ /* 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/3 = 64 Mhz */ /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 64/8 = 8 Mhz */ RCC_PLLSAIConfig(192, 7, 3); RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8); /* Enable PLLSAI Clock */ RCC_PLLSAICmd(ENABLE); /* Wait for PLLSAI activation */ while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET) { } /* Enable the LTDC Clock -----------------------------------------------------*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE); /* Configure the LCD Control pins --------------------------------------------*/ LCD_AF_GPIOConfig(); /* Sets LCD backlight and display On -----------------------------------------*/ GPIO_SetBits(GPIOA, GPIO_Pin_8); GPIO_SetBits(GPIOC, GPIO_Pin_6); /* Initialize the LCD --------------------------------------------------------*/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low*/ LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; /* Initialize the vertical synchronization polarity as active low */ LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; /* Initialize the data enable polarity as active low */ LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; /* Initialize the pixel clock polarity as input pixel clock */ LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC; /* Timing configuration */ /* Horizontal synchronization width = Hsync - 1 */ LTDC_InitStruct.LTDC_HorizontalSync = 40; /* Vertical synchronization height = Vsync - 1 */ LTDC_InitStruct.LTDC_VerticalSync = 9; /* Accumulated horizontal back porch = Hsync + HBP - 1 */ LTDC_InitStruct.LTDC_AccumulatedHBP = 42; /* Accumulated vertical back porch = Vsync + VBP - 1 */ LTDC_InitStruct.LTDC_AccumulatedVBP = 11; /* Accumulated active width = Hsync + HBP + Active Width - 1 */ LTDC_InitStruct.LTDC_AccumulatedActiveW = 522; /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ LTDC_InitStruct.LTDC_AccumulatedActiveH = 283; /* Total width = Hsync + HBP + Active Width + HFP - 1 */ LTDC_InitStruct.LTDC_TotalWidth = 524; /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ LTDC_InitStruct.LTDC_TotalHeigh = 285; /* Configure R,G,B component values for LCD background color */ LTDC_InitStruct.LTDC_BackgroundRedValue = 0; LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; /* Initialize LTDC */ LTDC_Init(<DC_InitStruct); /* LCD initializing end ------------------------------------------------------*/ /* Layer1 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* In this case only 320x240 window of 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 + 320 -1 Vertical stop = Vertical start + window height -1 = 12 + 240 -1 */ LTDC_Layer_InitStruct.LTDC_HorizontalStart = 43; LTDC_Layer_InitStruct.LTDC_HorizontalStop = (320 + 43 - 1); LTDC_Layer_InitStruct.LTDC_VerticalStart = 12; LTDC_Layer_InitStruct.LTDC_VerticalStop = (240 + 12 - 1); /* Pixel Format configuration : indirect color (L8) */ LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_L8; /* Alpha constant configuration */ LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255; /* Default Color configuration (configure A,R,G,B component values) */ LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0; /* Blending Factors */ LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA; LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA; /* Start Address configuration : frame buffer is located at FLASH memory */ LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)&L8_320x240; /* the length of one line of pixels in bytes + 3 then : Line Lenth = Active high width x number of bytes per pixel + 3 Active high width = 320 number of bytes per pixel = 1 (pixel_format : L8) */ LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((320 * 1) + 3); /* the pitch is the increment from the start of one line of pixels to the start of the next line in bytes, then : Pitch = Active high width x number of bytes per pixel */ LTDC_Layer_InitStruct.LTDC_CFBPitch = (320 * 1); /* Configure the number of lines */ LTDC_Layer_InitStruct.LTDC_CFBLineNumber = 240; /* Initialize the Layer1 */ LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct); /* Layer1 Configuration end --------------------------------------------------*/ /* Layer2 Configuration ------------------------------------------------------*/ /* Windowing configuration */ /* In this case only 320x240 window of the active display area is used to display a picture then : Horizontal start = horizontal synchronization + offset_x + Horizontal back porch = 43 Vertical start = vertical synchronization + offset_y + vertical back porch = 12 Horizontal stop = Horizontal start + offset_x + window width -1 = 43 + 320 -1 Vertical stop = Vertical start + offset_y + window height -1 = 12 + 240 -1 */ LTDC_Layer_InitStruct.LTDC_HorizontalStart = 160 + 43; LTDC_Layer_InitStruct.LTDC_HorizontalStop = (320 + 160 + 43 - 1); LTDC_Layer_InitStruct.LTDC_VerticalStart = 32 + 12; LTDC_Layer_InitStruct.LTDC_VerticalStop = (32 + 240 + 12 - 1); /* Pixel Format configuration */ LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565; /* Alpha constant configuration : The constant alpha for layer 2 is decreased to see the layer 1 in the intersection zone*/ LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 200; /* Default Color configuration (configure A,R,G,B component values) */ LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0; /* blending Factors */ LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA; LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA; /* Configure Input Address : frame buffer is located at FLASH memory */ LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)&RGB565_320x240; /* the length of one line of pixels in bytes + 3 then : Line Lenth = Active high width x number of bytes per pixel + 3 Active high width = 320 number of bytes per pixel = 2 (pixel_format : RGB565) */ LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((320 * 2) + 3); LTDC_Layer_InitStruct.LTDC_CFBPitch = (320 * 2); /* the pitch is the increment from the start of one line of pixels to the start of the next line in bytes, then : Pitch = Active high width x number of bytes per pixel */ LTDC_Layer_InitStruct.LTDC_CFBLineNumber = 240; /* Initialize the Layer 2 */ LTDC_LayerInit(LTDC_Layer2, <DC_Layer_InitStruct); /* Layer2 Configuration end --------------------------------------------------*/ /* CLUT loading --------------------------------------------------------------*/ /* Load 256 colors in CLUT address for Layer 1 */ for(uwCounter = 0; (uwCounter < 256); uwCounter++) { LTDC_CLUT_InitStruct.LTDC_CLUTAdress = uwCounter; LTDC_CLUT_InitStruct.LTDC_BlueValue = (L8_320x240_CLUT[uwCounter] & 0xFF); LTDC_CLUT_InitStruct.LTDC_GreenValue = (L8_320x240_CLUT[uwCounter] & 0xFF00) >> 8; LTDC_CLUT_InitStruct.LTDC_RedValue = (L8_320x240_CLUT[uwCounter] & 0xFF0000) >> 16; LTDC_CLUTInit(LTDC_Layer1, <DC_CLUT_InitStruct); } /* CLUT loading end ----------------------------------------------------------*/ }
LCDTFTConf::LCDTFTConf() { CurrentFrameBuffer = LCD_FRAME_BUFFER; CurrentLayer = LCD_BACKGROUND_LAYER; LTDC_InitTypeDef LTDC_InitStruct; /* Configure the LCD Control pins ------------------------------------------*/ LCD_CtrlLinesConfig(); LCD_ChipSelect(DISABLE); LCD_ChipSelect(ENABLE); /* Configure the LCD_SPI interface -----------------------------------------*/ LCD_SPIConfig(); /* Power on the LCD --------------------------------------------------------*/ LCD_PowerOn(); /* Enable the LTDC Clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE); /* Enable the DMA2D Clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE); /* Configure the LCD Control pins */ LCD_AF_GPIOConfig(); /* Configure the FMC Parallel interface : SDRAM is used as Frame Buffer for LCD */ SDRAM_Init(); /* LTDC Configuration *********************************************************/ /* Polarity configuration */ /* Initialize the horizontal synchronization polarity as active low */ LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; /* Initialize the vertical synchronization polarity as active low */ LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; /* Initialize the data enable polarity as active low */ LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; /* Initialize the pixel clock polarity as input pixel clock */ LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC; /* Configure R,G,B component values for LCD background color */ LTDC_InitStruct.LTDC_BackgroundRedValue = 0; LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; /* 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/4 = 48 Mhz */ /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 48/8 = 6 Mhz */ RCC_PLLSAIConfig(192, 7, 4); RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8); /* Enable PLLSAI Clock */ RCC_PLLSAICmd(ENABLE); /* Wait for PLLSAI activation */ while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET); /* Timing configuration */ /* Configure horizontal synchronization width */ LTDC_InitStruct.LTDC_HorizontalSync = 9; /* Configure vertical synchronization height */ LTDC_InitStruct.LTDC_VerticalSync = 1; /* Configure accumulated horizontal back porch */ LTDC_InitStruct.LTDC_AccumulatedHBP = 29; /* Configure accumulated vertical back porch */ LTDC_InitStruct.LTDC_AccumulatedVBP = 3; /* Configure accumulated active width */ LTDC_InitStruct.LTDC_AccumulatedActiveW = 269; /* Configure accumulated active height */ LTDC_InitStruct.LTDC_AccumulatedActiveH = 323; /* Configure total width */ LTDC_InitStruct.LTDC_TotalWidth = 279; /* Configure total height */ LTDC_InitStruct.LTDC_TotalHeigh = 327; LTDC_Init(<DC_InitStruct); LCD_LayerInit(); /* LTDC reload configuration */ LTDC_ReloadConfig(LTDC_IMReload); /* Enable the LTDC */ LTDC_Cmd(ENABLE); }