硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2858|回复: 8
收起左侧

[emWin教程入门篇] 【emWin实战教程V2.0】第34章      STemWin支持的颜

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2017-2-14 16:22:54 | 显示全部楼层 |阅读模式
完整65章+12章附件教程下载地址:
http://www.armbbs.cn/forum.php?mod=viewthread&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 总结
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:23:58 | 显示全部楼层
34.1   初学者重要提示

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


下图是英文版手册讲解位置:
34.2.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:27:56 | 显示全部楼层
34.2 颜色格式说明


    emWin支持黑色/白色、灰度(具有不同强度的单色)和彩色显示器。几乎市面上大家能够见到的颜色格式,emWin都支持。明白了这点后,下面说两个比较重要的概念,逻辑颜色和物理颜色。

34.2.1    逻辑颜色


    逻辑颜色是应用程序处理的颜色,emWin5.30版本之前仅支持ABGR(这里没有写错,就是BGR),也就是说我们操作emWin的时候,emWin是按照BGR格式处理写入的颜色数值,这个也就解释了初学者经常会有的疑问,为什么写入的颜色数值0x0000FF显示出来的是红色,本应该是绘制出蓝色啊,根本原因就在这个ABGR格式上了(大多数情况,我们都是直接使用emWin定义好的颜色,比如显示红色就调用GUI_RED,导致很多初学者没有注意到这个问题)。32位的ABGR颜色格式表示的含义如下:
34.3.png

从上面的表格可以看出alpha透明通道用8位来表示,三原色BGR也都是用8位数据来表示。从emWin5.30版本之后为什么又推出了ARGB格式呢?主要是因为越来越多显示屏控制器基本都采用这种颜色格式了,比如STM32F429就是这种颜色格式。32位的ARGB颜色格式表示的含义如下:
34.4.png

   那么问题来了,STM32F429的LCD控制器是ARGB格式的,跟emWin默认的ABGR格式不兼容,岂不是每次显示前都要做颜色的转换,实际上的确是这样的,在一定程度上比较影响LCD性能,但是由于三缓冲,内存设备和F429的DMA2D颜色格式硬件转换在一定程度上降低了影响。
    另外根据官方手册的说明,在GUIConf.h文件中设置如下宏定义就可以使用ARGB格式了(注意,这个是emWin5.30版本才开始有的):
#defineGUI_USE_ARGB        (1)
实际测试发现配置后没有任何效果,测试了ST的emWin5.32和MDK带的emWin5.32都不行,应该这两个库都没有把这个功能开放出来,只能等待后面发布新版了再做测试,如果STM32F429能够使用ARGB格式自然是最好的,性能才会发挥到最佳。
    下面是GUI.h文件中几种常用的ARGB和ABRG格式颜色定义:
  1. /*********************************************************************
  2. *
  3. *       Standard colors
  4. */
  5. #if (GUI_USE_ARGB)  这里是ARGB格式颜色
  6.   #define GUI_BLUE          0xFF0000FF
  7.   #define GUI_GREEN         0xFF00FF00
  8.   #define GUI_RED           0xFFFF0000
  9.   #define GUI_CYAN          0xFF00FFFF
  10.   #define GUI_MAGENTA       0xFFFF00FF
  11.   #define GUI_YELLOW        0xFFFFFF00
  12.   #define GUI_LIGHTBLUE     0xFF8080FF
  13.   #define GUI_LIGHTGREEN    0xFF80FF80
  14.   #define GUI_LIGHTRED      0xFFFF8080
  15.   #define GUI_LIGHTCYAN     0xFF80FFFF
  16.   #define GUI_LIGHTMAGENTA  0xFFFF80FF
  17.   #define GUI_LIGHTYELLOW   0xFFFFFF80
  18.   #define GUI_DARKBLUE      0xFF000080
  19.   #define GUI_DARKGREEN     0xFF008000
  20.   #define GUI_DARKRED       0xFF800000
  21.   #define GUI_DARKCYAN      0xFF008080
  22.   #define GUI_DARKMAGENTA   0xFF800080
  23.   #define GUI_DARKYELLOW    0xFF808000
  24.   #define GUI_WHITE         0xFFFFFFFF
  25.   #define GUI_LIGHTGRAY     0xFFD3D3D3
  26.   #define GUI_GRAY          0xFF808080
  27.   #define GUI_DARKGRAY      0xFF404040
  28.   #define GUI_BLACK         0xFF000000
  29.   #define GUI_BROWN         0xFFA52A2A
  30.   #define GUI_ORANGE        0xFFFFA500
  31.   #define GUI_TRANSPARENT   0x00000000
  32.   #define GUI_GRAY_3F       0xFF3F3F3F
  33.   #define GUI_GRAY_50       0xFF505050
  34.   #define GUI_GRAY_55       0xFF555555
  35.   #define GUI_GRAY_60       0xFF606060
  36.   #define GUI_GRAY_7C       0xFF7C7C7C
  37.   #define GUI_GRAY_9A       0xFF9A9A9A
  38.   #define GUI_GRAY_AA       0xFFAAAAAA
  39.   #define GUI_GRAY_C0       0xFFC0C0C0
  40.   #define GUI_GRAY_C8       0xFFC8C8C8
  41.   #define GUI_GRAY_D0       0xFFD0D0D0
  42.   #define GUI_GRAY_E7       0xFFE7E7E7
  43.   #define GUI_BLUE_98       0xFF000098
  44. #else    这里是ABGR格式颜色
  45.   #define GUI_BLUE          0x00FF0000
  46.   #define GUI_GREEN         0x0000FF00
  47.   #define GUI_RED           0x000000FF
  48.   #define GUI_CYAN          0x00FFFF00
  49.   #define GUI_MAGENTA       0x00FF00FF
  50.   #define GUI_YELLOW        0x0000FFFF
  51.   #define GUI_LIGHTBLUE     0x00FF8080
  52.   #define GUI_LIGHTGREEN    0x0080FF80
  53.   #define GUI_LIGHTRED      0x008080FF
  54.   #define GUI_LIGHTCYAN     0x00FFFF80
  55.   #define GUI_LIGHTMAGENTA  0x00FF80FF
  56.   #define GUI_LIGHTYELLOW   0x0080FFFF
  57.   #define GUI_DARKBLUE      0x00800000
  58.   #define GUI_DARKGREEN     0x00008000
  59.   #define GUI_DARKRED       0x00000080
  60.   #define GUI_DARKCYAN      0x00808000
  61.   #define GUI_DARKMAGENTA   0x00800080
  62.   #define GUI_DARKYELLOW    0x00008080
  63.   #define GUI_WHITE         0x00FFFFFF
  64.   #define GUI_LIGHTGRAY     0x00D3D3D3
  65.   #define GUI_GRAY          0x00808080
  66.   #define GUI_DARKGRAY      0x00404040
  67.   #define GUI_BLACK         0x00000000
  68.   #define GUI_BROWN         0x002A2AA5
  69.   #define GUI_ORANGE        0x0000A5FF
  70.   #define GUI_TRANSPARENT   0xFF000000
  71.   #define GUI_GRAY_3F       0x003F3F3F
  72.   #define GUI_GRAY_50       0x00505050
  73.   #define GUI_GRAY_55       0x00555555
  74.   #define GUI_GRAY_60       0x00606060
  75.   #define GUI_GRAY_7C       0x007C7C7C
  76.   #define GUI_GRAY_9A       0x009A9A9A
  77.   #define GUI_GRAY_AA       0x00AAAAAA
  78.   #define GUI_GRAY_C0       0x00C0C0C0
  79.   #define GUI_GRAY_C8       0x00C8C8C8
  80.   #define GUI_GRAY_D0       0x00D0D0D0
  81.   #define GUI_GRAY_E7       0x00E7E7E7
  82.   #define GUI_BLUE_98       0x00980000
  83. #endif
复制代码
对于ABGR格式,官方专门制作了一个常用颜色的实际显示效果,这里将其粘贴出来:
34.5.png


