上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
, n/ Y% E& c: g- o 基于Ubuntu18系统,补充安装所需要的库和小工具' N( O8 o, ~( }% P% {
更新软件列表 安装python3
3 X5 s; S, ^& B5 e7 }# n# H- F- 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-software8 ~/ o7 T' K2 W* U+ Q5 N
我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
9 J8 |' o, R$ ~
; G9 z& M7 ^( M( l' A" `# L# X3 }5 Z 然后就学着官方文档的样子去验证下SDK是否安装成功。
, l$ f8 z: x8 k H$ ^& Z3 g
% B/ G( n) u1 N4 O- m 以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。$ N$ g& s3 I$ [' r: Y* M* {* D4 z
首先拷贝官方给的demo程序,基于GTK得hello world。
" t7 j% ~- j3 ~7 A9 F0 m" b8 |8 a
, z& O. H0 `) P5 I% i" e; a- #include <gtk/gtk.h>
$ Q+ {% j7 k/ O6 L
* E# P- q8 O$ f8 {& d- static void1 ~5 M5 g" p; W- k( A i" H( `0 ]
- print_hello (GtkWidget *widget,
w! S ~/ A s - gpointer data)+ e3 s9 y9 _* i' _
- {, ~5 x4 B: @0 M% U4 }% ^
- g_print ("Hello World\n");
# B. i* x1 R8 r" A ?7 L" ~2 N - }
1 a, ~% m- N0 G3 X6 G+ [' |
7 ^; ]% ]0 a' j; l" r- static void' w. e7 ]' a! w% o- F& e( a6 S
- activate (GtkApplication *app,5 v2 z/ U* t8 H
- gpointer user_data)
' I2 ^3 F9 a) H+ N0 k8 y - {. u v' e* m* J8 r
- GtkWidget *window;0 e* M7 M) ]0 O
- GtkWidget *button;
$ q& D7 E( U) s" w& ^0 G- T& C h* }3 w - GtkWidget *button_box;
% T. ~- q& F0 F7 i1 ` - $ W/ }$ g5 n6 y: @9 i- H
- window = gtk_application_window_new (app);( H* L& [% ?* l% w
- gtk_window_set_title (GTK_WINDOW (window), "Window");
) [1 J0 {, l. q& S% s/ G" g# M( X - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
( l. G) _( w$ a2 J$ Z - 0 X, ]) @. o4 f/ D* A3 A
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);2 U5 z( W6 m8 P0 l4 F c. m
- gtk_container_add (GTK_CONTAINER (window), button_box);
) N: m. Q8 C3 t ~: y, [ - 4 e, Q& E. Z0 F f
- button = gtk_button_new_with_label ("Hello World");3 n- R# ~* m3 v3 a3 U6 _# {- y, J
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
4 P4 C9 K% S+ U) D; \) i - g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);6 C7 c2 X. }) P* i% n/ m
- gtk_container_add (GTK_CONTAINER (button_box), button);9 J! J/ \% f( Y( _0 s4 Y. m N D
- / u: `: o) E. ]* W
- gtk_widget_show_all (window); b& {1 f v1 K% h. V9 h# _
- }
9 I5 h$ O: @0 l' D - ' }" z( V0 k3 c! H/ Q9 r
- int7 H3 r" ~8 K! ~
- main (int argc,
! T1 Q* r% a# F6 k - char **argv)
0 |* \1 {) A6 i4 B - {
6 S& X/ t& g; T- m/ d: B, s - GtkApplication *app;
' n% K7 R" x: A/ V" R4 e' K8 M - int status;
8 _) J+ F# \" M
$ Q+ ?! {& f8 Y& S/ s7 ~6 @- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
# {$ S: E$ n8 I - g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
* h3 s( {8 |- i+ m/ k9 b: k - status = g_application_run (G_APPLICATION (app), argc, argv);! q1 a2 L( J% n# p1 g- E
- g_object_unref (app); O& E" e+ F7 [7 \# Y! F
& q5 a1 b+ @. a: @% a- return status;# o6 v2 a( p# j; G( ?9 h
- }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world
+ B; m5 U- W6 [, P% P) w - SRCS = gtk_hello_world.c
0 W1 k4 c0 Q; r5 j9 o/ ?5 V
' n4 V% y7 h2 x$ _5 {7 ~4 Z% q# \- CLEANFILES = $(PROG)& A# r% n* |4 M
- # X0 E$ r0 }. t5 ], J+ A; S3 O2 L
- # Add / change option in CFLAGS and LDFLAGS* b* ?& m9 o, p0 | m
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
; I$ v" P1 p |0 K - LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
3 a3 R! W' B }' L2 f4 c* w2 X$ W/ e - ( @& F$ c6 b E- o
- all: $(PROG); s' q& k; v# P/ w- z# S. I
- 2 }+ m/ \: K4 O1 l3 C
- $(PROG): $(SRCS)
1 b" \9 z( ]! D( {/ g - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)1 K# ^* {% R1 k& ?( h
" T/ p% u4 R, @5 t- clean:. @6 v6 x% s, t1 j& I4 w" G
- rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。& M$ A2 e* n& O! X
, U/ _% i7 a' o5 u `3 o5 N. X 接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。& a! c6 _) Z# T$ E
) w( Y0 U: D+ D- #include <gtk/gtk.h>
9 P3 |, E( m1 O9 \* e/ |' c+ J/ T - #include <stdio.h>
6 u* g) V# ^ R, n - #include <string.h># G( I* p, B! Y6 {( v6 P8 C
-
7 }% h2 Z! P* \' n - char buf[50] = "";/ @+ p8 w$ Q7 z7 i- s
- $ E. H" h- D, d n# k
- void calc(GtkButton *button, gpointer data)4 z5 I$ y6 ]+ j5 a4 d) h& a
- {; ^4 Z! I( }( b _
- const char *text = gtk_button_get_label(button);
' C. e) t7 c0 y- s3 K1 N -
( Y3 w+ A( X7 {; A$ E) Z - //退个操作% I4 N& H% j2 F
- if (0 == strcmp(text, "c")) / @: `5 D" T, `* M: d' U, W. b
- {9 X! ]5 }" A; G: P5 t" x# O. G9 E: T
- buf[strlen(buf) - 1] = 0;. z1 {3 h$ q. L1 g
- }else{; |' P6 H+ C1 F8 b3 T- x
- 7 x$ ]* k* b+ ?; m
- int a = 0, b = 0;3 P: J) T5 ~% y- j- W4 ^
- char c;
: h! B4 `5 O# R5 o8 i - strcat(buf,text);
8 a& |/ m) t, J, s/ N9 U4 w - ; Y3 N% O$ E) R- m r
- if (0 == strcmp("=", text)) { M' J' ~4 h& a) j. l j% F
- 5 ?+ u0 J6 D& s2 l7 D
- sscanf(buf, "%d%c%d", &a, &c, &b);! {9 i6 j, \6 w; m0 m. N) m! j
- & u( b' j5 a6 _! ?' `& I( c
- if ('+' == c) {
0 g8 q6 i' X2 C1 E - sprintf(buf,"%d", a+b);, `) y7 G$ ?& E4 w. @2 @" U
- }
9 c _' k& h( p5 q, y7 n# j: ` - else if ('-' == c) {0 C; k& b) U7 o/ l: y5 y
- sprintf(buf, "%d", a-b);* A5 Q' ~5 H4 ^& d: ^" i
- }
* T. ^" i! i4 Q Y - else if ('*' == c) {
4 ~6 V) y+ a" w - sprintf(buf, "%d", a*b);
p" t9 d0 Z- @+ b - }' s* v+ n7 Y+ Q8 B0 c( o% j* ^+ s
- else if ('/' == c) {
- R8 h9 V$ N* X- P, n' X' { - sprintf(buf, "%d", a/b);
5 s" \5 G* g& |( [, x% H; f E - }
o; Z6 d1 c$ K( F: J - " m, t6 g4 D2 ~. Q' b
- }3 T; B- V! ^( T' f3 N' ~* b8 ^, x
- }
5 f8 M" j* l8 u1 j* s2 R. V- T! f% }6 } - , a7 |+ Z; E. c! e( h
- gtk_entry_set_text(GTK_ENTRY(data), buf);$ ?( m; H+ B0 Q8 Q) ~2 ]0 ~6 n1 _
- % n: g0 W! L/ U4 \
- return;
, P9 L5 O; O6 i) o" ~ - }
: I; w9 w* P" d2 Y) Q$ t - ( h+ ~( X, I6 q) W
- int main(int argc,char *argv[])
% n- x; H4 h3 [: ] - {
/ ?1 M6 P# k5 G: m# R4 Q
; Y5 s8 {' X& B4 g* p: v L7 v/ P, i- gtk_init(&argc, &argv);) O" b2 N# {9 |1 r
- - r- k) \" P+ V$ p8 U- l7 N$ C
- ( P3 p- V9 m3 S" { {% X9 ]+ f
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);2 z3 z' m3 c; z2 _& g. j* |
- gtk_window_set_title (GTK_WINDOW (window), "calc");
+ K8 k8 F' f9 Z3 b6 Y9 c- Y( ^ - 2 L5 T/ R. b+ |7 z* ]9 r9 a! ?
- //创建一个表格容器5行4列5 }) _( \) Y, Q
- GtkWidget *table = gtk_table_new(5,4,TRUE);9 v9 N+ M, C5 ]: P' [ W1 _
- " t. u) Z3 Z' ~6 `) `. z0 A' q
- gtk_container_add(GTK_CONTAINER(window), table);: f- E o+ g* w z8 o* Q
- 0 E7 V. r w1 l
- //创建一个行编辑
6 P7 M" V3 B% g7 M7 M) V, p# d - GtkWidget *entry = gtk_entry_new();
+ D* `. ^6 q- K% Q! s7 f9 o, [+ I; N - # Z6 N3 V" k; J/ m
- gtk_entry_set_text(GTK_ENTRY(entry), "0");
! |. o. t, S8 M# F. _" C - 5 O# z% H9 s w; @ Z. ^" O3 v
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
; s: H* Q* |- K0 U) r. W! m. v -
+ O& y7 T& c" H& S- U- l. V) R% p - //创建多个按钮
/ @2 x+ N5 h$ h6 y# d - GtkWidget *button0 = gtk_button_new_with_label("0");+ O; k) u5 H8 D5 M5 V4 Y% U
- GtkWidget *button1 = gtk_button_new_with_label("1");
' ], R, I: R0 Z8 l- Z* W" H - GtkWidget *button2 = gtk_button_new_with_label("2");! B( ]% t$ t0 W1 G
- GtkWidget *button3 = gtk_button_new_with_label("3");
0 x& w. e- Q j4 J7 E# ~' e - GtkWidget *button4 = gtk_button_new_with_label("4");% J. D8 n* `: A+ J. u
- GtkWidget *button5 = gtk_button_new_with_label("5");4 G0 ^ [* q2 ?
- GtkWidget *button6 = gtk_button_new_with_label("6");. X. V) m) ?* w4 E5 N
- GtkWidget *button7 = gtk_button_new_with_label("7");
/ A: I1 @9 c3 [% `# }1 V - GtkWidget *button8 = gtk_button_new_with_label("8");- q! W, C" l) ]! ]
- GtkWidget *button9 = gtk_button_new_with_label("9");
; z; |; u/ Q5 `& h4 f0 q -
. d- ]% b+ \5 g0 f. l2 U- b9 Y( J - GtkWidget *button_add = gtk_button_new_with_label("+");4 o# H% g# y) I3 r5 i% D6 i
- GtkWidget *button_minus = gtk_button_new_with_label("-");* h4 i- C1 E6 S7 f% N; C, L! n
- GtkWidget *button_mul = gtk_button_new_with_label("*");
5 H# k5 P! ?$ A7 G+ y' X - GtkWidget *button_div = gtk_button_new_with_label("/");
; G5 y- G& C7 _' }" m: s# I8 R - GtkWidget *button_equal = gtk_button_new_with_label("=");5 |6 @" @. x5 a, W2 E
- GtkWidget *button_delete = gtk_button_new_with_label("c");
, n; ]5 w \* F6 C$ h# @% h& o7 h0 v - " P9 X9 h# V0 ~+ S8 r
5 u2 h2 S% y2 |+ g- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
, _: S$ H k- u& G - % c9 x+ h. _+ K# X* J7 E; z9 p' C
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);& x; ^# ?# W8 f" R+ ~0 f; s" a
- gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
0 r7 ]2 H( w9 W1 V( Y - gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);" V' k+ }# R' h- M: B4 V# R
- gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);4 l; y3 D& _- U% {$ _9 m
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
: j$ Z6 I; S% ]; e - gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
|6 \+ H' m/ U! ^# r6 Z - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3); B& z! ?: A3 V9 L
- gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
' [! S9 }9 g: ^ - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);, ^. `8 N0 L4 b, F
- gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);' b# t3 m: M! S1 c3 O
-
6 y+ N, Q9 a9 l( l3 u2 h$ A# s& q5 J# h - gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
0 n4 |" s6 F$ d# J1 ?$ K, [7 u2 D* M- _ - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
& z4 Q5 D# i5 l5 [! p% \ - gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
4 L3 q* L7 L& I) U" t, o4 @$ P4 i4 W - gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);% u9 f! i4 b7 K4 \
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
# {* y$ n/ a$ a+ I - gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
. o/ t4 L" d1 ~9 \; \6 Y. G. X - 2 R+ [1 @3 k, _- D! i8 u: d8 s+ r
- //注册信号函数,calc()
& _8 o. \3 S+ F0 i - g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
' ^& U0 y- S' T* i - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);" w6 y; X8 u A" Q/ t% F2 Q
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
8 l1 b9 j! U! f/ k6 R2 y+ i, Z3 K6 ]1 s - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
6 f# S4 p; j3 l% v z' u - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);5 I1 n9 V& O3 i! V' p& B9 e
- g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);* ]* K, d- { Q
- g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
! ]# O1 Z. q0 s$ C+ @2 ^$ R - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
' D; C! m5 r$ v# I - g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);, P/ p. i6 a$ F, [; V
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
% `: b9 v( F2 o) z$ u -
' Z- h& O) f2 U8 g2 T, _* E - g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);1 n% _' U2 C2 r
- g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);% O8 D! h; _ Y/ T
- g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
' R7 f( q7 z) i+ ~3 X - g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);( S. l0 J# ]6 V0 e, V% |
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
- Y! u+ Q# H. L7 y! @ - g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);! X% s! j7 S1 x
- / N- b8 P- c5 }8 r7 u- K/ C
0 x- [ \& j j, U. K- gtk_widget_show_all(window);
; F. \% r7 t% s) [# o& a/ \" l - 1 Q3 F) G. `7 {4 W3 p1 O
- //主事件循环
: Z6 P: H8 |* z3 a# H/ b - gtk_main();
' I* o7 v1 O" n1 v+ d -
( z) [' ^, T: f. ^ - return 0;
4 W2 u Z& n& [" R: z# C2 b - }
复制代码 以上程序,编译运行后,就可以有以下得效果。
( r" }' ^/ h( ?; q, r5 m
$ H3 s& ^& {6 t5 F- s 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。7 o1 d/ s* f: E6 X, n
搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
- F! V9 K2 n/ v+ S1 `$ ^4 P* |. \1 u+ h4 A6 q% d8 _
|
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习