上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
/ p# {8 [1 P S, Y1 ` 基于Ubuntu18系统,补充安装所需要的库和小工具
- k7 ?$ v4 v3 F( [' K" A% F 更新软件列表 安装python3
1 N/ B9 b7 }5 V ?! l6 ~- 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; P& Z- R" M! j. x# V7 @
我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
l9 M! p3 `" E2 K% h0 o
0 O( y$ @4 o) P4 U 然后就学着官方文档的样子去验证下SDK是否安装成功。
m$ e3 {( W1 t2 ]$ w& r
8 S8 y5 D6 T* {8 G' J8 E: f( m& D. V 以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。' {( o/ K% j/ Y# P5 v2 s
首先拷贝官方给的demo程序,基于GTK得hello world。2 P( Q' | U) ` T, O( B) @5 l0 F
$ P% i" r3 \1 E3 {- #include <gtk/gtk.h>" n% B( E! Q+ t ]! F0 C/ p. v ]
- ! N$ t$ r) a& b7 [
- static void
# z9 A: G0 C; B5 c% K - print_hello (GtkWidget *widget,, C9 B4 T0 d" W1 i+ a+ h
- gpointer data)% p }$ p% R( Y
- {3 _8 E' Z H3 h+ }0 @
- g_print ("Hello World\n");/ d5 T' G* o6 @5 n- ^0 f3 W
- }
6 q0 B+ G( n/ _. |' h
" V& K8 g Q; o9 S; F R$ h) k- static void
, \2 k* O" d* N! S$ q! | - activate (GtkApplication *app,
# q2 d- e: y5 |( \ - gpointer user_data)
' [0 _1 [) O& n- q. L2 Q1 h$ r* L - { f3 z6 g" O9 H+ N* L$ [. [4 G
- GtkWidget *window;
3 p) ^; w- o1 T - GtkWidget *button;
) h# n3 _5 i3 Z0 W$ B! r1 G - GtkWidget *button_box;
+ R4 V+ G. g" S - 7 J {% x7 g9 }) F9 E9 T
- window = gtk_application_window_new (app);' c3 K. R: C$ |
- gtk_window_set_title (GTK_WINDOW (window), "Window");
/ |1 a% a i; z( K& P* l7 L* ? - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
: y. i9 h, x- j
5 H7 u: L! w1 C+ j: D8 p- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
; P" z2 ^" i' y2 G; c+ }! N7 G - gtk_container_add (GTK_CONTAINER (window), button_box);6 @# s$ O5 A& a! s! c- \" q
+ ~1 o+ J* T7 e3 o! X- button = gtk_button_new_with_label ("Hello World");
9 ^4 h& k: m+ C3 y2 c5 w& g - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);3 x7 t( x! Q2 W8 I
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);5 t \- A9 g9 Q4 h" j( Q
- gtk_container_add (GTK_CONTAINER (button_box), button);& z- S9 o* p- M/ P
6 U! e' n; y7 e, l) S, A- gtk_widget_show_all (window);
; q! k+ D& u/ J: ~ - }
7 l' o' c( K4 c* [
5 I, v; g* h4 i( m- int
& f" u' p- I3 z# U6 S - main (int argc, o0 ~' ^# ^7 W4 h
- char **argv)
+ i7 T0 \2 l1 M! W7 `, I - {3 C. X1 X# P1 c1 Z0 W' G+ c- s
- GtkApplication *app;) [& v- `( c2 h) G @. ?4 b
- int status;
7 t0 s' ?1 V0 \# V% N - ! x3 z/ H; o1 _. H: }. N) y: {0 z
- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);+ m+ d; Z& W! Q" l& z6 A8 v5 I5 h
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);; n6 r& j& m. M" O$ k5 U
- status = g_application_run (G_APPLICATION (app), argc, argv);
& A$ \3 c3 z' G. }4 _1 \* Y - g_object_unref (app);
. M/ G$ U* b5 N1 N4 n* q; U - # Q( Y9 @2 C# ]( W- c
- return status;' u Q) v4 n1 I
- }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world
! B5 \# \$ t# r% U/ H6 Z* Q8 A; q - SRCS = gtk_hello_world.c
& S. w% F# Q- T! B2 H/ M - & [+ `6 @4 r3 I! R5 }0 D5 S
- CLEANFILES = $(PROG)
! L) b* c p. `0 L+ Z
* |% Y' a+ u' V0 t$ X& U# f E- # Add / change option in CFLAGS and LDFLAGS
: z' U. Q. n& m& m! i' x' B% \# X9 @5 m - CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0); m+ s0 _- s8 H9 |- S
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
- e9 s: j8 S J6 T
9 e4 x9 @- j6 g* A- all: $(PROG)- |0 \2 S0 P! E1 S
- / a/ N" P( F1 d9 T+ l; U! y
- $(PROG): $(SRCS)
9 y+ Y& X& c! S6 n) u. W - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
5 a' A) ^0 C0 r- u, B
3 O2 M" J% Q) g+ k/ i4 d4 l5 x. m- clean:
( [. e! k# K" X% \1 i - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
+ k, o. j/ c' j9 z- ~
: p, L- s9 b% ]' d4 K
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。! M7 s8 W$ a. r+ m; V
; T! E) P Y' P* J0 S) ?
- #include <gtk/gtk.h>8 ~2 y& Z; j" Q I2 |" j3 x
- #include <stdio.h>
; J, v. r% O8 [% e) q- C1 R - #include <string.h>( D( i. b' W, Q F) j7 U9 s
-
. k. S( R2 k6 @# f; V7 c - char buf[50] = "";2 x3 X* k) Y; S- ]
- ) X r }0 t- g
- void calc(GtkButton *button, gpointer data)
: e! F4 |2 j9 A4 c5 @3 Q$ ?' W. K - {
( j; E6 @ [' S1 V( ?$ s - const char *text = gtk_button_get_label(button);
) r+ D; ]! k& Y - 1 F& \8 I" @" n2 M
- //退个操作; G/ b3 H! k* d5 L- N
- if (0 == strcmp(text, "c"))
# ]2 M" b, q+ A2 ?. x; C - {
5 T2 z; A' j b. {, f4 ~. r - buf[strlen(buf) - 1] = 0;8 G8 K6 T- N6 {) U# Q$ n2 P- C
- }else{# s$ @" F2 ?, U: V
- , k: ]' D4 i' z' e9 E7 X* c. Y1 [, U
- int a = 0, b = 0;
/ Y# Y% G- L1 g7 V* u+ |0 s4 D - char c;* j4 h) u1 T" P
- strcat(buf,text);: }9 O6 _" _2 H8 t- @8 {
-
( K/ Z9 V# [- p" `; T - if (0 == strcmp("=", text)) {5 Q1 ]0 I" B, ~+ h0 r w) f2 s0 ?
-
, N2 T4 G* @5 ], |4 \* B* \9 A - sscanf(buf, "%d%c%d", &a, &c, &b);
6 v2 |) ` Y# G+ r/ K! r - ; M! E5 O! ^: c F. l- `
- if ('+' == c) {1 N( |( A& p* d y, o7 F6 |
- sprintf(buf,"%d", a+b);
& v2 l3 t9 `4 R - }3 i3 U, ]7 g9 Y, u! v
- else if ('-' == c) {
) U, P& c# n' r% `' z& Q1 H - sprintf(buf, "%d", a-b);
* W! F8 g+ q5 _4 g, |) ^ - }
( J7 U9 g5 D4 ~- Z$ O# a8 b0 r: l - else if ('*' == c) {
+ X/ P* Q. W; e+ |- S+ }; t- | - sprintf(buf, "%d", a*b);
& f Q0 z0 ?/ V - }
. E8 Q, N: f, y: t# t- @ - else if ('/' == c) {
- G1 x& g; I% \1 C - sprintf(buf, "%d", a/b);: F e1 B: [: J- H, G0 j
- }
3 t# M h7 T" f -
/ P) r1 p. W# g1 K- k9 V - }/ W% N3 D( m) L0 N2 ?
- }# x! l; ~0 d: N; Q) t! C* y6 a
-
- R9 K/ p5 ~- y: o - gtk_entry_set_text(GTK_ENTRY(data), buf);; o) |- v, B8 @; X9 L& j# g
-
2 i' s! J* X3 V9 c; b7 j' V - return;; C a ~2 K- M! i9 G2 D6 B
- }
7 c! N/ I9 C+ t# v2 }! D( ] -
9 Q& U' n7 s! z: L- m# f2 y - int main(int argc,char *argv[])6 E2 `2 p- l; r( F+ w: p
- {; `" o" W5 D# `; r$ {1 |) [7 d
; `; ]" O% O3 j+ P- gtk_init(&argc, &argv);
2 a2 C4 I8 r$ t( z2 n8 B -
9 @9 c5 {' U+ D; O( a" q
- F. }5 [9 l+ x' Q2 R- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);, M" [' i+ c1 Z0 ~6 T7 R9 J
- gtk_window_set_title (GTK_WINDOW (window), "calc");0 p" S) d9 ~" U
-
/ Y7 c% F% S4 ~ b) a& G( q/ { - //创建一个表格容器5行4列
( Z7 s6 { M2 X( K0 n - GtkWidget *table = gtk_table_new(5,4,TRUE);
, U' S$ [ ]9 r, |$ T. u - # X6 u+ a0 @+ o4 ~$ R0 Y. k
- gtk_container_add(GTK_CONTAINER(window), table);
9 z/ n# C+ I% s$ H3 i& L - " k' s( w- C% X( i, l: Q5 l9 i3 I
- //创建一个行编辑
/ W: K, e( ?7 [" F5 Q3 N8 j - GtkWidget *entry = gtk_entry_new();
1 B7 O1 U D2 |8 t -
# B8 a9 j" r* a' d2 d$ v - gtk_entry_set_text(GTK_ENTRY(entry), "0");
( {& d8 A2 H8 Z* n G2 E$ { - 7 E+ j) g) v, G% v2 a
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);2 O- ^% |1 e* g- }0 F( Q9 g7 |! X
-
* `# L* p$ d2 _( q1 ^ - //创建多个按钮' a; h/ m7 `; `5 L( a
- GtkWidget *button0 = gtk_button_new_with_label("0");
- Q* h& Y3 b; t& J' D7 u - GtkWidget *button1 = gtk_button_new_with_label("1");
# E2 U/ N3 l* _, t - GtkWidget *button2 = gtk_button_new_with_label("2");3 b b( A+ d0 I# J& s' [# u
- GtkWidget *button3 = gtk_button_new_with_label("3");
: ?: n% b0 B. w3 _( T: C - GtkWidget *button4 = gtk_button_new_with_label("4");0 ^; T( c% D8 M V
- GtkWidget *button5 = gtk_button_new_with_label("5");9 [* R) ~7 `: `: ^0 v
- GtkWidget *button6 = gtk_button_new_with_label("6");
8 ~5 @7 n: v5 u3 T" u7 l - GtkWidget *button7 = gtk_button_new_with_label("7");; k+ b( x, Q. q. U
- GtkWidget *button8 = gtk_button_new_with_label("8");
( Q& }3 V1 u! [& p - GtkWidget *button9 = gtk_button_new_with_label("9");
7 ?! \% L; A: o3 O& X6 H - 9 l! V) |# Q3 H# N4 z$ E* k
- GtkWidget *button_add = gtk_button_new_with_label("+");8 C* z4 C% t7 i% [2 g
- GtkWidget *button_minus = gtk_button_new_with_label("-");
- n+ f: t) V8 M) S - GtkWidget *button_mul = gtk_button_new_with_label("*");7 h" B% y! X0 |% p* A8 B+ g
- GtkWidget *button_div = gtk_button_new_with_label("/");
, u7 R+ l4 j1 p5 H6 w' z$ S4 Z% a - GtkWidget *button_equal = gtk_button_new_with_label("=");8 N( z+ c3 i6 j. Q
- GtkWidget *button_delete = gtk_button_new_with_label("c");, R7 t9 U' o$ ]
- ; A. b" _; i/ A9 n: w
- ! _! G4 X) j& s; M! U
- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);5 H9 S' H# q) A" o7 V2 s
- % S5 y4 }8 w% e# P( q F, Y7 C
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
5 I% b1 d/ [% Y# m, q2 d - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);9 a& X# G+ ?" ^; I
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);8 j( C7 e' l4 v2 v6 x
- gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);6 Y# ?$ b) e1 ~$ i2 H# a3 Y
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);0 J U; o" _% A$ w( Y: m
- gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);" Z$ w1 F' d4 w; Z- y
- gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
6 d2 G% k) Y1 y1 U; D4 ] - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
7 R W' e8 X3 S. }1 y% E& D - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
" k. M6 }5 `7 R5 g) p5 n' m - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);( u/ L0 Y* v6 ]0 y
- ; D6 ~/ I! K+ n4 i# j
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);& y' N6 {8 A+ [* s$ W; V
- gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);* U4 W `) u- @$ B' t. l
- gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
& W( E4 |3 \# D: k5 E. _+ E* b/ J - gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);; d( u1 f$ _2 c: W* Y
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);: U" {% E2 i# P( o' \0 C: N) D
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
$ L$ ^$ p! s O3 ? - ( `2 Q9 I1 h$ Q `- L& r
- //注册信号函数,calc()0 o7 m1 y y- c% m' j4 P) a8 G# F
- g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);! t2 _8 Q, S* s- B. V2 X, M% A
- g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);* A( P- N5 H' b' Q
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
/ Z, N0 H2 D$ O% Q2 Q. d - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
/ }# @! Z2 h/ M' z0 _% F - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
# z9 |$ V% I% {! t - g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
! J4 L! e o: A5 ?! o0 |6 w - g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
& K4 u- i# s) W W, B# M - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
& |7 z3 |+ _% c+ v/ P# Z& ? - g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);! [! D& P5 ^. r; u: ?$ w; J
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
0 {: c% C4 H# ^& s$ I+ P -
% K- m" Z6 r( x7 ], W - g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);5 f" \5 I8 q) ^. K$ k9 c
- g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
+ |3 E$ G5 ^3 P5 V: R) {7 z - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);8 t: G/ s6 r& p& O, k. ]' q3 K
- g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);1 i9 P0 [/ r5 U" }( l4 a( d
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);' O& ~* V; n. }. u; x9 }9 s
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);' c" z& U+ t9 i3 b: f# O, q
- % a6 S& J7 @2 q8 Z1 L. V K% K* ^
8 P. s" F5 i" c* z- gtk_widget_show_all(window);& H' J- f. U/ ?% Z! _
- , V, \/ u4 M. s" p$ @4 @2 G
- //主事件循环
( e& M2 S% ^( O% l \+ }% i5 g - gtk_main();/ A0 U8 f* @1 a& o+ A0 u+ e2 a8 f4 N
- 9 ?0 k5 \2 ~; X' c. l, w5 p) [4 T) m
- return 0;: O& n/ P: I# |# p& c8 G
- }
复制代码 以上程序,编译运行后,就可以有以下得效果。
: r- L Y( C6 `7 ?3 g8 x. W
* A% P; P9 G, S( S
操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。' M$ [- J9 R0 j
搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。' E4 n* m" W- w
! Y# C% H4 J* \ `' G* w$ X$ C- w |
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习