硬汉嵌入式论坛

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

[emWin] 帮忙看看STM32 F429上移植STemWin出现显示问题

[复制链接]

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2018-9-4 22:36:39 | 显示全部楼层 |阅读模式
本帖最后由 Angel 于 2018-9-4 22:42 编辑

按照开发板教程移植了带UCOS III的STemWin到自己的F429板子上,然后添加应用进行测试的时候,不知为啥就显示有问题了,如下:

微信图片_20180904220047.jpg

屏幕的上半部分显示是正常的,但是下半部分就出现了花屏。
首先说明的一点是,我的LTDC驱动在裸机情况下(不带UCOS和emWin)显示是没有问题的,板子也是没有问题的,但是移植了emWin后就发现显示不正常了,不知道是什么原因。

LCDConf_Lin_Template.c用的是安富莱emWin例程中的显示驱动文件,然后修改成了自己的配置:
5.0寸 800*480的屏幕
LTDC使用2层,第1层用RGB565的颜色模式,第2层用ARGB8888的颜色模式。

现在怀疑是LCDConf_Lin_Template.c的配置有问题,麻烦大家帮忙看看,这12个项目是不是配置出问题了:

先是宏定义:

#define HBP              46
#define HSW             2
#define HFP              210

#define VBP              23
#define VSW             2
#define VFP              22