34.2.2   物理颜色


    物理颜色是可用显示器实际显示的颜色,按照与逻辑颜色相同的24位RGB或者BGR格式进行定义。在运行时,逻辑颜色映射到物理颜色。对于仅有几种颜色的显示器,如单色显示器或8/16色LCD,emWin使用优化版的“最小二乘偏差搜索”对其进行转换,将显示的颜色(逻辑颜色)与LCD可实际显示的所有可用颜色(物理颜色)进行比较,最终使用最接近的颜色。

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文件的宏配置:
  1. /*
  2.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  3.       特别注意如下两个问题:
  4.        (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
  5.            请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
  6.            a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
  7.            b. 480*272分辨率的可以高些,取20MHz左右即可。
  8.        (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
  9. */
  10. #define _CM_ARGB8888      1
  11. #define _CM_RGB888        2
  12. #define _CM_RGB565        3
  13. #define _CM_ARGB1555      4
  14. #define _CM_ARGB4444      5
  15. #define _CM_L8            6
  16. #define _CM_AL44          7
  17. #define _CM_AL88          8
  18. /* 7. 配置图层1的颜色模式和分辨率大小 */
  19. #define COLOR_MODE_0      _CM_RGB565
  20. #define XSIZE_0           XSIZE_PHYS
  21. #define YSIZE_0           YSIZE_PHYS
  22. /* 8. 配置图层2的的颜色模式和分辨率大小 */
  23. #define COLOR_MODE_1      _CM_RGB565
  24. #define XSIZE_1           XSIZE_PHYS
  25. #define YSIZE_1           YSIZE_PHYS
  26. /* 9. 单图层情况下,根据用户选择的颜色模式可自动选择图层1的emWin的驱动和颜色模式 */
  27. #if   (COLOR_MODE_0 == _CM_ARGB8888)
  28.   #define COLOR_CONVERSION_0 GUICC_M8888I
  29.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_32
  30. #elif (COLOR_MODE_0 == _CM_RGB888)
  31.   #define COLOR_CONVERSION_0 GUICC_M888
  32.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_24
  33. #elif (COLOR_MODE_0 == _CM_RGB565)
  34.   #define COLOR_CONVERSION_0 GUICC_M565
  35.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  36. #elif (COLOR_MODE_0 == _CM_ARGB1555)
  37.   #define COLOR_CONVERSION_0 GUICC_M1555I
  38.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  39. #elif (COLOR_MODE_0 == _CM_ARGB4444)
  40.   #define COLOR_CONVERSION_0 GUICC_M4444I
  41.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  42. #elif (COLOR_MODE_0 == _CM_L8)
  43.   #define COLOR_CONVERSION_0 GUICC_8666
  44.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  45. #elif (COLOR_MODE_0 == _CM_AL44)
  46.   #define COLOR_CONVERSION_0 GUICC_1616I
  47.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  48. #elif (COLOR_MODE_0 == _CM_AL88)
  49.   #define COLOR_CONVERSION_0 GUICC_88666I
  50.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  51. #else
  52.   #error Illegal color mode 0!
  53. #endif
  54. /* 10. 双图层情况下,根据用户选择的颜色模式可自动选择图层2的emWin的驱动和颜色模式 */
  55. #if (GUI_NUM_LAYERS > 1)
  56. #if   (COLOR_MODE_1 == _CM_ARGB8888)
  57.   #define COLOR_CONVERSION_1 GUICC_M8888I
  58.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_32
  59. #elif (COLOR_MODE_1 == _CM_RGB888)
  60.   #define COLOR_CONVERSION_1 GUICC_M888
  61.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_24
  62. #elif (COLOR_MODE_1 == _CM_RGB565)
  63.   #define COLOR_CONVERSION_1 GUICC_M565
  64.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  65. #elif (COLOR_MODE_1 == _CM_ARGB1555)
  66.   #define COLOR_CONVERSION_1 GUICC_M1555I
  67.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  68. #elif (COLOR_MODE_1 == _CM_ARGB4444)
  69.   #define COLOR_CONVERSION_1 GUICC_M4444I
  70.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  71. #elif (COLOR_MODE_1 == _CM_L8)
  72.   #define COLOR_CONVERSION_1 GUICC_8666
  73.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  74. #elif (COLOR_MODE_1 == _CM_AL44)
  75.   #define COLOR_CONVERSION_1 GUICC_1616I
  76.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  77. #elif (COLOR_MODE_1 == _CM_AL88)
  78.   #define COLOR_CONVERSION_1 GUICC_88666I
  79.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  80. #else
  81.   #error Illegal color mode 1!
  82. #endif
  83. #else
  84. #undef XSIZE_0
  85. #undef YSIZE_0
  86. #define XSIZE_0       XSIZE_PHYS
  87. #define YSIZE_0       YSIZE_PHYS
  88. #endif
复制代码
比如要实现图层0使用RGB565,只需设置:  #define COLOR_MODE_0     _CM_RGB565
配置了这个后,在接下来的条件编译中会选择执行宏定义
1、#define COLOR_CONVERSION_0 GUICC_M565
    此宏定义表示:STM32F429要输出RGB565颜色格式,STemWin要使用GUICC_M565颜色转换格式,即将STemWin应用程序使用的ARGB8888或者ABGR8888颜色格式按照GUICC_M565转换后才可以发给STM32F429使用。GUICC_M565就是起到这么一个作用。
2、#define DISPLAY_DRIVER_0        GUIDRV_LIN_16
    这个是STemWin按照颜色转换格式GUICC_M565实现的底层驱动。
如果用户选择了STM32F429支持的其它类型颜色格式,上面代码中的条件编译都会选择相应的颜色转换格式和驱动。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:30:33 | 显示全部楼层
34.3  固定调色板及其说明


    STemWin支持的调色板模式很多,这里我们只介绍下面五种,其它的看官方手册。
34.6.png

    如果大家看emWin手册固定调色板部分,会发现有很多类似GUICC_565和GUICC_M565的情况,多一个字母M。如果含字母M,表示RGB的颜色格式顺序,如果没有字母M表示BGR顺序。

34.3.1   GUICC_1

    这种调色板适合用于OLED,12864等单色的显示屏。GUICC_1仅支持2种颜色,彩带显示效果下:
34.7.png


34.3.2   GUICC_8666


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

34.8.png




34.3.3   GUICC_M565


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

34.9.png




34.3.4   GUICC_M888


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

34.10.png




34.3.5   GUICC_M8888I


   相比GUICC_M888多了一个alpha通道,其中低位3字节用于颜色分量,高位字节用于Alpha混合。红、绿、蓝和Alpha混合分量都是8位。颜色格式:AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB。
彩带显示效果如下:
34.11.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:37:45 | 显示全部楼层
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按键,串口打印):
34.12.png

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

STemWin动态内存配置:
    GUIConf.c文件中的配置如下:
  1. #define EX_SRAM   1/*1 used extern sram, 0 used internal sram */
  2. #if EX_SRAM
  3. #define GUI_NUMBYTES  (1024*1024*8)
  4. #else
  5. #define GUI_NUMBYTES  (100*1024)
  6. #endif
复制代码
    通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
#define EX_SRAM    1 表示使用外部SDRAM作为emWin动态内存,大小8MB。
#define EX_SRAM    0 表示使用内部SRAM作为emWin动态内存,大小100KB。
默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。
STemWin底层接口配置:
    LCDConf_Lin_Template.c文件中共12项emWin配置:
  1. /*
  2. **********************************************************************************************************
  3.                                           用户可以配置的选项
  4. **********************************************************************************************************
  5. */
  6. /* 0. 在官方代码的基础上再做优化,官方的部分函数效率低,耗内存, 0表示优化 */
  7. #define emWin_Optimize   0
  8. /*
  9.   1. 显示屏的物理分辨率,驱动已经做了显示屏自适应,支持4.3寸,5寸和7寸屏
  10.      这里填写自适应显示屏中的最大分辨率。
  11. */
  12. #define XSIZE_PHYS       800
  13. #define YSIZE_PHYS       480
  14. /* 2. 多缓冲 / 虚拟屏,多缓冲和虚拟屏不可同时使用,emWin不支持 */
  15. #define NUM_BUFFERS      3 /* 定义多缓冲个数,仅可以设置1,2和3,也就是最大支持三缓冲 */
  16. #define NUM_VSCREENS     1 /* 定义虚拟屏个数 */
  17. /* 3. 没有图层激活时,背景色设置, 暂时未用到 */
  18. #define BK_COLOR         GUI_DARKBLUE
  19. /*
  20.    4. 重定义图层数,对于STM32F429/439,用户可以选择一个图层或者两个图层,不支持三图层
  21.       (1). 设置GUI_NUM_LAYERS = 1时,即仅使用图层1时,默认触摸值是发送给图层1的。
  22.        (2). 设置GUI_NUM_LAYERS = 2时,即图层1和图层2都已经使能,此时图层2是顶层,
  23.             用户需要根据自己的使用情况设置如下两个地方。
  24.             a. 在bsp_touch.c文件中的函数TOUCH_InitHard里面设置参数State.Layer = 1,1就表示
  25.                给图层2发送触摸值。
  26.             b. 调用GUI_Init函数后,调用函数GUI_SelectLayer(1), 设置当前操作的是图层2。
  27. */
  28. #undef  GUI_NUM_LAYERS
  29. #define GUI_NUM_LAYERS    1
  30. /*
  31.    5. 设置图层1和图层2对应的显存地址
  32.       (1) EXT_SDRAM_ADDR 是SDRAM的首地址。
  33.       (2) LCD_LAYER0_FRAME_BUFFER 是图层1的显存地址。
  34.        (3) LCD_LAYER1_FRAME_BUFFER 是图层2的显存地址。
  35.        (4) 每个图层的显存大小比较考究,这里进行下简单的说明。
  36.            如果用户选择的颜色模式 = 32位色ARGB8888,显存的大小:
  37.            XSIZE_PHYS * YSIZE_PHYS * 4 * NUM_VSCREENS * NUM_BUFFERS
  38.          
  39.            颜色模式 = 24位色RGB888,显存的大小:
  40.            XSIZE_PHYS * YSIZE_PHYS * 3 * NUM_VSCREENS * NUM_BUFFERS
  41.          
  42.            颜色模式 = 16位色RGB566,ARGB1555, ARGB4444,AL88,那么显存的大小就是:
  43.            XSIZE_PHYS * YSIZE_PHYS * 2 * NUM_VSCREENS * NUM_BUFFERS
  44.            颜色模式 = 8位色L8,AL44,那么显存的大小就是:
  45.            XSIZE_PHYS * YSIZE_PHYS * 1 * NUM_VSCREENS * NUM_BUFFERS  
  46.      
  47.       这里为了方便起见,将开发板配套的16MB的SDRAM前8MB分配给LCD显存使用,后8MB用于emWin动态内存。
  48.        对于24位色,16位色,8位色,用户可以对其使能三缓冲,并且使能双图层。但是32位色也使能三缓冲和双
  49.        图层的话会超出8MB,所以用户根据自己的情况做显存和emWin动态内存的分配调整。
  50.          举一个例子,对于800*480分辨率的显示屏,使能32位色,三缓冲,那么最终一个图层需要的大小就是
  51.       800 * 480 * 4 * 3  = 4.394MB的空间,如果是双图层,已经超出8MB的分配范围。
  52.      
  53.       (5)为了方便起见,图层2的宏定义LCD_LAYER1_FRAME_BUFFER中的参数4是按照32位色设置的,如果用户的图层1
  54.          使用的是8位色,这里填数字1,如果是16位色,这里填2,如果是24位色,这里填3。
  55. */
  56. #define LCD_LAYER0_FRAME_BUFFER  EXT_SDRAM_ADDR
  57. #define LCD_LAYER1_FRAME_BUFFER  (LCD_LAYER0_FRAME_BUFFER + XSIZE_PHYS * YSIZE_PHYS * 4 * NUM_VSCREENS *
  58. NUM_BUFFERS)
  59. /*
  60.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  61.       特别注意如下两个问题:
  62.        (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
  63.            请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
  64.            a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
  65.            b. 480*272分辨率的可以高些,取20MHz左右即可。
  66.        (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
  67. */
  68. #define _CM_ARGB8888      1
  69. #define _CM_RGB888        2
  70. #define _CM_RGB565        3
  71. #define _CM_ARGB1555      4
  72. #define _CM_ARGB4444      5
  73. #define _CM_L8            6
  74. #define _CM_AL44          7
  75. #define _CM_AL88          8
  76. /* 7. 配置图层1的颜色模式和分辨率大小 */
  77. #define COLOR_MODE_0      _CM_RGB565
  78. #define XSIZE_0           XSIZE_PHYS
  79. #define YSIZE_0           YSIZE_PHYS
  80. /* 8. 配置图层2的的颜色模式和分辨率大小 */
  81. #define COLOR_MODE_1      _CM_RGB565
  82. #define XSIZE_1           XSIZE_PHYS
  83. #define YSIZE_1           YSIZE_PHYS
  84. /* 9. 单图层情况下,根据用户选择的颜色模式可自动选择图层1的emWin的驱动和颜色模式 */
  85. #if   (COLOR_MODE_0 == _CM_ARGB8888)
  86.   #define COLOR_CONVERSION_0 GUICC_M8888I
  87.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_32
  88. #elif (COLOR_MODE_0 == _CM_RGB888)
  89.   #define COLOR_CONVERSION_0 GUICC_M888
  90.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_24
  91. #elif (COLOR_MODE_0 == _CM_RGB565)
  92.   #define COLOR_CONVERSION_0 GUICC_M565
  93.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  94. #elif (COLOR_MODE_0 == _CM_ARGB1555)
  95.   #define COLOR_CONVERSION_0 GUICC_M1555I
  96.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  97. #elif (COLOR_MODE_0 == _CM_ARGB4444)
  98.   #define COLOR_CONVERSION_0 GUICC_M4444I
  99.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  100. #elif (COLOR_MODE_0 == _CM_L8)
  101.   #define COLOR_CONVERSION_0 GUICC_8666
  102.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  103. #elif (COLOR_MODE_0 == _CM_AL44)
  104.   #define COLOR_CONVERSION_0 GUICC_1616I
  105.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  106. #elif (COLOR_MODE_0 == _CM_AL88)
  107.   #define COLOR_CONVERSION_0 GUICC_88666I
  108.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  109. #else
  110.   #error Illegal color mode 0!
  111. #endif
  112. /* 10. 双图层情况下,根据用户选择的颜色模式可自动选择图层2的emWin的驱动和颜色模式 */
  113. #if (GUI_NUM_LAYERS > 1)
  114. #if   (COLOR_MODE_1 == _CM_ARGB8888)
  115.   #define COLOR_CONVERSION_1 GUICC_M8888I
  116.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_32
  117. #elif (COLOR_MODE_1 == _CM_RGB888)
  118.   #define COLOR_CONVERSION_1 GUICC_M888
  119.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_24
  120. #elif (COLOR_MODE_1 == _CM_RGB565)
  121.   #define COLOR_CONVERSION_1 GUICC_M565
  122.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  123. #elif (COLOR_MODE_1 == _CM_ARGB1555)
  124.   #define COLOR_CONVERSION_1 GUICC_M1555I
  125.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  126. #elif (COLOR_MODE_1 == _CM_ARGB4444)
  127.   #define COLOR_CONVERSION_1 GUICC_M4444I
  128.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  129. #elif (COLOR_MODE_1 == _CM_L8)
  130.   #define COLOR_CONVERSION_1 GUICC_8666
  131.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  132. #elif (COLOR_MODE_1 == _CM_AL44)
  133.   #define COLOR_CONVERSION_1 GUICC_1616I
  134.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  135. #elif (COLOR_MODE_1 == _CM_AL88)
  136.   #define COLOR_CONVERSION_1 GUICC_88666I
  137.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  138. #else
  139.   #error Illegal color mode 1!
  140. #endif
  141. #else
  142. #undef XSIZE_0
  143. #undef YSIZE_0
  144. #define XSIZE_0       XSIZE_PHYS
  145. #define YSIZE_0       YSIZE_PHYS
  146. #endif
  147. /*11. 配置选项检测,防止配置错误或者某些选项没有配置 */
  148. #ifndef   XSIZE_PHYS
  149.   #error Physical X size of display is not defined!
  150. #endif
  151. #ifndef   YSIZE_PHYS
  152.   #error Physical Y size of display is not defined!
  153. #endif
  154. #ifndef   NUM_VSCREENS
  155.   #define NUM_VSCREENS 1
  156. #else
  157.   #if (NUM_VSCREENS <= 0)
  158.     #error At least one screeen needs to be defined!
  159.   #endif
  160. #endif
  161. #if (NUM_VSCREENS > 1) && (NUM_BUFFERS > 1)
  162.   #error Virtual screens and multiple buffers are not allowed!
  163. #endif
