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中怎么
- 下一篇: PHP怎样防止小数点精度不丢失,java