5.6 第3步:LTDC涉及到的引脚配置和时序配置
5.6.1 LTDC时序配置
(提示:本小节要实现的操作,最简单的方法是复制教程配套例子整理好的驱动文件bsp_tft_429.c到自己的工程目录,然后调试修改文件中的函数LCD_ConfigLTDC即可,由于此文件关联了几个其它冗余文件,所以也是要添加的)
用户仅需配置LTDC涉及到的引脚和时序即可,LTDC其余的配置已经在文件LCDConf_Lin_Template.c全部封好了。将引脚配置预留出来供用户配置是因为硬件设计不同,比如可能使用RGB888接口,也可能是RGB565接口,所以用户仅需把需要的引脚初始化即可。将时序配置也预留出来是因为不同厂家的裸屏,驱动时序是不同的。
引脚的配置还比较容易,硬件上用到哪些引脚了就把那些引脚配置下即可,关键是LTDC的时序配置。针对这个问题,专门发布了一个LTDC时序配置的帖子:http://www.armbbs.cn/forum.php?mod=viewthread&tid=18528 。帖子中是以开发板的7寸显示屏为例进行配置的,如果大家配置自己的显示屏,方法是一样的,一定要参照裸屏驱动手册中的时序参数进行配置。
由于开发板配套了4.3寸,5寸和7寸屏显示屏,所以要对这几种尺寸的显示屏做自适应,每个屏的时序配置都是不一样的,具体实现在bsp_tft_429.c文件末尾的,即函数LCD_ConfigLTDC。大家在给自己的显示屏移植时仅需提供这个LCD_ConfigLTDC函数即可,引脚配置需要在这个函数里面实现。另外,文件bsp_tft_429.c里面的其它函数都没有用到,其它的函数是供裸机代码(不含GUI)使用的,与emWin没有任何关系。下面我们再结合函数LCD_ConfigLTDC的实现,讲解下配置时要注意的一些问题,具体代码如下:
- //////////////////////////////////////////////////////////////////////////////////////////////////////////
- /*
- *********************************************************************************************************
- * 下面的函数被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 = 90; /* =10时,显示错位,20时部分屏可以的,80时全部OK */
- HBP = 10;
- HFP = 10;
-
- VSYNC_W = 10;
- VBP = 10;
- VFP = 10;
- 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)
- }
复制代码 1. LTDC时钟使能,此函数切不要忘记。
2. DMA2D时钟使能,此函数切不要忘记。
3. LTDC用到的引脚配置,此函数切不要忘记。LCD接口原理图如下,RGB888接口方式:
原理图中用到哪些引脚了,那些引脚就需要做初始化,具体初始化代码如下,初始化时别忘了初始化引脚对应的时钟:
- /*
- *********************************************************************************************************
- * 函 数 名: LCD429_AF_GPIOConfig
- * 功能说明: 配置GPIO用于 LTDC.
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void LCD429_AF_GPIOConfig(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
-
- /* Enable GPIOI, GPIOJ, GPIOK AHB Clocks */
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOJ | \\
- RCC_AHB1Periph_GPIOK, ENABLE);
-
- /* GPIOs Configuration */
- /*
- +------------------------+-----------------------+----------------------------+
- + LCD pins assignment +
- +------------------------+-----------------------+----------------------------+
- | LCD429_TFT R0 <-> PI.15 | LCD429_TFT G0 <-> PJ.07 | LCD429_TFT B0 <-> PJ.12 |
- | LCD429_TFT R1 <-> PJ.00 | LCD429_TFT G1 <-> PJ.08 | LCD429_TFT B1 <-> PJ.13 |
- | LCD429_TFT R2 <-> PJ.01 | LCD429_TFT G2 <-> PJ.09 | LCD429_TFT B2 <-> PJ.14 |
- | LCD429_TFT R3 <-> PJ.02 | LCD429_TFT G3 <-> PJ.10 | LCD429_TFT B3 <-> PJ.15 |
- | LCD429_TFT R4 <-> PJ.03 | LCD429_TFT G4 <-> PJ.11 | LCD429_TFT B4 <-> PK.03 |
- | LCD429_TFT R5 <-> PJ.04 | LCD429_TFT G5 <-> PK.00 | LCD429_TFT B5 <-> PK.04 |
- | LCD429_TFT R6 <-> PJ.05 | LCD429_TFT G6 <-> PK.01 | LCD429_TFT B6 <-> PK.05 |
- | LCD429_TFT R7 <-> PJ.06 | LCD429_TFT G7 <-> PK.02 | LCD429_TFT B7 <-> PK.06 |
- -------------------------------------------------------------------------------
- | LCD429_TFT HSYNC <-> PI.12 | LCDTFT VSYNC <-> PI.13 |
- | LCD429_TFT CLK <-> PI.14 | LCD429_TFT DE <-> PK.07 |
- -----------------------------------------------------
- */
-
- /* GPIOI configuration */
- GPIO_PinAFConfig(GPIOI, GPIO_PinSource12, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOI, GPIO_PinSource13, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOI, GPIO_PinSource14, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOI, GPIO_PinSource15, GPIO_AF_LTDC);
-
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
-
- //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOI, &GPIO_InitStruct);
-
- /* GPIOJ configuration */
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource0, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource1, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource2, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource3, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource4, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource5, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource6, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource7, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource8, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource9, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource10, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource11, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource12, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource13, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource14, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOJ, GPIO_PinSource15, GPIO_AF_LTDC);
-
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | \\
- GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | \\
- GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | \\
- GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
-
- GPIO_Init(GPIOJ, &GPIO_InitStruct);
-
- /* GPIOI configuration */
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource0, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource1, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource2, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource3, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource4, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource5, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource6, GPIO_AF_LTDC);
- GPIO_PinAFConfig(GPIOK, GPIO_PinSource7, GPIO_AF_LTDC);
-
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | \\
- GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
-
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOK, &GPIO_InitStruct);
- }
复制代码 4. STM32F429/439的图层是由背景层,图层1和图层2组成,这里配置的是背景层的颜色值,分别配置了R,G,B三原色的数值,范围都是0-255。6. 六种显示面板的LTDC输出时钟和时序参数配置,六种面板的识别是在bsp_touch.c文件中实现的。大家自己配置时用不到这个,仅需提供一组时序参数和输出时钟即可,除非项目中需要切换不同显示屏。 8. 全局变量g_LcdWidth和g_LcdHeight在文件bsp_tft_lcd.c文件定义。如果大家自己移植时用不到文件bsp_tft_lcd.c的话,需要自行定义这两个全局变量(另外,此文件里面的背光设置函数也要自行实现),因为这两个变量要被文件LCDConf_Lin_Template.c所调用。 9. 等待LTDC输出时钟配置完成。 10. 通过函数LTDC_Init完成时序配置。
5.6.2 如何验证LTDC的时序配置是否正确
下面说一个最重要的问题,配置好时序了,怎么检查自己的配置是否成功了?用户仅需在这个函数的末尾加上如下三行代码: - /* 开背光,这个函数是在bsp_tft_lcd.c文件实现,如果大家移植自己的板子,写个类似的函数,开启背光即可 */
- LCD_SetBackLight(255);
- /* 开启LTDC */
- LTDC_Cmd(ENABLE);
- /* 将程序停止在这里 */
- while(1);
复制代码
加上这三行代码后,再将背景层设置为一个合适的颜色,建议设置成红色,方便观察:
- /* 背景色 */
- LTDC_InitStruct.LTDC_BackgroundRedValue = 0xff;
- LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;
- LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;
复制代码 如果背景层可以正常显示红色,说明引脚和时序配置都是没有问题的。如果不成功要从以下几个方面着手检查:
1、首先要清楚一点,当前的设置与是否使用了SDRAM没有任何关系,因为背景层是不需要SDRAM的,图层1和图层2才需要SDRAM做显存使用。
2、从硬件着手检查,保证F429/439芯片焊接没问题,TFT接口一定要牢固,防止接触不良,特别是使用FPC软排线的时候,测试阶段,软排线越短越好。有时候也可能是显示屏有问题,最好可以备两个显示屏测试。
3、从软件配置着手检查,查看LTDC涉及到的所有引脚是否配置,引脚时钟是否使能,有时候无法显示也有可能是板子硬件设计不规范导致干扰较大造成的,此时,可以降低LTDC涉及到的引脚速度。
4、如果显示了,但是显示的位置不正确,可以重新调整下时序参数即可。
这部分知识就为大家讲解这么多,下面讲解工程中需要添加的文件。
5.6.3 添加涉及到的所有文件到工程
实际上大家自己实现的话,仅需参考函数LCD_ConfigLTDC,自己实现此函数即可,无需其它任何配置。由于我们开发板要做不同显示屏的自适应,所以关联了好多个文件,所有关于TFT,触摸,触摸校准参数保存和字体的文件都要添加进来:
下面把这些新添加的文件做一个简单的介绍:
1、Fonts分组中的文件
所有这些文件,emWin都用不上,只是因为被文件bsp_tft_lcd.c文件关联了。
asc12.c---12点阵ASCII字符字库
asc16.c---16点阵ASCII字符字库
hz12.c--- 12点阵宋体小字库
hz16.c--- 16点阵宋体小字库
hz24.c--- 24点阵宋体小字库
hz32.c--- 32点阵宋体小字库
ra8875_asc_width.c-- RA8875 ASCII字体的宽度表
2、LCD_Driver分组中的文件
这个分组里面的文件,emWin都要用到。
param.c--- 触摸校准时参数保存和参数加载功能的实现。
bsp_tft_lcd.c--- TFT驱动和相关API函数汇总文件,比如用户的RA8875显示屏,ili9488显示屏,F429所带TFT控制器
驱动显示屏都可以有一个单独的文件,然后将这些显示屏相同功能的函数汇总成一个函数。这个文件
就起到这个作用。emWin仅用到这个文件里面的全局变量g_LcdHeight,g_LcdWidth以及背光函数
LCD_SetBackLight,其它所有函数都没有用到。
bsp_touch.c --- 触摸芯片自适应驱动,根据用户使用的触摸IC选择不同的驱动。另外,电阻屏的触摸扫描,触摸校准和
触摸滤波也是在这个文件里面实现。
bsp_gt811.c --- 电容触摸芯片GT811的驱动以及触摸扫描。
bsp_ft5x06.c --- 电容触摸芯片FT5X06的驱动以及触摸扫描。
TOUCH_STMPE811.c --- 电阻触摸芯片STMPE811的驱动。
3、bsp分组中的文件
这个分组里面的三个文件,emWin都要间接用到。
bsp_tim_pwm.c--- 定时器驱动,显示屏的背光要用到PWM。
bsp_i2c_gpio.c--- I2C接口驱动,EEPROM,GT811,STMPE811和FT5X06都要用到,因为他们的接口都是I2C方式。
bsp_eeprom_24xx.c ---EEPROM驱动,用于存储电阻屏触摸校准参数。
4、StdPeriph_Driver分组中的文件
这个分组里面的两个文件,emWin都要间接用到。
stm32f4xx_tim.c--- 显示屏的背光是用PWM驱动的,需要用到这个定时器库文件。
stm32f4xx_ltdc.c ---LTDC相关的API函数需要用到这个库文件。 |