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

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

[复制链接]
baiyongbin2009 发布时间:2015-1-8 18:14
本帖最后由 baiyongbin2009 于 2015-1-8 18:18 编辑 / S6 Y$ w' b! s: V0 _+ V& K7 }% U
; u& x+ s2 E4 |- N; B
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第2章  STemWin5.xx详细移植步骤
/ ?) v1 J4 V5 Z' O$ N% i
    本期教程开始带领大家学习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 总结

/ q8 V8 |: x3 v) |
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

" A7 e% d- ]0 U, i
    其实这个是针对SEGGER自己做的emWin源码而言的,SEGGER授权给其它厂商后,芯片厂商都对源码进行了优化,要不FPU的存在就没有意义了。上面的GUI_CM4F.lib文件就是KEIL公司对emWin中需要使用浮点的地方进行了优化。
    第二步:注册RL-ARM,点击File->License Management
2.3.jpg
5 C; P$ }/ Q$ @5 q" }& x
    第三步:注册RL-ARM,点击File->License Management
2.4.jpg

: B/ k  f& S! }! [6 q) H, a
    第四步:注册机的设置
2.5.png

8 s2 v" P  B( b
    这些准备工作做好后就可以开始移植工作了。
2.2.2      STemWin移植
     STemWin的移植准备工作比较简单,用户只需在初始化STemWin前使能CRC校验即可。STemWin的库文件如下:
2.6.jpg
/ I, l$ z- l0 g$ k' p9 a  c+ k
    这里面含有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