复制代码
    对于这12个配置选项,注释说明已经比较详细。默认情况下,本教程配套的emWin例子都是用的三缓冲,RGB565格式,且仅使用单图层。
程序设计:
任务栈大小分配:
    μCOS-III任务栈大小在os_cfg.h文件中配置:
#define  APP_CFG_TASK_START_STK_SIZE                     512u
#define  APP_CFG_TASK_MsgPro_STK_SIZE                    512u
#define  APP_CFG_TASK_COM_STK_SIZE                       512u
#define  APP_CFG_TASK_USER_IF_STK_SIZE                    512u
#define  APP_CFG_TASK_GUI_STK_SIZE                        1024u
    任务栈大小的单位是4字节,那么每个任务的栈大小如下:
App Task Start   任务:2048字节。
       App Task MspPro任务 :2048字节。
       App Task UserIF  任务:2048字节。
       App Task COM   任务:2048字节。
App Task GUI    任务:4096字节。
系统栈大小分配:
    μCOS-III的系统栈大小在os_cfg_app.h文件中配置:
    #define  OS_CFG_ISR_STK_SIZE                      512u      
    系统栈大小的单位是4字节,那么这里就是配置系统栈大小为2KB。
μCOS-III初始化:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: main
  4. *    功能说明: 标准c程序入口。
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. int main(void)
  10. {
  11.     OS_ERR  err;
  12.    
  13.      /* 初始化uC/OS-III 内核 */
  14.     OSInit(&err);
  15.      /* 创建一个启动任务(也就是主任务)。启动任务会创建所有的应用程序任务 */
  16.      OSTaskCreate((OS_TCB       *)&AppTaskStartTCB,  /* 任务控制块地址 */           
  17.                  (CPU_CHAR     *)"App Task Start",  /* 任务名 */
  18.                  (OS_TASK_PTR   )AppTaskStart,      /* 启动任务函数地址 */
  19.                  (void         *)0,                 /* 传递给任务的参数 */
  20.                  (OS_PRIO       )APP_CFG_TASK_START_PRIO, /* 任务优先级 */
  21.                  (CPU_STK      *)&AppTaskStartStk[0],     /* 堆栈基地址 */
  22.                  (CPU_STK_SIZE  )APP_CFG_TASK_START_STK_SIZE / 10, /* 堆栈监测区,这里表示后10%作为监测区 */
  23.                  (CPU_STK_SIZE  )APP_CFG_TASK_START_STK_SIZE,      /* 堆栈空间大小 */
  24.                  (OS_MSG_QTY    )0,  /* 本任务支持接受的最大消息数 */
  25.                  (OS_TICK       )0,  /* 设置时间片 */
  26.                  (void         *)0,  /* 堆栈空间大小 */
  27.                  (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  28.         
  29.                     /*  定义如下:
  30.                        OS_OPT_TASK_STK_CHK      使能检测任务栈,统计任务栈已用的和未用的
  31.                        OS_OPT_TASK_STK_CLR      在创建任务时,清零任务栈
  32.                        OS_OPT_TASK_SAVE_FP      如果CPU有浮点寄存器,则在任务切换时保存浮点寄存器的内容
  33.                     */
  34.                  (OS_ERR       *)&err);
  35.      /* 启动多任务系统,控制权交给uC/OS-III */
  36.     OSStart(&err);                                             
  37.    
  38.     (void)&err;
  39.    
  40.     return (0);
  41. }
复制代码
硬件外设初始化
    硬件外设的初始化是在bsp.c文件实现:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: bsp_Init
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void bsp_Init(void)
  10. {
  11.      /*
  12.          由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
  13.          启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
  14.          系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
  15.      */
  16.      /* 使能CRC 因为使用STemWin前必须要使能 */
  17.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  18.    
  19.      /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
  20.      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  21.    
  22.      SystemCoreClockUpdate();    /* 根据PLL配置更新系统时钟频率变量 SystemCoreClock */
  23.      bsp_InitUart();        /* 初始化串口 */
  24.      bsp_InitKey();         /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
  25.    
  26.      bsp_InitExtIO();       /* FMC总线上扩展了32位输出IO, 操作LED等外设必须初始化 */
  27.      bsp_InitLed();         /* 初始LED指示灯端口 */
  28.    
  29.      bsp_InitI2C();         /* 配置I2C总线 */
  30.      bsp_InitSPIBus();       /* 配置SPI总线 */
  31.    
  32.      bsp_InitSFlash();       /* 初始化SPI Flash */
  33.    
  34.      bsp_InitExtSDRAM();   /* 初始化SDRAM */
  35.      bsp_DetectLcdType();  /* 检测触摸板和LCD面板型号, 结果存在全局变量 g_TouchType, g_LcdType */
  36.    
  37.      TOUCH_InitHard();    /* 初始化配置触摸芯片 */
  38.      LCD_ConfigLTDC();     /* 初始化配置LTDC */
  39.    
  40.      result = f_mount(&fs, "0:/", 0);     /* 挂载文件系统 */
  41. }
复制代码
五个μCOS-III任务的实现:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskStart
  4. *    功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器。本任务主要实现按键和触摸检测。
  5. *    形    参: p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7.      优 先 级: 2
  8. *********************************************************************************************************
  9. */
  10. static  void  AppTaskStart (void *p_arg)
  11. {
  12.      OS_ERR      err;
  13.      uint8_t  ucCount = 0;
  14.      uint8_t  ucCount1 = 0;
  15.    
  16.     /* 仅用于避免编译器告警,编译器不会产生任何目标代码 */  
  17.     (void)p_arg;
  18.    
  19.      /* BSP 初始化。 BSP = Board Support Package 板级支持包,可以理解为底层驱动。*/
  20.      CPU_Init();  /* 此函数要优先调用,因为外设驱动中使用的us和ms延迟是基于此函数的 */
  21.      bsp_Init();      
  22.      BSP_Tick_Init();
  23.    
  24. #if OS_CFG_STAT_TASK_EN > 0u
  25.      OSStatTaskCPUUsageInit(&err);  
  26. #endif
  27. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  28.     CPU_IntDisMeasMaxCurReset();
  29. #endif
  30.         
  31.      /* 创建应用程序的任务 */
  32.      AppTaskCreate();
  33.    
  34.      /* 创建任务通信 */
  35.      AppObjCreate();
  36.    
  37.     while(1)
  38.     {
  39.           /* 1ms一次触摸扫描,电阻触摸屏 */
  40.          if(g_tTP.Enable == 1)
  41.          {
  42.               TOUCH_Scan();
  43.             
  44.               /* 按键扫描 */
  45.               ucCount++;
  46.               if(ucCount == 10)
  47.               {
  48.                    ucCount = 0;
  49.                    bsp_KeyScan();
  50.               }
  51.              OSTimeDly(1, OS_OPT_TIME_DLY, &err);         
  52.          }
  53.         
  54.          /* 20ms一次触摸扫描,电容触摸屏GT811
  55.             GT811取20ms比较稳定,取10ms偶尔会有跳动。
  56.          */
  57.          if(g_GT811.Enable == 1)
  58.          {
  59.               bsp_KeyScan();
  60.               ucCount1++;
  61.               if(ucCount1 == 2)
  62.               {
  63.                    ucCount1 = 0;
  64.                    GT811_OnePiontScan();
  65.               }
  66.              OSTimeDly(10, OS_OPT_TIME_DLY, &err);     
  67.          }
  68.         
  69.          /* 10ms一次触摸扫描,电容触摸屏FT5X06 */
  70.          if(g_tFT5X06.Enable == 1)
  71.          {
  72.               bsp_KeyScan();
  73.               FT5X06_OnePiontScan();
  74.              OSTimeDly(10, OS_OPT_TIME_DLY, &err);
  75.          }
  76.     }   
  77. }
  78. /*
  79. *********************************************************************************************************
  80. *    函 数 名: AppTaskMsgPro
  81. *    功能说明: 实现截图功能,将图片以BMP格式保存到SD卡中
  82. *    形    参: p_arg 是在创建该任务时传递的形参
  83. *    返 回 值: 无
  84.      优 先 级: 3
  85. *********************************************************************************************************
  86. */
  87. static void AppTaskMsgPro(void *p_arg)
  88. {
  89.      uint32_t ulStart, ulEnd;
  90.      OS_ERR      err;
  91.      uint8_t       Pic_Name = 0;
  92.      char buf[20];
  93.      (void)p_arg;
  94.          
  95.      while(1)
  96.      {   
  97.           /* 等待获取信号量同步消息,接收到后执行串口打印 */
  98.          OSSemPend((OS_SEM *)&SEM_SYNCH,
  99.                      (OS_TICK )0,
  100.                      (OS_OPT  )OS_OPT_PEND_BLOCKING,
  101.                      (CPU_TS  )0,
  102.                      (OS_ERR *)&err);
  103.         
  104.          if(err == OS_ERR_NONE)
  105.          {   
  106.               sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);
  107.             
  108.               /* 记录截图前起始时间 */
  109.               ulStart = OSTimeGet(&err);
  110.             
  111.               /* 开启调度锁 */
  112.               OSSchedLock(&err);
  113.             
  114.               /* 如果SD卡中没有PicSave文件,会进行创建 */
  115.               result = f_mkdir("0:/PicSave");
  116.             
  117.               /* 创建截图 */
  118.               result = f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);
  119.             
  120.               /* 向SD卡绘制BMP图片 */
  121.               GUI_BMP_Serialize(_WriteByte2File, &file);
  122.             
  123.               /* 创建完成后关闭file */
  124.              result = f_close(&file);
  125.             
  126.               /* 开启调度锁 */
  127.               OSSchedUnlock(&err);
  128.             
  129.               /* 记录截图后时间并获取截图过程耗时 */
  130.               ulEnd = OSTimeGet(&err);
  131.               ulEnd -= ulStart;
  132.             
  133.               App_Printf("截图完成,耗时 = %dms\\r\\n", ulEnd);
  134.               Pic_Name++;      
  135.          }                                                                                                                  
  136.      }  
  137. }
  138. /*
  139. *********************************************************************************************************
  140. *    函 数 名: AppTaskUserIF
  141. *    功能说明: 按键消息处理
  142. *    形    参: p_arg 是在创建该任务时传递的形参
  143. *    返 回 值: 无
  144.      优 先 级: 4
  145. *********************************************************************************************************
  146. */
  147. static void AppTaskUserIF(void *p_arg)
  148. {
  149.      OS_ERR      err;
  150.      uint8_t  ucKeyCode;
  151.    
  152.      (void)p_arg;                /* 避免编译器报警 */
  153.    
  154.      while (1)
  155.      {      
  156.          ucKeyCode = bsp_GetKey();
  157.         
  158.          if (ucKeyCode != KEY_NONE)
  159.          {
  160.               switch (ucKeyCode)
  161.               {
  162.                    case KEY_DOWN_K1:             /* K1键按下 打印任务执行情况 */
  163.                        DispTaskInfo();        
  164.                        break;
  165.                   
  166.                    case KEY_DOWN_K2:             /* K2键按下 向消息队列发送数据 */
  167.                        OSSemPost((OS_SEM *)&SEM_SYNCH,
  168.                                   (OS_OPT  )OS_OPT_POST_1,
  169.                                   (OS_ERR *)&err);
  170.                        break;
  171.                   
  172.                    default:                     /* 其他的键值不处理 */
  173.                        break;
  174.               }
  175.          }
  176.         
  177.          OSTimeDly(20, OS_OPT_TIME_DLY, &err);
  178.      }
  179. }
  180. /*
  181. *********************************************************************************************************
  182. *    函 数 名: AppTaskCom
  183. *    功能说明: 暂未使用
  184. *    形    参: p_arg 是在创建该任务时传递的形参
  185. *    返 回 值: 无
  186.      优 先 级: 5
  187. *********************************************************************************************************
  188. */
  189. static void AppTaskCOM(void *p_arg)
  190. {
  191.      OS_ERR  err;      
  192.    
  193.      (void)p_arg;
  194.    
  195.      while(1)
  196.      {   
  197.          OSTimeDly(500, OS_OPT_TIME_DLY, &err);
  198.      }                                                                                                
  199. }
  200. /*
  201. *********************************************************************************************************
  202. *    函 数 名: AppTaskGUI
  203. *    功能说明: GUI任务,最低优先级                        
  204. *    形    参:p_arg 是在创建该任务时传递的形参
  205. *    返 回 值: 无
  206. *   优 先 级:OS_CFG_PRIO_MAX - 4u
  207. *********************************************************************************************************
  208. */
  209. static void AppTaskGUI(void *p_arg)
  210. {
  211.     (void)p_arg;       /* 避免编译器告警 */
  212.         
  213.      while (1)
  214.      {
  215.          MainTask();
  216.      }
  217. }
