ucos_emwin_ucgui吧 关注:383贴子:3,095
  • 14回复贴,共1

【emWin实战教程V2.0】第34章 STemWin支持的颜色格式

只看楼主收藏回复

完整65章+12章附件教程下载地址:http://bbs.armfly.com/read.php?tid=19834
完整65章+12章附件教程下载地址:http://bbs.armfly.com/read.php?tid=19834
完整65章+12章附件教程下载地址:http://bbs.armfly.com/read.php?tid=19834
第34章 STemWin支持的颜色格式
本章节为大家讲解STemWin支持的颜色格式,了解了这些颜色就可以很方便的根据液晶屏支持的颜色选择STemWin相应的颜色配置。简单的说就是,如果大家使用的屏只支持黑白两色,那么就得使用STemWin配套的颜色格式GUICC_1。
STM32F429支持8种颜色格式,用户可以根据项目需要选择合适的颜色格式,同时STemWin也要选择相应的颜色格式。
34.1 初学者重要提示
34.2 颜色格式说明
34.3 固定调色板及其说明
34.4 颜色格式选择RGB565实验例程说明(RTOS)
34.5 颜色格式选择RGB565实验例程说明(裸机)
34.6 颜色格式选择RGB888实验例程说明(RTOS)
34.7 颜色格式选择RGB888实验例程说明(裸机)
34.8 总结


