欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > php >内容正文

php

saiav.win forum.php,【emWin实战教程V2.0】第4章    emWin5.xx的裸机方式移植(F4

发布时间:2025/3/19 php 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。