saiav.win forum.php,【emWin实战教程V2.0】第4章 emWin5.xx的裸机方式移植(F4
//
/*
*********************************************************************************************************
*? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 下面的函數被emWin所調用
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*? ? 函 數 名: LCD_ConfigLTDC
*? ? 功能說明: 配置LTDC
*? ? 形? ? 參: 無
*? ? 返 回 值: 無
*? ?筆? ? 記:
*? ?? ? LCD_TFT 同步時序配置(整理自官方做的一個截圖,言簡意賅):
*? ?? ? ----------------------------------------------------------------------------
*
*? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? Total Width
*? ?? ?? ?? ?? ?? ?? ?? ?? ???<--------------------------------------------------->
*? ?? ?? ?? ?? ?? ?? ???Hsync width HBP? ?? ?? ?? ? Active Width? ?? ?? ?? ?? ? HFP
*? ?? ?? ?? ?? ?? ?? ?? ?? ???<---><--><--------------------------------------><-->
*? ?? ?? ?? ?? ?? ?? ?? ? ____? ? ____|_______________________________________|____
*? ?? ?? ?? ?? ?? ?? ?? ?? ???|___|? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ?? ?? ?? ?? ? __|? ?? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ?/|\\? ? /|\\??|? ?? ?? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ? | VSYNC|? ?|? ?? ?? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ? |Width\\|/??|__? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ? |? ???/|\\? ???|? ?? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ? |??VBP |? ?? ?|? ?? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|? ? |
*? ?? ?? ?? ? |? ???\\|/_____|_________|_______________________________________|? ? |
*? ?? ?? ?? ? |? ???/|\\? ???|? ?? ?? ?| / / / / / / / / / / / / / / / / / / / |? ? |
*? ?? ?? ?? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ? Total? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ? Heigh? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ?? ?? ?? ? |Active|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ?? ?? ?? ? |Heigh |? ?? ?|? ?? ?? ?|/ / / / / / Active Display Area / / / /|? ? |
*? ?? ?? ?? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ?? ?? ?? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ?? ?? ?? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ?? ?? ?? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ?? ?? ?? ? |? ?? ?|? ?? ?|? ?? ?? ?|/ / / / / / / / / / / / / / / / / / / /|? ? |
*? ?? ?? ?? ? |? ???\\|/_____|_________|_______________________________________|? ? |
*? ?? ?? ?? ? |? ???/|\\? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
*? ?? ?? ?? ? |??VFP |? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
*? ?? ?? ?? ?\\|/? ? \\|/_____|______________________________________________________|
*
*
*? ???每個LCD設備都有自己的同步時序值:
*? ???Horizontal Synchronization (Hsync)
*? ???Horizontal Back Porch (HBP)
*? ???Active Width
*? ???Horizontal Front Porch (HFP)
*
*? ???Vertical Synchronization (Vsync)
*? ???Vertical Back Porch (VBP)
*? ???Active Heigh
*? ???Vertical Front Porch (VFP)
*
*? ???LCD_TFT 窗口水平和垂直的起始以及結束位置 :
*? ???----------------------------------------------------------------
*
*? ???HorizontalStart = (Offset_X + Hsync + HBP);
*? ???HorizontalStop??= (Offset_X + Hsync + HBP + Window_Width - 1);
*? ???VarticalStart? ?= (Offset_Y + Vsync + VBP);
*? ???VerticalStop? ? = (Offset_Y + Vsync + VBP + Window_Heigh - 1);
*
*********************************************************************************************************
*/
__IO uint16_t Width, Height, HSYNC_W, VSYNC_W, HBP, HFP, VBP, VFP;
void LCD_ConfigLTDC(void)
{
LTDC_InitTypeDef? ?? ? LTDC_InitStruct;
LTDC_Layer_TypeDef? ???LTDC_Layerx;
/* 使能LTDC */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE); //--------------(1)
/* 使能DMA2D */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE); //--------------(2)
/* 配置LCD引腳 */
LCD429_AF_GPIOConfig();??//--------------(3)
/* 配置信號極性 */
LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;? ?/* HSYNC 低電平有效 */??//--------------(4)
LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;? ?/* VSYNC 低電平有效 */
LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;? ?/* DE 低電平有效 */
LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;
/* 背景色 */
LTDC_InitStruct.LTDC_BackgroundRedValue = 0;? ? //--------------(5)
LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;
LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;
/*
LTDC時鐘配置說明:
函數RCC_PLLSAIConfig的第一個參數是PLLSAI_N,第三個參數數PLLSAI_R。
函數RCC_LTDCCLKDivConfig的參數是RCC_PLLSAIDivR。
下面舉一個例子:PLLSAI_N = 400, PLLSAI_R = 4??RCC_PLLSAIDivR = 2:
首先,輸入時鐘 PLLSAI_VCO Input = HSE_VALUE / PLL_M = 8M / 8 = 1MHz
輸出時鐘 PLLSAI_VCO Output??= PLLSAI_VCO Input * PLLSAI_N = 1 * 400 = 400 1MHz
PLLLCDCLK = PLLSAI_VCO Output / PLLSAI_R = 400 / 4 = 100 1MHz
最好,LTDC 時鐘 = PLLLCDCLK / RCC_PLLSAIDivR = 100 / 2 = 50 1MHz
*/
/* 支持6種面板 */
switch (g_LcdType)? ?//--------------(6)
{
case LCD_35_480X320:? ?/* 3.5寸 480 * 320 */
RCC_PLLSAIConfig(429, 2,??4);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
Width = 480;
Height = 272;
HSYNC_W = 10;
HBP = 20;
HFP = 20;
VSYNC_W = 20;
VBP = 20;
VFP = 20;
break;
case LCD_43_480X272:/* 4.3寸 480 * 272??選擇LTDC輸出20MHz,所有顏色深度都可以選擇這個時鐘頻率 */
RCC_PLLSAIConfig(280, 2,??7);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div2);
Width = 480;
Height = 272;
HSYNC_W = 40;
HBP = 2;
HFP = 2;
VSYNC_W = 9;
VBP = 2;
VFP = 2;
break;
case LCD_50_480X272:? ?? ???/* 5.0寸 480 * 272 */
RCC_PLLSAIConfig(429, 2,??4);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
Width = 480;
Height = 272;
HSYNC_W = 40;
HBP = 2;
HFP = 2;
VSYNC_W = 9;
VBP = 2;
VFP = 2;
break;
case LCD_50_800X480:/* 5.0寸 800 * 480,24位或者32位色選擇LTDC輸出15MHz,16位或者8位30MHz */
RCC_PLLSAIConfig(420, 2,??7);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
Width = 800;
Height = 480;
HSYNC_W = 96;
HBP = 10;
HFP = 10;
VSYNC_W = 2;
VBP = 10;
VFP = 10;
break;
//--------------(7)
case LCD_70_800X480:/* 7.0寸 800 * 480,24位或者32位色選擇LTDC輸出15MHz,16位或者8位30MHz*/
RCC_PLLSAIConfig(420, 2,??7);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div2);
#if 0
RCC_PLLSAIConfig(400, 2,??2);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
#endif
Width = 800;
Height = 480;
HSYNC_W = 48;
HBP = 88;
HFP = 40;
VSYNC_W = 3;
VBP = 32;
VFP = 13;
break;
case LCD_70_1024X600:? ?? ? /* 7.0寸 1024 * 600 */
LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;? ?/* HSYNC 低電平有效 */
LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;? ?/* VSYNC 低電平有效 */
LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;? ?/* DE 低電平有效 */
LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IIPC;
/* IPS 7寸 1024*600,??像素時鐘頻率范圍 : 57 -- 65 --- 70.5MHz
PLLSAI_VCO Input? ?= HSE_VALUE / PLL_M = 8M / 4 = 2 Mhz
PLLSAI_VCO Output??= PLLSAI_VCO Input * PLLSAI_N =? ?2 * 429 = 858 Mhz
PLLLCDCLK = PLLSAI_VCO Output / PLLSAI_R = 858 / 4 = 214.5 Mhz
LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 214.5 / 4 = 53.625 Mhz
(429, 2, 4); RCC_PLLSAIDivR_Div4 實測像素時鐘 = 53.7M
*/
RCC_PLLSAIConfig(429, 2, 6);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
Width = 1024;
Height = 600;
HSYNC_W = 2;??/* =10時,顯示錯位,20時部分屏可以的,80時全部OK */
HBP = 157;
HFP = 160;
VSYNC_W = 2;
VBP = 20;
VFP = 12;
break;
default:
RCC_PLLSAIConfig(429, 2,??4);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
Width = 800;
Height = 480;
HSYNC_W = 80; /* =10時,顯示錯位,20時部分屏可以的,80時全部OK */
HBP = 10;
HFP = 10;
VSYNC_W = 10;
VBP = 10;
VFP = 10;
break;
}
g_LcdWidth??= Width;? ?? ???/* 顯示屏分辨率-寬度 */??//--------------(8)
g_LcdHeight = Height;? ?? ? /* 顯示屏分辨率-高度 */
/* 使能 PLLSAI */
RCC_PLLSAICmd(ENABLE);? ?//--------------(9)
/* 等待完成 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET);
/* 配置LTDC的同步時序 */
LTDC_InitStruct.LTDC_HorizontalSync = HSYNC_W;
LTDC_InitStruct.LTDC_VerticalSync = VSYNC_W;
LTDC_InitStruct.LTDC_AccumulatedHBP = LTDC_InitStruct.LTDC_HorizontalSync + HBP;
LTDC_InitStruct.LTDC_AccumulatedVBP = LTDC_InitStruct.LTDC_VerticalSync + VBP;
LTDC_InitStruct.LTDC_AccumulatedActiveW = Width + LTDC_InitStruct.LTDC_AccumulatedHBP;
LTDC_InitStruct.LTDC_AccumulatedActiveH = Height + LTDC_InitStruct.LTDC_AccumulatedVBP;
LTDC_InitStruct.LTDC_TotalWidth = LTDC_InitStruct.LTDC_AccumulatedActiveW + HFP;
LTDC_InitStruct.LTDC_TotalHeigh = LTDC_InitStruct.LTDC_AccumulatedActiveH + VFP;
LTDC_Init(<DC_InitStruct); //--------------(10)
}
總結
以上是生活随笔為你收集整理的saiav.win forum.php,【emWin实战教程V2.0】第4章 emWin5.xx的裸机方式移植(F4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中map怎么遍历,Java中怎么
- 下一篇: matlab分割字,matlab字符分割