|
上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。 基于Ubuntu18系统,补充安装所需要的库和小工具 更新软件列表 安装python3 - sudo apt-get install gawk wget git diffstat unzip texinfo gcc-multilib chrpath socat cpio python3 python3-pip python3-pexpect
复制代码 其他工具- sudo apt-get install libssl-dev libgmp-dev libmpc-dev lz4 zstd
复制代码 编译器等组件 - sudo apt-get install build-essential libncurses-dev libyaml-dev libssl-dev
复制代码 默认使用python3 - sudo apt install python-is-python3
复制代码 其他有用的工具 - sudo apt-get install coreutils bsdmainutils sed curl bc lrzsz corkscrew cvs subversion mercurial nfs-common nfs-kernel-server libarchive-zip-perl dos2unix texi2html libxml2-utils
复制代码 执行完以上内容,就可以下载和安装SDK软件包了。从以下地址获取最新的SDK https://www.st.com/en/embedded-software/stm32mp1dev.html#get-software 我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。- S, X* i( }, k6 v3 m; ~7 o$ k, e& E
2 W3 k- ~& s0 C& y 然后就学着官方文档的样子去验证下SDK是否安装成功
1 N. x! E j* d2 A. \2 B2 k# x9 m: Y
) f3 x! `1 T# B9 n. G 以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。 首先拷贝官方给的demo程序,基于GTK得hello world。 - #include <gtk/gtk.h>7 w! F; P1 `0 \* Z% Y
- * `% t9 f9 R5 d5 T; t7 Q
- static void
, }. U2 v; E6 r0 I6 a/ T - print_hello (GtkWidget *widget," H% [- U5 a% j) x& t# z" Q) X( G
- gpointer data)
! l) v. s) T" I. |2 A+ f - {& |: L7 N5 D: Q6 D$ t
- g_print ("Hello World\n"); l$ a7 L9 M/ D, E2 L, f! c
- }
, c& f5 m7 x# l& {+ I - ; P* ^4 {5 I% z( l$ |+ Y
- static void
, X" D7 j% Y$ R6 O; |! r/ I - activate (GtkApplication *app,$ E) Q0 D" F' R6 W2 a
- gpointer user_data)
# ?) g% y4 [! z) m - {
# }" V) w3 \; ?1 `- k- d8 N - GtkWidget *window;+ T/ Z. \/ g. F ]6 }4 \
- GtkWidget *button;
4 W' U& `! I2 A$ p4 h# y. l2 I0 p. | - GtkWidget *button_box;( v# c* O5 G! ?
- , p+ e: l4 @% W0 c; G
- window = gtk_application_window_new (app);/ y. @, I ^5 Z, t% C6 l2 t6 }
- gtk_window_set_title (GTK_WINDOW (window), "Window");
% \4 O( O& N( k* N2 K - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
, }0 ^$ J7 F: n7 G- v; _
# `7 d, `- e; |2 w- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
( X6 a' f9 I: [8 h- E$ ? - gtk_container_add (GTK_CONTAINER (window), button_box);- K7 @3 [2 C/ b/ W5 [& Z
- + L! F3 U7 n1 s6 A
- button = gtk_button_new_with_label ("Hello World");3 H+ i! D# q+ O# j6 o
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);4 X% w& w* O1 g' U! g
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
) K7 w+ p/ W( B( w) k4 ]% ? - gtk_container_add (GTK_CONTAINER (button_box), button);
: l. w& x, D+ \2 c
' C8 T x8 X0 _. V) P- f- b* W: z- gtk_widget_show_all (window);6 _: w3 X$ a( w3 V$ j0 G
- }
6 z; Q- Z' N" F) j7 T9 u
" j0 p& c# c( C' Z1 G" i/ k- int
" ^1 [' f9 l% I - main (int argc,
N) ?: ?1 r D( R, L" [9 O0 { - char **argv): B* V+ T' Z, [4 ]! l/ Y
- {, B: c) Z0 j1 l( m: w5 ` s
- GtkApplication *app; y' I9 G6 w) l- j( V5 P" s4 ?
- int status;
! f+ Y7 L/ y+ r
3 h3 @' Y: S& ?3 F. M5 t& \8 P$ d. v- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);) P& m; d$ c _: Q) g& s0 E
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
& z( g" k, G& [6 N. H - status = g_application_run (G_APPLICATION (app), argc, argv);
: h7 t! n! t/ o8 L/ n4 y - g_object_unref (app);
% j" r9 U4 Q# L+ O - 7 y2 j" L; R! f
- return status;: b% {" L6 o: p8 u6 V
- }
" Y9 C0 g: ~: y- [; m7 O
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 4 ~# r7 X) T0 ~" @& w f
- PROG = gtk_hello_world6 T) R0 r( D: W
- SRCS = gtk_hello_world.c
) b, {( a. R3 _) L$ S: c2 R8 g4 I - $ {3 F$ d& i( T5 a3 _% C+ G
- CLEANFILES = $(PROG)
) g5 c( F1 ]3 a L0 G& U - & Q$ O: ~! D) S6 J
- # Add / change option in CFLAGS and LDFLAGS
- f6 E2 _9 X' ~7 a$ d+ ]6 w - CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
9 @ ^* ~0 ?" P. s& [ - LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
9 m1 b$ y. J0 B - 1 C' r% w1 P$ \) V* x; s- S
- all: $(PROG)
* X2 r3 v3 x4 k' N: @
9 I3 X' d% r# O$ y* g- $(PROG): $(SRCS)- v# Y$ _& u9 o$ T5 @% k; r
- $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)' z+ T- x5 s% ~
/ L [) U8 K' t( M- m; Y- clean:
0 S8 Y) W! ], c& h - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS)), c# d! r$ U( s2 h$ U; R% d
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
3 P, G8 J$ U6 K+ A! v
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
' [% ~1 p; s" i6 R5 h% M
7 C2 c7 X o9 ]6 {- L5 T. U * u& ?# m3 m! w7 w( r
- #include <gtk/gtk.h>5 E, V6 ?2 M7 P: D9 ?' v" e
- #include <stdio.h>5 o! x' v3 S. g% s
- #include <string.h>
; g3 j7 N( j: V9 X) q0 K5 J
9 ^4 {. t* e) m3 N; J. P, I& r' A, L- char buf[50] = "";6 z- L( {( ?5 q7 @: Z
: d5 Z. J& K) T+ V: ^) x% A- void calc(GtkButton *button, gpointer data)% b. H& P$ x& |# G& r2 S7 V
- {! v, }' B: n& s' E. z% s
- const char *text = gtk_button_get_label(button);8 z' V; H$ c8 K1 j+ A0 M" p; H; _
% N* ?9 `8 w2 D, G$ P8 }0 b( Y- //退个操作. V( I, Q8 S, K% X r( P
- if (0 == strcmp(text, "c"))
1 b: [% F5 ?; i3 t, b& d/ L - {, j% Q4 q- D) \. K) S0 b
- buf[strlen(buf) - 1] = 0;
; t9 \- I8 p* P( x! C - }else{& F9 \* t; p- Z/ ^9 y( f; O$ i, Q
- 6 Q; Y2 ]8 P# M- E
- int a = 0, b = 0;
$ Z4 T) h2 F# n, n0 D9 O - char c;
# b. e9 K# j( E( @: s; S - strcat(buf,text);% [3 `- ^0 U* v) f8 A
1 z8 P8 J( r5 a+ c' |4 A& B- if (0 == strcmp("=", text)) {& X4 L& [" e( |' e. \
4 O$ f0 x8 Q3 P, T9 g- sscanf(buf, "%d%c%d", &a, &c, &b);5 ~, ]* ?0 M, E" o* N
- 0 W7 O- ^+ u" O- M/ i
- if ('+' == c) {1 b8 u M# e0 [7 M
- sprintf(buf,"%d", a+b); }" v$ c6 v) q2 S+ y5 \
- }
% a( @, {( W3 T, O" F - else if ('-' == c) {6 s9 U; C( C& e2 L( d Y" H5 c: S
- sprintf(buf, "%d", a-b);8 J! l: p+ M% F' O, J
- }. ]- v3 J) y9 K! q8 \0 i9 t: b0 n% b
- else if ('*' == c) {4 i) T) G f- w" A# Q |6 T2 q
- sprintf(buf, "%d", a*b);0 c% Q3 A* z% s% T1 n2 m0 G7 f, f! _ \
- }- R# g, _4 v: [
- else if ('/' == c) {
/ p: q; m0 c) a* i6 U# J: B - sprintf(buf, "%d", a/b);
! q! j7 V0 b% C2 ^ - }
1 j& R# W2 X( J# ?* |. n. ] - 6 H2 A! E+ p0 q; g9 c% I
- }8 T, a1 @' w$ ~ l9 A
- }: L- G( C) p+ A# \4 R
- $ t/ A% }0 c4 N5 n) ?
- gtk_entry_set_text(GTK_ENTRY(data), buf);
/ p- u4 d8 h( f8 @ i3 W/ Z
( k5 _& G: L2 e; O: a# O- return;
' t* q# m1 C: l7 d5 O - }4 _7 ^2 [0 ~9 t3 a# q c+ g7 w
- 3 I* a+ i' x* r9 v
- int main(int argc,char *argv[])- r, o: m- a: I6 s0 Y
- {
: M- z" B, {" u1 k* T5 k& h - ( j }3 w. l: a2 d8 A8 P! k1 d+ E
- gtk_init(&argc, &argv);- m2 h+ s; d- z) b) h2 w. q
- 8 p- r D5 W, Z @0 _) W# l
- " H3 A; I( i2 R8 R1 C
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);# Y- o3 m( s' d7 v; }+ b
- gtk_window_set_title (GTK_WINDOW (window), "calc");
9 N/ V* [7 i7 N Z/ B - + z3 ?- h& P; a6 ?$ M
- //创建一个表格容器5行4列2 ~/ ]- h# | I) r! m# z+ I
- GtkWidget *table = gtk_table_new(5,4,TRUE);+ f) s; x3 P p6 ]- h; l; Z6 D4 ?
0 E0 O, _. Y. b5 i, p8 O0 u3 v- gtk_container_add(GTK_CONTAINER(window), table);
4 L) B8 f% u. O1 H0 d& z3 B
4 o/ ?2 n; j$ K- g! Q1 v; N0 e- //创建一个行编辑
3 |3 f# D1 Y% w5 c9 ]5 [6 [0 q: P - GtkWidget *entry = gtk_entry_new();
) e6 ^1 S# h9 T+ R% {
8 F* |0 I4 z' } |- gtk_entry_set_text(GTK_ENTRY(entry), "0");' J7 j- e9 ^( c/ j4 ?6 O; _2 j
& W4 O& h; t# B- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
" R4 H- `% b6 b4 g1 W; q3 z - : B1 }2 \) g2 k) r
- //创建多个按钮
% H; m5 d" c" f& q, ^8 N! y - GtkWidget *button0 = gtk_button_new_with_label("0");
6 F: g, ~$ ]- g - GtkWidget *button1 = gtk_button_new_with_label("1");
4 c! s( U% U! ^" O* C - GtkWidget *button2 = gtk_button_new_with_label("2");
: ~8 F& c# n% d" F( s( [! r - GtkWidget *button3 = gtk_button_new_with_label("3");
2 v' v O% N7 A0 N7 Q+ Q - GtkWidget *button4 = gtk_button_new_with_label("4");; v6 ?# E8 a0 l" u$ W3 e- J
- GtkWidget *button5 = gtk_button_new_with_label("5");
$ A$ U0 z# t7 w: C- m( A - GtkWidget *button6 = gtk_button_new_with_label("6");) S' _' \0 ^ @0 g, y+ _# |) @
- GtkWidget *button7 = gtk_button_new_with_label("7");6 }+ p) B7 m( S
- GtkWidget *button8 = gtk_button_new_with_label("8");
. g! Z8 Y( e8 z+ s: k - GtkWidget *button9 = gtk_button_new_with_label("9");8 g0 J* T$ h" V/ O6 f. t0 C- o( \
" H. D& F2 S6 @- GtkWidget *button_add = gtk_button_new_with_label("+");
) z# N( y$ c/ k6 e4 z; V, d5 \ - GtkWidget *button_minus = gtk_button_new_with_label("-");
" M+ o- x# ? b/ Q& ] - GtkWidget *button_mul = gtk_button_new_with_label("*");' f4 n( A9 e! d9 B
- GtkWidget *button_div = gtk_button_new_with_label("/");
: Y3 `' i. _. \( T! Z4 n! M - GtkWidget *button_equal = gtk_button_new_with_label("=");
7 N" C- ?% V) Y0 d - GtkWidget *button_delete = gtk_button_new_with_label("c");
( z3 s$ V5 M s8 W- \* I - ) X# u- z6 q' h* G X" u
1 b T1 u8 G. ^+ h5 A& a1 c; Y9 ~- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);3 t8 C1 q. {# n, l4 _
- 1 Q) c! p3 `1 R+ y% t
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
' \& z6 G; K) n- W7 f8 I - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);% L& a6 f: ^7 f' @0 E/ W* V& @
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);) V+ g; |& r7 I
- gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);- e, |1 }5 ^1 H% p6 n S0 N
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);* [# |$ o& N. j# ?0 F
- gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
^$ n) E) N+ Z P - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);2 j& p) k9 d# D0 K
- gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);$ ]% `$ Y$ b4 h/ a' F- g
- gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
+ `2 n1 @' O; O6 d" ?: n - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
9 |( u* i- y% ?+ Z+ W
/ i4 g' x. `$ y' m z* c. s- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);8 Z2 @) ~; L3 O/ g! _: N! X
- gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);: ?: t8 i: J' N7 n2 Q
- gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
3 G H+ I3 p: T: Q - gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
6 f" m+ P7 M, `5 R4 V1 Z - gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
: k5 G' v+ l/ v3 y, x# {6 O: f - gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);/ j2 e7 F# I4 Y8 C
- 4 j* _: W: I" ?' q: b
- //注册信号函数,calc()7 a7 T, w. I- K& s4 n* z
- g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
1 v% L! v! `, A - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
0 |1 D/ q8 a' v+ q% J - g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
& p( N4 y: S t$ i - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
7 p) W% n! N6 c6 ?& j/ r s5 b- ]3 _ - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);, v! m4 }6 R. ~$ A
- g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
" I5 i! x* e! o7 e4 Y - g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);' R$ I$ m Z, G% W4 N6 B3 A
- g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
7 B. V! h6 Q" m) \8 d7 C' h - g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
- D6 v2 w/ O2 C, D - g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
- R+ \( }( j% F: X# J0 y
- `7 @8 s# t0 v6 O2 e5 j; S; j- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
& U8 g) n: F4 p: e5 ? - g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
4 a7 R- j" ?5 e( q% S8 g) j - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);1 n! Y* n% ?6 |$ G
- g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
$ V1 z* |- Z2 j5 @! p7 k - g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);7 @, A0 Q+ ]6 J: Z* c8 `9 b; L
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
- Q9 J" M. m2 y! d" d - 0 d( M# D) V* ]# E" M) i+ r
- / v& }3 p8 K9 P4 L0 M/ J" p
- gtk_widget_show_all(window);, h+ T7 y u2 P R: N
% `6 K4 a2 E9 C: K- //主事件循环6 T# z+ O4 i1 ~% d' n: {- F8 g
- gtk_main();+ C2 K: I) d8 s/ A
- 3 l H+ r5 B( P, Y$ p* W
- return 0;6 Y) o8 V# f" n' i
- }
; s1 b: V% t- |2 D6 W2 b/ z
复制代码 以上程序,编译运行后,就可以有以下得效果
' d3 F @$ x8 U" G; y5 E
7 m( B6 ?7 K' G \" X1 S 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。 搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。 |