|
上次已经开启了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/,,这个路径就可以,直接继续安装。
9 h$ A9 G' Z& A, x: c; x6 J9 P
6 d( G& u5 b% V' E5 l
然后就学着官方文档的样子去验证下SDK是否安装成功
+ ~+ p0 |0 a& l t
( W. W$ x8 m) u 以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。 首先拷贝官方给的demo程序,基于GTK得hello world。 - #include <gtk/gtk.h>2 Y) [: e: p0 i( D+ e* e
; E! h6 G2 {: E. f4 ~1 L- static void O6 c( V. L" B
- print_hello (GtkWidget *widget,
- T& X5 H* n, P - gpointer data)
- ~0 }7 J% ]+ G- T' `- ?- q - {6 Q/ A' J: Q7 `' o& Y
- g_print ("Hello World\n");
2 c. X; o. C' d5 q& B" z/ ~ - }
& b5 m1 {! ?" e/ y) C+ x; c - 3 C7 z3 ?8 g8 a# R; k \9 _6 x
- static void/ R2 d' I" u% ^) @7 @! E
- activate (GtkApplication *app,& |" y; [( q7 V) b0 H4 a
- gpointer user_data)
. c. B& m! b# o1 B! N; V - {
, v7 g' f+ V" e% S% b - GtkWidget *window;
1 K- z( i+ m+ j X+ J# U+ V - GtkWidget *button; A; z& _1 c3 Z3 n
- GtkWidget *button_box;
: t! {* P; l0 o! P( C: N* m& r7 X - - v, A5 C3 X: ?* F) `- t9 E
- window = gtk_application_window_new (app);# X3 H1 C8 r: b. | v4 O
- gtk_window_set_title (GTK_WINDOW (window), "Window");% u5 e3 n! d- c$ m
- gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
0 [2 J0 u3 w f) E5 c
( @, E% a7 x& g+ N; O0 w( R- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
( Y6 s' W/ o8 K) ? - gtk_container_add (GTK_CONTAINER (window), button_box);
k/ j' ~8 R2 _2 }, x u6 X: n
/ B+ X( c5 m" I5 o; e! b @- button = gtk_button_new_with_label ("Hello World");$ J4 f# ]$ {% C+ U: `- H
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
1 @, J) P& o+ B9 G8 i/ Y - g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
3 e' S, Q$ d \/ l3 t4 N - gtk_container_add (GTK_CONTAINER (button_box), button);( x1 [0 C, _0 [) L
( S. m- n( g4 q6 T" y( T- gtk_widget_show_all (window);* g8 S0 |7 T" i/ F0 a
- }$ v0 y0 c) }) A$ v$ |$ O# z
- ) ~2 H* W1 ]) I% [; h& s
- int9 C8 w& H& C+ e' p/ B
- main (int argc,% i S+ U* }" O% u' X
- char **argv)! c( X4 B" m$ m! y8 k: R
- {% d: e* u! V/ K" P' {
- GtkApplication *app;3 ], q6 u# u8 `/ k9 \
- int status;) d* ~# L# _$ T' K% R* }
2 C; v2 M; `/ V- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);0 A: C8 z5 Z# B# L- g
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
T" N) d! E6 V3 h' ]8 \ - status = g_application_run (G_APPLICATION (app), argc, argv);7 l6 N- {- Y5 J, n$ n: t# K5 y/ D
- g_object_unref (app);8 B( E. J$ }/ x0 b! T# d
- : Z: |, X) e/ A7 s4 u3 s
- return status;. p% }5 G: M3 z, U7 o! f
- }
/ H8 Z4 r# j' a& l( |( T
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。
4 S' B& T, D7 z& h/ P; g! A- PROG = gtk_hello_world% y: B+ V U1 h9 _/ X
- SRCS = gtk_hello_world.c) `8 |9 S* {4 j+ c/ G; P
- 7 A$ B" }0 r3 \1 \- \6 ?4 R( L
- CLEANFILES = $(PROG)& Y& t) q1 N) B; H
+ t7 R9 y; U5 L1 X$ z( r- # Add / change option in CFLAGS and LDFLAGS
# a* ^* n5 Z( R0 o0 S$ h - CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)' z7 }( E8 ^$ d9 T6 l2 `
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
% T( _9 n' g0 z1 G \3 G9 Z2 a
% B4 _0 \) u% F. [9 E6 A- all: $(PROG)4 I- x6 i- d: R* L) u' E! r
* N/ b% d7 ]: L- $(PROG): $(SRCS)
' } h% q; Q# Q! J( T/ m - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
4 [: t d, D* g0 w9 T/ n" D - , \! J3 s4 h- U! Q
- clean:
2 a8 l( A R, F2 V' N; H - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
) g% Y# m) n: p( f: r
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
, m! U" ^! e) i; c. n- N
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。7 p, }% N# U0 Z$ B9 ]
. F* X4 m y& e4 r1 q) q
4 d6 ]* n; ]7 X% N5 u# c- #include <gtk/gtk.h>
% ? [! ^1 ? E' x2 i: ?7 A5 M - #include <stdio.h>: n7 a& c7 x& j# D
- #include <string.h>+ M3 C9 [6 A! M) ^
- 3 O* S% h: M% s4 X! G
- char buf[50] = "";
( ^/ C, a2 a" e$ u! N - 8 R( v2 W- w( ^
- void calc(GtkButton *button, gpointer data)
4 }+ _$ Q7 J0 |( I - {: L8 ~/ v+ Y. h9 |0 e3 \/ l
- const char *text = gtk_button_get_label(button); l* Y' F- R7 A4 }2 V
- ( V- s! s5 |) S4 O
- //退个操作
0 X+ B$ S. @+ V7 n F, g3 S8 I - if (0 == strcmp(text, "c"))
) s3 y0 P$ L. B - {+ m8 X* E# k9 H" ~0 w! q
- buf[strlen(buf) - 1] = 0;% f* G4 j, I3 E& |9 b r& |2 M
- }else{. J: m( x/ a3 E' R/ u& r' [6 P
- + ]1 }! A8 ]0 B' g- S$ [* r
- int a = 0, b = 0;
! W- f; z! [4 f" J - char c;% e! e. b+ K: q/ ?+ H6 I& D
- strcat(buf,text);: R! ]# N s- G9 ` E! B
- # `& m/ c0 z6 Q$ V
- if (0 == strcmp("=", text)) {0 P! ~* T( l7 Q2 p% A+ D% u
- + P2 O q9 T \# D
- sscanf(buf, "%d%c%d", &a, &c, &b);
- k+ L8 E7 p; x0 L1 P8 Y - . y3 o& u5 y' M6 m- b. i
- if ('+' == c) {( G: j% X6 u: k$ P
- sprintf(buf,"%d", a+b);
6 g9 n& G3 q# g/ K2 Q: T - }- P& \, R9 {' V8 o6 o/ L( l
- else if ('-' == c) {
( @8 L+ K$ j' }0 s - sprintf(buf, "%d", a-b);
/ r/ w) t6 x0 `& o3 { - }
2 Y" D" O! m3 P" N& J - else if ('*' == c) {- I" Y z% w; A9 f. C7 y
- sprintf(buf, "%d", a*b);
9 w. |( H5 _ r+ b+ \+ k p - }
4 ^ N. p. y0 |6 v - else if ('/' == c) {) f/ e% q5 \2 s( c0 i9 N
- sprintf(buf, "%d", a/b);
) t; O. h% x- T4 } - }2 O7 T3 c. S' v) z) ?( A4 X
- 4 \! J- _4 u& X: J3 x$ b x( w7 e
- }( R! U5 u7 {2 O2 v& R( ]" x
- }
- K$ ~+ _* t: V9 K" q - * H( D) O! a8 x4 W1 @
- gtk_entry_set_text(GTK_ENTRY(data), buf); `' g! k0 f$ I! E0 N2 b
- , C% A$ m2 T. Z. t6 v1 r9 l, p* H
- return;! A* v. ]' N+ M& [* M
- }
$ r7 r8 B2 c/ F4 [. E: H- L
. b: C5 u _, c2 B% R* p- int main(int argc,char *argv[])! P8 J7 }$ X0 H, q0 F
- {8 g8 O2 e& q$ h+ P/ C
' B; T+ D) D5 A% h9 [" X0 M1 l6 Z- gtk_init(&argc, &argv);
* ^1 z" @. z! b5 @1 X - 7 d& _. B! m7 t, t; m! }7 g7 ?
- # ]. S2 T$ X, }+ U7 y6 d
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);# a3 y4 J! X6 t6 v& w
- gtk_window_set_title (GTK_WINDOW (window), "calc");
3 S( t" y+ X) P1 n5 A5 { - 2 |* h! @/ R* f3 S+ |8 }" v$ }3 X
- //创建一个表格容器5行4列 R' O$ B. i0 ]) ~& L5 B, i6 e
- GtkWidget *table = gtk_table_new(5,4,TRUE);
- B5 ~% J# q5 t& j - ( n; W7 z' x+ U( t' g: r( Z0 c# S
- gtk_container_add(GTK_CONTAINER(window), table);2 |& ~. F( \3 c8 p
- % a1 w! T7 M' h* Z- R- }/ ]
- //创建一个行编辑% I: Y J. o5 V
- GtkWidget *entry = gtk_entry_new();
4 W( ~( s" G( f, K" D8 t
Z+ z% J+ `% b }$ W% z- gtk_entry_set_text(GTK_ENTRY(entry), "0");
/ b6 ^6 g4 H8 P2 b4 [
& ~5 Z2 t$ h7 l3 Q8 T- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);7 {% W2 ?% ?7 U: c
- 5 C8 v$ R! v, K( l3 d; Y
- //创建多个按钮
/ f) R4 m3 \: Z" X4 b5 |0 b& Q - GtkWidget *button0 = gtk_button_new_with_label("0");' N7 D$ ~! d9 J. }+ I/ _4 |: j
- GtkWidget *button1 = gtk_button_new_with_label("1");
; b2 z; Z& Z/ u' M. L4 ?+ S - GtkWidget *button2 = gtk_button_new_with_label("2");$ C- c6 z, {+ W0 b0 v. b% j
- GtkWidget *button3 = gtk_button_new_with_label("3");
3 {" |. r4 h, X' I! t6 @& w - GtkWidget *button4 = gtk_button_new_with_label("4");
/ t; O; O; C/ o; _ - GtkWidget *button5 = gtk_button_new_with_label("5");
+ i5 k$ b) s( C& J0 f - GtkWidget *button6 = gtk_button_new_with_label("6");% a0 h d+ I* @4 ~) h- g
- GtkWidget *button7 = gtk_button_new_with_label("7");
p0 n7 I3 y5 s7 I - GtkWidget *button8 = gtk_button_new_with_label("8");
$ l# o. b9 ]8 P8 ~ - GtkWidget *button9 = gtk_button_new_with_label("9");
4 _' m3 }% U0 M% a& H; k n( d3 x
: M. {3 P5 ?/ A% e- GtkWidget *button_add = gtk_button_new_with_label("+");5 u1 w/ ~: J$ f/ }7 W8 ^% R+ j9 H
- GtkWidget *button_minus = gtk_button_new_with_label("-");" |$ W! x, v& r
- GtkWidget *button_mul = gtk_button_new_with_label("*");! K6 ]4 O3 M2 M4 W$ O5 c
- GtkWidget *button_div = gtk_button_new_with_label("/");6 ~/ f4 |: a% F4 i3 U2 j5 ^
- GtkWidget *button_equal = gtk_button_new_with_label("=");
1 {6 s$ @+ k9 v% K% t8 B - GtkWidget *button_delete = gtk_button_new_with_label("c");% b# j! A/ U& c1 J; u7 G9 N8 l$ v
. z- n h' G8 e$ d- 2 M1 ]5 ~5 @% U8 `, G) j
- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);9 b$ Q3 W) C$ w7 h5 ?7 ?
- " \ ]; v5 v" x1 W
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
) g5 N. B' ]" p6 G; Z: m8 H - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
1 l( B4 D7 d2 l& x2 G$ D, e" Z# P - gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
# P; b N0 r, e - gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);* d$ D' p4 C! |# G) m& A. ?
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
$ ?5 L" t3 e+ m - gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);" c7 V" t! e: ?
- gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
# G+ E- u+ N/ g' ] - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);3 y6 C% C5 U+ l' ]5 v
- gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);; C" [3 M& ?# B
- gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);' m3 Q; ?' O/ w/ x
- 3 m( A3 ?: q' M% a! e# }
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
2 }( G; {: [4 X$ b8 u - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);5 k/ v6 u7 g% [/ n7 F' Q
- gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);: g U) w8 t5 o6 H- Q, L
- gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);) i9 I! k4 c4 f8 U! r
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
, W. C1 m% S$ |. u- i+ }- ? - gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);5 i) g0 R; Q1 @5 @: u9 g5 r3 K
7 Q- t( e6 J! j K1 u- //注册信号函数,calc()6 [5 {/ G8 P/ f6 {& U; S
- g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
3 q' P2 O; P) u8 D3 `. K+ n - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);$ m/ T& O/ Q3 Q5 t9 i/ w% I; x( z e
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
' M& B$ O4 z! H0 m" P - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
) {0 N% R. I+ G" H6 f3 ~ - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
( B/ X( d% y5 i. g - g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
) u% W- G% l% Q- t9 O* ] - g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
! @# s1 k1 \$ P0 o4 s s - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
7 ?2 Y2 C' K1 f' J, i6 Z - g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);! ]8 d) P+ \7 \, K! ]
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
6 \+ ^& o$ { M1 y - ( F% K4 w, ~' w, S
- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);$ ~# g1 D* V2 W# H- g+ {( ^
- g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
4 l" L3 w% o" _ B2 s9 L - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);% g/ Q9 O1 Z" M# R/ u
- g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);7 L, p# A# {$ _5 j
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);9 m0 o$ ]# g, f# Q! t% h2 E" d, P
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);. D. X/ w, U2 h2 ~
2 t ~% L! a& L O" f: t& r- 8 B7 x u" J* V$ O
- gtk_widget_show_all(window);
& K3 |$ Y# F$ t+ U; @- k9 G: V3 g - - _6 M7 {6 N/ W8 y9 q
- //主事件循环
" |7 N* V$ {; K/ H8 T2 p - gtk_main();
4 a) M! G* D' b; r- Z
( v, f* Q$ x* [# a# Q0 }( k' r- return 0;1 c1 A7 K4 `' P$ P
- }
# b, U( }( k. G% Y+ `7 w
复制代码 以上程序,编译运行后,就可以有以下得效果
' [" {9 z$ ]: c1 E# X. \
( g+ f$ Q7 y# O. T: {7 ~ 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。 搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。 |