复制代码
emWin任务的具体实现(在MainTask.c文件里面):
  1. #include "MainTask.h"
  2. #include "includes.h"
  3. /*
  4. *********************************************************************************************************
  5. *                                      宏定义
  6. *********************************************************************************************************
  7. */
  8. #define X_START 60
  9. #define Y_START 40
  10. /*
  11. *********************************************************************************************************
  12. *                                       变量
  13. *********************************************************************************************************
  14. */
  15. typedef struct {
  16.   int NumBars;
  17.   GUI_COLOR Color;
  18.   const char * s;
  19. } BAR_DATA;
  20. static const BAR_DATA _aBarData[] = {
  21.   { 2, GUI_RED    , "Red" },
  22.   { 2, GUI_GREEN  , "Green" },
  23.   { 2, GUI_BLUE   , "Blue" },
  24.   { 1, GUI_WHITE  , "Grey" },
  25.   { 2, GUI_YELLOW , "Yellow" },
  26.   { 2, GUI_CYAN   , "Cyan" },
  27.   { 2, GUI_MAGENTA, "Magenta" },
  28. };
  29. static const GUI_COLOR _aColorStart[] = { GUI_BLACK, GUI_WHITE };
  30. /*
  31. *********************************************************************************************************
  32. *    函 数 名: _DemoShowColorBar
  33. *    功能说明: 显示彩带
  34. *    形    参: 无
  35. *    返 回 值: 无
  36. *********************************************************************************************************
  37. */
  38. static void _DemoShowColorBar(void)
  39. {
  40.      GUI_RECT Rect;
  41.      int      yStep;
  42.      int      i;
  43.      int      j;
  44.      int      xSize;
  45.      int      ySize;
  46.      int      NumBars;
  47.      int      NumColors;
  48.      //
  49.      // 获取显示屏大小
  50.      //
  51.      xSize = LCD_GetXSize();
  52.      ySize = LCD_GetYSize();
  53.    
  54.      //
  55.      // 获取能够显示的彩带数
  56.      //
  57.      NumColors = GUI_COUNTOF(_aBarData);
  58.      for (i = NumBars = 0, NumBars = 0; i < NumColors; i++)
  59.      {
  60.          NumBars += _aBarData[i].NumBars;
  61.      }
  62.      yStep = (ySize - Y_START) / NumBars;
  63.    
  64.      //
  65.      // 显示文本
  66.      //
  67.      Rect.x0 = 0;
  68.      Rect.x1 = X_START - 1;
  69.      Rect.y0 = Y_START;
  70.      GUI_SetFont(&GUI_Font8x16);
  71.      for (i = 0; i < NumColors; i++)
  72.      {
  73.          Rect.y1 = Rect.y0 + yStep * _aBarData[i].NumBars - 1;
  74.          GUI_DispStringInRect(_aBarData[i].s, &Rect, GUI_TA_LEFT | GUI_TA_VCENTER);
  75.          Rect.y0 = Rect.y1 + 1;
  76.      }
  77.    
  78.      //
  79.      // 绘制彩带
  80.      //
  81.      Rect.x0 = X_START;
  82.      Rect.x1 = xSize - 1;
  83.      Rect.y0 = Y_START;
  84.      for (i = 0; i < NumColors; i++)
  85.      {
  86.          for (j = 0; j < _aBarData[i].NumBars; j++)
  87.          {
  88.               Rect.y1 = Rect.y0 + yStep - 1;
  89.               GUI_DrawGradientH(Rect.x0, Rect.y0, Rect.x1, Rect.y1, _aColorStart[j], _aBarData[i].Color);
  90.               Rect.y0 = Rect.y1 + 1;
  91.          }
  92.      }
  93. }
  94. /*
  95. *********************************************************************************************************
  96. *    函 数 名: MainTask
  97. *    功能说明: GUI主函数
  98. *    形    参: 无
  99. *    返 回 值: 无
  100. *********************************************************************************************************
  101. */
  102. void MainTask(void)
  103. {
  104.    
  105.      /* 初始化 */
  106.      GUI_Init();
  107.    
  108.      /*
  109.       关于多缓冲和窗口内存设备的设置说明
  110.         1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
  111.            WM_MULTIBUF_Enable(1);
  112.         2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
  113.         3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
  114.            STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
  115.            感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
  116.         4. 所有emWin例子默认是开启三缓冲。
  117.      */
  118.      WM_MULTIBUF_Enable(1);
  119.    
  120.      /*
  121.        触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
  122.         此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
  123.      */
  124.     //TOUCH_Calibration();
  125.    
  126.      /* 清屏 */
  127.      GUI_SetBkColor(GUI_BLACK);
  128.      GUI_Clear();
  129.    
  130.      /* 设置前景色和字体,并显示字符 */
  131.      GUI_SetColor(GUI_WHITE);
  132.      GUI_SetFont(&GUI_Font24_ASCII);
  133.      GUI_DispStringHCenterAt("COLOR_ShowColorBar - Sample", 160, 5);
  134.    
  135.      /* 显示彩带 */
  136.      _DemoShowColorBar();
  137.    
  138.      while(1)
  139.      {
  140.          GUI_Delay(10);
  141.      }
  142. }