#define Width           800
#define Height          480
#define HSYNC_W     1
#define VSYNC_W     1

  1. /* 0. 在官方代码的基础上再做优化,官方的部分函数效率低,耗内存, 0表示优化 */
  2. #define emWin_Optimize   0

  3. /*
  4.   1. 显示屏的物理分辨率,驱动已经做了显示屏自适应,支持4.3寸,5寸和7寸屏
  5.      这里填写自适应显示屏中的最大分辨率。
  6. */
  7. #define XSIZE_PHYS       800
  8. #define YSIZE_PHYS       480

  9. /* 2. 多缓冲 / 虚拟屏,多缓冲和虚拟屏不可同时使用,emWin不支持 */
  10. #define NUM_BUFFERS      1 /* 定义多缓冲个数,仅可以设置1,2和3,也就是最大支持三缓冲 */
  11. #define NUM_VSCREENS     1 /* 定义虚拟屏个数 */

  12. /* 3. 没有图层激活时,背景色设置, 暂时未用到 */
  13. #define BK_COLOR         GUI_DARKBLUE

  14. /*
  15.    4. 重定义图层数,对于STM32F429/439,用户可以选择一个图层或者两个图层,不支持三图层
  16.       (1). 设置GUI_NUM_LAYERS = 1时,即仅使用图层1时,默认触摸值是发送给图层1的。
  17.           (2). 设置GUI_NUM_LAYERS = 2时,即图层1和图层2都已经使能,此时图层2是顶层,
  18.                用户需要根据自己的使用情况设置如下两个地方。
  19.                    a. 在bsp_touch.c文件中的函数TOUCH_InitHard里面设置参数State.Layer = 1,1就表示
  20.                       给图层2发送触摸值。
  21.                    b. 调用GUI_Init函数后,调用函数GUI_SelectLayer(1), 设置当前操作的是图层2。
  22. */
  23. #undef  GUI_NUM_LAYERS
  24. #define GUI_NUM_LAYERS    2

  25. /*
  26.    5. 设置图层1和图层2对应的显存地址
  27.       (1) EXT_SDRAM_ADDR 是SDRAM的首地址。
  28.       (2) LCD_LAYER0_FRAME_BUFFER 是图层1的显存地址。
  29.           (3) LCD_LAYER1_FRAME_BUFFER 是图层2的显存地址。
  30.           (4) 每个图层的显存大小比较考究,这里进行下简单的说明。
  31.               如果用户选择的颜色模式 = 32位色ARGB8888,显存的大小:
  32.               XSIZE_PHYS * YSIZE_PHYS * 4 * NUM_VSCREENS * NUM_BUFFERS
  33.                   
  34.               颜色模式 = 24位色RGB888,显存的大小:
  35.               XSIZE_PHYS * YSIZE_PHYS * 3 * NUM_VSCREENS * NUM_BUFFERS
  36.                   
  37.               颜色模式 = 16位色RGB566,ARGB1555, ARGB4444,AL88,那么显存的大小就是:
  38.               XSIZE_PHYS * YSIZE_PHYS * 2 * NUM_VSCREENS * NUM_BUFFERS

  39.               颜色模式 = 8位色L8,AL44,那么显存的大小就是:
  40.               XSIZE_PHYS * YSIZE_PHYS * 1 * NUM_VSCREENS * NUM_BUFFERS        
  41.       
  42.       这里为了方便起见,将开发板配套的16MB的SDRAM前8MB分配给LCD显存使用,后8MB用于emWin动态内存。
  43.           对于24位色,16位色,8位色,用户可以对其使能三缓冲,并且使能双图层。但是32位色也使能三缓冲和双
  44.           图层的话会超出8MB,所以用户根据自己的情况做显存和emWin动态内存的分配调整。
  45.             举一个例子,对于800*480分辨率的显示屏,使能32位色,三缓冲,那么最终一个图层需要的大小就是
  46.       800 * 480 * 4 * 3  = 4.394MB的空间,如果是双图层,已经超出8MB的分配范围。

  47.       (5)为了方便起见,图层2的宏定义LCD_LAYER1_FRAME_BUFFER中的参数4是按照32位色设置的,如果用户的图层1
  48.          使用的是8位色,这里填数字1,如果是16位色,这里填2,如果是24位色,这里填3。
  49. */
  50. #define LCD_LAYER0_FRAME_BUFFER  0xD0000000
  51. #define LCD_LAYER1_FRAME_BUFFER  (LCD_LAYER0_FRAME_BUFFER + XSIZE_PHYS * YSIZE_PHYS * 2 * NUM_VSCREENS * NUM_BUFFERS)

  52. /*
  53.    6. STM32F429/439支持的颜色模式,所有模式都支持,用户可任意配置。
  54.       特别注意如下两个问题:
  55.           (1) 如果用户选择了ARGB8888或者RGB888模式,LCD闪烁比较厉害的话,
  56.               请降低LTDC的时钟大小,在文件bsp_tft_429.c的函数LCD_ConfigLTDC里面设置。
  57.               a. 一般800*480分辨率的显示屏,ARGB8888或者RGB888模式LTDC时钟选择10-20MHz即可。
  58.               b. 480*272分辨率的可以高些,取20MHz左右即可。
  59.           (2) 16位色或者8位色模式,LTDC的时钟频率一般可以比24位色或者32位色的高一倍。
  60. */
  61. #define _CM_ARGB8888      1
  62. #define _CM_RGB888        2
  63. #define _CM_RGB565        3
  64. #define _CM_ARGB1555      4
  65. #define _CM_ARGB4444      5
  66. #define _CM_L8            6
  67. #define _CM_AL44          7
  68. #define _CM_AL88          8

  69. /* 7. 配置图层1的颜色模式和分辨率大小 */
  70. #define COLOR_MODE_0      _CM_RGB565
  71. #define XSIZE_0           XSIZE_PHYS
  72. #define YSIZE_0           YSIZE_PHYS

  73. /* 8. 配置图层2的的颜色模式和分辨率大小 */
  74. #define COLOR_MODE_1      _CM_ARGB8888
  75. #define XSIZE_1           XSIZE_PHYS
  76. #define YSIZE_1           YSIZE_PHYS

  77. /* 9. 单图层情况下,根据用户选择的颜色模式可自动选择图层1的emWin的驱动和颜色模式 */
  78. #if   (COLOR_MODE_0 == _CM_ARGB8888)
  79.   #define COLOR_CONVERSION_0 GUICC_M8888I
  80.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_32
  81. #elif (COLOR_MODE_0 == _CM_RGB888)
  82.   #define COLOR_CONVERSION_0 GUICC_M888
  83.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_24
  84. #elif (COLOR_MODE_0 == _CM_RGB565)
  85.   #define COLOR_CONVERSION_0 GUICC_M565
  86.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  87. #elif (COLOR_MODE_0 == _CM_ARGB1555)
  88.   #define COLOR_CONVERSION_0 GUICC_M1555I
  89.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  90. #elif (COLOR_MODE_0 == _CM_ARGB4444)
  91.   #define COLOR_CONVERSION_0 GUICC_M4444I
  92.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  93. #elif (COLOR_MODE_0 == _CM_L8)
  94.   #define COLOR_CONVERSION_0 GUICC_8666
  95.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  96. #elif (COLOR_MODE_0 == _CM_AL44)
  97.   #define COLOR_CONVERSION_0 GUICC_1616I
  98.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_8
  99. #elif (COLOR_MODE_0 == _CM_AL88)
  100.   #define COLOR_CONVERSION_0 GUICC_88666I
  101.   #define DISPLAY_DRIVER_0   GUIDRV_LIN_16
  102. #else
  103.   #error Illegal color mode 0!
  104. #endif

  105. /* 10. 双图层情况下,根据用户选择的颜色模式可自动选择图层2的emWin的驱动和颜色模式 */
  106. #if (GUI_NUM_LAYERS > 1)

  107. #if   (COLOR_MODE_1 == _CM_ARGB8888)
  108.   #define COLOR_CONVERSION_1 GUICC_M8888I
  109.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_32
  110. #elif (COLOR_MODE_1 == _CM_RGB888)
  111.   #define COLOR_CONVERSION_1 GUICC_M888
  112.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_24
  113. #elif (COLOR_MODE_1 == _CM_RGB565)
  114.   #define COLOR_CONVERSION_1 GUICC_M565
  115.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  116. #elif (COLOR_MODE_1 == _CM_ARGB1555)
  117.   #define COLOR_CONVERSION_1 GUICC_M1555I
  118.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  119. #elif (COLOR_MODE_1 == _CM_ARGB4444)
  120.   #define COLOR_CONVERSION_1 GUICC_M4444I
  121.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  122. #elif (COLOR_MODE_1 == _CM_L8)
  123.   #define COLOR_CONVERSION_1 GUICC_8666
  124.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  125. #elif (COLOR_MODE_1 == _CM_AL44)
  126.   #define COLOR_CONVERSION_1 GUICC_1616I
  127.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_8
  128. #elif (COLOR_MODE_1 == _CM_AL88)
  129.   #define COLOR_CONVERSION_1 GUICC_88666I
  130.   #define DISPLAY_DRIVER_1   GUIDRV_LIN_16
  131. #else
  132.   #error Illegal color mode 1!
  133. #endif

  134. #else

  135. #undef XSIZE_0
  136. #undef YSIZE_0
  137. #define XSIZE_0       XSIZE_PHYS
  138. #define YSIZE_0       YSIZE_PHYS

  139. #endif

  140. /*11. 配置选项检测,防止配置错误或者某些选项没有配置 */
  141. #ifndef   XSIZE_PHYS
  142.   #error Physical X size of display is not defined!
  143. #endif
  144. #ifndef   YSIZE_PHYS
  145.   #error Physical Y size of display is not defined!
  146. #endif
  147. #ifndef   NUM_VSCREENS
  148.   #define NUM_VSCREENS 1
  149. #else
  150.   #if (NUM_VSCREENS <= 0)
  151.     #error At least one screeen needs to be defined!
  152.   #endif
  153. #endif
  154. #if (NUM_VSCREENS > 1) && (NUM_BUFFERS > 1)
  155.   #error Virtual screens and multiple buffers are not allowed!
  156. #endif
复制代码


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-9-5 02:21:02 | 显示全部楼层
先测试仅使用图层1,RGB565格式,是否正常。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-9-5 21:37:24 | 显示全部楼层
eric2013 发表于 2018-9-5 02:21
先测试仅使用图层1,RGB565格式,是否正常。

终于发现问题了,原来是LCDConf_Lin_Template.c这个驱动已经包含了LTDC第1层和第2层的初始化代码。
之前由于不知道LCDConf_Lin_Template.c函数还有LTDC层级初始化的功能,所以还单独调用了STM32的库函数LTDC_Layer_InitStruct对LTDC进行层级初始化,结果不但不起任何作用,还让显示出现异常,真是多此一举啊!
感谢老师的解答,现在已经能正常使用了
1.jpg
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-9-6 01:44:18 | 显示全部楼层
Angel 发表于 2018-9-5 21:37
终于发现问题了,原来是LCDConf_Lin_Template.c这个驱动已经包含了LTDC第1层和第2层的初始化代码。
之前 ...

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 06:34 , Processed in 0.225949 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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