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

开源GUI LittlevGL V5.0版本移植  

[复制链接]
creep 发布时间:2018-1-13 18:42
本帖最后由 creep 于 2018-1-13 19:17 编辑 2 _) x# ?6 U- d8 @( u1 X
* B7 v( O4 s5 L
             最近看到越来越多的小伙伴在讨论littlevgl,这说明这个开源GUI正在被更多的人了解和使用,最近littlevgl正式推出了V5.0版本,完善了整个代码架构和一些API及函数的命名,重新设计了移植的接口方式,添加了众多的控件及可更换主题等功能。我之前在STM32F769-DISCO 上移植了V4.2版本,下面的移植使用最新的V5.0版本的源码。1 W) [& |, _* e0 p* p

+ p4 G. t# O2 r) E( R& O9 _
" x5 B: L- i5 Y: [
                                  IMG_0407.JPG
! Q, [" t+ ]# M: d
. Y% H3 E# ]. _" C. k/ \
7 M! c3 B" {. W/ D* Y. ?
1、V5.0新特性/ J; W3 q' g7 V% Z, l) |6 e# R! j
f80ce980-bcd9-4d2c-a19c-0978a125bd04.jpg
( {9 R: A) p( N+ z0 S
. h& J( F" F5 Y+ P5 D. N. X6 B) a源码提供了各种内置主题可以选择比如下面的黑色主题
' d6 C' X' Q% }1 c8 n% ]3 E6 v: r; w( E. T7 ~' ^, p1 I6 [
Elegant dark theme which shows confidence and high quality.
: ?- S! o6 ]! M  q$ z4 c9 S, t8 L
539cce83-09fc-4d77-9478-9edcfb83b7b6.jpg
4 w. F' W& _+ P. X# m9 ^/ {+ ]0 D( u$ u7 p. g, d% W5 c4 p! b1 U
下面的是Android's material design风格主题
9 }( K  K8 k; `; F
0 h& G8 b' D+ A
3fe6c4e1-4051-4b1d-b917-1b0d114aa23a.jpg
; P' E; M6 l. V; }4 h; |4 _
+ t& g( b2 p4 }1 `; _
6 V, W# ], I. {6 f
更多主题可以到官网查看:http://littlevgl.com/themes
1 ^2 t1 N, k; y+ }# @0 lUnicode support、Symbol fonts 支持  [7 _' p9 e, W, z# i
) f4 G% m2 o& T$ F; m/ _
ffd05b20-3bde-4ee1-b7d3-a148a0a2df50.jpg 3 w6 ~/ ]% ?8 O4 i* g% p
e84cd541-ebe8-454a-8151-c173e885ad10.jpg
1 l/ z# G5 P+ I5 a4 `: H
$ R- C2 Q0 z5 e& I

0 G& A" e- u- D! v! _% v5.0版本也增加了一些新的的控件:http://littlevgl.com/object-types
/ t! P4 j2 z( Y4 A# d6 `" G" E/ e% O/ n$ S9 k) E/ Q5 L# j
4a59d689-35c5-4c1b-9087-fb75bbe84999.jpg
1 k0 w) P; b* z更详细的请移步官网:http://littlevgl.com/basics) |9 f( r5 D6 q: V4 }, ?! g8 T  D
4 w' H+ T6 i+ A% `" R9 W2 J
2、移植
1 K1 C- t7 `+ H! P( L官网给出的移植要求如下,littlevgl 的移植性很高,基本不需要单片机外部资源。
7 R7 X$ b/ ^( I; _

2 K  R4 H0 \1 @) c# v$ h  w* B deea7166-3e0d-4344-b970-67f20c82a7de.jpg
+ n+ N7 }# I  L新的5.0版本的移植接口采用了函数注册的方式,Display interface、Input device interface、Tick interface ,只要实现这3个简单的接口就可以$ J0 ^' ?/ t8 A$ F% X3 [
简单的跑起来littlevgl,接口的移植的详细的说明可以参考:http://littlevgl.com/porting
" H+ H% h- x8 ]5 U
! K/ z, u2 r0 l7 C/ |  f* a# V5 C其中需要注意的Display interface,为了优化显示,可以使用2个Virtual Display buffers (VDB)并行的rendering and flushing。作者的移植例子使用的是DMA中断在进行background flushing。我移植的时候为了简单就直接使用的单缓冲,然后手动调用lv_flush_ready();。' F" e# `$ |4 G. U
+ p$ C& q2 S. a' M3 L

7 v: J% z5 j. J& Y
  1. /**
    , K3 d- C( I# n3 u* ?7 \
  2. * Flush a color buffer; O* M+ [& @; @! K
  3. * @param x1 left coordinate of the rectangle- P  {- q/ v5 r3 H
  4. * @param x2 right coordinate of the rectangle: I5 K% K0 x8 D# c. q+ B- j
  5. * @param y1 top coordinate of the rectangle" x( K8 y" Q- U. t& k* m
  6. * @param y2 bottom coordinate of the rectangle
    # Y, [2 Q1 o5 s' y' U; ~& q0 |6 M* R
  7. * @param color_p pointer to an array of colors
    * ]9 E/ s5 p# w% ^" b
  8. */
    / I0 ^$ |9 q. {, i) k3 D4 x/ {
  9. static void tft_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p), C# D( K0 B1 b% Z8 |4 ]+ ?4 X' b
  10. {
    5 q4 i4 T; K; \
  11.     /*Return if the area is out the screen*/
    , ^, Z5 x" r& G1 q1 V* T& U  W: N
  12.     if(x2 < 0) return;6 l  |/ B* z0 B# ?# A

  13. ) ?, C& }/ _  p/ ~' `, v+ w
  14.     if(y2 < 0) return;
    7 m6 c; i* X" |8 Q: k0 o, B% G
  15. - q8 v6 i& p1 N' l8 m
  16.     if(x1 > TFT_HOR_RES - 1) return;: p) a% }( |+ \" |8 p

  17. - u- R+ Z. W6 v) G' D
  18.     if(y1 > TFT_VER_RES - 1) return;
    + {8 u4 l) ~' m+ J+ m1 D. Q
  19. 8 c0 r3 r, T: j4 d. C# Y; w! O% K  |
  20.     /*Truncate the area to the screen*/
    $ r" K$ z; w- `/ u
  21.     int32_t act_x1 = x1 < 0 ? 0 : x1;. r, U7 P- p# v9 F& d* f& V
  22.     int32_t act_y1 = y1 < 0 ? 0 : y1;
      ^$ v1 k9 r3 d4 `+ ^, a
  23.     int32_t act_x2 = x2 > TFT_HOR_RES - 1 ? TFT_HOR_RES - 1 : x2;2 K& b( X2 r  ?% s! ^5 ~' G2 H) _" C$ H. P
  24.     int32_t act_y2 = y2 > TFT_VER_RES - 1 ? TFT_VER_RES - 1 : y2;$ X4 t/ E2 }- g4 z7 ]+ [

  25. # k* M* |/ }6 z* K
  26.     uint32_t x;8 u) A+ k8 U8 }0 T# C% g$ H
  27.     uint32_t y;
    & X. y, d; z" M6 U

  28. . ]5 F' F7 W, ?5 {1 ]
  29.     /*Put the map to the remaining area*/( T3 l4 ~" R5 u  a6 a5 L4 a, R
  30.     for(y = act_y1; y <= act_y2; y++)
    & W; w7 m" V& q  O
  31.     {8 y: c! M& n$ v# m: i; x
  32.         for(x = act_x1; x <= act_x2; x++)
    3 X& N$ ?% q% }  N9 n5 |& `0 |
  33.         {8 ]0 _3 R2 D. y' M
  34.             /*Your specific function comes here!*/
    ' N* _3 D/ D- W6 g# G. a/ j
  35.             /*my_put_pixel(x, y, color_p->full);*/1 Q) @6 G, \/ b! ~$ E1 r' e; z: P
  36.             BSP_LCD_DrawPixel(x, y,  ((color_p->full) | 0xFF000000));( o/ ^) O2 L$ F& r  I# w/ u
  37.             color_p++;
    , K; n  H+ i$ Q& e6 X/ x
  38.         }
    3 M( X& E/ M/ h0 E" K6 X# Q  \
  39. 3 C. B% S8 E) k. D2 N8 a+ l7 N
  40.         color_p += x2 - act_x2;        /*Skip the parts out of the screen*/* |* i3 z& E) B0 M
  41.     }7 i+ K- Z) T- h5 F9 ~( r
  42.     lv_flush_ready();1 t4 P( R  T; n# w  J: F' @3 b; m% D
  43. }
复制代码
: c8 F: H4 o6 E2 L0 f

9 V$ p2 \+ y# f) B首先测试下一个demo1 S- {/ \( E  }) D$ F0 Y0 K

' m7 o, [' d& |7 J
: H) Z3 z: H9 U) z IMG_0415.JPG : D) i3 `; f; {
9 X" @& F( Q+ w" I5 V6 k2 e& v8 i5 ?
: Y8 v0 z' z$ D9 J( T5 o
然后测试下内置的主题换肤
7 m1 `, V4 O8 _3 ~  `2 h
8 l: {0 j; m: |1 h! J6 D IMG_0413.JPG

+ ^8 m. B1 m3 w# P* l) ^2 G' @' E7 U
* o8 e4 l+ Z% A

$ a  l2 F6 U( w- R& G IMG_0404.JPG
: j  P0 y8 {* L. T: Z
0 ?4 `) r: j+ A$ J" _
看下main函数
9 v* d' x% W1 M  j
  1. int main(void)
    ; }" u( v- R" i5 h
  2. {+ k, U2 d0 D9 L+ k$ I6 x

  3. # F3 m5 U  J. ?/ _
  4.     CPU_CACHE_Enable();
    ( b5 I  `( {* h9 E8 i: n* `; t3 C, y
  5.     HAL_Init();
    # Q6 P8 w% ^7 b* N- T
  6.     SystemClock_Config();- n% J- g! b. I) o: ~3 d' A+ \
  7.     USART1_Init();$ ]5 O! z# f- ]& L! B- b. V& K1 T
  8.     BSP_LCD_Init();
    ; j8 P1 ^6 C& @" W  a
  9.     BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);; s6 \) l8 i) g- C3 V. \
  10.     BSP_LCD_SetTextColor(LCD_COLOR_RED);
    1 |, @' W  o/ r7 P2 `
  11.     BSP_LCD_Clear(LCD_COLOR_WHITE);
    ; y" @- R9 J7 L+ r, k  i
  12.     BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
    6 y& h. G! G$ G# N% C8 }5 g$ {

  13. ! X" y, |  D. ]) y# N; o% A( k" [5 m
  14.     lv_init();
    & o. V% V6 i) d
  15.     tft_init();
    & e4 @  c5 e0 z8 i' u# f" a& a
  16.     touchpad_init();
    : n0 c# _; n9 m) n% ?1 {
  17.     //可以使用下面的注释' G6 Q, l3 v3 u! Z
  18.     //测试button
    8 H$ S- W; I  ^1 X% L$ C( Z
  19.     //button_test();
    ; D; _! K4 X9 u1 i/ Y5 {9 V7 V
  20.    
    $ L' H) a8 j4 A9 t" Y# g
  21.     //测试demo
    8 w/ s, y: U! Q: e
  22.     //demo_create();
    $ v. d- z% a0 Q, M2 B. o
  23.     5 B, g; z% M" l4 |# c0 f/ g6 E
  24.     //测试theme
    & Z7 j7 U/ |& R; _
  25.     lv_theme_t *th = lv_theme_alien_init(21, NULL);
    : ?" l# g0 x; C2 q8 X
  26.     lv_test_theme_1(th);
    - D; e5 {& g% h; Q! X# k
  27.    
    8 H2 m# ~8 ~" I
  28.     while(1)
    4 G/ C6 [) O8 a" ?
  29.     {# X. z9 h: E, @. {
  30.         HAL_Delay(10);
    6 U( ?3 d' ^5 J) D0 `- U
  31.         lv_task_handler();
    4 x7 k$ v/ ?1 H2 d* c
  32. 3 q* L; w: W3 S) s* C
  33.     }9 Q  }% F3 b/ F7 A  @! N. g# d
  34. }
复制代码

7 C7 p+ z! Z5 i  w8 s. w9 v
2 H6 p) I8 w8 S  A7 ?1 c; S- l7 |6 {: @7 \: X* X; v$ K3 i
3 u5 V+ F( g( p
3、参考资料* a: F6 k  C- E( Y

# w9 D- R1 m8 Y( [1 Q9 t6 |) Y
0 T4 a: z+ I/ c: m5 r9 O% b- W
  参考资料要推荐的官网的详细的说明和各种控件的使用说明及代码实例,还有就是作者在github上提供了PC模拟器以及各种控件和入门的代码可以参考,最后要感谢作者无私的开源精神!8 Q5 y# |/ P' H# x  M0 Y

5 U9 N9 |1 ~& d; S3 Y. ]

( ?- c) B( d2 U0 F# e0 ?# G5 G9 q) F官网:http://littlevgl.com/
+ G3 n! I0 @& E6 W  B) `pc_simulator:http://github.com/littlevgl/pc_simulator5 O/ |; U9 w; s/ k  D
lv_examples:http://github.com/littlevgl/lv_examples: H' T6 m- z' d3 v: t2 u  D' T
& H+ @2 j2 t1 n( z7 N

/ L/ O) F$ D+ `( m测试代码:
2 s& K6 ^: \6 k+ c3 o3 |
LittlevGL-V5-STM32F69-DISCO.rar (6.01 MB, 下载次数: 2319)

评分

参与人数 1 ST金币 +10 收起 理由
g921002 + 10 赞一个!

查看全部评分

1 收藏 20 评论49 发布时间:2018-1-13 18:42

举报

49个回答
creep 最优答案 回答时间:2018-12-2 17:05:00

7 K$ O- s2 D2 j7 V8 e! _& u1 R" o: Y 开源GUI-littevGL应用教程 V0.1.pdf (3.14 MB, 下载次数: 499)
damiaa 回答时间:2018-5-17 08:40:08

- B2 Z( R; L" T. |' e1 c+ q7 M+ S  r6 M, m8 Y3 ?
MIT许可证之名源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称「X条款」(X License)或「X11条款」(X11 License)/ F) ~& T6 r) B
1 |* Q1 [# Q, N9 b4 t# K+ @
MIT内容与三条款BSD许可证(3-clause BSD license)内容颇为近似,但是赋予软体被授权人更大的权利与更少的限制。' y7 T" g- S" @- Q! S( ~
, h9 J* P) \9 p1 W0 D0 T
被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软体及软体的副本。
/ s( K) M9 g- k% P- p, R* \8 q* q, p) V( J
被授权人可根据程式的需要修改授权条款为适当的内容。
" `  q! i0 z' r+ D! W% Z( @" {& x7 ~
在软件和软件的所有副本中都必须包含版权声明和许可声明。
/ b% ?5 O# a2 ~  y2 ?2 p. h4 J& p+ e7 O( i  Y0 w
此授权条款并非属copyleft的自由软体授权条款,允许在自由/开放源码软体或非自由软体(proprietary software)所使用。. L- U) @/ D. n: _1 Z
4 ?3 |7 ^7 u" e* M7 X- p1 b' Q
此亦为MIT与BSD(The BSD license, 3-clause BSD license)本质上不同处。
6 |  C( W6 S  u% |4 @1 O' c1 L: t! S$ d' d5 w
MIT条款可与其他授权条款并存。另外,MIT条款也是自由软体基金会(FSF)所认可的自由软体授权条款,与GPL相容。
creep 回答时间:2018-1-19 11:45:46
jinyi7016 发表于 2018-1-19 10:48
2 j' O6 ]9 l1 t* ?' u9 `5 X; T6 x# s8 |哪个开源协议?
1 B$ f8 u/ A" p3 b
               
TLLED 回答时间:2018-5-17 08:33:21
学习下                  
Paderboy 回答时间:2018-1-13 22:17:08
666学习了。。。
Stm32McuLover 回答时间:2018-1-13 22:51:35
xyz.543 回答时间:2018-1-14 03:32:44
谢谢版主对此 GUI 的介绍。( u. p6 b6 v$ i" X5 M% b
1 ^( K, |8 u1 I) F
Inc_brza 回答时间:2018-1-14 10:15:51
水果牛逼
leo121_3006061 回答时间:2018-1-14 13:14:36
这个非常牛
zero99 回答时间:2018-1-15 09:31:56
厉害了大佬
shanji 回答时间:2018-1-15 10:11:35
本帖最后由 shanji 于 2018-1-15 10:13 编辑 , }7 Y# [4 R: Z+ p& o( [1 i
' ?/ @. y4 P) F! X/ l6 L
风格漂亮。
MrJiu 回答时间:2018-1-15 10:13:30
我前天刚下载,确实不错。。。niubility!!!
shanji 回答时间:2018-1-15 10:24:23
我准备弄到F429上玩玩,等着我啊
creep 回答时间:2018-1-15 10:43:32
shanji 发表于 2018-1-15 10:24
5 e) i6 c2 p2 F. @1 d  R2 H+ D4 W我准备弄到F429上玩玩,等着我啊
" d" f# ]" G' q! q! {/ [5 ^
好呀,一起耍!
风子 回答时间:2018-1-15 13:57:34
这个UI看起来很漂亮
我爱下载 回答时间:2018-1-19 08:19:35
学习一下,谢谢推荐
jinyi7016 回答时间:2018-1-19 10:48:21
哪个开源协议?
1234下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版