复制代码
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:40:36 | 显示全部楼层
34.5   颜色格式选择RGB565实验例程说明(裸机)


配套例子:
    V6-547_STemWin实验_颜色格式RGB565(裸机)
实验目的:
    1.     本实验主要演示RGB565格式彩带显示效果。
    2.     emWin功能的实现在MainTask.c文件里面。
STemWin界面显示效果:
    800*480分辨率界面效果(emWin截图的时候,光标是无法截图出来的)。
34.14.png


STemWin动态内存配置:
    GUIConf.c文件中的配置如下:
  1. #define EX_SRAM   1/*1 used extern sram, 0 used internal sram */
  2. #if EX_SRAM
  3. #define GUI_NUMBYTES  (1024*1024*8)
  4. #else
  5. #define GUI_NUMBYTES  (100*1024)
  6. #endif
复制代码
    通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
#define EX_SRAM    1 表示使用外部SDRAM作为emWin动态内存,大小8MB。
#define EX_SRAM    0 表示使用内部SRAM作为emWin动态内存,大小100KB。
默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。
STemWin底层接口配置:
    LCDConf_Lin_Template.c文件中共12项emWin配置:
  1. /*
  2. **********************************************************************************************************
  3.                                           用户可以配置的选项
  4. **********************************************************************************************************
  5. */
  6. /* 0. 在官方代码的基础上再做优化,官方的部分函数效率低,耗内存, 0表示优化 */
  7. #define emWin_Optimize   0
  8. /*
  9.   1. 显示屏的物理分辨率,驱动已经做了显示屏自适应,支持4.3寸,5寸和7寸屏
  10.      这里填写自适应显示屏中的最大分辨率。
  11. */
  12. #define XSIZE_PHYS       800
  13. #define YSIZE_PHYS       480
  14. /* 2. 多缓冲 / 虚拟屏,多缓冲和虚拟屏不可同时使用,emWin不支持 */
  15. #define NUM_BUFFERS      3 /* 定义多缓冲个数,仅可以设置1,2和3,也就是最大支持三缓冲 */
  16. #define NUM_VSCREENS     1 /* 定义虚拟屏个数 */
  17. /* 3. 没有图层激活时,背景色设置, 暂时未用到 */
  18. #define BK_COLOR         GUI_DARKBLUE
  19. /*
  20.    4. 重定义图层数,对于STM32F429/439,用户可以选择一个图层或者两个图层,不支持三图层
  21.       (1). 设置GUI_NUM_LAYERS = 1时,即仅使用图层1时,默认触摸值是发送给图层1的。
  22.        (2). 设置GUI_NUM_LAYERS = 2时,即图层1和图层2都已经使能,此时图层2是顶层,
  23.             用户需要根据自己的使用情况设置如下两个地方。
  24.             a. 在bsp_touch.c文件中的函数TOUCH_InitHard里面设置参数State.Layer = 1,1就表示
  25.                给图层2发送触摸值。
  26.             b. 调用GUI_Init函数后,调用函数GUI_SelectLayer(1), 设置当前操作的是图层2。
  27. */
  28. #undef  GUI_NUM_LAYERS
  29. #define GUI_NUM_LAYERS    1
  30. /*
  31.    5. 设置图层1和图层2对应的显存地址
  32.       (1) EXT_SDRAM_ADDR 是SDRAM的首地址。
  33.       (2) LCD_LAYER0_FRAME_BUFFER 是图层1的显存地址。
  34.        (3) LCD_LAYER1_FRAME_BUFFER 是图层2的显存地址。
  35.        (4) 每个图层的显存大小比较考究,这里进行下简单的说明。
  36.            如果用户选择的颜色模式 = 32位色ARGB8888,显存的大小:
  37.            XSIZE_PHYS * YSIZE_PHYS * 4 * NUM_VSCREENS * NUM_BUFFERS
  38.          
  39.            颜色模式 = 24位色RGB888,显存的大小:
  40.            XSIZE_PHYS * YSIZE_PHYS * 3 * NUM_VSCREENS * NUM_BUFFERS
  41.          
  42.            颜色模式 = 16位色RGB566,ARGB1555, ARGB4444,AL88,那么显存的大小就是:
  43.            XSIZE_PHYS * YSIZE_PHYS * 2 * NUM_VSCREENS * NUM_BUFFERS
  44.            颜色模式 = 8位色L8,AL44,那么显存的大小就是:
  45.            XSIZE_PHYS * YSIZE_PHYS * 1 * NUM_VSCREENS * NUM_BUFFERS  
  46.      
  47.       这里为了方便起见,将开发板配套的16MB的SDRAM前8MB分配给LCD显存使用,后8MB用于emWin动态内存。
  48.        对于24位色,16位色,8位色,用户可以对其使能三缓冲,并且使能双图层。但是32位色也使能三缓冲和双
  49.        图层的话会超出8MB,所以用户根据自己的情况做显存和emWin动态内存的分配调整。
  50.          举一个例子,对于800*480分辨率的显示屏,使能32位色,三缓冲,那么最终一个图层需要的大小就是
  51.       800 * 480 * 4 * 3  = 4.394MB的空间,如果是双图层,已经超出8MB的分配范围。
  52.      
  53.       (5)为了方便起见,图层2的宏定义LCD_LAYER1_FRAME_BUFFER中的参数4是按照32位色设置的,如果用户的图层1
  54.          使用的是8位色,这里填数字1,如果是16位色,这里填2,如果是24位色,这里填3。
  55. */
  56. #define LCD_LAYER0_FRAME_BUFFER  EXT_SDRAM_ADDR
  57. #define LCD_LAYER1_FRAME_BUFFER  (LCD_LAYER0_FRAME_BUFFER + XSIZE_PHYS * YSIZE_PHYS * 4 * NUM_VSCREENS *
  58. NUM_BUFFERS)
  59. /*
  60.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  61.       特别注意如下两个问题:
  62.        (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
  63.            请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
  64.            a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
  65.            b. 480*272分辨率的可以高些,取20MHz左右即可。
  66.        (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
  67. */
  68. #define _CM_ARGB8888      1
  69. #define _CM_RGB888        2
  70. #define _CM_RGB565        3
  71. #define _CM_ARGB1555      4
  72. #define _CM_ARGB4444      5
  73. #define _CM_L8            6
  74. #define _CM_AL44          7
  75. #define _CM_AL88          8
  76. /* 7. 配置图层1的颜色模式和分辨率大小 */
  77. #define COLOR_MODE_0      _CM_RGB565
  78. #define XSIZE_0           XSIZE_PHYS
  79. #define YSIZE_0           YSIZE_PHYS
  80. /* 8. 配置图层2的的颜色模式和分辨率大小 */
  81. #define COLOR_MODE_1      _CM_RGB565
  82. #define XSIZE_1           XSIZE_PHYS
  83. #define YSIZE_1           YSIZE_PHYS
  84. /* 9. 单图层情况下,根据用户选择的颜色模式可自动选择图层1的emWin的驱动和颜色模式 */
  85. #if   (COLOR_MODE_0 == _CM_ARGB8888)
  86.   #define COLOR_CONVERSION_0 GUICC_M8888I
  87.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_32
  88. #elif (COLOR_MODE_0 == _CM_RGB888)
  89.   #define COLOR_CONVERSION_0 GUICC_M888
  90.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_24
  91. #elif (COLOR_MODE_0 == _CM_RGB565)
  92.   #define COLOR_CONVERSION_0 GUICC_M565
  93.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  94. #elif (COLOR_MODE_0 == _CM_ARGB1555)
  95.   #define COLOR_CONVERSION_0 GUICC_M1555I
  96.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  97. #elif (COLOR_MODE_0 == _CM_ARGB4444)
  98.   #define COLOR_CONVERSION_0 GUICC_M4444I
  99.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  100. #elif (COLOR_MODE_0 == _CM_L8)
  101.   #define COLOR_CONVERSION_0 GUICC_8666
  102.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  103. #elif (COLOR_MODE_0 == _CM_AL44)
  104.   #define COLOR_CONVERSION_0 GUICC_1616I
  105.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  106. #elif (COLOR_MODE_0 == _CM_AL88)
  107.   #define COLOR_CONVERSION_0 GUICC_88666I
  108.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  109. #else
  110.   #error Illegal color mode 0!
  111. #endif
  112. /* 10. 双图层情况下,根据用户选择的颜色模式可自动选择图层2的emWin的驱动和颜色模式 */
  113. #if (GUI_NUM_LAYERS > 1)
  114. #if   (COLOR_MODE_1 == _CM_ARGB8888)
  115.   #define COLOR_CONVERSION_1 GUICC_M8888I
  116.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_32
  117. #elif (COLOR_MODE_1 == _CM_RGB888)
  118.   #define COLOR_CONVERSION_1 GUICC_M888
  119.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_24
  120. #elif (COLOR_MODE_1 == _CM_RGB565)
  121.   #define COLOR_CONVERSION_1 GUICC_M565
  122.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  123. #elif (COLOR_MODE_1 == _CM_ARGB1555)
  124.   #define COLOR_CONVERSION_1 GUICC_M1555I
  125.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  126. #elif (COLOR_MODE_1 == _CM_ARGB4444)
  127.   #define COLOR_CONVERSION_1 GUICC_M4444I
  128.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  129. #elif (COLOR_MODE_1 == _CM_L8)
  130.   #define COLOR_CONVERSION_1 GUICC_8666
  131.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  132. #elif (COLOR_MODE_1 == _CM_AL44)
  133.   #define COLOR_CONVERSION_1 GUICC_1616I
  134.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  135. #elif (COLOR_MODE_1 == _CM_AL88)
  136.   #define COLOR_CONVERSION_1 GUICC_88666I
  137.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  138. #else
  139.   #error Illegal color mode 1!
  140. #endif
  141. #else
  142. #undef XSIZE_0
  143. #undef YSIZE_0
  144. #define XSIZE_0       XSIZE_PHYS
  145. #define YSIZE_0       YSIZE_PHYS
  146. #endif
  147. /*11. 配置选项检测,防止配置错误或者某些选项没有配置 */
  148. #ifndef   XSIZE_PHYS
  149.   #error Physical X size of display is not defined!
  150. #endif
  151. #ifndef   YSIZE_PHYS
  152.   #error Physical Y size of display is not defined!
  153. #endif
  154. #ifndef   NUM_VSCREENS
  155.   #define NUM_VSCREENS 1
  156. #else
  157.   #if (NUM_VSCREENS <= 0)
  158.     #error At least one screeen needs to be defined!
  159.   #endif
  160. #endif
  161. #if (NUM_VSCREENS > 1) && (NUM_BUFFERS > 1)
  162.   #error Virtual screens and multiple buffers are not allowed!
  163. #endif