7 l* w2 M% t7 I# v6 F* \9 B
收藏 评论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. /*3 j3 T# g8 d% F% t9 R8 F6 a# T
  2. *********************************************************************************************************7 W/ [& G# ?. p
  3. *    函 数 名: TOUCH_DataFilter
    4 Y* n" ?2 T5 G; p3 M- |- K
  4. *    功能说明: 读取一个坐标值(x或者y)
    % S5 c- i" _7 e) k
  5. *             连续读取XPT2046_READ_TIMES次数据,对这些数据升序排列,& \/ Q4 n/ `* H2 F
  6. *             然后去掉最低和最高XPT2046_LOST_VAL个数,取平均值
    2 ~+ V: {/ I( l4 Y: ]# Q1 _
  7. *    形    参:无
    " G" [: [3 f+ _# N* ~2 r
  8. *    返 回 值: 读到的数据$ h  _  Q2 ^$ [; b2 z: Y/ B: Z
  9. *********************************************************************************************************
    : c  |3 s% ]7 ?: a) S& a+ }
  10. */: l. E% O9 R& g2 [- {0 a
  11. /* 读取次数 */
    % x, I8 Y. k! q
  12. #define XPT2046_READ_TIMES    59 o1 U# i! p9 ^6 @1 I
  13. /* 丢弃值  */1 [3 |1 K, `+ r- b" p' y/ u
  14. #define XPT2046_LOST_VAL      1       W& i/ _$ X3 \7 ^3 J; v
  15. uint16_t TOUCH_DataFilter(uint8_t _ucCh)5 u5 f; K! r" z: U+ Z: S. ~9 |6 h
  16. {9 m1 P' m# m% n8 e
  17.      uint16_t i, j;
    9 N7 E7 `, |6 n/ R. w
  18.      uint16_t buf[XPT2046_READ_TIMES];
    ( Q3 C0 i  _, a
  19.      uint16_t usSum;
    - r+ a# p  C! D' c) R* M& E
  20.      uint16_t usTemp;  l& }' s0 e/ X% C

  21. ( \' N( k" I4 m/ C8 @9 T
  22.      /* 读取READ_TIMES次数据*/( x* R5 j% j2 _& R9 C! s$ [) e
  23.      for(i=0; i < XPT2046_READ_TIMES; i++)! B* a( [8 l4 `/ `9 h) D
  24.      {% y8 A9 \3 Y% T8 D
  25.          if (g_ChipID == IC_8875)% ~$ f5 \  M- w6 |% R& b9 K& h1 J3 V
  26.          {
    7 ^, w5 p5 Q; ^9 X' K8 A2 ?2 A
  27.               if(_ucCh == ADC_CH_X)
    * p- s' s* Z4 i
  28.               {
    1 m! O% W* {9 _0 d
  29.                    buf[i] = RA8875_TouchReadX();
    ; r1 v7 o9 t" K. {1 c0 q* Y
  30.               }& s+ _+ t3 N3 W5 i( `
  31.               else* H) e% J  Z' a) E
  32.               {2 X+ w( Y# i  \
  33.                    buf[i] = RA8875_TouchReadY();   
    " _# K7 @8 e; V
  34.               }
    6 a. }+ N$ J. F. b- F; r
  35.          }
    % O0 V9 Y5 {( h3 @& e/ l
  36.          else
    * c2 _4 ?' ]' e, t+ w
  37.          {
    1 n3 o1 p. }- Q4 g
  38.               buf[i] = TSC2046_ReadAdc(_ucCh);
    ! m$ c. `; n1 e
  39.          }   
    3 c+ H) b1 s% F5 G' x# R( u! e
  40.      }
    7 V2 L1 w- P( R& U
  41.    
    4 X- }4 g# A) u6 X9 Y
  42.      /* 升序排列 */                  
    4 T% L- e1 N, k2 {
  43.      for(i = 0; i < XPT2046_READ_TIMES - 1; i++)7 h$ x- W, I3 z( X. ^) g
  44.      {
    $ g- o5 D5 Z9 B% m
  45.          for(j = i + 1; j < XPT2046_READ_TIMES; j++)+ O! @( o- b4 `7 r
  46.          {+ K2 ]; s: K. I
  47.               if(buf[i] > buf[j])
    * ^' E; f/ q9 F, F$ i. ~* R, G3 o
  48.               {, B5 G' v& D1 ]& ]5 z. j
  49.                    usTemp = buf[i];; T+ {# S7 T( p: ~
  50.                    buf[i] = buf[j];/ }: x* D7 Z2 {
  51.                    buf[j] = usTemp;
    + b& J- M% _+ s
  52.               }
    + i6 @# d; l; z: C4 e2 s  I
  53.          }/ v1 B! ]9 s& l5 Y3 K8 l$ u, D
  54.      }
    ( h3 h, _' m6 }
  55.         5 O6 O# l! b, |- F9 o
  56.      usSum = 0;; E9 X! u# [' c6 q. s

  57. & K/ V' r" N0 B- N* [
  58.      /*求和 */0 H5 h2 [, A0 T- }6 i3 b
  59.      for(i = XPT2046_LOST_VAL; i < XPT2046_READ_TIMES - XPT2046_LOST_VAL; i++)4 D; r0 ?5 }, C. Q: l9 w
  60.      {4 K8 f9 p6 m- P/ s
  61.          usSum += buf[i];: x) U$ N2 [7 s7 o" Q: ~
  62.      }
    , X) E. M0 D$ t! b5 v( V: w8 a
  63.      /*求平均 */
    % x& ^; @, h% o1 r" \/ h
  64.      usTemp = usSum / (XPT2046_READ_TIMES - 2 * XPT2046_LOST_VAL);; R9 W7 Q% @8 K! H' q4 t
  65. " e1 t1 {$ \* D2 H5 A% u% P6 x4 T$ D
  66.      return usTemp;3 K9 C8 M/ Q* A. p) O. Y, y- |+ e/ y
  67. }
    & E9 ^6 Z" _/ z7 Y- s3 ~# a
  68. ( C1 n) Y' W) A+ u* i" d
  69. /*
    1 c& b2 f: D5 Z1 s7 O" v: Y4 B
  70. *********************************************************************************************************0 z: D2 @6 D  I* {) B
  71. *    函 数 名: TOUCH_ReadAdcXY5 H7 F. e8 {1 n8 \, t
  72. *    功能说明: 连续2次读取触摸屏IC,且这两次的偏差不能超过% C: m* Y  }6 Q' b
  73. *             ADC_ERR_RANGE,满足条件,则认为读数正确,否则读数错误.2 I4 R4 ~' D8 p  W. b: I. n
  74. *             该函数能大大提高准确度
    " w- B4 q  |; W" T% ]3 m
  75. *    形    参:x,y:读取到的坐标值
    + ?! h5 Y2 K; ?
  76. *    返 回 值: 0,失败;1,成功/ C  B9 o1 \& z4 Q
  77. *********************************************************************************************************( x$ K1 e4 d/ G' n; h
  78. */$ y. u* ~" @/ f2 _
  79. /* 误差范围 */ 4 [) l6 g$ ]; l- Y
  80. uint8_t ADC_ERR_RANGE = 5;
    8 d' V, Z* p, y, a4 P: @7 q
  81. uint8_t TOUCH_ReadAdcXY(int16_t *_usX, int16_t *_usY)
    , a' f9 d4 J) ~0 m% e0 O
  82. {
    4 F# I8 d) Z0 M; ~) L4 [7 }
  83.      uint16_t iX1, iY1;
    ) R" E4 f4 v9 i/ V6 Q  i  W- ?
  84.      uint16_t iX2, iY2;
    6 |9 F6 k+ C! g* L$ l
  85.      uint16_t iX, iY;. i* K1 M* F+ l# k
  86. 1 A% @6 N8 B+ Q# x! I
  87.      iX1 = TOUCH_DataFilter(ADC_CH_X);
    : i% u: f/ c$ P3 i& ^+ L) s) a
  88.      iY1 = TOUCH_DataFilter(ADC_CH_Y);9 q4 f5 G" K" {+ X8 e' @
  89.      iX2 = TOUCH_DataFilter(ADC_CH_X);* r% ?; a# O% s1 K  j
  90.      iY2 = TOUCH_DataFilter(ADC_CH_Y);4 B8 I( s! e" C3 h
  91.    
    4 G! t! u5 M3 @+ ]5 ~3 i
  92.      iX = TOUCH_Abs(iX1 - iX2);
    3 I$ b2 t" B& T( E0 d$ K9 B1 L
  93.      iY = TOUCH_Abs(iY1 - iY2);+ J( O$ a/ ~% {% Q, h7 y
  94.     & w$ v, ]# X% q# k2 G0 V! ^
  95.      /* 前后两次采样在+-ERR_RANGE内 */ 8 `8 h8 b, B; L5 V$ z2 p
  96.     if ((iX <= ADC_ERR_RANGE) && (iY <= ADC_ERR_RANGE))( b2 \8 P1 q5 [( A% O" j' g9 u( U2 K7 h
  97.     {        
    % N2 n* P4 H$ P7 G: U
  98.          *_usX = (iX1 + iX2) / 2;6 O) v( p9 `! c- G% m; Q5 ?
  99.          *_usY = (iY1 + iY2) / 2;   & Z) }+ M7 r* @6 R

  100. ( C5 g  B0 R6 j2 P# R5 B5 A
  101.          return 1;
    . m/ N/ t& t1 n% J7 E! B+ ?
  102.     }  t( q( h" n) k
  103.      else
    5 y/ F. Z8 l6 |- A: F
  104.      {% _& s# p1 C; w  ]0 {' k
  105.          return 0;$ x1 r) ^) V3 m8 `) C$ I
  106.      }   
    ; O% M& z- q( l2 f; [0 i. `
  107. }
    % D& z* P, ^8 |( V
  108. $ |2 j1 \% z) ^+ d; u# w, e
  109. /*% ^# s& K7 e( o9 F' g
  110. *********************************************************************************************************
    ) M' i6 j7 n' h$ |5 X4 }
  111. *    函 数 名: TOUCH_Scan, j& m/ s9 s: A. @7 B# u0 ]# R
  112. *    功能说明: 触摸板事件检测程序。该函数被周期性调用,每ms调用1次. 见 bsp_Timer.c
    1 B( ~: Y- B3 \6 o
  113. *    形    参:无
    # _9 |7 L# v. v  b$ Z
  114. *    返 回 值: 无
    2 L3 S+ N/ d- I# P3 ?
  115. *********************************************************************************************************% \0 W' Q1 l1 d
  116. */* F* R. b8 j5 n
  117. void TOUCH_SCAN(void)
    * f0 o8 Y. S9 P# l) |
  118. {
    3 x" ]9 j. E6 c. |2 O
  119.      uint8_t s_invalid_count = 0;
    : Z4 a  g. E% x' G0 b  N# J
  120.     2 `% v6 O( L; w4 ~5 g4 l
  121.      if(TOUCH_PressValid == 0)+ @; q! ~3 x- f. Y6 E
  122.      {            % B8 _* N, N8 g7 l! i8 U
  123.          while(!TOUCH_ReadAdcXY(&g_tTP.usAdcNowX, &g_tTP.usAdcNowY)&&s_invalid_count < 20);
    * T" P, ?9 u3 X) V
  124.          {( `( J. l5 j# ^6 `' C# a, a% U
  125.               s_invalid_count++;( A7 V* e5 o- Y0 R6 n. \9 i
  126.          }
    . Y' l, ~% m. D3 |1 t- F
  127.          if(s_invalid_count >= 20)
    ! _$ ]) A* j! r# f2 h
  128.          {0 T# Q, l# C7 `+ {+ y* N/ B5 c0 ^
  129.               g_tTP.usAdcNowX = -1;1 E9 E: G; \& g8 v! Q
  130.               g_tTP.usAdcNowY = -1;
    . C5 j) f3 q. }" ]2 j( d; ^9 U
  131.          }6 p' @+ [- e, e
  132.      }9 n  s4 k3 x% `2 Y, Y
  133.      else
      n) F/ n  s1 h! u: W; h
  134.      {
    6 Q$ p! O9 K  g2 u
  135.          g_tTP.usAdcNowX = -1;
    ( }" G7 p" m) G: _, z% D" L2 s
  136.          g_tTP.usAdcNowY = -1; $ S& M5 v# C7 U- x5 ~5 d7 M+ _
  137.      }
    0 E9 F. K0 P8 {5 b9 Z2 u. ^# V
  138.             
    5 T7 v$ Y1 [' z* \4 Z; T
  139. }
复制代码
    触摸的驱动就这些东西,详细的使用看例程级可以,然后在文件GUI_X_Touch_Analog.c里面调用就可以了。
  1. #include "GUI.h"
    " ?) @1 g9 h7 R+ ?: @/ Z1 p+ {
  2. #include "LCD_RA8875.h"
    1 D6 E" ^3 Y) i7 t! K
  3. #include "bsp_touch.h"6 n3 V. e" I2 }1 J, ?. Y& W! I
  4. $ l7 Z7 R4 x% U- ?9 t4 q
  5. void GUI_TOUCH_X_ActivateX(void); h1 D# r$ X( K- N; G
  6. {
    7 ]8 j! w4 p9 r/ D
  7. 5 b. D) D0 N7 l! b$ V% W
  8. }
    1 J2 p5 N0 e$ i* ]
  9. 6 V5 M$ a! ~. T( {
  10. void GUI_TOUCH_X_ActivateY(void)
    ) M; T6 e$ y& p& x7 c" A
  11. {* J1 r7 H1 I, R& _" n7 C  U/ ~
  12. % @2 t$ f. B" U. E9 a
  13. }3 \8 p" k. P' r/ H4 E5 u$ s
  14. + t: ]" K/ O* s, |7 q5 S6 t: U
  15. int  GUI_TOUCH_X_MeasureX(void)
    & ?; g+ Y- O, n2 a
  16. {
    / Y6 G7 I4 z& X! V# o
  17.      TOUCH_SCAN();  x6 H# h& d% K4 r" v
  18.      return(g_tTP.usAdcNowX);        
    4 Y9 x5 G. |% B
  19. }. G6 F3 ~; V7 q- q
  20. % k* c. f3 t8 u' g0 c
  21. int  GUI_TOUCH_X_MeasureY(void)7 d3 {' T  _: D5 K+ X
  22. {   
    ) V0 i  d: g' R# K' V7 D& B8 j
  23.      return(g_tTP.usAdcNowY);
    2 i6 c1 y; ?  L- }5 o6 a$ `6 @$ I/ ^
  24. }
复制代码
" ?- P/ g! ~1 N' E. j4 E' f
% G5 n/ {  ?+ }( q1 M& c
baiyongbin2009 回答时间:2015-1-8 18:24:33
本帖最后由 baiyongbin2009 于 2015-1-8 18:28 编辑 5 L' y  S* p" h5 C+ V

: w$ a* S. ^7 i8 A' k1 G3 v2.3.3       底层驱动接口函数(GUIRV_Template)
    STemWin的底层驱动函数也很简单,用户只需提供打点和读点函数即可。但是这种没有经过优化的移植方式非常的影响STemWin的实际性能。这里就针对RA8875说一下需要优化的地方。
l  画水平线的函数
/*********************************************************************
*
*       _DrawHLine
*/
static void _DrawHLine  (GUI_DEVICE * pDevice, int x0, int y,  int x1) {
//  LCD_PIXELINDEX ColorIndex;
  m$ J: w- W3 O6 r  B. \* v
  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);

% o% T! y# M0 y% p' `* U/ W+ p
         }
       #endif
    }
}
l  画垂直线的函数
/*********************************************************************
*
*       _DrawVLine
*/
static void _DrawVLine  (GUI_DEVICE * pDevice, int x, int y0,  int y1) {
//  LCD_PIXELINDEX ColorIndex;
- J$ E" R/ ^1 s6 V9 S% L
  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);
         }      
     }
5 M1 _( T- i1 K- K+ G' }
#else
     for (; y0 <= y1; y0++)
     {
         _DrawHLine(pDevice, x0, y0, x1);
     }
#endif
}
l  绘制16BPP的函数
  1. /*******************************************************************************************************
    ! u) ]0 {( j) {  p5 h
  2. *! Q2 n, k( g* A: ^( i7 {% u( ?
  3. * Draw Bitmap 16 BPP, not optimized  [3 x9 u: Y, j1 X8 W' I3 }( j
  4. */; A& q  \  {' E( Y8 G* L
  5. static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {2 V4 t' a% ~; F7 P8 a: ]1 A+ O
  6. #if emWin_Optimize/ {, L  n% n* T' ?2 y9 ?
  7. s_ucRA8875BusyNow = 1;
    # C# H' H% C! B, d: H
  8. LCD_DrawHColorLine(x, y, xsize, (uint16_t *)p);" N1 S: x4 e, A6 O- W
  9. s_ucRA8875BusyNow = 0;9 e# f6 u  H1 i( e' Z
  10. #else
    4 w& d5 e$ |% o$ X( e) I" b# q
  11. for (;xsize > 0; xsize--, x++, p++)
    , e( F6 p7 E* g, U5 ~9 l
  12. {
    # R: r) i  S: g+ E! Y/ T* I
  13. _SetPixelIndex(pDevice, x, y, *p);
    % d+ J8 r: s! C4 a
  14. }1 F5 d  V) I; p; j2 @0 s
  15. #endif
    " D4 g0 e) a1 R2 D
  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;
}
    优化好上面四个地方即可。

/ U8 Q8 h" ~% u- ~
baiyongbin2009 回答时间:2015-1-8 18:27:56
2.3.4       系统函数配置
    STemWin的底层驱动做好以后,就可以进行GUI和LCD的配置工作,这个是官方提供的配置流程:
2.9.png
1.    GUI的配置
    主要是配置STemWin所需的动态内存,下面的配置方式支持使用芯片内部存储器也支持使用外部存储器(比如:SRAM,SDRAM),使用外部存储器的话,一定要记得初始化相应器件。
  1. ----------------------------------------------------------------------
    2 I3 K' d  F0 a, R. `) i* p5 L6 p
  2. File : GUIConf.c
    6 `2 T1 M4 U+ |- \1 i* _# ?0 _
  3. Purpose : Display controller initialization/ [, v7 L9 Q* c
  4. ---------------------------END-OF-HEADER------------------------------% U, w$ }5 ]$ Q
  5. */0 k9 a4 G* M; v$ J
  6. #include "GUI.h"
    + K( U, U" J& d4 \; Y
  7. #include "bsp.h"
    0 ]8 U* X  w4 X% E; G5 E
  8. : k  a  L2 \* g1 d+ g
  9. /*
    & y% V/ h$ H; \6 P* m1 P( p
  10. **********************************************************************, L# P5 [# F$ G0 f, L9 \
  11. *
    7 f6 X9 S+ a3 @7 B+ p
  12. * Defines& d: X5 \6 S- b9 s- ^0 }4 a
  13. *
    * x. q+ d+ I: F8 t# h
  14. **********************************************************************
    ! n2 U* T* \# \1 c
  15. */+ H" q6 `7 ~7 p1 x  ^% s7 N; M

  16. ( b2 O* V) R& X8 w1 {) H, Z
  17. /* Define the available number of bytes available for the GUI */
    * f6 O2 e! g3 m1 E, y1 q
  18. //#define GUI_NUMBYTES (1024*105)2 j8 M( I) |" _3 P/ Q
  19. #define GUI_NUMBYTES (1024*100)
    0 o. K* W& _5 B
  20. /* Define the average block size */
    ) o3 M( h, ^; W  T, g
  21. #define GUI_BLOCKSIZE 0x80
    - v/ z; g* l# l% J& i& t
  22. 3 I% E0 X5 H2 k( L/ w+ O4 [
  23. /*********************************************************************" a  ?6 w" C1 q. T
  24. *0 @5 u- B- S3 m. w& V: {$ }; F
  25. * GUI_X_Config
    , ~0 `/ R" v/ E: {! R& y
  26. *8 \: S  @3 Z: k- i
  27. * Purpose:
    ; z; T6 }5 ~, G# Q  P+ E" A* I
  28. * Called during the initialization process in order to set up the0 e8 T# Z# s( ]. _: U9 y/ H
  29. * available memory for the GUI.3 K0 T$ ^1 b! O
  30. **********************************************************************
    0 u. r6 ~4 e& e
  31. */
    9 m! ~" n  ]' p2 A6 _
  32. void GUI_X_Config(void)" F9 Z2 e4 I( U0 O
  33. {# Y4 S, m! K3 r3 u8 C
  34. #if 1 //使用芯片内部内存
    8 @" X6 `# i2 z; q0 u! [# B" {
  35. /* 32 bit aligned memory area */
    0 ~: e# l0 P  M7 j; [3 L9 c
  36. static U32 aMemory[GUI_NUMBYTES / 4];; A+ G! G- H2 c; {
  37. . `: t1 N/ m$ Y+ L0 ~0 W0 }; p& a
  38. /* Assign memory to emWin */
    2 u0 X9 Y- o2 ]1 j% |& w
  39. GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
    , [# d* G8 M" V6 \1 _( I" h, C
  40. GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
    5 C, s2 C' t- b+ z0 T, U
  41. #else//使用外部内存
    , G: a6 J* m1 M
  42. static U32 *aMemory;3 M; y5 Z/ P' c8 R3 U- x
  43. aMemory = (U32 *)EXT_SRAM_ADDR;
    $ s: H7 b7 f  t! t
  44. /* Assign memory to emWin */1 V1 }4 H% O( x7 J0 [
  45. GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);( Y/ F1 L. ?3 J% H2 g+ |, k
  46. GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);  R% Z( w* D5 {! Z' _5 k" T
  47. #endif
    : g# m! x7 k: D- Z& m, g; t# F  x
  48. }
复制代码
2.    LCD的配置
    LCD的配置按照上面官方提供的驱动流程执行即可,下面是详细的代码。
  1. /*
    ; z0 {4 C# i$ J% G/ F# }1 T- n2 P% i
  2. ****************************************************************************
    0 @% O) ^$ Z$ z; A% o8 W
  3. *2 F; b) G* z0 D
  4. * LCD_X_Config
    5 j% E; p+ I$ Q/ |+ A( Q6 [
  5. *
    3 H! s+ v0 d- x7 w9 @/ _
  6. * Purpose:9 C+ l+ g, z6 t
  7. * Called during the initialization process in order to set up the- `' V+ T  _' k0 i" S4 |) \
  8. * display driver configuration.
    1 _0 b% M( M  \
  9. *6 g+ u0 x3 X( N8 O+ \4 p% H
  10. **************************************************************************** 0 N; T$ x- F" z% ?" F1 ]4 `$ M
  11. */* w+ v7 Q- b2 Z% C' M$ v
  12. void LCD_X_Config(void)
    3 G/ a# e) C6 U$ M
  13. {( Y* R7 N6 K! G# J  R  o
  14. /* 读取EEPROM中的参数 */
    ' m  V/ k" c1 }1 {% v
  15. ee_ReadBytes((uint8_t *)&g_tTPSL, 1024, sizeof(g_tTPSL));( X% p% ]! ?: [: ^" x* v8 m
  16. - ~7 o# }$ H6 i7 D
  17. /* Set display driver and color conversion for 1st layer */7 [) {% @6 e, _3 J9 X
  18. GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
    0 {; t$ ]5 I/ \) D. E
  19.   c7 p* p+ P% A1 q. W3 L
  20. if (g_ChipID == IC_8875)
    ; G: y7 N. k/ l* w
  21. {
    : q9 E$ H4 X& g  [
  22. if (g_ucGPIX == 1) /* GPIX = 1 4.3 480x272 */
    * P% A0 @) ]' G- W. ~
  23. {
    ) ~0 K$ r: w, t' d
  24. /* Display driver configuration */$ w( U: ]8 s& b
  25. LCD_SetSizeEx (0, 480, 272);1 }% G! H2 C8 m' r
  26. LCD_SetVSizeEx (0, 480, 272);
      ]( [/ f" s: F; C3 P
  27. ( S7 g3 R# y) _: w+ {
  28. /* Touch calibration */5 J" \' T  F- v2 z1 K3 o
  29. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 479, g_tTPSL.usAdcX1, g_tTPSL.usAdcX2);
    & y  J/ \3 H  m! @' i
  30. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 271, g_tTPSL.usAdcY1, g_tTPSL.usAdcY2);, g2 l: J) `$ k2 C: L8 M  I  t: f

  31.   |; P0 E% y, y
  32. /* 查看是否需要切换X,Y*/
    & M( T; p; n. \: F. O: i  ?. I
  33. if(g_tTPSL.XYChange == 1)6 ?; Y& h4 c6 B7 L
  34. {% c9 H' p) g2 U4 Y5 }" E% v$ \
  35. GUI_TOUCH_SetOrientation(GUI_SWAP_XY);
    5 p& D! W; M# n' A, S* |
  36. }* q/ C0 T. u8 @6 E; [5 I8 w1 I
  37. }% `. {* T' ]& r$ @: P- z
  38. else /* GPIX = 0 7 800*480 */# n. r" }8 x0 `' O  L
  39. {
      D; Q$ w4 r) a% ~/ K& g
  40. /* Display driver configuration */7 B6 b. r8 |: G1 E
  41. LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
    ( E; u# ]- P- P9 F
  42. LCD_SetVSizeEx (0, VXSIZE_PHYS, VYSIZE_PHYS);
    2 V9 C3 R& p! q+ P
  43. 0 q4 b' B1 j8 v0 a2 y/ F7 b! C
  44. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, XSIZE_PHYS - 1, g_tTPSL.usAdcX1, g_tTPSL.usAdcX2);0 l( K+ v$ N5 y
  45. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, YSIZE_PHYS - 1, g_tTPSL.usAdcY1, g_tTPSL.usAdcY2); ; V' D2 r2 R1 h
  46. , ^3 K; Q" E9 R, H
  47. /* 查看是否需要切换X,Y*/' \! C8 \6 y9 B5 G
  48. if(g_tTPSL.XYChange == 1). T* d0 I+ |) I/ H8 n7 N
  49. {
    7 Q0 i# G- |8 X2 o; u* T$ S4 X5 w
  50. GUI_TOUCH_SetOrientation(GUI_SWAP_XY);
    , m' b, @$ c, r4 }+ \
  51. }  b5 o) K" r. l  L( j1 G' I& L
  52. }( L4 ^6 S  a- t
  53. }
    " Z! \2 k, [1 e3 R% n6 [
  54. else, i/ L3 k6 g6 k- Z! z
  55. {/ O2 E. Z+ w1 g6 f1 k$ ~
  56. LCD_SetSizeEx (0, 400, 240);: t( P6 C1 g, {$ K+ [
  57. LCD_SetVSizeEx (0, 400, 240);" P- L+ A$ K0 G$ g0 A, i+ D: ~, b7 y/ _

  58. ' S( x. o6 m- z
  59. /* Touch calibration */" Z8 e8 H6 I& `, L+ d# k2 V
  60. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 399, 300, 3600);
    * U( z2 A& F# `7 J% \) s/ P/ D1 s6 N
  61. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 239, 273, 3671);
    ! C+ E# m, N& y5 j
  62. }( b  W! c3 M+ |, V& J; w; \% o

  63. * g# j/ K# H$ x4 s9 N
  64. }
复制代码

9 K; j; @; V4 n/ N" O& n
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
  ]  b  X9 i' s' Y. H* a3 O, [. _
默默前行 回答时间: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:513 j- O  `. n: k: i5 M6 P7 C% I8 f
有没有STM32F429DIS的移植??谢谢!
, ^+ v/ _! a; B) Q7 |4 [
移植详解,是官方移植好的:http://bbs.armfly.com/read.php?tid=1958
baiyongbin2009 回答时间:2015-1-8 20:12:38
那片清茶 发表于 2015-1-8 20:059 l! o7 _8 a) i( V; N. y! G
楼主什么时候出数字信号的例程啊。。

: A# T& D+ W2 w& o( E% ^5 ~" T很快了,这几天正在赶工,这个月15号前就发布。
moyanming2013 回答时间:2015-1-8 20:14:48
baiyongbin2009 发表于 2015-1-8 20:12
5 f: x6 [1 S# u& V- K移植详解,是官方移植好的:http://bbs.armfly.com/read.php?tid=1958

& b) G4 l4 [4 W2 u太好了,LZ有没有429或439的板子出?
boyubeiyu 回答时间:2015-1-8 20:21:21
安富莱的资料一向很给力
那片清茶 回答时间:2015-1-8 20:57:17
baiyongbin2009 发表于 2015-1-8 20:128 J. M9 S8 G+ e" E+ J8 `1 {: y
很快了,这几天正在赶工,这个月15号前就发布。

, n/ t8 y" {: f有没有图像处理的例程,也可以共享出来。
baiyongbin2009 回答时间:2015-1-8 23:13:46
moyanming2013 发表于 2015-1-8 20:14: J5 ~( `/ ^5 d; ~
太好了,LZ有没有429或439的板子出?

5 I' [" X. o5 ]; s8 L  ]这个得春节后了。
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版