你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第2章 STemWin5.xx详细移植步骤

[复制链接]
baiyongbin2009 发布时间:2015-1-8 18:14
本帖最后由 baiyongbin2009 于 2015-1-8 18:18 编辑
0 v+ ^3 f2 M5 V; }# U8 d* L8 K4 R& [8 e. y1 X( Y7 D$ a$ x
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第2章  STemWin5.xx详细移植步骤

2 I9 P# q+ i; K# {  u) z; T  W& Q
    本期教程开始带领大家学习STemWin的移植,对于初学者STemWin的移植不是必须要先学的,可以先学一些基本的应用,然后再来学习移植就方面很多了,考虑到教程正常的编排顺序,这里就把STemWin的移植放在了第二章。本章提供的移植方法可以自适应安富莱生产的3.0寸,4.3寸,5寸,7寸TFT屏。这里只讲STemWin在MDK上面的移植,在IAR上面的移植是类似的。开发板使用安富莱STM32-V5开发板,主芯片STM32F407IGT6。
    2.1 关于STemWin移植的重要说明
    2.2 移植前的准备工作
    2.3 STemWin的裸机移植
    2.4 STemWin带RTOS的移植
    2.5 总结

% G  h; b* W5 g; r; \' p
2.1  关于STemWin移植的重要说明
    关于STemWin的移植一定要明确以下几点:
1.     emWin手册里面有这样一句话:“驱动接口的改变始于emWin V5。不再支持针对emWin V4 或更早版本开发的老显示驱动”。
2.     如果不使用V5以后版本的新特性,基本和以前的版本使用是一样的,也就是说,大家用V5以前版本实现的功能,直接升级到现有的版本,基本可以正常运行。
3.     尽管emWin提供了大部分屏的驱动,但是不能包含所有,这篇移植文档就因此而生。不管是emWin已经支持的,还是没有提供支持的,均可采用这种方法。
4.     本章教程提供了一个非常好的触摸滤波方法,此方法可以有效的滤除飞点。
5.     使用STemWin的库,一定得记得开启CRC,使用MDK安装目录里面的emWin库,一定得注册MDK的RL-ARM。
2.2  移植前的准备工作
    这里分别讲一下MDK安装目录中emWin的移植和STemWin的移植,准备工作做好以后,剩下的移植步骤基本是一样的。只是使用的各自的库即可。
2.2.1      MDK安装目录中emWin移植
     第一步:我们以MDK5.10中emWin5.22库进行说明。安装目录中有如下几个文件(路径:C:\Keil5.10\ARM\Pack\Keil\MDK-Middleware\5.1.4\emWin,如果使用的是MDK4.73等4.xx版本,路径:C:\Keil4.73\ARM\Segger\emWin)。
2.1.jpg                               
库版本
说明
GUI_ARM_B.lib
大端模式的库
GUI_ARM_L.lib
小端模式的库
GUI_CM0.lib
M0内核
GUI_CM3.lib
M3内核
GUI_CM4F.lib
M4内核
    在这里有一个问题要跟大家说明,emWin的官方手册中有这样一句话:
2.2.png

; }' O* A  G' N7 ?1 R6 O
    其实这个是针对SEGGER自己做的emWin源码而言的,SEGGER授权给其它厂商后,芯片厂商都对源码进行了优化,要不FPU的存在就没有意义了。上面的GUI_CM4F.lib文件就是KEIL公司对emWin中需要使用浮点的地方进行了优化。
    第二步:注册RL-ARM,点击File->License Management
