上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
! O! v7 v U! b6 w% E/ \: r 基于Ubuntu18系统,补充安装所需要的库和小工具) t) v) T0 {6 y1 q
更新软件列表 安装python3
- V' `3 D* b* T8 I# C6 V- 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. f& d% d7 k+ |9 r5 U B
我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。* [0 X0 Z) T$ t3 M
2 H' M5 M5 x, c! d- b! v 然后就学着官方文档的样子去验证下SDK是否安装成功。
8 S7 G4 t" n: c5 F+ q7 o
) H% o! R! M: Y' l9 q5 l! O
以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
$ Q0 U( w ] i: O! f F 首先拷贝官方给的demo程序,基于GTK得hello world。
1 ^" V$ T' }! f# v M0 A4 {" n7 f
- #include <gtk/gtk.h>; q' P+ m3 B' ?8 n% V6 N0 O* F
( N; e1 P a) b6 T- static void2 U& l1 v+ H* T _! ?
- print_hello (GtkWidget *widget,+ i1 b- U( G3 b6 s$ l, T: S
- gpointer data)) W9 w0 k3 S& Z6 q0 L0 Q- ?
- {. [; `1 M6 c' o
- g_print ("Hello World\n");
. C7 f* {3 w& ]0 c2 {% G6 i: ` - }
5 e0 S {0 [+ y8 H# W - * Y& y2 {3 l' I
- static void, l' L/ Y' \% T1 D$ [: j% ?
- activate (GtkApplication *app,. H/ S2 u2 A2 }& o" g7 T D3 W
- gpointer user_data)* y4 a7 I( f# m$ c
- {5 j7 l U' S# \3 L3 ^
- GtkWidget *window;" N* \8 F8 O3 F0 s* y
- GtkWidget *button;2 K' R8 R7 L4 W- t2 A8 o- g
- GtkWidget *button_box;
# |: H. O+ K% N- P4 v0 G9 E - 4 p7 W7 O% R: c" m
- window = gtk_application_window_new (app);
+ U& G7 d" J* {! ? - gtk_window_set_title (GTK_WINDOW (window), "Window");
) C) D* b- w$ M J( E/ Y - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);% x p1 S0 s* E1 j8 y% \
- 8 [) ]7 Y' k f! J/ p/ m! W+ D: e8 f
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
& z9 B9 V2 h9 C7 U4 \3 Y+ B w - gtk_container_add (GTK_CONTAINER (window), button_box);6 C( y2 C/ U1 Y' N
1 d/ @- a/ y7 ~' ]1 l5 ^! k- button = gtk_button_new_with_label ("Hello World");0 m7 Q) f E) K2 w& @ }5 }+ K
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);1 q1 I8 m. U9 {( C/ m
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);5 s1 `; D! X% Q' u) f9 s0 ~: L
- gtk_container_add (GTK_CONTAINER (button_box), button);* F( I9 m7 R- i5 K, {. q
- * T" r/ h) @" q# p
- gtk_widget_show_all (window);
6 F. W1 e9 A+ D8 e+ I1 a1 a: p8 @ - }- p# o( T" |0 v& B* K- K
- 0 Z3 V7 ?' `# i. ~3 U
- int' u; @( \* J( X* ]; k9 l7 A
- main (int argc,
1 I; P+ |+ A' ^6 l$ z! g o - char **argv)
- X9 i7 x$ }$ B1 [. L5 M* q - {
; r; ^- I( {. P6 c - GtkApplication *app;# f# i/ a) n6 @7 \/ d; K
- int status;
5 C$ t: I4 ~* ~5 [) q - * }; }6 m% s \3 \- K9 c
- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);4 _: J8 _" b9 O" r7 W( `
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
; @% \. G0 I" x' K( { - status = g_application_run (G_APPLICATION (app), argc, argv);( H, y4 N, k: S5 g
- g_object_unref (app);; G* J# y. Y" u! f3 d
6 p5 ]1 x3 ^6 C7 Y3 h2 i2 X- return status;
* s' O3 @/ ?- Y& F6 i+ U1 ` - }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world; D; d" x1 W: T: M
- SRCS = gtk_hello_world.c! r: y* h6 ?. F) P% n
% o2 W- p' f: n9 q- CLEANFILES = $(PROG)
& |: k4 K) n! g. V/ b - : }7 B7 R% e% w& V; M
- # Add / change option in CFLAGS and LDFLAGS
; K5 j$ n4 p' M; h* o# _ - CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)# j! x5 ]3 P2 f _5 C
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0)2 v! {5 T/ B, u, ?$ }
- # w1 U0 p0 D1 \, E) Q3 k- X! }& G
- all: $(PROG) `, r% s. @6 Z( W; n5 L; ?) P
3 a1 S4 @# x; x, n- $(PROG): $(SRCS)
6 x+ x) Y& Y- ^ - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)! ]$ f# X5 S, U9 ~- `- z4 c0 J% }
- ) M5 P" w" M% A3 m+ _- Y2 x
- clean:
3 y$ }- }+ p2 w1 B9 U& l - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。+ V' n' Q8 o% }& w" V& r) T
: v# Y) Z. n8 J* v$ y, } 接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。7 S' X, G1 k7 y% G
! J, U+ U1 P8 u1 m
- #include <gtk/gtk.h>6 z% \( f2 K7 b, f: z: `/ `4 R
- #include <stdio.h>8 ?5 o+ J" z. M& m z ?* W y
- #include <string.h># Z+ M/ s6 M. |) V
-
3 b5 Z) b3 h* d! ~& \. P; b - char buf[50] = "";/ `& V2 h1 L' ?
-
6 d: j* e3 E B4 v, n! Z) L+ v - void calc(GtkButton *button, gpointer data): K0 z, y- E9 ]1 f, Z* g6 d
- {! `* M+ B2 l1 W
- const char *text = gtk_button_get_label(button);
$ A3 e; Y( M) t6 o' U - ; i4 M: V0 o# A. j4 Z C. a. |- K( f
- //退个操作
7 O9 P0 ~- [7 Q3 |4 L# L- P - if (0 == strcmp(text, "c")) : J8 e' k( i! x
- {
- I8 M% l1 I2 q: e9 W- _ - buf[strlen(buf) - 1] = 0;
! `# x' k$ S2 ~8 a8 a: z# F - }else{9 g+ F! r Q9 P
-
' p, J( ]9 n# y4 P - int a = 0, b = 0;
8 ~6 b" K# n" f. G5 o - char c;/ J) l! G3 F& k$ g3 o
- strcat(buf,text);
# o; [' V* H8 ] -
! z" U$ j; b1 n) U' l, Z - if (0 == strcmp("=", text)) {
8 i6 o$ o9 O$ M- S* e - % z$ q8 y7 Y% f2 X7 J- L+ o
- sscanf(buf, "%d%c%d", &a, &c, &b);+ m) ]& U- C% {* e& {5 a* B% U" m
- 7 S, ]6 r2 V" Q t0 j
- if ('+' == c) {' g. n. u8 a1 B$ I" A( b( K0 J) ~
- sprintf(buf,"%d", a+b);5 p1 e1 B- m$ h. |& ^% D/ i
- }* k# u/ R. Q( L
- else if ('-' == c) {
! v! A8 J( E1 X, P1 v: X6 V B: B - sprintf(buf, "%d", a-b);8 [7 A, m6 K" |
- }
& e+ H1 e" l" W E: g5 E - else if ('*' == c) {; C; s' Y: a* L h
- sprintf(buf, "%d", a*b);
6 E% `4 x, y ]1 Y. F2 t - }
7 S. a2 H, F$ d - else if ('/' == c) {0 k1 v: L- R7 M
- sprintf(buf, "%d", a/b);
3 h* q. m) ^( ~9 G O* J - }/ R0 W' G, [7 j) Y) r" `( j! C3 w
- 3 J4 l" k/ O! `8 y2 j
- }
# L* S7 J6 n! u4 W - }# X* X+ v/ b) Y2 l2 r$ C# I1 @1 q1 ]
- $ K, J6 H- L" u$ n% ~' u
- gtk_entry_set_text(GTK_ENTRY(data), buf);
! r# X" i+ q, a$ A7 d- t# N - 2 u& C8 ~) w( o+ b. d$ Q
- return;* K/ ?3 l3 S5 P) y( K, T
- }
- Z- o5 V0 u9 R$ o - : B. t9 e1 {1 L8 D& X
- int main(int argc,char *argv[])1 ?4 f. Q# }. w) n
- {
( y$ o4 W( R4 ^9 m) X - ' u5 o1 B! l# V* r% R
- gtk_init(&argc, &argv);5 R/ Y0 l+ W7 W) {6 y$ g
-
2 s/ X- B' g( E
1 M) Y5 i9 \3 E1 |' U2 l- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);. X. x, z, O/ Z: B1 N
- gtk_window_set_title (GTK_WINDOW (window), "calc");8 \) p ^# L. m- {3 d: y
-
' b( g6 c) e! n8 F5 a6 a - //创建一个表格容器5行4列
# T9 r) {4 ~5 @" i, Q% K6 C - GtkWidget *table = gtk_table_new(5,4,TRUE);3 T0 G W/ |6 v) O1 n2 o
- 4 T/ n" E4 p0 w, q) ]
- gtk_container_add(GTK_CONTAINER(window), table);
" n: I4 }% b! s* ~7 n% M6 h( J) g. H -
5 E8 q/ r7 D7 \( c+ D1 c1 @ - //创建一个行编辑! V* Y( H! K$ O
- GtkWidget *entry = gtk_entry_new();2 ]5 M4 [) a0 E3 `( R& @. f5 ^
-
4 Y0 F$ s4 R5 A" q7 @7 K0 G - gtk_entry_set_text(GTK_ENTRY(entry), "0");9 W* T& ~1 I- J, ~8 L$ m5 W% q
- " v: x+ r$ f( t6 ]% ] @. j
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
9 f6 H. ~2 |. t; \* A$ n& s0 ?0 E( X - " B& G' Z/ i& N' U
- //创建多个按钮; y0 S% {; X2 j
- GtkWidget *button0 = gtk_button_new_with_label("0");3 q& E0 S! [/ @) T/ N' u
- GtkWidget *button1 = gtk_button_new_with_label("1");
( u. t6 O- m5 [3 K( C% R - GtkWidget *button2 = gtk_button_new_with_label("2");, L2 q6 n# I/ H3 h2 O
- GtkWidget *button3 = gtk_button_new_with_label("3");, e& v0 q; B* j, t+ i# P- ~
- GtkWidget *button4 = gtk_button_new_with_label("4");
9 o+ j( C6 T0 D - GtkWidget *button5 = gtk_button_new_with_label("5");
" X* I) G0 L1 `! L( v4 e9 J+ Z - GtkWidget *button6 = gtk_button_new_with_label("6");
6 p4 W; y5 j5 V6 z2 A' u& X - GtkWidget *button7 = gtk_button_new_with_label("7");5 O1 n$ S9 d( R+ P0 q
- GtkWidget *button8 = gtk_button_new_with_label("8");
" X* y' J% E( L4 B7 J - GtkWidget *button9 = gtk_button_new_with_label("9");
, r2 U% ]4 M2 ?' i, _6 ]" K -
# a9 m) G& g0 B; Y$ I) D9 j1 c5 c - GtkWidget *button_add = gtk_button_new_with_label("+");/ B) @8 r" w. n0 r5 e
- GtkWidget *button_minus = gtk_button_new_with_label("-");/ \* {( F3 o: @9 p9 g% x U' }" r+ o; T
- GtkWidget *button_mul = gtk_button_new_with_label("*");
X0 x. J: a3 p% ]8 r - GtkWidget *button_div = gtk_button_new_with_label("/");
. e( ~+ G) b5 \9 f$ x% y7 S - GtkWidget *button_equal = gtk_button_new_with_label("=");
' j- m' a. q$ z. ^* c - GtkWidget *button_delete = gtk_button_new_with_label("c");
4 I6 L+ p! _( I5 U" f -
. t, u/ y1 @. D$ z" ` - / d5 O/ Q. z1 ]- {* K! H) D
- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);) Z+ z$ H7 O! c* V7 G* D: y# p
-
8 |5 U5 @1 ~( e; b, A! T9 y - gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
, b7 j# S1 U% P. A4 ] - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);/ Q0 g$ [) l* G3 N$ y2 h2 s
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
3 T m/ g; K% k& Z$ Y: Y! {6 ^3 T - gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);# i" h. E o8 S2 A$ s/ S4 F* @- f
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
+ k1 y$ G" `. C% L% I& _ - gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
" ?* ]4 l0 E H/ S+ k! y - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
% m& p9 d; A0 N5 X' \ - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);9 N2 O' B/ B1 y$ r4 ~/ L& x% U
- gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
`9 G7 M' w; N. q$ @# m - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);6 e: p% C8 E$ p- j( C
- ) ^" w- b) b4 ]* q" W
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
7 D8 n: F: G+ a5 M2 M* A1 a3 j - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
) t! Q" z- p, ^5 A - gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);9 O, Y" k: A. B' h% _; O$ A
- gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
5 q8 U2 J3 D% Z( i" D& F. l( E - gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
9 m. V, W. r/ W# t+ l - gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);' j1 S4 _, ~9 ~1 F3 o" k# c
- 8 F7 \; N) M# t7 c' J0 ]& ]
- //注册信号函数,calc()
: q6 d* h9 d. Q- p9 K$ J - g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);" }! t7 F# Z% Y! m
- g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);: f; e) z3 n1 H! Z$ u, ?
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);5 z0 I) i2 y( h+ w( ^3 _7 @
- g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);5 m9 k/ g& Q6 D1 h
- g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
6 g. u, a9 b: f; g9 R r- ` - g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
' u3 Q y5 q3 X. A, I2 V8 Q9 l# m0 M2 X - g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);& ?8 h# }0 R2 e, z
- g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);7 a- |$ v! N5 I1 Z2 ?
- g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
! r4 J; ~ K4 {2 S& ?0 t$ ^ - g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);: H n: C0 d, m/ N
- + @, m% |: u# [+ m, U7 i2 K
- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
! v0 M, d$ C7 E R& {( k - g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);: ~6 `) p5 b, Z# S3 Q
- g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
2 Z- ?. }* d/ D9 @) p - g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);9 I+ d5 ~' \8 E, V2 y' M0 i
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);8 b7 O2 @* m4 d
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);9 U: m; C5 a) b, ^! q
-
: Q7 d$ [: b! A+ _" H. s) H- K
: W% M5 N3 q2 a6 V2 G9 n7 x- gtk_widget_show_all(window);% K3 C9 T! `3 J; K
- " U5 R; i' ?" U, u
- //主事件循环
9 p5 Y( N0 f) ]1 ` - gtk_main();5 S g0 x3 m0 B- A0 y8 T! Y
- + w2 F! r1 K: v4 E- c
- return 0;$ w9 i$ z7 U" q. e1 B
- }
复制代码 以上程序,编译运行后,就可以有以下得效果。
0 w1 G% U; u2 L& }
& F1 L, e+ n- g 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
. N& o8 v6 \( A7 {. | 搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
5 I4 K7 z7 w! H7 }, \
, B( j& N! q# K0 S( b1 y3 y$ O4 N |
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习