复制代码
    对于这12个配置选项,注释说明已经比较详细。默认情况下,本教程配套的emWin例子都是用的三缓冲,RGB565格式,且仅使用单图层。
程序设计:
栈大小分配:
    系统栈大小在startup_stm32f429_439xx.s文件中配置:
34.15.png

    栈大小的单位是字节,那么这里配置的系统栈大小就是8192字节。
主函数初始化:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: main
  4. *    功能说明: 标准c程序入口。
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. int main (void)
  10. {   
  11.      /* 初始化外设 */
  12.      bsp_Init();
  13.      /* 进入emWin主函数 */
  14.      MainTask();
  15. }
复制代码
硬件外设初始化
    硬件外设的初始化是在bsp.c文件实现:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: bsp_Init
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void bsp_Init(void)
  10. {
  11.      /*
  12.          由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
  13.          启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
  14.          系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
  15.      */
  16.      /* 使能CRC 因为使用STemWin前必须要使能 */
  17.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  18.    
  19.      /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
  20.      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  21.    
  22.      SystemCoreClockUpdate();    /* 根据PLL配置更新系统时钟频率变量 SystemCoreClock */
  23.      bsp_InitUart();        /* 初始化串口 */
  24.      bsp_InitKey();         /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
  25.    
  26.      bsp_InitExtIO();       /* FMC总线上扩展了32位输出IO, 操作LED等外设必须初始化 */
  27.      bsp_InitLed();         /* 初始LED指示灯端口 */
  28.    
  29.      bsp_InitI2C();         /* 配置I2C总线 */
  30.      bsp_InitSPIBus();       /* 配置SPI总线 */
  31.    
  32.      bsp_InitSFlash();       /* 初始化SPI Flash */
  33.    
  34.      bsp_InitExtSDRAM();   /* 初始化SDRAM */
  35.      bsp_DetectLcdType();  /* 检测触摸板和LCD面板型号, 结果存在全局变量 g_TouchType, g_LcdType */
  36.    
  37.      TOUCH_InitHard();    /* 初始化配置触摸芯片 */
  38.      LCD_ConfigLTDC();     /* 初始化配置LTDC */
  39.    
  40.      result = f_mount(&fs, "0:/", 0);     /* 挂载文件系统 */
  41. }
复制代码
emWin功能的具体实现(在MainTask.c文件里面):
  1. #include "MainTask.h"
  2. #include "bsp.h"
  3. /*
  4. *********************************************************************************************************
  5. *                                      宏定义
  6. *********************************************************************************************************
  7. */
  8. #define X_START 60
  9. #define Y_START 40
  10. /*
  11. *********************************************************************************************************
  12. *                                       变量
  13. *********************************************************************************************************
  14. */
  15. typedef struct {
  16.   int NumBars;
  17.   GUI_COLOR Color;
  18.   const char * s;
  19. } BAR_DATA;
  20. static const BAR_DATA _aBarData[] = {
  21.   { 2, GUI_RED    , "Red" },
  22.   { 2, GUI_GREEN  , "Green" },
  23.   { 2, GUI_BLUE   , "Blue" },
  24.   { 1, GUI_WHITE  , "Grey" },
  25.   { 2, GUI_YELLOW , "Yellow" },
  26.   { 2, GUI_CYAN   , "Cyan" },
  27.   { 2, GUI_MAGENTA, "Magenta" },
  28. };
  29. static const GUI_COLOR _aColorStart[] = { GUI_BLACK, GUI_WHITE };
  30. /*
  31. *********************************************************************************************************
  32. *    函 数 名: _DemoShowColorBar
  33. *    功能说明: 显示彩带
  34. *    形    参: 无
  35. *    返 回 值: 无
  36. *********************************************************************************************************
  37. */
  38. static void _DemoShowColorBar(void)
  39. {
  40.      GUI_RECT Rect;
  41.      int      yStep;
  42.      int      i;
  43.      int      j;
  44.      int      xSize;
  45.      int      ySize;
  46.      int      NumBars;
  47.      int      NumColors;
  48.      //
  49.      // 获取显示屏大小
  50.      //
  51.      xSize = LCD_GetXSize();
  52.      ySize = LCD_GetYSize();
  53.    
  54.      //
  55.      // 获取能够显示的彩带数
  56.      //
  57.      NumColors = GUI_COUNTOF(_aBarData);
  58.      for (i = NumBars = 0, NumBars = 0; i < NumColors; i++)
  59.      {
  60.          NumBars += _aBarData[i].NumBars;
  61.      }
  62.      yStep = (ySize - Y_START) / NumBars;
  63.    
  64.      //
  65.      // 显示文本
  66.      //
  67.      Rect.x0 = 0;
  68.      Rect.x1 = X_START - 1;
  69.      Rect.y0 = Y_START;
  70.      GUI_SetFont(&GUI_Font8x16);
  71.      for (i = 0; i < NumColors; i++)
  72.      {
  73.          Rect.y1 = Rect.y0 + yStep * _aBarData[i].NumBars - 1;
  74.          GUI_DispStringInRect(_aBarData[i].s, &Rect, GUI_TA_LEFT | GUI_TA_VCENTER);
  75.          Rect.y0 = Rect.y1 + 1;
  76.      }
  77.    
  78.      //
  79.      // 绘制彩带
  80.      //
  81.      Rect.x0 = X_START;
  82.      Rect.x1 = xSize - 1;
  83.      Rect.y0 = Y_START;
  84.      for (i = 0; i < NumColors; i++)
  85.      {
  86.          for (j = 0; j < _aBarData[i].NumBars; j++)
  87.          {
  88.               Rect.y1 = Rect.y0 + yStep - 1;
  89.               GUI_DrawGradientH(Rect.x0, Rect.y0, Rect.x1, Rect.y1, _aColorStart[j], _aBarData[i].Color);
  90.               Rect.y0 = Rect.y1 + 1;
  91.          }
  92.      }
  93. }
  94. /*
  95. *********************************************************************************************************
  96. *    函 数 名: MainTask
  97. *    功能说明: GUI主函数
  98. *    形    参: 无
  99. *    返 回 值: 无
  100. *********************************************************************************************************
  101. */
  102. void MainTask(void)
  103. {
  104.    
  105.      /* 初始化 */
  106.      GUI_Init();
  107.    
  108.      /*
  109.       关于多缓冲和窗口内存设备的设置说明
  110.         1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
  111.            WM_MULTIBUF_Enable(1);
  112.         2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
  113.         3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
  114.            STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
  115.            感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
  116.         4. 所有emWin例子默认是开启三缓冲。
  117.      */
  118.      WM_MULTIBUF_Enable(1);
  119.    
  120.      /*
  121.        触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
  122.         此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
  123.      */
  124.     //TOUCH_Calibration();
  125.    
  126.      /* 清屏 */
  127.      GUI_SetBkColor(GUI_BLACK);
  128.      GUI_Clear();
  129.    
  130.      /* 设置前景色和字体,并显示字符 */
  131.      GUI_SetColor(GUI_WHITE);
  132.      GUI_SetFont(&GUI_Font24_ASCII);
  133.      GUI_DispStringHCenterAt("COLOR_ShowColorBar - Sample", 160, 5);
  134.    
  135.      /* 显示彩带 */
  136.      _DemoShowColorBar();
  137.    
  138.      while(1)
  139.      {
  140.          GUI_Delay(10);
  141.      }
  142. }