2.3.jpg
+ A2 V6 L( S% h
    第三步:注册RL-ARM,点击File->License Management
2.4.jpg
% |& A' {  T( C( t! V* Q5 @
    第四步:注册机的设置
2.5.png

# Q' ^/ _+ w2 n" O8 v( C+ L
    这些准备工作做好后就可以开始移植工作了。
2.2.2      STemWin移植
     STemWin的移植准备工作比较简单,用户只需在初始化STemWin前使能CRC校验即可。STemWin的库文件如下:
2.6.jpg
( U$ `# D$ ]) c. S# U
    这里面含有KEIL,IAR和GCC三个版本的库。而且还区分带OS和不带OS版本。本教程讲的是不带OS版本的移植,带OS版本的移植也很简单,用户只需添加相应的文件即可。
    STemWin的下载地址:http://www.st.com/web/en/catalog/tools/PF259225#  (版本1.1.2)
    Lib文件所在的路径:STemWin_Library_V1.1.2\Libraries\STemWinLibrary522\Lib

3 j4 }6 Z8 |) H5 W+ y3 f4 t
赞 收藏 评论19 发布时间:2015-1-8 18:14

举报

19个回答
baiyongbin2009 回答时间:2015-1-8 18:23:10
2.3  STemWin的裸机移植2.3.1      工程中添加的文件
    添加如图所示的几个文件:
2.7.png
                              
    这几个文件从上往下依次进行一下简单的说明:
1.     bsp_tft_lcd.c, LCD_RA887, LCD_SPFD5420.c是用户要实现的TFT驱动文件。
2.     bsp_touch.c是触摸文件,也是用户要实现的。
3.     GUIDRV_Template.c文件在ST官方提供的STemWin包里面没有,需要在MDK的安装目录里面找。
    比如在MDK4.73安装目录中查找位置是:C:\Keil4.73\ARM\Segger\emWin\Sample\DisplayDriver
2.8.png
4.    上面MDK工程目录中GUI_X中的几个文件在MDK安装目录和STemWin软件包中都有:
  Ø  STemWin软件包中路径如下:STemWin_Library_V1.1.2\Libraries\STemWinLibrary522\OS,只是STemWin软件包中相关文件比较少。
  Ø  MDK4.73安装目录中的如下路径中:C:\Keil4.73\ARM\Segger\emWin\Sample\GUI_X,这里文件夹里面的内容比较全。
5.    GUI和LCD配置文件所在位置:
    MDK4.73安装目录:C:\Keil4.73\ARM\Segger\emWin\Sample\Config
    STemWin软件包:STemWin_Library_V1.1.2\Libraries\STemWinLibrary522\Config
6.    GUI/DEMO中的函数需要用户实现,简单的写个程序即可。
7.    GUI/Lib里面是emWin,所在位置
    MDK4.73安装目录:C:\Keil4.73\ARM\Segger\emWin\Lib
    STemWin软件包:STemWin_Library_V1.1.2\Libraries\STemWinLibrary522\Lib
2.3.2      触摸屏滤波的实现
    这里提供了一种有效的滤波方法。具体函数在bsp_touch.c这个文件里面,得到触摸数值后供emWin中的函数GUI_TOUCH_X_MeasureX 和GUI_TOUCH_X_MeasureY两个函数的调用。
    特别注意这里改变触摸的滤波方法,以前的时候大家都是采用舍弃触摸数值的前几个点和后几个点,然后中间数值取平均的方法,效果并不理想,因为这种方法不能有效的滤除飞点,这里提供一个新的方法。1. 在STemWin里面使用触摸的中断方式,效果并不好,所以这里使用查询,查询此引脚的电平,这样可以避免不必要的读取触摸数据。
2. 触摸滤波,主要滤的是飞点,正是因为这些飞点的存在,才使得触摸很不稳定。
    下面的这个函数,大家应该很熟悉,就是滤除前几个点和后面几个点,然后中间几个点取平均
  1. /*
    $ h7 h$ [2 i, _7 h" a% D
  2. *********************************************************************************************************9 r  r2 k* B) \
  3. *    函 数 名: TOUCH_DataFilter$ F; r5 r' ?3 W0 U) {
  4. *    功能说明: 读取一个坐标值(x或者y)
    9 O5 Z- |! `( D, I* c! L, J
  5. *             连续读取XPT2046_READ_TIMES次数据,对这些数据升序排列,8 E4 e/ u% p- @8 P' L- r
  6. *             然后去掉最低和最高XPT2046_LOST_VAL个数,取平均值' F* h4 ]# W2 `4 A. X
  7. *    形    参:无
    8 Y( ]. P' D  n$ s, M( i+ s
  8. *    返 回 值: 读到的数据7 V9 G: b3 }3 T0 {  N. m3 y8 P
  9. *********************************************************************************************************
    ! E+ ~9 W6 k8 V% D# R& z' z+ O
  10. */4 w. x8 u9 n( v) `" }1 K
  11. /* 读取次数 */
    ( M, k! r, w- x: F9 K1 }+ y8 Q
  12. #define XPT2046_READ_TIMES    5' U# p2 H0 X0 A' d
  13. /* 丢弃值  */
    4 ^% t/ \: V$ l) @# p, P( g$ u
  14. #define XPT2046_LOST_VAL      1     1 ]* v2 \; F/ b  ^& T% r8 A
  15. uint16_t TOUCH_DataFilter(uint8_t _ucCh); l9 H# D7 O' S5 S
  16. {1 k3 G+ V  a' Y9 X. n
  17.      uint16_t i, j;
    5 M, b2 M5 O  h/ r* r( s
  18.      uint16_t buf[XPT2046_READ_TIMES];
    1 ~. A: w2 F% R) E. J9 r- n5 ?% H4 Z
  19.      uint16_t usSum;2 X' c3 V( C& B* l; g% G
  20.      uint16_t usTemp;
    ( n1 e/ X5 b- M

  21. ; U" O! U" k' D. v% V; R
  22.      /* 读取READ_TIMES次数据*/! M7 Q) y: x- C0 v. g& e0 O
  23.      for(i=0; i < XPT2046_READ_TIMES; i++)
    : X# F1 H1 s% Q. t9 A9 q
  24.      {# j$ `: M6 d1 X: A4 P1 u
  25.          if (g_ChipID == IC_8875)
    ! s& z, O, m$ k3 P8 v$ L! Z2 B7 y
  26.          {! R3 z& C) P8 @+ A' K7 T8 |
  27.               if(_ucCh == ADC_CH_X)8 G* t6 ~7 Y% d/ w
  28.               {0 G1 u6 }3 w9 y
  29.                    buf[i] = RA8875_TouchReadX();/ d: X, n$ m- R# A
  30.               }7 K7 y5 D) Q$ ~; @
  31.               else" W3 W$ q/ [9 s# g  K- P4 C
  32.               {
    # p8 t- ]) D" h8 R6 g- V) C7 [
  33.                    buf[i] = RA8875_TouchReadY();   + T2 y1 O4 A7 T! h1 w
  34.               }# E, [% ^2 H5 U  |) O7 l- C: L( K
  35.          }
    1 g. I* y6 D) J3 Y1 `
  36.          else* w( e( I5 C) [" x& t( I8 K
  37.          {0 M. }! x0 ^  @0 X0 V* w4 k6 A
  38.               buf[i] = TSC2046_ReadAdc(_ucCh);$ d8 c+ Z; N( r/ g/ }) |; Y
  39.          }   ' n, _: k& a# N/ A$ M# p8 S4 a2 \
  40.      }. E/ g9 ~2 ?2 }6 b6 |( m
  41.     3 ]( W5 A- j8 A2 K$ F' {2 B0 r: Q
  42.      /* 升序排列 */                  
    / Y4 O3 R- F+ J  |$ ^2 D
  43.      for(i = 0; i < XPT2046_READ_TIMES - 1; i++)
      j( ?7 ^6 ~& g
  44.      {
    % Z7 B+ V0 n7 o0 t8 A5 G
  45.          for(j = i + 1; j < XPT2046_READ_TIMES; j++)2 o4 L1 o1 f% K: X- B: t
  46.          {
    ' a! C' o( u3 G2 H
  47.               if(buf[i] > buf[j])
    % ?, l; ~' H$ V/ G
  48.               {
      t* U8 X4 ?2 h# n& N
  49.                    usTemp = buf[i];8 C# a8 h0 `& ^/ B8 D/ ?' i$ N
  50.                    buf[i] = buf[j];
    / G. w# @9 e5 R; A
  51.                    buf[j] = usTemp;# e- t+ O. b9 I/ p* X. M% H
  52.               }5 j8 k$ p3 Y$ a
  53.          }
    - G1 t. Z8 b% V& N
  54.      }
    : ]/ o* [+ B/ a0 ], \. K
  55.         
    . N% n7 E/ q- O1 o
  56.      usSum = 0;6 _8 T4 f# a+ R- w+ W' l6 p* g
  57. 1 b3 m& _% @( {) x6 O" m
  58.      /*求和 */! p! ]. x! y* U3 A
  59.      for(i = XPT2046_LOST_VAL; i < XPT2046_READ_TIMES - XPT2046_LOST_VAL; i++)
    2 V# o' U: s0 d& b* E) Y6 }/ i1 W
  60.      {% ]/ Z6 F+ L  {) _& q* v. u& g  C/ x
  61.          usSum += buf[i];8 d4 ~; }* g/ B, \
  62.      }
    # R2 Q! T- r$ h4 J
  63.      /*求平均 */
    " X) N8 l3 W9 k" M- e0 q
  64.      usTemp = usSum / (XPT2046_READ_TIMES - 2 * XPT2046_LOST_VAL);
    0 k$ I. Y5 ]6 V# V
  65. 1 f: |$ y$ \9 u; h9 y3 X
  66.      return usTemp;8 E- Q$ V* B6 P' S, ~8 V. k# z
  67. }
    / B, q7 F( g' x( S; X1 |

  68. ' ?& ?) g/ G. a# M3 _6 `) z$ |# j
  69. /*5 }- @- p/ X& b$ F+ p% c
  70. ********************************************************************************************************** J+ y& M4 r0 j: E- w5 f4 u. q- N
  71. *    函 数 名: TOUCH_ReadAdcXY. r. R; n. T/ E. x
  72. *    功能说明: 连续2次读取触摸屏IC,且这两次的偏差不能超过3 ?+ p! N6 l) q" j# W. j
  73. *             ADC_ERR_RANGE,满足条件,则认为读数正确,否则读数错误.
    7 Z% N* i  ?9 E
  74. *             该函数能大大提高准确度+ V1 W' j7 i7 J$ Z5 T2 W
  75. *    形    参:x,y:读取到的坐标值
    ( M2 {. D' e& \% h
  76. *    返 回 值: 0,失败;1,成功
    $ c( a7 K) V) ~6 A
  77. *********************************************************************************************************6 q8 y2 C2 k0 e4 P4 B
  78. */, \5 {, e, \8 C
  79. /* 误差范围 */
    " t  P4 Z7 D5 M
  80. uint8_t ADC_ERR_RANGE = 5;
    / v# ?. q& A% o; N. U1 o3 ?
  81. uint8_t TOUCH_ReadAdcXY(int16_t *_usX, int16_t *_usY)3 ~2 F9 ~. ^8 @' H! S; _
  82. {
    2 u$ V) W( j4 @5 R; v. M, W# s
  83.      uint16_t iX1, iY1;
    9 f) p1 p' ?7 P- f
  84.      uint16_t iX2, iY2;
    8 }  T, C& e( f' W( N" X! O
  85.      uint16_t iX, iY;
    5 q& l: k/ @3 d

  86.   R, r& f7 c; O# C/ P$ l9 k% D
  87.      iX1 = TOUCH_DataFilter(ADC_CH_X);
    . E0 J; E! f' B7 r
  88.      iY1 = TOUCH_DataFilter(ADC_CH_Y);7 U: u0 K; P+ g2 ?: e
  89.      iX2 = TOUCH_DataFilter(ADC_CH_X);. P" `- O7 _: v: {" T
  90.      iY2 = TOUCH_DataFilter(ADC_CH_Y);, k* n; N" P0 _
  91.     # P6 ]& R" m# u) a' m0 ?) @+ i
  92.      iX = TOUCH_Abs(iX1 - iX2);
    8 n% t) `9 \3 t, l3 b
  93.      iY = TOUCH_Abs(iY1 - iY2);
    4 U$ d2 a: C+ s/ r3 n
  94.     " L& V. D( p* @5 S: y! O6 Q
  95.      /* 前后两次采样在+-ERR_RANGE内 */
    5 J$ S9 u) P4 K/ N6 g$ |1 e
  96.     if ((iX <= ADC_ERR_RANGE) && (iY <= ADC_ERR_RANGE))
    7 n9 b! O9 s) s: d  e( B& V- _' F
  97.     {        8 L  P+ I  W$ `4 |6 y
  98.          *_usX = (iX1 + iX2) / 2;; `" \% p6 B, G; v% m0 Z
  99.          *_usY = (iY1 + iY2) / 2;   ; c' ?: W  O4 U/ d9 `3 `+ U! o
  100. 4 w( W, |8 Y- g% R
  101.          return 1;5 T# ~, s! j! O) T$ u. F
  102.     }8 I8 v" i; U; P0 Y! Y+ h' M) M
  103.      else9 a: [) {0 y9 I% w9 e) g
  104.      {9 O+ b) T: f  e! D  ^7 M; H9 n: s
  105.          return 0;) A$ O  Y0 y6 S8 H7 N  g
  106.      }   
    8 |& I! k: B( g/ j  I5 l0 o9 [
  107. }4 M  k0 Y( G# S
  108. 0 i( U% L6 Q( M4 i4 R0 Y! z
  109. /*
    " n1 j! C6 p) c
  110. *********************************************************************************************************
      z  l( s  P: B" ?5 l
  111. *    函 数 名: TOUCH_Scan
    $ {9 d# s  [7 n  G' ~
  112. *    功能说明: 触摸板事件检测程序。该函数被周期性调用,每ms调用1次. 见 bsp_Timer.c% X3 T& k  J5 _0 H: k, f
  113. *    形    参:无) @0 Z+ h' W0 ^% a8 A: Q& T
  114. *    返 回 值: 无  R1 X2 K6 u. Y- c$ ^6 v: q
  115. *********************************************************************************************************: ?% Y8 o) H5 ]9 R2 j
  116. */
    " W' K2 j. ?% g, x% L1 x
  117. void TOUCH_SCAN(void)
    # `! z' g5 u/ C- B
  118. {. B" H& v9 U" o! B8 @' a
  119.      uint8_t s_invalid_count = 0;( c0 P- f  m! c4 D0 \- {. B3 X
  120.     2 `  v3 L6 S7 D/ J2 C
  121.      if(TOUCH_PressValid == 0)
    6 ]2 c% [( F, E: y. D
  122.      {            
    ; ~' R9 T7 J" c  _; n7 }% x8 D
  123.          while(!TOUCH_ReadAdcXY(&g_tTP.usAdcNowX, &g_tTP.usAdcNowY)&&s_invalid_count < 20);
    1 _4 J- F- U% _8 P/ o8 [8 a) ?
  124.          {
    . J1 u6 v. c- e
  125.               s_invalid_count++;
    + d4 T3 J2 j' N2 q# ^
  126.          }9 f- H: `* ]0 u' l
  127.          if(s_invalid_count >= 20)0 B4 b) D; Z! Y& s
  128.          {
    7 a8 X! r  ^- t& n
  129.               g_tTP.usAdcNowX = -1;
    + `5 l1 j. o, z6 P9 U9 O
  130.               g_tTP.usAdcNowY = -1; - p8 |- [7 P3 n) ?4 s# X
  131.          }
    - c" k% J: o0 L% `# \, \/ P4 o
  132.      }( s# \7 y8 I  ~% }1 J4 D
  133.      else
    : d; j: D& ^0 G
  134.      {: B" E/ G8 O3 M7 m! [9 ?
  135.          g_tTP.usAdcNowX = -1;
    $ C+ Y* T* }7 r! D% q1 M/ m
  136.          g_tTP.usAdcNowY = -1;   R' T4 C6 {( l5 l% d. _6 e
  137.      }
    " b! _* [4 J3 A" L0 U( Q
  138.             
    7 o, }( C; N2 i3 c2 L( ?3 Y
  139. }
复制代码
    触摸的驱动就这些东西,详细的使用看例程级可以,然后在文件GUI_X_Touch_Analog.c里面调用就可以了。
  1. #include "GUI.h"
    8 @! u" v5 n7 b/ i# V' d' \
  2. #include "LCD_RA8875.h"0 `" z* C- O! T. K
  3. #include "bsp_touch.h"( H$ D/ g+ w4 q' f0 U
  4. + O. `0 c/ v: p, S( L6 c
  5. void GUI_TOUCH_X_ActivateX(void)( B, C3 h$ L$ d( i
  6. {
    6 Q8 u6 Z2 L5 h7 Q, ^

  7. ( y  x2 d. X) N. n# m, U. c9 D' u
  8. }2 f: S  U4 Q8 j* T) _6 Z; L9 Y
  9. . j, p4 |2 D8 P2 t
  10. void GUI_TOUCH_X_ActivateY(void)3 ]$ B& ^1 ~; S8 [
  11. {1 ?7 ?/ z/ H6 g7 I- \) |3 D. A
  12. & C; F& e  d4 Y+ n! T
  13. }% u4 h+ R8 I% j/ e
  14. 2 I" n5 A8 u1 a( T9 U/ m
  15. int  GUI_TOUCH_X_MeasureX(void)
    . O3 X9 v2 m( [. h
  16. {
    2 t! Y% H, |0 r+ B. F
  17.      TOUCH_SCAN();  a0 {# j" I3 ^: n1 d. s3 N- R
  18.      return(g_tTP.usAdcNowX);        1 D4 {# T& r/ E, G2 L2 u# e1 z
  19. }
      c6 C2 x+ Q! U$ J' z

  20. 2 l4 M* X3 U, T
  21. int  GUI_TOUCH_X_MeasureY(void)
    # D. f9 Q8 j3 J9 u
  22. {   
    ; M8 a$ m0 @5 G8 y4 p* j% E+ v
  23.      return(g_tTP.usAdcNowY);
    / t7 `% X2 m4 x
  24. }
复制代码
0 z8 H: \! U/ \1 Y8 O; w

" Y5 |" e. h. S5 G& |: R9 h
baiyongbin2009 回答时间:2015-1-8 18:24:33
本帖最后由 baiyongbin2009 于 2015-1-8 18:28 编辑
8 [; y( Q6 h/ N  {5 U
+ H! x4 \6 B7 N+ G7 H: c2.3.3       底层驱动接口函数(GUIRV_Template)
    STemWin的底层驱动函数也很简单,用户只需提供打点和读点函数即可。但是这种没有经过优化的移植方式非常的影响STemWin的实际性能。这里就针对RA8875说一下需要优化的地方。
l  画水平线的函数
/*********************************************************************
*
*       _DrawHLine
*/
static void _DrawHLine  (GUI_DEVICE * pDevice, int x0, int y,  int x1) {
//  LCD_PIXELINDEX ColorIndex;
' B, [4 v& P9 `, u$ f0 R0 e7 n
  if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
    for (; x0 <= x1; x0++) {
      _XorPixel(pDevice, x0, y);
    }
  } else {
       #if emWin_Optimize
         //LCD8875_DrawHLine(x0, y, x1, LCD_COLORINDEX);
         s_ucRA8875BusyNow = 1;
         LCD_DrawLineH(x0, y, x1, LCD_COLORINDEX);
         s_ucRA8875BusyNow = 0;
       #else
         LCD_PIXELINDEX ColorIndex;
         ColorIndex = LCD__GetColorIndex();
         for (; x0 <= x1; x0++) {
           _SetPixelIndex(pDevice, x0, y, ColorIndex);

/ \) l  [$ q: m* \
         }
       #endif
    }
}
l  画垂直线的函数
/*********************************************************************
*
*       _DrawVLine
*/
static void _DrawVLine  (GUI_DEVICE * pDevice, int x, int y0,  int y1) {
//  LCD_PIXELINDEX ColorIndex;

# X" O* G) t1 M: o* \+ J3 [/ q
  if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
    for (; y0 <= y1; y0++) {
      _XorPixel(pDevice, x, y0);
    }
  } else {
    #if emWin_Optimize
         s_ucRA8875BusyNow = 1;
         LCD_DrawLineV(x, y0, y1, LCD_COLORINDEX);
         s_ucRA8875BusyNow = 0;
     #else
         LCD_PIXELINDEX ColorIndex;
         ColorIndex = LCD__GetColorIndex();
         for (; y0 <= y1; y0++) {
           _SetPixelIndex(pDevice, x, y0, ColorIndex);
         }
     #endif
  }
}
l  矩形填充函数
/*********************************************************************
*
*       _FillRect
*/
static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
#if emWin_Optimize
    if (g_ChipID == IC_8875)
     {
         s_ucRA8875BusyNow = 1;
         BTE_SetTarBlock(x0, y0, y1-y0+1, x1-x0+1, 0);/* 设置BTE位置和宽度高度 */
         BTE_SetOperateCode(0x0C);           /* 设定BTE 操作码和光栅运算码  REG[51h] Bit[3:0] = 0Ch */
         RA8875_SetFrontColor(LCD_COLORINDEX);    /* 设置BTE前景色 */
         BTE_Start();                        /* 开启BTE 功能 */
         BTE_Wait();                              /* 等待操作结束 */
         s_ucRA8875BusyNow = 0;    
     }
     else
     {
         for (; y0 <= y1; y0++)
         {
              _DrawHLine(pDevice, x0, y0, x1);
         }      
     }

% R! o+ T9 u' Z0 M$ S+ M
#else
     for (; y0 <= y1; y0++)
     {
         _DrawHLine(pDevice, x0, y0, x1);
     }
#endif
}
l  绘制16BPP的函数
  1. /*******************************************************************************************************1 K; ?; @/ W9 A4 e) n, ^% M
  2. *7 c; m0 e6 Y6 [9 f& O
  3. * Draw Bitmap 16 BPP, not optimized' N' x$ ]6 b) T/ y. Y
  4. */
    & U0 }6 ^  n" o0 c
  5. static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
    & w6 r7 H0 p" D% Q; G' G) `, M! r( m
  6. #if emWin_Optimize, Y- j6 T1 B, ]* _8 Y2 u
  7. s_ucRA8875BusyNow = 1;! _: ?1 y& |! `7 k
  8. LCD_DrawHColorLine(x, y, xsize, (uint16_t *)p);4 I  H/ |4 m( f" j4 s
  9. s_ucRA8875BusyNow = 0;+ r! ^7 b. }) Q9 E7 ?6 p( S
  10. #else) Y5 |" M7 d" V( [* b# Z: L8 @
  11. for (;xsize > 0; xsize--, x++, p++)
    . d9 M5 A: b  Q
  12. {
    ( e, x" S4 M# N& [6 W
  13. _SetPixelIndex(pDevice, x, y, *p);; }( t" |* u# `0 Z
  14. }
    ! t! Z. j# ~, s$ W8 C9 S8 |
  15. #endif
    ; {1 }* S9 |2 n$ h
  16. }
