本帖最后由 creep 于 2018-1-13 19:17 编辑 - b( b4 f' f F0 ~. Q
* a$ l. m* }, Z8 H 最近看到越来越多的小伙伴在讨论littlevgl,这说明这个开源GUI正在被更多的人了解和使用,最近littlevgl正式推出了V5.0版本,完善了整个代码架构和一些API及函数的命名,重新设计了移植的接口方式,添加了众多的控件及可更换主题等功能。我之前在STM32F769-DISCO 上移植了V4.2版本,下面的移植使用最新的V5.0版本的源码。
1 @! v( [0 H( s: s3 t( `$ M
$ M+ [' K; \/ O1 B1 Y$ Q! Z. v# e- }) j, q" b. `) }
: m% |( G- g' ?# i: n* S w( ]6 {, I1 [ y6 L% X
5 z0 \- S! a) q6 V* y% `1、V5.0新特性- S1 Y0 V6 ?$ [/ r2 K% n9 m
5 O: `- B4 V4 T' Q6 {2 S
1 m& p. ]6 @8 r' O! k f/ t$ f8 i( h
源码提供了各种内置主题可以选择比如下面的黑色主题% X/ J n' v7 ]. K3 D
X$ S3 z8 D3 i' S7 EElegant dark theme which shows confidence and high quality.
) Z/ F1 S2 S% S8 q3 b
3 x6 d) {" Y; q& _; B- N
( U- {* f" X% Z5 ~
下面的是Android's material design风格主题" a3 P. h ^1 ^6 P# F+ X* h' F' K
: J1 M5 J5 O6 O! ?- C! O. D! u
1 I8 @' w) m3 K! `. u a( Z% s& R$ u1 g% m& d4 B& Q8 F
9 P" \0 Z& l5 Z3 |+ d2 j: Z更多主题可以到官网查看:http://littlevgl.com/themes
t: }0 \3 D, {9 wUnicode support、Symbol fonts 支持" a, S0 f9 @9 z0 o" @% ~2 c
8 U' v( S" U% e6 C4 A# l. m
8 o3 O! F$ y( u* r# v- F; F
9 X4 L# s3 B; n) _+ L- w; X
7 e0 ~% R2 r3 m2 G2 K
/ F. W7 `7 r" c/ {" Q5.0版本也增加了一些新的的控件:http://littlevgl.com/object-types% g' M% O* d: U: i8 n
# r5 \4 W4 F' H2 Y. B8 u
$ \: Z; r# q7 w7 ]+ H( Q* H
更详细的请移步官网:http://littlevgl.com/basics4 X& H# W0 G; N. @6 y
6 w! l( X* {' o1 w: J. o
2、移植9 h! K. k) O+ \
官网给出的移植要求如下,littlevgl 的移植性很高,基本不需要单片机外部资源。
/ H. w/ N/ W! s, L% L/ F. K4 @) j" m2 k$ X" S
8 q& [6 y6 |7 L4 C: g. M- R9 l" \& L' I新的5.0版本的移植接口采用了函数注册的方式,Display interface、Input device interface、Tick interface ,只要实现这3个简单的接口就可以8 ?0 ?# X- G' }: q
简单的跑起来littlevgl,接口的移植的详细的说明可以参考:http://littlevgl.com/porting; W7 {! w3 i3 ]+ z$ _# N
, d1 h5 ~) M( T% J9 t
其中需要注意的Display interface,为了优化显示,可以使用2个Virtual Display buffers (VDB)并行的rendering and flushing。作者的移植例子使用的是DMA中断在进行background flushing。我移植的时候为了简单就直接使用的单缓冲,然后手动调用lv_flush_ready();。
) v& V: i$ B! q+ P6 r: c8 U7 Y( q% \8 S8 y+ ~7 [! b
M2 F) Q8 P) F
- /**
/ X- H$ \* t! ^+ U. F2 [: |# { - * Flush a color buffer( U* x: Q! d& G. U
- * @param x1 left coordinate of the rectangle3 o9 T4 |. X. J6 [: j- K4 H0 e) w
- * @param x2 right coordinate of the rectangle
Z& q% c+ Q7 B9 q# o: M9 }# B1 U - * @param y1 top coordinate of the rectangle/ a3 E3 j$ f7 j, r' z; b5 o- E r& ~
- * @param y2 bottom coordinate of the rectangle
( ]5 b1 k: R9 [7 v( S* M, u( [/ z - * @param color_p pointer to an array of colors1 z" {- }+ i9 n$ D* _+ `
- */* Z& f6 X( @8 ^( z5 v$ l
- static void tft_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p)
2 ]2 g9 ?3 a4 ?; K) w6 M0 } - {/ \( v% k# v( `5 _
- /*Return if the area is out the screen*/) t0 n5 B/ E+ F7 r* i0 I
- if(x2 < 0) return;
, w# q5 F3 _* W3 f1 E
8 {5 I# l0 _% o) ]$ |0 W4 s- z- if(y2 < 0) return;
8 ]9 j i5 q x$ R% \ - , \% R `. p( {
- if(x1 > TFT_HOR_RES - 1) return;
$ u9 Q. ?4 O/ o0 e# e9 |/ u - 8 P% x% e6 w% N; L3 T( {6 L, z
- if(y1 > TFT_VER_RES - 1) return;0 R1 B- I& k; \3 ]
- 3 K; a2 v4 S1 @3 Z1 p! j
- /*Truncate the area to the screen*/! I1 u; e1 T. _5 T
- int32_t act_x1 = x1 < 0 ? 0 : x1;
! v$ B6 l! _+ X+ d" H/ n- Z - int32_t act_y1 = y1 < 0 ? 0 : y1;) ~" z9 X; F& A; ~1 I# [
- int32_t act_x2 = x2 > TFT_HOR_RES - 1 ? TFT_HOR_RES - 1 : x2;( ]3 P$ o$ c) U( G
- int32_t act_y2 = y2 > TFT_VER_RES - 1 ? TFT_VER_RES - 1 : y2;
0 Z; E. A& C7 C
, z0 c+ H* {1 |4 b* b- uint32_t x;
9 P6 q. Y0 D- ~: R6 ?4 O2 u4 r - uint32_t y;- \) ~3 e% q8 N* \# g( b% F6 _
- % b5 L7 V7 o, ^' z: j$ j
- /*Put the map to the remaining area*/
' r6 X& O3 U' S: _5 l - for(y = act_y1; y <= act_y2; y++)" p& `3 r! B* ^
- {
$ S+ }$ s7 N0 Y - for(x = act_x1; x <= act_x2; x++)0 E0 q v) J8 K& A4 z, i% w; q
- {
8 m V- z/ V) ], K$ W" O* Z! Q2 ` - /*Your specific function comes here!*/
' \7 E+ n7 G: h# z$ ?* m, ]: Z1 z - /*my_put_pixel(x, y, color_p->full);*/- R3 Q; Q, T" g* A) Z# ], Y
- BSP_LCD_DrawPixel(x, y, ((color_p->full) | 0xFF000000));2 j' o. B2 D. a* V5 U
- color_p++;( ~1 I5 u W9 F' ~; k. K
- }
5 \9 p9 V& Z, x: ^; C2 N) w D$ T
9 X/ D2 n8 J" | ~ R7 a3 ]" |- color_p += x2 - act_x2; /*Skip the parts out of the screen*/
2 S6 Y( r. t+ Q( x - }
1 M8 [% m5 ~/ W* g; d3 q - lv_flush_ready();
! n% ]0 S; D. D. ]8 m( `1 j8 ] - }
复制代码
8 o! A# @' H i
4 C4 d0 I6 |) O0 U2 V首先测试下一个demo
; t' `4 g M( o) W
* c* N+ X5 N$ ~# Q; L) j
% W: c; _0 _' c! a
5 d: P, h4 `5 \6 d: N$ m) W2 Z' H
" n, [8 a$ v5 s" V- c' H- @9 l6 W% ^: U# c* y
然后测试下内置的主题换肤
( l% n. M; ^( D% I: e1 T7 ?) {7 k: b! o( n1 W! b# ]8 V9 v. _
8 f: H2 E8 L4 ]4 V3 C- h1 ~7 L
2 P* y/ S, I" ~# `. g# E& j4 Z- k
$ L& r, e! a+ z1 T
' S+ X3 S# ?$ }! M: Q1 h; ?
# \4 Y/ m$ N( {, Y- ]: }: q看下main函数, B9 \; R. ~+ V, a7 p* T& d
- int main(void)
. \" z/ L9 {/ ^! ]3 ] - {( `) s9 s( b+ \5 q8 v2 Y
7 }+ Q& Y1 Z$ u- CPU_CACHE_Enable();
3 h( ]4 x/ n, e5 Z5 t) ^3 z2 [! ^3 h - HAL_Init();$ ~' ~3 v, n n/ }. J6 U
- SystemClock_Config();
# B1 A' v, f/ \( A! j - USART1_Init();
- \0 t! _( x, K$ G R - BSP_LCD_Init();, g$ |4 ~. ^) b9 R9 Y
- BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);' `) V+ \! l2 \5 p( }8 U, t9 @
- BSP_LCD_SetTextColor(LCD_COLOR_RED);3 A5 t9 @- r* _) C2 x( x
- BSP_LCD_Clear(LCD_COLOR_WHITE);
! x) M5 G* F* z - BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
9 D& f2 P" w# H3 \, q, v0 U( L& K
" U8 \" D5 J! b) K: [( H% k; h% z- lv_init();+ ^+ ]) B0 K7 p$ q* L! [( U) E
- tft_init();( ?: }2 @" S7 k3 b
- touchpad_init();
! U0 [ E5 C( Q - //可以使用下面的注释
- V9 G3 A7 V! F - //测试button* f8 x3 K. ]1 Q8 Z3 @4 t
- //button_test();
- ?; q- ~& y3 d y8 j' F; D -
8 c/ g8 n1 v9 f8 [* g - //测试demo2 b& C6 |" _" ?
- //demo_create();$ }. W) g& F4 H4 E: o' p# t# ~7 {
-
' G; q; T8 R# W - //测试theme, r2 B. m2 l4 W" H+ _3 g
- lv_theme_t *th = lv_theme_alien_init(21, NULL);
% l/ a; p% u. q4 C7 S0 O! w - lv_test_theme_1(th);5 W# }9 ?" {1 l- J
- ! @4 R* A& d3 T, F4 l# O
- while(1)( `9 q0 n$ o+ d5 k
- {6 f* R5 w6 g' A8 J! c
- HAL_Delay(10);
) G+ E0 v/ h2 c/ {" W! w4 y8 f" \ - lv_task_handler();; r, P" d1 z9 |
- & w0 e9 I4 g& b8 \$ t
- }
' r! G" o* a: G5 \ - }
复制代码 8 T& v+ m" O6 C# Y0 B* q
. x6 Y# M1 V) k9 b6 _
2 ~! C" B5 X8 v. V( m; n7 }9 \# s Q% A+ T
3、参考资料
3 R; L+ V% s' G$ k. |. q4 y
% q; ?/ `' v6 _1 j7 H! j c6 h$ ?" J: w7 n2 ]% [2 R
参考资料要推荐的官网的详细的说明和各种控件的使用说明及代码实例,还有就是作者在github上提供了PC模拟器以及各种控件和入门的代码可以参考,最后要感谢作者无私的开源精神!
4 ~4 u: w1 w( ?8 U; D8 J: J2 d! T4 [8 K6 N# M0 @
( N4 p) o/ f# } n* m7 `. D+ [官网:http://littlevgl.com/
* a& Y$ G3 C3 J! Ipc_simulator:http://github.com/littlevgl/pc_simulator
/ z9 s0 m0 ?9 ]2 X! X4 tlv_examples:http://github.com/littlevgl/lv_examples! O1 v+ j S Q y1 i& ]2 ?
& |& S. d; i* p* ^) ~; B- C/ E* ?/ G* [% H( M, A4 ]$ Y' W
测试代码:
4 q- x" `$ C$ @, ?4 X: N$ S; n
LittlevGL-V5-STM32F69-DISCO.rar
(6.01 MB, 下载次数: 2319)
|
% U% D; _. {1 E4 q& S$ d3 c8 j1 a
MIT许可证之名源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称「X条款」(X License)或「X11条款」(X11 License)5 K8 E9 O5 ]3 y8 d& O5 O1 x9 Z n$ \
* r" D0 V# N; I
MIT内容与三条款BSD许可证(3-clause BSD license)内容颇为近似,但是赋予软体被授权人更大的权利与更少的限制。+ |8 w- Z7 e4 p4 n
被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软体及软体的副本。0 S3 w$ G6 j# \) b1 y# W
被授权人可根据程式的需要修改授权条款为适当的内容。( D& R# ` p5 G2 p7 s
3 h0 q! K6 S2 u u! P( X; N
在软件和软件的所有副本中都必须包含版权声明和许可声明。* @/ t" B! J+ Q# G7 A2 I0 z
此授权条款并非属copyleft的自由软体授权条款,允许在自由/开放源码软体或非自由软体(proprietary software)所使用。
此亦为MIT与BSD(The BSD license, 3-clause BSD license)本质上不同处。- l/ y1 |) T! V4 ?) M5 w, l
MIT条款可与其他授权条款并存。另外,MIT条款也是自由软体基金会(FSF)所认可的自由软体授权条款,与GPL相容。
. O, @( e" t8 l6 _) O: O
风格漂亮。
好呀,一起耍!