复制代码
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:42:56 | 显示全部楼层
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按键,串口打印):
34.16.png

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

实验说明:
    本实验我们仅说明RGB888和RGB565两处配置上的不同,其余部分跟本章节34.4小节是相同的,这里不再赘述。
不同点一:LCDConf_Lin_Template.C文件的宏配置,图层1选择RGB888格式,下面代码中红色字体是被修改的地方,其余地方未做修改:
  1. /*
  2.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  3.       特别注意如下两个问题:
  4.        (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
  5.            请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
  6.            a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
  7.            b. 480*272分辨率的可以高些,取20MHz左右即可。
  8.        (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
  9. */
  10. #define _CM_ARGB8888      1
  11. #define _CM_RGB888        2
  12. #define _CM_RGB565        3
  13. #define _CM_ARGB1555      4
  14. #define _CM_ARGB4444      5
  15. #define _CM_L8            6
  16. #define _CM_AL44          7
  17. #define _CM_AL88          8
  18. /* 7. 配置图层1的颜色模式和分辨率大小 */
  19. #define COLOR_MODE_0      _CM_RGB888
  20. #define XSIZE_0           XSIZE_PHYS
  21. #define YSIZE_0           YSIZE_PHYS
  22. /* 8. 配置图层2的的颜色模式和分辨率大小 */
  23. #define COLOR_MODE_1      _CM_RGB565
  24. #define XSIZE_1           XSIZE_PHYS
  25. #define YSIZE_1           YSIZE_PHYS
复制代码
不同点二:bsp_tft_429.c文件中LTDC输出时钟,对于4.3寸,5寸和7寸屏来说都降低一半,下面代码中红色字体是被修改的地方,其余地方未做修改:
  1. /*
  2.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  3.       特别注意如下两个问题:
  4. void LCD_ConfigLTDC(void)
  5. {
  6.      LTDC_InitTypeDef       LTDC_InitStruct;
  7.      LTDC_Layer_TypeDef     LTDC_Layerx;
  8.      /* 使能LTDC */
  9.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);
  10.      /* 使能DMA2D */
  11.      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);
  12.      /* 配置LCD引脚 */
  13.      LCD429_AF_GPIOConfig();
  14.      /* 配置信号极性 */
  15.      LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;   /* HSYNC 低电平有效 */
  16.      LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;   /* VSYNC 低电平有效 */
  17.      LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;   /* DE 低电平有效 */
  18.      LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;
  19.      /* 背景色 */
  20.      LTDC_InitStruct.LTDC_BackgroundRedValue = 0xff;
  21.      LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;
  22.      LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;
  23.    
  24.      /*
  25.         LTDC时钟配置说明:
  26.           函数RCC_PLLSAIConfig的第一个参数是PLLSAI_N,第三个参数数PLLSAI_R。
  27.           函数RCC_LTDCCLKDivConfig的参数是RCC_PLLSAIDivR。
  28.       
  29.         下面举一个例子:PLLSAI_N = 400, PLLSAI_R = 4  RCC_PLLSAIDivR = 2:
  30.           首先,输入时钟 PLLSAI_VCO Input = HSE_VALUE / PLL_M = 8M / 8 = 1MHz
  31.             输出时钟 PLLSAI_VCO Output  = PLLSAI_VCO Input * PLLSAI_N = 1 * 400 = 400 1MHz
  32.             PLLLCDCLK = PLLSAI_VCO Output / PLLSAI_R = 400 / 4 = 100 1MHz
  33.           最好,LTDC 时钟 = PLLLCDCLK / RCC_PLLSAIDivR = 100 / 2 = 50 1MHz
  34.       */
  35.                   
  36.      /* 支持6种面板 */
  37.      switch (g_LcdType)
  38.      {
  39.          case LCD_35_480X320:   /* 3.5寸 480 * 320 */
  40.               RCC_PLLSAIConfig(429, 2,  4);
  41.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
  42.         
  43.               Width = 480;
  44.               Height = 272;
  45.               HSYNC_W = 10;
  46.               HBP = 20;
  47.               HFP = 20;
  48.               VSYNC_W = 20;
  49.               VBP = 20;
  50.               VFP = 20;
  51.               break;
  52.         
  53.          case LCD_43_480X272:/* 4.3寸 480 * 272  选择LTDC输出20MHz,所有颜色深度都可以选择这个时钟频率 */
  54.               RCC_PLLSAIConfig(280, 2,  7);
  55.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  56.               Width = 480;
  57.               Height = 272;
  58.               HSYNC_W = 40;
  59.               HBP = 2;
  60.               HFP = 2;
  61.               VSYNC_W = 9;
  62.               VBP = 2;
  63.               VFP = 2;
  64.               break;
  65.         
  66.          case LCD_50_480X272:        /* 5.0寸 480 * 272 */
  67.               RCC_PLLSAIConfig(429, 2,  4);
  68.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
  69.         
  70.               Width = 480;
  71.               Height = 272;
  72.         
  73.               HSYNC_W = 40;
  74.               HBP = 2;
  75.               HFP = 2;
  76.               VSYNC_W = 9;
  77.               VBP = 2;
  78.               VFP = 2;         
  79.               break;
  80.         
  81.          case LCD_50_800X480:/* 5.0寸 800 * 480,24位或者32位色选择LTDC输出15MHz,16位或者8位30MHz */
  82.               RCC_PLLSAIConfig(420, 2,  7);
  83.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  84.               Width = 800;
  85.               Height = 480;
  86.               HSYNC_W = 96;
  87.               HBP = 10;
  88.               HFP = 10;
  89.               VSYNC_W = 2;
  90.               VBP = 10;
  91.               VFP = 10;         
  92.               break;
  93.         
  94.          case LCD_70_800X480: /* 7.0寸 800 * 480,24位或者32位色选择LTDC输出15MHz,16位或者8位30MHz*/
  95.               RCC_PLLSAIConfig(420, 2,  7);
  96.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  97.             
  98.               #if 0
  99.                    RCC_PLLSAIConfig(400, 2,  2);
  100.                    RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  101.               #endif
  102.               Width = 800;
  103.               Height = 480;
  104.               HSYNC_W = 90; /* =10时,显示错位,20时部分屏可以的,80时全部OK */
  105.               HBP = 10;
  106.               HFP = 10;
  107.         
  108.               VSYNC_W = 10;
  109.               VBP = 10;
  110.               VFP = 10;
  111.               break;
  112.         
  113.          case LCD_70_1024X600:       /* 7.0寸 1024 * 600 */
  114.               LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;   /* HSYNC 低电平有效 */
  115.               LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;   /* VSYNC 低电平有效 */
  116.               LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;   /* DE 低电平有效 */
  117.               LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IIPC;
  118.         
  119.               /* IPS 7寸 1024*600,  像素时钟频率范围 : 57 -- 65 --- 70.5MHz
  120.         
  121.                    PLLSAI_VCO Input   = HSE_VALUE / PLL_M = 8M / 4 = 2 Mhz
  122.                    PLLSAI_VCO Output  = PLLSAI_VCO Input * PLLSAI_N =   2 * 429 = 858 Mhz
  123.                    PLLLCDCLK = PLLSAI_VCO Output / PLLSAI_R = 858 / 4 = 214.5 Mhz
  124.                    LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 214.5 / 4 = 53.625 Mhz   
  125.                    (429, 2, 4); RCC_PLLSAIDivR_Div4 实测像素时钟 = 53.7M
  126.               */
  127.               RCC_PLLSAIConfig(429, 2, 6);
  128.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  129.         
  130.               Width = 1024;
  131.               Height = 600;
  132.               HSYNC_W = 2;  /* =10时,显示错位,20时部分屏可以的,80时全部OK */
  133.               HBP = 157;
  134.               HFP = 160;
  135.         
  136.               VSYNC_W = 2;
  137.               VBP = 20;
  138.               VFP = 12;         
  139.               break;
  140.         
  141.          default:
  142.               RCC_PLLSAIConfig(429, 2,  4);
  143.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
  144.               Width = 800;
  145.               Height = 480;
  146.               HSYNC_W = 80; /* =10时,显示错位,20时部分屏可以的,80时全部OK */
  147.               HBP = 10;
  148.               HFP = 10;
  149.               VSYNC_W = 10;
  150.               VBP = 10;
  151.               VFP = 10;         
  152.               break;
  153.      }
  154.    
  155.      g_LcdWidth  = Width;        /* 显示屏分辨率-宽度 */
  156.      g_LcdHeight = Height;       /* 显示屏分辨率-高度 */
  157.    
  158.      /* 使能 PLLSAI */
  159.      RCC_PLLSAICmd(ENABLE);
  160.      /* 等待完成 */
  161.      while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET);
  162.    
  163.      /* 配置LTDC的同步时序 */
  164.      LTDC_InitStruct.LTDC_HorizontalSync = HSYNC_W;
  165.      LTDC_InitStruct.LTDC_VerticalSync = VSYNC_W;
  166.      LTDC_InitStruct.LTDC_AccumulatedHBP = LTDC_InitStruct.LTDC_HorizontalSync + HBP;
  167.      LTDC_InitStruct.LTDC_AccumulatedVBP = LTDC_InitStruct.LTDC_VerticalSync + VBP;
  168.      LTDC_InitStruct.LTDC_AccumulatedActiveW = Width + LTDC_InitStruct.LTDC_AccumulatedHBP;
  169.      LTDC_InitStruct.LTDC_AccumulatedActiveH = Height + LTDC_InitStruct.LTDC_AccumulatedVBP;
  170.      LTDC_InitStruct.LTDC_TotalWidth = LTDC_InitStruct.LTDC_AccumulatedActiveW + HFP;
  171.      LTDC_InitStruct.LTDC_TotalHeigh = LTDC_InitStruct.LTDC_AccumulatedActiveH + VFP;
  172.      LTDC_Init(<DC_InitStruct);
  173. }
复制代码
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:44:30 | 显示全部楼层
34.7   颜色格式选择RGB888实验例程说明(裸机)


配套例子:
    V6-549_STemWin实验_颜色格式RGB888(裸机)
实验目的:
    1.     本实验主要演示RGB888格式彩带显示效果。
    2.     emWin功能的实现在MainTask.c文件里面。