复制代码
l  这里要根据实际的情况进行填写,不能填错,要不系统无法启动。
/*********************************************************************
*
*       _GetDevData
*/
static void * _GetDevData(GUI_DEVICE * pDevice, int Index) {
  GUI_USE_PARA(pDevice);
  #if GUI_SUPPORT_MEMDEV
    switch (Index) {
    case LCD_DEVDATA_MEMDEV:
// TBD: Has to be adapted to the right memory device depending on the used color depth!
      return (void *)&GUI_MEMDEV_DEVICE_16;
    }
  #else
    GUI_USE_PARA(Index);
  #endif
  return NULL;
}
    优化好上面四个地方即可。

, g  |( c) J+ l
baiyongbin2009 回答时间:2015-1-8 18:27:56
2.3.4       系统函数配置
    STemWin的底层驱动做好以后,就可以进行GUI和LCD的配置工作,这个是官方提供的配置流程:
2.9.png
1.    GUI的配置
    主要是配置STemWin所需的动态内存,下面的配置方式支持使用芯片内部存储器也支持使用外部存储器(比如:SRAM,SDRAM),使用外部存储器的话,一定要记得初始化相应器件。
  1. ----------------------------------------------------------------------
    $ X. d% w3 y+ n2 g. b
  2. File : GUIConf.c; M& |1 ]8 O8 A4 \# M4 ?. V( Q5 e( h
  3. Purpose : Display controller initialization8 n3 Y  k- t3 Y
  4. ---------------------------END-OF-HEADER------------------------------6 `$ c& h8 |. u1 ^. N  n! U0 \
  5. */8 ^  W& Q7 H- n  w! v/ w
  6. #include "GUI.h"
    3 x5 t. B" s1 O: j
  7. #include "bsp.h"
    + v3 [& A2 X8 g9 c9 V

  8. 7 D" F% [, ?. U& N( \- r: |
  9. /*
    3 r) D/ O- r4 T; W4 C# O4 \' f
  10. **********************************************************************# I1 y$ @6 {. g* [9 U( w0 h6 I
  11. *0 c; _3 i' P/ ^) P; n$ \& r
  12. * Defines# U7 |% U  W6 w. C
  13. *2 ?& e7 T. ^& l* e5 C
  14. **********************************************************************
    . S0 m0 Z& D9 G0 T6 k/ |$ v* b
  15. */
    " r  ]6 K! M* ^. C- r  z

  16. 2 R& J8 c6 S3 e5 t
  17. /* Define the available number of bytes available for the GUI */" _/ \8 a2 P% h
  18. //#define GUI_NUMBYTES (1024*105)1 q3 o$ x4 F+ u- C2 `" O; U
  19. #define GUI_NUMBYTES (1024*100)* y6 m0 d) ]/ d1 |* L" X, A
  20. /* Define the average block size */, M) G% ^- k8 R3 `  m
  21. #define GUI_BLOCKSIZE 0x807 b% }: Q% R* x! u

  22. * r% P) U, C3 G2 c8 `5 K) Z
  23. /*********************************************************************$ T- |' G, B' f
  24. *+ d( T# b+ D0 H7 h
  25. * GUI_X_Config; d9 x; s% o. M
  26. *
    6 T7 k* o$ ~# ?; Z4 S) _2 A' P3 `
  27. * Purpose:  G8 \5 v% {; U
  28. * Called during the initialization process in order to set up the& b/ w% T) @6 V$ R) M/ `* n
  29. * available memory for the GUI.
      o5 C4 F% G5 B
  30. **********************************************************************8 m; B# m1 ?' C! m+ h8 \
  31. */
    # n* q0 ]# F1 _* n
  32. void GUI_X_Config(void)
    8 U) w2 B$ {# {$ ]
  33. {  i+ r0 u9 {6 ?! l. K# j/ R
  34. #if 1 //使用芯片内部内存
    % e1 H  N% |9 ]4 Y$ v; `* m' x) m' K
  35. /* 32 bit aligned memory area */. K4 P% t* ~2 b! q
  36. static U32 aMemory[GUI_NUMBYTES / 4];
    6 I9 X7 X! A! q
  37. 4 L; N( O% w) p+ i6 v; y, w
  38. /* Assign memory to emWin */
    $ f# O- m$ l- T. `. Y
  39. GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
    * [0 e) o) S* ~, \
  40. GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
    4 Z7 g9 [& w  o# {4 C: E9 q. n
  41. #else//使用外部内存8 h" J* K, _( ~, a
  42. static U32 *aMemory;
    ' ^( a! M$ O  l: L# m) Y
  43. aMemory = (U32 *)EXT_SRAM_ADDR;1 \! v# O7 s$ {
  44. /* Assign memory to emWin */2 S6 ~8 Y( e& `- E1 u
  45. GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);& \1 m" y2 g  p1 z5 m& X: z
  46. GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);, }8 D; k' Y9 t3 l# w1 t+ |
  47. #endif  M: J" b3 ~! W$ t6 v2 L' z
  48. }
复制代码
2.    LCD的配置
    LCD的配置按照上面官方提供的驱动流程执行即可,下面是详细的代码。
  1. /*4 W- J, u5 J' Z. [! z8 Q
  2. ****************************************************************************
    ( M: \- [: \2 g5 j, E
  3. *8 n2 y" C. e( {. o5 R
  4. * LCD_X_Config
    - e0 h& m* Q# S
  5. *
    " L/ ^6 [9 `% d8 P$ _* [
  6. * Purpose:
    ' Y1 |  r; C! q- Z8 R5 T
  7. * Called during the initialization process in order to set up the
    / |1 W% Q' W& P# U! `$ G% x, }
  8. * display driver configuration.# ^; t5 o( Y' S& k
  9. *5 v1 u% J5 t. c4 D
  10. **************************************************************************** # {7 Y" G) H/ [* x$ M( s
  11. */
    7 ]8 D$ L- S2 ?1 {! G) p. f- j
  12. void LCD_X_Config(void)
    $ t7 w+ `  E  D/ l2 E
  13. {
    ) v* ~: X" ?2 U2 i, l
  14. /* 读取EEPROM中的参数 */ : L" N! T& |7 X: h- A
  15. ee_ReadBytes((uint8_t *)&g_tTPSL, 1024, sizeof(g_tTPSL));& [! x* @8 @) y( ^% n! N( x2 J

  16.   G, B3 g2 e7 N
  17. /* Set display driver and color conversion for 1st layer */. _8 T+ p( |4 F
  18. GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
    # t% A/ W2 }& g$ ?" N

  19. / ]/ d! @! l/ E0 P2 O
  20. if (g_ChipID == IC_8875)' a8 M4 h0 {+ |, m
  21. {
    " a0 _# ]2 {( t+ G2 `; r
  22. if (g_ucGPIX == 1) /* GPIX = 1 4.3 480x272 */7 T- I4 d6 `0 |' B! `
  23. {8 D# z8 a0 w3 ]! U) ?' w6 D7 a
  24. /* Display driver configuration */
    # ?  J! z% i8 q: ?/ M
  25. LCD_SetSizeEx (0, 480, 272);
    # G% L: |+ z; h$ ]0 T8 q0 l
  26. LCD_SetVSizeEx (0, 480, 272);8 t" Q2 g, A4 H! v3 S' f: K, }4 f

  27. 2 |* O' U3 D* d8 v
  28. /* Touch calibration */$ O. E) f2 F, L0 X) ]
  29. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 479, g_tTPSL.usAdcX1, g_tTPSL.usAdcX2);
      Y6 G: h; n1 j4 B7 k
  30. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 271, g_tTPSL.usAdcY1, g_tTPSL.usAdcY2);$ G9 ^6 B5 a6 Q. z2 ^8 K, y

  31. / \! o7 ~% H4 J7 u/ a* b& \
  32. /* 查看是否需要切换X,Y*/
    2 \! M4 G1 w3 R. ]8 s
  33. if(g_tTPSL.XYChange == 1)5 R' l/ X% B  E0 @/ V' T. g7 ~
  34. {
    & i6 r7 p# J8 ~- D9 r8 A
  35. GUI_TOUCH_SetOrientation(GUI_SWAP_XY);
    " o4 o' W3 D6 v. M
  36. }, E, k  h3 n$ U
  37. }
    $ s/ L2 c4 r0 S9 _. p
  38. else /* GPIX = 0 7 800*480 */
      y5 ?/ K9 L3 W/ R% x7 f
  39. {
    % p, C/ Q/ W# s+ Z& `
  40. /* Display driver configuration */
    4 ?. F6 @7 k  L
  41. LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
    6 e* \& n4 _- H8 p5 I
  42. LCD_SetVSizeEx (0, VXSIZE_PHYS, VYSIZE_PHYS);
    ) ^: ?/ z9 L! \7 ^- L8 A
  43. ; I4 z3 K" d( Z1 }
  44. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, XSIZE_PHYS - 1, g_tTPSL.usAdcX1, g_tTPSL.usAdcX2);
    1 q8 ?' r3 a; ~: f, K4 _) Q1 i
  45. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, YSIZE_PHYS - 1, g_tTPSL.usAdcY1, g_tTPSL.usAdcY2); ' q& ?/ ^! F$ t# @+ U

  46. # y# I, {( {2 b* V% K
  47. /* 查看是否需要切换X,Y*/+ T5 I7 G/ [* f4 S5 A& R) X8 h
  48. if(g_tTPSL.XYChange == 1)
    9 o3 U5 {' l$ U# t
  49. {) U0 v* n* v* g* O% E: N
  50. GUI_TOUCH_SetOrientation(GUI_SWAP_XY);% H0 [! `9 `% E8 H( A/ @1 p
  51. }
    2 G9 `7 u- @. d4 P: f  @
  52. }6 P( k6 M3 F- {  K* i# Z* a) W
  53. }$ z9 g' m2 \) n0 M1 e% n
  54. else
    ' N) k3 O, B3 _% L; \; v
  55. {
    9 X2 K! e- Q8 M; K! j
  56. LCD_SetSizeEx (0, 400, 240);
      ]; j1 m: d1 b5 R* A
  57. LCD_SetVSizeEx (0, 400, 240);2 n9 k3 {4 \) Z; v3 b
  58. ( i" Q. r- I% v' {7 D0 v/ R
  59. /* Touch calibration */
    , q" {  U, E) R5 L9 ]0 i
  60. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 399, 300, 3600);$ q9 p# I: |8 W2 n+ i7 W" O
  61. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 239, 273, 3671);
    , C2 Q; F) J9 o
  62. }, k; `' T8 h3 |" W
  63. 8 q5 x  w, h9 N' X
  64. }
复制代码

, ?6 y: l8 k; ~: }. I
baiyongbin2009 回答时间:2015-1-8 18:30:51
2.4  STemWin带RTOS的移植
    带系统和不带系统的区别就是添加一个驱动文件并添加RTOS相关文件即可,STemWin软件包里面提供了一个FreeRTOS的驱动文件,而MDK安装目录里面提供了好几款RTOS的驱动。所在路径如下:
        MDK4.73安装目录:C:\Keil4.73\ARM\Segger\emWin\Sample\GUI_X
        STemWin软件包:STemWin_Library_V1.1.2\Libraries\STemWinLibrary522\OS