IP属地:河北1楼2017-01-16 17:38回复
    34.1 初学者重要提示
    1、对于初学者来说,主要掌握RGB888和RGB565两种颜色格式的使用即可,因为这两种格式在实际项目中用到的最多。
    2、对于32位色,24位色,16位色和8位色的显示效果及其刷屏速度可以看这个帖子:http://bbs.armfly.com/read.php?tid=16963。通过这个帖子对不同颜色格式的显示效果有个感性认识。
    3、 使用32位色或者24位色时,ST发布的V5.32及其以下版本在刷位图时都表现的非常慢,经过不断的测试,已经找到根本原因,请看此帖子:http://bbs.armfly.com/read.php?tid=23425
    4、颜色格式相关知识在emWin手册中都有讲解,下图是中文版讲解位置

    下图是英文版手册讲解位置:


    IP属地:河北2楼2017-01-16 17:39
    回复
      2026-04-05 15:16:35
      广告
      不感兴趣
      开通SVIP免广告
      34.2.2 物理颜色
      物理颜色是可用显示器实际显示的颜色,按照与逻辑颜色相同的24位RGB或者BGR格式进行定义。在运行时,逻辑颜色映射到物理颜色。对于仅有几种颜色的显示器,如单色显示器或8/16色LCD,emWin使用优化版的“最小二乘偏差搜索”对其进行转换,将显示的颜色(逻辑颜色)与LCD可实际显示的所有可用颜色(物理颜色)进行比较,最终使用最接近的颜色。


      IP属地:河北4楼2017-01-16 17:42
      回复
        34.2.3 STM32F429支持的颜色格式
        STM32F429支持8种颜色格式:
        (1) ARGB8888
        (2) RGB888
        (3) RGB565
        (4) ARGB1555
        (5) ARGB4444
        (6) L8( 8 位 Luminance 或 CLUT)
        (7) AL44( 4 位 alpha + 4 位 luminance)
        (8) AL88( 8 位 alpha + 8 位 luminance)
        对于这8种颜色格式,本教程配套的例子已经都实现了,用户只需设置LCDConf_Lin_Template.C文件的宏配置:
        /*
        6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
        特别注意如下两个问题:
        (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
        请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
        a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
        b. 480*272分辨率的可以高些,取20MHz左右即可。
        (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
        */
        #define _CM_ARGB8888 1
        #define _CM_RGB888 2
        #define _CM_RGB565 3
        #define _CM_ARGB1555 4
        #define _CM_ARGB4444 5
        #define _CM_L8 6
        #define _CM_AL44 7
        #define _CM_AL88 8
        /* 7. 配置图层1的颜色模式和分辨率大小 */
        #define COLOR_MODE_0 _CM_RGB565
        #define XSIZE_0 XSIZE_PHYS
        #define YSIZE_0 YSIZE_PHYS
        /* 8. 配置图层2的的颜色模式和分辨率大小 */
        #define COLOR_MODE_1 _CM_RGB565
        #define XSIZE_1 XSIZE_PHYS
        #define YSIZE_1 YSIZE_PHYS
        /* 9. 单图层情况下,根据用户选择的颜色模式可自动选择图层1的emWin的驱动和颜色模式 */
        #if (COLOR_MODE_0 == _CM_ARGB8888)
        #defineCOLOR_CONVERSION_0 GUICC_M8888I
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_32
        #elif (COLOR_MODE_0 == _CM_RGB888)
        #defineCOLOR_CONVERSION_0 GUICC_M888
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_24
        #elif (COLOR_MODE_0 == _CM_RGB565)
        #defineCOLOR_CONVERSION_0 GUICC_M565
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_16
        #elif (COLOR_MODE_0 == _CM_ARGB1555)
        #defineCOLOR_CONVERSION_0 GUICC_M1555I
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_16
        #elif (COLOR_MODE_0 == _CM_ARGB4444)
        #defineCOLOR_CONVERSION_0 GUICC_M4444I
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_16
        #elif (COLOR_MODE_0 == _CM_L8)
        #defineCOLOR_CONVERSION_0 GUICC_8666
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_8
        #elif (COLOR_MODE_0 == _CM_AL44)
        #defineCOLOR_CONVERSION_0 GUICC_1616I
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_8
        #elif (COLOR_MODE_0 == _CM_AL88)
        #defineCOLOR_CONVERSION_0 GUICC_88666I
        #defineDISPLAY_DRIVER_0 GUIDRV_LIN_16
        #else
        #errorIllegal color mode 0!
        #endif
        /* 10. 双图层情况下,根据用户选择的颜色模式可自动选择图层2的emWin的驱动和颜色模式 */
        #if (GUI_NUM_LAYERS > 1)
        #if (COLOR_MODE_1 == _CM_ARGB8888)
        #defineCOLOR_CONVERSION_1 GUICC_M8888I
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_32
        #elif (COLOR_MODE_1 == _CM_RGB888)
        #defineCOLOR_CONVERSION_1 GUICC_M888
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_24
        #elif (COLOR_MODE_1 == _CM_RGB565)
        #defineCOLOR_CONVERSION_1 GUICC_M565
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_16
        #elif (COLOR_MODE_1 == _CM_ARGB1555)
        #defineCOLOR_CONVERSION_1 GUICC_M1555I
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_16
        #elif (COLOR_MODE_1 == _CM_ARGB4444)
        #defineCOLOR_CONVERSION_1 GUICC_M4444I
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_16
        #elif (COLOR_MODE_1 == _CM_L8)
        #defineCOLOR_CONVERSION_1 GUICC_8666
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_8
        #elif (COLOR_MODE_1 == _CM_AL44)
        #defineCOLOR_CONVERSION_1 GUICC_1616I
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_8
        #elif (COLOR_MODE_1 == _CM_AL88)
        #defineCOLOR_CONVERSION_1 GUICC_88666I
        #defineDISPLAY_DRIVER_1 GUIDRV_LIN_16
        #else
        #errorIllegal color mode 1!
        #endif
        #else
        #undef XSIZE_0
        #undef YSIZE_0
        #define XSIZE_0 XSIZE_PHYS
        #define YSIZE_0 YSIZE_PHYS
        #endif
        比如要实现图层0使用RGB565,只需设置: #define COLOR_MODE_0 _CM_RGB565
        配置了这个后,在接下来的条件编译中会选择执行宏定义
        #define COLOR_CONVERSION_0 GUICC_M565
        此宏定义表示:STM32F429要输出RGB565颜色格式,STemWin要使用GUICC_M565颜色转换格式,即将STemWin应用程序使用的ARGB8888或者ABGR8888颜色格式按照GUICC_M565转换后才可以发给STM32F429使用。GUICC_M565就是起到这么一个作用。
        #define DISPLAY_DRIVER_0 GUIDRV_LIN_16
        这个是STemWin按照颜色转换格式GUICC_M565实现的底层驱动。
        如果用户选择了STM32F429支持的其它类型颜色格式,上面代码中的条件编译都会选择相应的颜色转换格式和驱动。


        IP属地:河北5楼2017-01-16 17:42
        回复
          34.3 固定调色板及其说明
          STemWin支持的调色板模式很多,这里我们只介绍下面五种,其它的看官方手册。

          如果大家看emWin手册固定调色板部分,会发现有很多类似GUICC_565和GUICC_M565的情况,多一个字母M。如果含字母M,表示RGB的颜色格式顺序,如果没有字母M表示BGR顺序。
          34.3.1 GUICC_1
          这种调色板适合用于OLED,12864等单色的显示屏。GUICC_1仅支持2种颜色,彩带显示效果下:

          34.3.2 GUICC_8666
          这种颜色格式主要通过颜色查找表来实现,把支持的256种颜色全部存贮到颜色查找表里面,需要那种颜色就从查找表里面获取。彩带显示效果如下:

          34.3.3 GUICC_M565
          这种格式比较常用,支持65536种颜色。这里565的意思是红色和蓝色分量为5位,绿色分量为6位,即RRRRRGGGGGGBBBBB。彩带显示效果如下:

          34.3.4 GUICC_M888
          这种颜色格式也比较常用。这里888的意思是红绿蓝三原色都是用8位来表示,即RRRRRRRRGGGGGGGGBBBBBBBB。彩带显示效果如下:

          34.3.5 GUICC_M8888I
          相比GUICC_M888多了一个alpha通道,其中低位3字节用于颜色分量,高位字节用于Alpha混合。红、绿、蓝和Alpha混合分量都是8位。颜色格式:AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB。
          彩带显示效果如下:


          IP属地:河北6楼2017-01-16 17:43
          回复
            34.4 颜色格式选择RGB565实验例程说明(RTOS)
            配套例子:
            V6-546_STemWin实验_颜色格式RGB565(RTOS)
            实验目的:
            1. 本实验主要演示RGB565格式彩带显示效果。
            2. emWin功能的实现在MainTask.c文件里面。
            实验内容:
            1. K1按键按下,串口打印任务执行情况(波特率115200,数据位8,奇偶校验位无,停止位1)。
            2. K2按键按下,实现截图功能,将图片以BMP格式保存到SD卡中。
            3. 各个任务实现的功能如下:
            App Task Start 任务:实现按键和触摸扫描。
            App Task MspPro任务 :实现截图功能,将图片以BMP格式保存到SD卡中。
            App Task UserIF 任务:按键消息处理。
            App Task COM 任务:暂未使用。
            App Task GUI 任务:GUI任务。
            μCOS-III任务调试信息(按K1按键,串口打印):

            STemWin界面显示效果:
            800*480分辨率界面效果。

            STemWin动态内存配置:
            GUIConf.c文件中的配置如下:
            #define EX_SRAM 1/*1 used extern sram, 0 used internal sram */
            #if EX_SRAM
            #define GUI_NUMBYTES (1024*1024*8)
            #else
            #define GUI_NUMBYTES (100*1024)
            #endif
            通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
            #define EX_SRAM 1 表示使用外部SDRAM作为emWin动态内存,大小8MB。
            #define EX_SRAM 0 表示使用内部SRAM作为emWin动态内存,大小100KB。
            默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。


            IP属地:河北7楼2017-01-16 17:44
            回复
              34.5 颜色格式选择RGB565实验例程说明(裸机)
              配套例子:
              V6-547_STemWin实验_颜色格式RGB565(裸机)
              实验目的:
              1. 本实验主要演示RGB565格式彩带显示效果。
              2. emWin功能的实现在MainTask.c文件里面。
              STemWin界面显示效果:
              800*480分辨率界面效果(emWin截图的时候,光标是无法截图出来的)。

              STemWin动态内存配置:
              GUIConf.c文件中的配置如下:
              #define EX_SRAM 1/*1 used extern sram, 0 used internal sram */
              #if EX_SRAM
              #define GUI_NUMBYTES (1024*1024*8)
              #else
              #define GUI_NUMBYTES (100*1024)
              #endif
              通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
              #define EX_SRAM 1 表示使用外部SDRAM作为emWin动态内存,大小8MB。
              #define EX_SRAM 0 表示使用内部SRAM作为emWin动态内存,大小100KB。
              默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。


              IP属地:河北8楼2017-01-16 17:45
              回复
                续34.5
                程序设计:
                栈大小分配:
                系统栈大小在startup_stm32f429_439xx.s文件中配置:

                栈大小的单位是字节,那么这里配置的系统栈大小就是8192字节。
                主函数初始化:
                /*
                *********************************************************************************************************
                * 函 数名: main
                * 功能说明: 标准c程序入口。
                * 形 参:无
                * 返 回值: 无
                *********************************************************************************************************
                */
                int main (void)
                {
                /*初始化外设 */
                bsp_Init();
                /* 进入emWin主函数 */
                MainTask();
                }
                硬件外设初始化
                硬件外设的初始化是在bsp.c文件实现:
                /*
                *********************************************************************************************************
                * 函 数名: bsp_Init
                * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
                * 形 参:无
                * 返 回值: 无
                *********************************************************************************************************
                */
                void bsp_Init(void)
                {
                /*
                由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
                启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
                系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
                */
                /*使能CRC 因为使用STemWin前必须要使能 */
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
                /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
                SystemCoreClockUpdate(); /* 根据PLL配置更新系统时钟频率变量 SystemCoreClock */
                bsp_InitUart(); /* 初始化串口 */
                bsp_InitKey(); /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
                bsp_InitExtIO(); /*FMC总线上扩展了32位输出IO, 操作LED等外设必须初始化 */
                bsp_InitLed(); /* 初始LED指示灯端口 */
                bsp_InitI2C(); /* 配置I2C总线 */
                bsp_InitSPIBus(); /* 配置SPI总线 */
                bsp_InitSFlash(); /*初始化SPI Flash */
                bsp_InitExtSDRAM(); /* 初始化SDRAM*/
                bsp_DetectLcdType(); /* 检测触摸板和LCD面板型号, 结果存在全局变量g_TouchType, g_LcdType */
                TOUCH_InitHard(); /* 初始化配置触摸芯片 */
                LCD_ConfigLTDC(); /* 初始化配置LTDC */
                result =f_mount(&fs, "0:/", 0); /* 挂载文件系统 */
                }


                IP属地:河北9楼2017-01-16 17:45
                回复
                  2026-04-05 15:10:35
                  广告
                  不感兴趣
                  开通SVIP免广告
                  34.6 颜色格式选择RGB888实验例程说明(RTOS)
                  配套例子:
                  V6-548_STemWin实验_颜色格式RGB888(RTOS)
                  实验目的:
                  1. 本实验主要演示RGB888格式彩带显示效果。
                  2. emWin功能的实现在MainTask.c文件里面。
                  实验内容:
                  1. K1按键按下,串口打印任务执行情况(波特率115200,数据位8,奇偶校验位无,停止位1)。
                  2. K2按键按下,实现截图功能,将图片以BMP格式保存到SD卡中。
                  3. 各个任务实现的功能如下:
                  App Task Start 任务:实现按键和触摸扫描。
                  App Task MspPro任务 :实现截图功能,将图片以BMP格式保存到SD卡中。
                  App Task UserIF 任务:按键消息处理。
                  App Task COM 任务:暂未使用。
                  App Task GUI 任务:GUI任务。
                  μCOS-III任务调试信息(按K1按键,串口打印):

                  STemWin界面显示效果:
                  800*480分辨率界面效果。


                  IP属地:河北10楼2017-01-16 17:46
                  回复
                    续34.6
                    实验说明:
                    本实验我们仅说明RGB888和RGB565两处配置上的不同,其余部分跟本章节34.4小节是相同的,这里不再赘述。
                    不同点一:LCDConf_Lin_Template.C文件的宏配置,图层1选择RGB888格式,下面代码中红色字体是被修改的地方,其余地方未做修改:
                    /*
                    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
                    特别注意如下两个问题:
                    (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
                    请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
                    a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
                    b. 480*272分辨率的可以高些,取20MHz左右即可。
                    (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
                    */
                    #define _CM_ARGB8888 1
                    #define _CM_RGB888 2
                    #define _CM_RGB565 3
                    #define _CM_ARGB1555 4
                    #define _CM_ARGB4444 5
                    #define _CM_L8 6
                    #define _CM_AL44 7
                    #define _CM_AL88 8
                    /* 7. 配置图层1的颜色模式和分辨率大小 */
                    #define COLOR_MODE_0 _CM_RGB888
                    #define XSIZE_0 XSIZE_PHYS
                    #define YSIZE_0 YSIZE_PHYS
                    /* 8. 配置图层2的的颜色模式和分辨率大小 */
                    #define COLOR_MODE_1 _CM_RGB565
                    #define XSIZE_1 XSIZE_PHYS
                    #define YSIZE_1 YSIZE_PHYS


                    IP属地:河北11楼2017-01-16 17:46
                    回复
                      续34.6
                      不同点二:bsp_tft_429.c文件中LTDC输出时钟,对于4.3寸,5寸和7寸屏来说都降低一半,下面代码中红色字体是被修改的地方,其余地方未做修改:
                      /*
                      6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
                      特别注意如下两个问题:
                      void LCD_ConfigLTDC(void)
                      {
                      LTDC_InitTypeDef LTDC_InitStruct;
                      LTDC_Layer_TypeDef LTDC_Layerx;
                      /* 使能LTDC */
                      RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC,ENABLE);
                      /* 使能DMA2D */
                      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D,ENABLE);
                      /* 配置LCD引脚 */
                      LCD429_AF_GPIOConfig();
                      /* 配置信号极性 */
                      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_IPC;
                      /* 背景色 */
                      LTDC_InitStruct.LTDC_BackgroundRedValue= 0xff;
                      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)
                      {
                      caseLCD_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;
                      caseLCD_43_480X272:/* 4.3寸 480 * 272 选择LTDC输出20MHz,所有颜色深度都可以选择这个时钟频率 */
                      RCC_PLLSAIConfig(280,2, 7);
                      RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
                      Width= 480;
                      Height= 272;
                      HSYNC_W= 40;
                      HBP= 2;
                      HFP= 2;
                      VSYNC_W= 9;
                      VBP= 2;
                      VFP= 2;
                      break;
                      caseLCD_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;
                      caseLCD_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;
                      caseLCD_70_800X480: /* 7.0寸 800 * 480,24位或者32位色选择LTDC输出15MHz,16位或者8位30MHz*/
                      RCC_PLLSAIConfig(420,2, 7);
                      RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
                      #if0
                      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;
                      caseLCD_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_VCOInput = HSE_VALUE / PLL_M = 8M / 4 = 2Mhz
                      PLLSAI_VCOOutput = PLLSAI_VCO Input * PLLSAI_N= 2 * 429 = 858 Mhz
                      PLLLCDCLK= PLLSAI_VCO Output / PLLSAI_R = 858 / 4 = 214.5 Mhz
                      LTDCclock 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; /* 显示屏分辨率-宽度 */
                      g_LcdHeight= Height; /*显示屏分辨率-高度 */
                      /* 使能 PLLSAI */
                      RCC_PLLSAICmd(ENABLE);
                      /* 等待完成 */
                      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(&LTDC_InitStruct);
                      }


                      IP属地:河北12楼2017-01-16 17:47
                      回复
                        34.7 颜色格式选择RGB888实验例程说明(裸机)
                        配套例子:
                        V6-549_STemWin实验_颜色格式RGB888(裸机)
                        实验目的:
                        1. 本实验主要演示RGB888格式彩带显示效果。
                        2. emWin功能的实现在MainTask.c文件里面。
                        STemWin界面显示效果:
                        800*480分辨率界面效果。


                        IP属地:河北13楼2017-01-16 17:47
                        回复
                          续34.7
                          实验说明:
                          本实验我们仅说明RGB888和RGB565两处配置上的不同,其余部分跟本章节34.5小节是相同的,这里不再赘述。
                          不同点一:LCDConf_Lin_Template.C文件的宏配置,图层1选择RGB888格式,下面代码中红色字体是被修改的地方,其余地方未做修改:
                          /*
                          6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
                          特别注意如下两个问题:
                          (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
                          请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
                          a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
                          b. 480*272分辨率的可以高些,取20MHz左右即可。
                          (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
                          */
                          #define _CM_ARGB8888 1
                          #define _CM_RGB888 2
                          #define _CM_RGB565 3
                          #define _CM_ARGB1555 4
                          #define _CM_ARGB4444 5
                          #define _CM_L8 6
                          #define _CM_AL44 7
                          #define _CM_AL88 8
                          /* 7. 配置图层1的颜色模式和分辨率大小 */
                          #define COLOR_MODE_0 _CM_RGB888
                          #define XSIZE_0 XSIZE_PHYS
                          #define YSIZE_0 YSIZE_PHYS
                          /* 8. 配置图层2的的颜色模式和分辨率大小 */
                          #define COLOR_MODE_1 _CM_RGB565
                          #define XSIZE_1 XSIZE_PHYS
                          #define YSIZE_1 YSIZE_PHYS
                          不同点二:bsp_tft_429.c文件中LTDC输出时钟,对于4.3寸,5寸和7寸屏来说都降低一半,下面代码中红色字体是被修改的地方,其余地方未做修改:
                          /*
                          6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
                          特别注意如下两个问题:
                          void LCD_ConfigLTDC(void)
                          {
                          LTDC_InitTypeDef LTDC_InitStruct;
                          LTDC_Layer_TypeDef LTDC_Layerx;
                          /* 使能LTDC */
                          RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC,ENABLE);
                          /* 使能DMA2D */
                          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D,ENABLE);
                          /* 配置LCD引脚 */
                          LCD429_AF_GPIOConfig();
                          /* 配置信号极性 */
                          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_IPC;
                          /* 背景色 */
                          LTDC_InitStruct.LTDC_BackgroundRedValue= 0xff;
                          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)
                          {
                          caseLCD_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;
                          caseLCD_43_480X272:/* 4.3寸 480 * 272 选择LTDC输出20MHz,所有颜色深度都可以选择这个时钟频率 */
                          RCC_PLLSAIConfig(280,2, 7);
                          RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
                          Width= 480;
                          Height= 272;
                          HSYNC_W= 40;
                          HBP= 2;
                          HFP= 2;
                          VSYNC_W= 9;
                          VBP= 2;
                          VFP= 2;
                          break;
                          caseLCD_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;
                          caseLCD_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;
                          caseLCD_70_800X480: /* 7.0寸 800 * 480,24位或者32位色选择LTDC输出15MHz,16位或者8位30MHz*/
                          RCC_PLLSAIConfig(420,2, 7);
                          RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
                          #if0
                          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;
                          caseLCD_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_VCOInput = HSE_VALUE / PLL_M = 8M / 4 = 2Mhz
                          PLLSAI_VCOOutput = PLLSAI_VCO Input * PLLSAI_N= 2 * 429 = 858 Mhz
                          PLLLCDCLK= PLLSAI_VCO Output / PLLSAI_R = 858 / 4 = 214.5 Mhz
                          LTDCclock 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; /* 显示屏分辨率-宽度 */
                          g_LcdHeight= Height; /*显示屏分辨率-高度 */
                          /* 使能 PLLSAI */
                          RCC_PLLSAICmd(ENABLE);
                          /* 等待完成 */
                          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(&LTDC_InitStruct);
                          }


                          IP属地:河北14楼2017-01-16 17:49
                          回复
                            34.8 总结
                            本章节就为大家讲解这么多,主要讲解了部分常用的颜色格式,不过实际项目中已经够用了。更多相关的知识还是要大家看官方手册的颜色章节。


                            IP属地:河北15楼2017-01-16 17:49
                            收起回复