STemWin界面显示效果:
    800*480分辨率界面效果。
34.18.png

实验说明:
    本实验我们仅说明RGB888和RGB565两处配置上的不同,其余部分跟本章节34.5小节是相同的,这里不再赘述。
不同点一:LCDConf_Lin_Template.C文件的宏配置,图层1选择RGB888格式,下面代码中红色字体是被修改的地方,其余地方未做修改:
  1. /*
  2.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  3.       特别注意如下两个问题:
  4.        (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
  5.            请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
  6.            a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
  7.            b. 480*272分辨率的可以高些,取20MHz左右即可。
  8.        (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
  9. */
  10. #define _CM_ARGB8888      1
  11. #define _CM_RGB888        2
  12. #define _CM_RGB565        3
  13. #define _CM_ARGB1555      4
  14. #define _CM_ARGB4444      5
  15. #define _CM_L8            6
  16. #define _CM_AL44          7
  17. #define _CM_AL88          8
  18. /* 7. 配置图层1的颜色模式和分辨率大小 */
  19. #define COLOR_MODE_0      _CM_RGB888
  20. #define XSIZE_0           XSIZE_PHYS
  21. #define YSIZE_0           YSIZE_PHYS
  22. /* 8. 配置图层2的的颜色模式和分辨率大小 */
  23. #define COLOR_MODE_1      _CM_RGB565
  24. #define XSIZE_1           XSIZE_PHYS
  25. #define YSIZE_1           YSIZE_PHYS
复制代码
不同点二:bsp_tft_429.c文件中LTDC输出时钟,对于4.3寸,5寸和7寸屏来说都降低一半,下面代码中红色字体是被修改的地方,其余地方未做修改:
  1. /*
  2.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  3.       特别注意如下两个问题:
  4. void LCD_ConfigLTDC(void)
  5. {
  6.      LTDC_InitTypeDef       LTDC_InitStruct;
  7.      LTDC_Layer_TypeDef     LTDC_Layerx;
  8.      /* 使能LTDC */
  9.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);
  10.      /* 使能DMA2D */
  11.      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);
  12.      /* 配置LCD引脚 */
  13.      LCD429_AF_GPIOConfig();
  14.      /* 配置信号极性 */
  15.      LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;   /* HSYNC 低电平有效 */
  16.      LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;   /* VSYNC 低电平有效 */
  17.      LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;   /* DE 低电平有效 */
  18.      LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;
  19.      /* 背景色 */
  20.      LTDC_InitStruct.LTDC_BackgroundRedValue = 0xff;
  21.      LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;
  22.      LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;
  23.    
  24.      /*
  25.         LTDC时钟配置说明:
  26.           函数RCC_PLLSAIConfig的第一个参数是PLLSAI_N,第三个参数数PLLSAI_R。
  27.           函数RCC_LTDCCLKDivConfig的参数是RCC_PLLSAIDivR。
  28.       
  29.         下面举一个例子:PLLSAI_N = 400, PLLSAI_R = 4  RCC_PLLSAIDivR = 2:
  30.           首先,输入时钟 PLLSAI_VCO Input = HSE_VALUE / PLL_M = 8M / 8 = 1MHz
  31.             输出时钟 PLLSAI_VCO Output  = PLLSAI_VCO Input * PLLSAI_N = 1 * 400 = 400 1MHz
  32.             PLLLCDCLK = PLLSAI_VCO Output / PLLSAI_R = 400 / 4 = 100 1MHz
  33.           最好,LTDC 时钟 = PLLLCDCLK / RCC_PLLSAIDivR = 100 / 2 = 50 1MHz
  34.       */
  35.                   
  36.      /* 支持6种面板 */
  37.      switch (g_LcdType)
  38.      {
  39.          case LCD_35_480X320:   /* 3.5寸 480 * 320 */
  40.               RCC_PLLSAIConfig(429, 2,  4);
  41.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
  42.         
  43.               Width = 480;
  44.               Height = 272;
  45.               HSYNC_W = 10;
  46.               HBP = 20;
  47.               HFP = 20;
  48.               VSYNC_W = 20;
  49.               VBP = 20;
  50.               VFP = 20;
  51.               break;
  52.         
  53.          case LCD_43_480X272:/* 4.3寸 480 * 272  选择LTDC输出20MHz,所有颜色深度都可以选择这个时钟频率 */
  54.               RCC_PLLSAIConfig(280, 2,  7);
  55.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  56.               Width = 480;
  57.               Height = 272;
  58.               HSYNC_W = 40;
  59.               HBP = 2;
  60.               HFP = 2;
  61.               VSYNC_W = 9;
  62.               VBP = 2;
  63.               VFP = 2;
  64.               break;
  65.         
  66.          case LCD_50_480X272:        /* 5.0寸 480 * 272 */
  67.               RCC_PLLSAIConfig(429, 2,  4);
  68.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
  69.         
  70.               Width = 480;
  71.               Height = 272;
  72.         
  73.               HSYNC_W = 40;
  74.               HBP = 2;
  75.               HFP = 2;
  76.               VSYNC_W = 9;
  77.               VBP = 2;
  78.               VFP = 2;         
  79.               break;
  80.         
  81.          case LCD_50_800X480:/* 5.0寸 800 * 480,24位或者32位色选择LTDC输出15MHz,16位或者8位30MHz */
  82.               RCC_PLLSAIConfig(420, 2,  7);
  83.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  84.               Width = 800;
  85.               Height = 480;
  86.               HSYNC_W = 96;
  87.               HBP = 10;
  88.               HFP = 10;
  89.               VSYNC_W = 2;
  90.               VBP = 10;
  91.               VFP = 10;         
  92.               break;
  93.         
  94.          case LCD_70_800X480: /* 7.0寸 800 * 480,24位或者32位色选择LTDC输出15MHz,16位或者8位30MHz*/
  95.               RCC_PLLSAIConfig(420, 2,  7);
  96.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  97.             
  98.               #if 0
  99.                    RCC_PLLSAIConfig(400, 2,  2);
  100.                    RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  101.               #endif
  102.               Width = 800;
  103.               Height = 480;
  104.               HSYNC_W = 90; /* =10时,显示错位,20时部分屏可以的,80时全部OK */
  105.               HBP = 10;
  106.               HFP = 10;
  107.         
  108.               VSYNC_W = 10;
  109.               VBP = 10;
  110.               VFP = 10;
  111.               break;
  112.         
  113.          case LCD_70_1024X600:       /* 7.0寸 1024 * 600 */
  114.               LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;   /* HSYNC 低电平有效 */
  115.               LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;   /* VSYNC 低电平有效 */
  116.               LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;   /* DE 低电平有效 */
  117.               LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IIPC;
  118.         
  119.               /* IPS 7寸 1024*600,  像素时钟频率范围 : 57 -- 65 --- 70.5MHz
  120.         
  121.                    PLLSAI_VCO Input   = HSE_VALUE / PLL_M = 8M / 4 = 2 Mhz
  122.                    PLLSAI_VCO Output  = PLLSAI_VCO Input * PLLSAI_N =   2 * 429 = 858 Mhz
  123.                    PLLLCDCLK = PLLSAI_VCO Output / PLLSAI_R = 858 / 4 = 214.5 Mhz
  124.                    LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 214.5 / 4 = 53.625 Mhz   
  125.                    (429, 2, 4); RCC_PLLSAIDivR_Div4 实测像素时钟 = 53.7M
  126.               */
  127.               RCC_PLLSAIConfig(429, 2, 6);
  128.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
  129.         
  130.               Width = 1024;
  131.               Height = 600;
  132.               HSYNC_W = 2;  /* =10时,显示错位,20时部分屏可以的,80时全部OK */
  133.               HBP = 157;
  134.               HFP = 160;
  135.         
  136.               VSYNC_W = 2;
  137.               VBP = 20;
  138.               VFP = 12;         
  139.               break;
  140.         
  141.          default:
  142.               RCC_PLLSAIConfig(429, 2,  4);
  143.               RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
  144.               Width = 800;
  145.               Height = 480;
  146.               HSYNC_W = 80; /* =10时,显示错位,20时部分屏可以的,80时全部OK */
  147.               HBP = 10;
  148.               HFP = 10;
  149.               VSYNC_W = 10;
  150.               VBP = 10;
  151.               VFP = 10;         
  152.               break;
  153.      }
  154.    
  155.      g_LcdWidth  = Width;        /* 显示屏分辨率-宽度 */
  156.      g_LcdHeight = Height;       /* 显示屏分辨率-高度 */
  157.    
  158.      /* 使能 PLLSAI */
  159.      RCC_PLLSAICmd(ENABLE);
  160.      /* 等待完成 */
  161.      while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET);
  162.    
  163.      /* 配置LTDC的同步时序 */
  164.      LTDC_InitStruct.LTDC_HorizontalSync = HSYNC_W;
  165.      LTDC_InitStruct.LTDC_VerticalSync = VSYNC_W;
  166.      LTDC_InitStruct.LTDC_AccumulatedHBP = LTDC_InitStruct.LTDC_HorizontalSync + HBP;
  167.      LTDC_InitStruct.LTDC_AccumulatedVBP = LTDC_InitStruct.LTDC_VerticalSync + VBP;
  168.      LTDC_InitStruct.LTDC_AccumulatedActiveW = Width + LTDC_InitStruct.LTDC_AccumulatedHBP;
  169.      LTDC_InitStruct.LTDC_AccumulatedActiveH = Height + LTDC_InitStruct.LTDC_AccumulatedVBP;
  170.      LTDC_InitStruct.LTDC_TotalWidth = LTDC_InitStruct.LTDC_AccumulatedActiveW + HFP;
  171.      LTDC_InitStruct.LTDC_TotalHeigh = LTDC_InitStruct.LTDC_AccumulatedActiveH + VFP;
  172.      LTDC_Init(<DC_InitStruct);
  173. }
复制代码
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-14 16:44:51 | 显示全部楼层
34.8  总结


    本章节就为大家讲解这么多,主要讲解了部分常用的颜色格式,不过实际项目中已经够用了。更多相关的知识还是要大家看官方手册的颜色章节。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 20:20 , Processed in 0.306309 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表