2.10.png
                              
    用户更具自己使用的OS,并添加此驱动即可,下面是FreeRTOS的工程目录。
2.11.png
2.5  总结
    整体来说,STemWin的移植不难,难的是底层驱动的优化,如何让它工作在最佳性能状态。这里有三个DEMO演示视频(分别是3.0寸,4.3寸和7寸的视频)供大家欣赏下:http://bbs.armfly.com/read.php?tid=1545。

% X" U) ]( M6 }( q0 N7 C! p
默默前行 回答时间:2015-1-8 18:32:52
感谢楼主分享。
moyanming2013 回答时间:2015-1-8 19:51:43
有没有STM32F429DIS的移植??谢谢!
那片清茶 回答时间:2015-1-8 20:05:48
楼主什么时候出数字信号的例程啊。。
zhous 回答时间:2015-1-8 20:11:28
点赞啊!!!
baiyongbin2009 回答时间:2015-1-8 20:12:02
moyanming2013 发表于 2015-1-8 19:51+ Q  C6 R1 M- T( t/ u, \+ [
有没有STM32F429DIS的移植??谢谢!

$ f8 s. x) w) P. u) ?) ]( c  j4 C1 ]; ~! L移植详解,是官方移植好的:http://bbs.armfly.com/read.php?tid=1958
baiyongbin2009 回答时间:2015-1-8 20:12:38
那片清茶 发表于 2015-1-8 20:05
: U% t7 P" U- R' j5 |. k0 I楼主什么时候出数字信号的例程啊。。
7 h# H" F* z; h" e* I; J
很快了,这几天正在赶工,这个月15号前就发布。
moyanming2013 回答时间:2015-1-8 20:14:48
baiyongbin2009 发表于 2015-1-8 20:12  ~1 `; A" S8 K' M+ J! j
移植详解,是官方移植好的:http://bbs.armfly.com/read.php?tid=1958
) u- Q0 E& p$ B$ C, M  d
太好了,LZ有没有429或439的板子出?
boyubeiyu 回答时间:2015-1-8 20:21:21
安富莱的资料一向很给力
那片清茶 回答时间:2015-1-8 20:57:17
baiyongbin2009 发表于 2015-1-8 20:12/ H/ F4 }* [" _+ r
很快了,这几天正在赶工,这个月15号前就发布。

# j+ @" O: v/ P& }有没有图像处理的例程,也可以共享出来。
baiyongbin2009 回答时间:2015-1-8 23:13:46
moyanming2013 发表于 2015-1-8 20:14
9 @9 f/ f* J; K太好了,LZ有没有429或439的板子出?
: D7 O2 u& F! b
这个得春节后了。
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版