上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
# e: M, d! Z' p6 g5 u* X+ W 基于Ubuntu18系统,补充安装所需要的库和小工具
# u5 R- U# s5 M" x l 更新软件列表 安装python3
, \& H. s! a9 Z R1 n- 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
- g. G* j+ w `" `6 Y; [/ }/ t: J) ` 我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
* C1 U+ F- X" f% X
; I* N9 C4 q7 I! ?8 P2 j 然后就学着官方文档的样子去验证下SDK是否安装成功。
) Q1 r1 s. S! a$ }8 Y# s* N: H
) [+ V( u6 x3 F0 B4 g( u 以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
3 |" U% i) R' i/ V' j 首先拷贝官方给的demo程序,基于GTK得hello world。
& r' x {, @) j. b5 _- f) N9 V2 ?6 @% w) z3 {! h6 }6 G( t8 B
- #include <gtk/gtk.h>4 O" Q- W3 H( y" d9 y! y8 u
- $ n- X. ~8 k# q7 C/ y. ]! q
- static void
: n4 q8 E* }( K, k - print_hello (GtkWidget *widget,
& o( Z: u' [& ~- P - gpointer data)
: t( p5 o$ e, P& D - {4 N$ A8 U) z5 v, y5 e1 U9 G
- g_print ("Hello World\n");
% _3 Y: D# ?- J: ` - }" y& g H, ^- {/ u4 ]( \6 Q
- 5 B* j- i% s# k2 q& r9 r9 J0 S W
- static void
# E9 L4 p% Y& X5 W - activate (GtkApplication *app,
. A3 D+ M; R+ E! o+ l! K) L" J - gpointer user_data)
4 t4 }/ h5 ]* z- C3 N3 H/ S# P - {
$ K; Z4 c3 r1 k( A0 q - GtkWidget *window;
% s U4 b m" a" F - GtkWidget *button;
9 P6 u- n5 I* W1 z4 ]7 P8 t+ Y - GtkWidget *button_box;; T# U1 d! H( m4 t9 ]& T
. S/ H7 o5 \( j9 |# N- window = gtk_application_window_new (app);9 a( P0 H! t/ L0 n
- gtk_window_set_title (GTK_WINDOW (window), "Window");
( S3 }: d- C7 h$ q( v& |$ d - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
8 E: i; ]9 G& E7 F - " d+ d# H7 ^1 a
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
0 i' G" ^' B+ \8 R - gtk_container_add (GTK_CONTAINER (window), button_box);0 ?8 P( `, Z+ e- E! i
, m5 w. x8 A* U" Y! y2 ~- button = gtk_button_new_with_label ("Hello World");8 N) V* w. c! o3 l
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);* n8 V9 l& o8 d( J/ N) k) m
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);+ J$ b) H% N5 C8 k& M- k! s
- gtk_container_add (GTK_CONTAINER (button_box), button);
0 _$ I9 Q T. j. G, d - c8 \. E+ Z) r' V
- gtk_widget_show_all (window);
$ Q3 ?5 H* t1 H' ^ B4 z- }) } - }
7 U# |8 l$ K2 y) D2 O! F - # q/ ?( w( T% E+ c' v
- int5 O; K- O$ h, k1 ?8 |
- main (int argc,/ F/ X a W, a. ~ s8 y+ d
- char **argv) q9 d( F+ b" A ~/ r# l2 T
- {$ E9 ^) B3 E% e+ F/ i! j/ h
- GtkApplication *app;
7 n/ z& L8 q8 ~& j' _! x - int status;7 Y6 l3 `- U- J8 V; i
|) _) ^! p- y1 V- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
1 Z) c7 E( B( q( f - g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
; D# d) Q% R4 v: m7 Z - status = g_application_run (G_APPLICATION (app), argc, argv);
1 F/ h) D2 z# B - g_object_unref (app);
' c( `+ a8 ^/ n* p+ G- n) B - 7 S0 @6 X( ~2 T5 }- I1 P# {$ ~
- return status;
0 J+ l9 k7 Y1 J& e9 q; a4 } - }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world5 t! D* v( d" g
- SRCS = gtk_hello_world.c
0 N0 o. W9 }1 Q) \ - 6 T/ U' f4 \& U9 u8 n
- CLEANFILES = $(PROG)
& h% Y) r1 T- o - + n5 V0 v% S0 R: p" a- s. W$ T' |8 h: ~
- # Add / change option in CFLAGS and LDFLAGS
; J2 R" r+ g. a* [3 R) d3 i - CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)1 S1 S- p# l$ P$ h
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0)9 {+ L: [" L: R
- E2 ]1 i$ Y) _; k1 l u P. j
- all: $(PROG)
n% J8 I( j1 k
3 [: D: K! ^) z& }: K, e- $(PROG): $(SRCS)
5 b# v- v( H, S$ r. ` - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)3 u8 |. F+ u/ n2 |* G4 B
. ?2 g) t7 y# H7 T+ P- clean:
7 g% a$ f0 }. R - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
1 `9 m$ ^5 B2 x% k$ h. d
* j5 D) D. E+ g9 K4 U4 W 接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
4 K- \3 \& F/ N; s+ Y4 x% D6 g$ ]+ V8 M# v" t5 ~ |, Q
- #include <gtk/gtk.h>
$ r. u* [* N r - #include <stdio.h>
' ~1 I7 V, |3 F5 P, h7 d8 o. y' Z! _ - #include <string.h>9 F( p& {6 H8 F. |: ~
-
- Q5 p( k' Y& u; N2 X - char buf[50] = "";; i4 Y* h4 x4 B9 q: O, E$ j
- ( a" \4 n1 w1 j- ~& Q
- void calc(GtkButton *button, gpointer data)! h' f0 h2 Y: a+ q8 ~
- {
1 X" p: z! C+ t4 s - const char *text = gtk_button_get_label(button);' T0 @7 ]1 H5 m
-
. v H) H7 b1 j7 z% R - //退个操作3 m ?) B+ u/ P
- if (0 == strcmp(text, "c")) % ~5 b# K3 s4 r% o$ [
- {
9 |: K Q5 O2 ?5 x' ] o - buf[strlen(buf) - 1] = 0;4 t) Y; j1 v6 B
- }else{
8 M& O. [: w# o) i - 6 ~/ ^ b! J) b+ ^1 n
- int a = 0, b = 0;
+ E% q9 h5 I7 |) [' h - char c;3 W y. e3 t) T2 Y# m
- strcat(buf,text);
, j) L- Q* }4 C - " B! _# b) l V( q& C
- if (0 == strcmp("=", text)) {
6 E9 c- K E$ f- J -
. b+ K! z8 z) w7 a, } x - sscanf(buf, "%d%c%d", &a, &c, &b);, q; R# s6 E! P* x( {
- / y0 E1 e% C% K3 p
- if ('+' == c) {3 e) W/ o/ N% \7 o
- sprintf(buf,"%d", a+b);% s% @7 o1 N) r- X
- }
) |' a" C: m E$ }& B - else if ('-' == c) {
+ H9 W+ x9 ]2 e/ Y - sprintf(buf, "%d", a-b);3 T- w" I5 l" f1 n5 ~4 ^
- }
5 {! c) G* B* C8 J6 ^% Y - else if ('*' == c) {& D$ M/ K0 \' r0 s+ H1 g7 G
- sprintf(buf, "%d", a*b);5 ?1 W9 t) I# n# q% I
- }& L8 W0 P2 R% [6 x; V2 M% W
- else if ('/' == c) {
. U6 L# }& B/ U9 m- [! n! Y - sprintf(buf, "%d", a/b);( ~4 f1 i' ]6 l
- }
. z2 |5 \+ G0 }( `: } - ' ?4 [- F1 c8 H
- }" O* a1 Y, l8 a1 D
- }
/ ]6 Z; c! Y8 B- x/ m - / H8 e! @% S0 E6 N& W' |6 a, |
- gtk_entry_set_text(GTK_ENTRY(data), buf);
2 h0 @0 c4 Y( h -
& R2 t7 H7 @0 M* [/ F) b4 U; p6 Q - return;1 K7 u: E4 j8 C: [! }0 P2 z
- }
" |# L6 H- f: |9 p5 X% ?; i2 F' | - : X s4 n' N: A( G; T
- int main(int argc,char *argv[])' F/ A) o7 A# N* V9 _+ h7 z U
- {
; h! x# U; U9 b - 1 D; g+ [& g3 f- A
- gtk_init(&argc, &argv);7 {7 n* |6 ~, p7 J# U5 R) L! }8 t
- / `7 A8 V5 ?# U7 V) O
8 m) K! d: I# k! B1 b- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
. g7 ]3 b9 P6 ^+ z+ `, m* C3 B" `; E5 ?. s - gtk_window_set_title (GTK_WINDOW (window), "calc");/ K, y1 m, \$ I' I. G
-
U: P2 @) J1 E2 o3 a1 y - //创建一个表格容器5行4列- X Y+ n- W/ Q/ Z- W, H; p
- GtkWidget *table = gtk_table_new(5,4,TRUE);
. U0 n% x# R! R& y+ _& M9 |/ m0 A: B - ( G& Y# d+ m+ {: n3 Z3 n
- gtk_container_add(GTK_CONTAINER(window), table);, F/ } F7 s$ D, r* G7 y
- 1 i/ T$ a" r Q
- //创建一个行编辑 @* w4 G) H6 ^8 a# T5 [5 h
- GtkWidget *entry = gtk_entry_new();
. n4 W9 O& g) J$ o d - . g$ l+ C" W+ v* O1 i7 Z
- gtk_entry_set_text(GTK_ENTRY(entry), "0");
8 X! L3 G: \- A- {' Y
, Y/ D! P" x2 M/ z6 k9 c0 d# D- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
) B9 |- q0 [, T7 o3 }# v -
4 p9 J" o) e" l5 k# x( c; A - //创建多个按钮5 s# v/ S: p$ `" i
- GtkWidget *button0 = gtk_button_new_with_label("0");, W3 V2 ?5 t+ p1 c; A
- GtkWidget *button1 = gtk_button_new_with_label("1");
) M0 w* t: F2 A( U - GtkWidget *button2 = gtk_button_new_with_label("2");5 R: D" {5 d) u6 z/ B
- GtkWidget *button3 = gtk_button_new_with_label("3");
9 ]& j( V( U2 X! G3 [4 T5 C - GtkWidget *button4 = gtk_button_new_with_label("4");5 m! _( V2 c& {& s8 r$ K
- GtkWidget *button5 = gtk_button_new_with_label("5");
5 L7 R! q) i s' b - GtkWidget *button6 = gtk_button_new_with_label("6");( f3 d# Q" O# _, h
- GtkWidget *button7 = gtk_button_new_with_label("7");
* x7 W H8 F4 Q3 R& _: d+ J - GtkWidget *button8 = gtk_button_new_with_label("8");5 _+ N5 `4 o' ~0 \6 S
- GtkWidget *button9 = gtk_button_new_with_label("9");' m) \7 \ L; u, k/ T
-
- j/ X6 q7 j* [ - GtkWidget *button_add = gtk_button_new_with_label("+");, g0 H |, k. G, d: f
- GtkWidget *button_minus = gtk_button_new_with_label("-");9 s& G4 @* u z. b" _' p
- GtkWidget *button_mul = gtk_button_new_with_label("*");
4 D0 g6 m8 u; x4 F6 s3 [ - GtkWidget *button_div = gtk_button_new_with_label("/");
, ]' o9 N2 r0 p, p3 [' x - GtkWidget *button_equal = gtk_button_new_with_label("=");
' w+ W6 Q7 q5 H% A - GtkWidget *button_delete = gtk_button_new_with_label("c");2 k+ ^, O+ s w1 B; v0 T) R0 ^
-
1 s( X0 C" U: J - & o7 E. F/ Y& C* G U# | Q
- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);5 O d! T- @" S* U; y
- 0 k$ S/ k: Z: W5 q+ _; L7 G T
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);& E$ O8 _# n4 ?4 D& S: r+ d) n
- gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);% g2 z$ X" G: u7 C% V$ f [
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);8 n/ l7 H* u5 m0 \: m* `, J: ^
- gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
- H8 C. [1 F9 D8 b; ^ - gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
9 G, O( P0 M U6 t8 l - gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
8 j, F2 o4 I8 j% G% W+ m8 d - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
% n- M+ o* i$ h5 Q& q - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
/ l/ ^0 \9 t' O* m; Q$ e - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
# t8 m2 @* J: f; `, X - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);* k; M' R9 X1 f! N8 J; N0 c J
- ' d' z8 R( j0 a! Q1 Z: X
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
& C, x; Z- K8 d: M& G5 L' | - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
, D: p8 R4 f2 j. Y; ^. d8 z+ S - gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
1 }0 e- s3 h) l H - gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);" `4 R d' A9 {+ I! ]
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);' [4 t% z3 c% S3 @# l$ u. d% s! x
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);/ `- L8 x3 i8 \0 F' k+ n
-
6 A j# _3 i; E S3 S2 u - //注册信号函数,calc()
7 p+ H" ~# h" o# H - g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
: B+ t9 _+ t5 H, p5 ~- }/ g9 j$ \1 S - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);. A0 m- T/ l9 b h
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
6 _! D/ z4 f7 T8 x. R - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);4 a2 J. P4 d; M# M& R, C
- g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);3 [' }2 z9 [; ]: W+ s7 K1 v
- g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);/ c" I0 `$ D( a) X& R8 [$ B
- g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);0 Q* {. K8 f9 _
- g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
$ K6 X8 n+ R" g% T. U% ~ - g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
8 a G% v. ^* ]+ Q6 g% h - g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
6 R4 o) v z: R- {! f0 Q8 L7 Z - % a% d6 n8 T2 L7 T
- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
1 o7 e9 t# B2 X k - g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);- X a# l7 s) g1 d4 M
- g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);1 ?0 E7 r+ z( ^
- g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);, `3 o, A4 m; R5 j5 d( p- v6 F
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
2 v: x+ m5 T7 T - g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
! v. ]# [' l( k. R - 2 \7 B3 r" ~; ?) \& w
- * t/ @+ Y3 g2 N8 D; R( h
- gtk_widget_show_all(window);6 U# @5 t7 C2 k$ e8 Y( _ u' n
-
5 N2 \+ m% \ O8 Q2 B4 f- L - //主事件循环1 U' R; m) l, s n
- gtk_main();
7 f7 R$ J- {6 [# ]* c, M2 Z: c7 U: f - & }2 T& p! Q# H" d, _2 J& D
- return 0;! [6 U! M5 }( x, n% d( C' `3 Q5 B# I' b+ G. k
- }
复制代码 以上程序,编译运行后,就可以有以下得效果。 ; L' B; n5 l0 _
& B4 ]% `; z7 [+ o8 y( c, }
操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。* b1 s# U6 }9 t1 j9 h7 g/ F
搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
1 M. Q: W" E$ j, W- G( ~ W4 U( g5 ?( `( C, Z' k( k
|
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习