上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。' _/ y1 B9 ^5 R$ F! w0 Q
基于Ubuntu18系统,补充安装所需要的库和小工具( L/ d3 M/ F( U
更新软件列表 安装python3 4 \9 Q( {! B' G
- 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
7 U, e' a" c: t2 U 我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
9 R9 y0 Z6 t0 W8 K
y0 q6 f: c: v; b; h6 X
然后就学着官方文档的样子去验证下SDK是否安装成功。
6 O* [5 A( ^9 q _
% {( C( f" ?8 c0 w4 o 以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
+ K0 y. p" h* J! } 首先拷贝官方给的demo程序,基于GTK得hello world。. s# q1 _/ n* l+ Z0 c0 T
; W/ S% D3 J" t0 o6 X" ?- #include <gtk/gtk.h>! C$ X9 ?% O( x8 O" }
- 9 K( y) o% A# v1 M3 u
- static void4 d# X y6 ^" J' T; _" q( D" P2 d
- print_hello (GtkWidget *widget,& q2 X( G/ \- q% M5 J
- gpointer data)
- s: G! Q/ Z9 I% w& y/ q E - {2 g! M, S) \ @# O9 B+ P: r
- g_print ("Hello World\n");
7 Y8 a8 k1 [0 C' F3 K. l# _ - }% v+ t* m3 s, v* b; I
0 x. `: j0 W# l5 e* b6 |6 v4 `' R- static void
5 w- e0 B3 l! C0 V/ ~1 Z% ^ - activate (GtkApplication *app,
) p+ S5 J: B h - gpointer user_data)2 C- _- P5 J, Z$ l) h6 A3 M u
- {! B5 b5 |1 o2 f
- GtkWidget *window;
" b9 H! Y5 D# n0 u - GtkWidget *button;
G8 E1 y. |7 G# r' a/ B0 ?7 R) h - GtkWidget *button_box;. X$ j; i0 F; t {$ C. N' s2 c' y3 D
/ ]4 L+ S2 J6 F! q$ C- window = gtk_application_window_new (app);/ T5 j7 J1 t( W: A: r
- gtk_window_set_title (GTK_WINDOW (window), "Window");
% @; T7 d$ b% [ - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); ~: v: Q7 p1 Y& Y0 h9 j$ t/ m* E; x
0 ]7 d9 e; }' H) U% w; o- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
4 G; v9 B! R9 h% X( D# Q6 ^ - gtk_container_add (GTK_CONTAINER (window), button_box);
4 O! i/ w7 K: ?
1 }5 D6 H" y8 V) X4 S7 p- button = gtk_button_new_with_label ("Hello World");8 w8 l# o( |+ m0 k5 T9 @
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
- B7 q- f( H( U - g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
. x9 x7 G+ v2 ~( x - gtk_container_add (GTK_CONTAINER (button_box), button);
* p2 P) i5 x) S0 q% a) M0 _, l - 6 e1 ?5 `# ?0 K- ]. B3 ]
- gtk_widget_show_all (window);
. [! t" j6 U* R4 F$ B5 y- {4 ` - }( e- O2 }7 S$ V9 H; a8 g) A, G: l
- 2 ?; m1 ~+ l7 t- v! S: V9 K
- int, o# p4 _: T7 l
- main (int argc,
! a9 E/ B3 Y8 \9 @6 O - char **argv)* I# s: a# _! [% R
- { u, o& f: K. u5 _2 N2 v1 R& A
- GtkApplication *app;
, v% b) @( X# h& u, o# M - int status;
" E" a! ?9 a/ y" R2 C7 _7 j
8 v" f6 i& @- F7 L0 x4 W- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);4 K& H7 N4 Z! M' A& [
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
; B! Z) T! G' i% o- v0 l - status = g_application_run (G_APPLICATION (app), argc, argv);
. [' ]2 f) H: |7 g( Q; {+ k - g_object_unref (app);" u. {* W$ V6 y9 f4 W
$ P- U& T% H$ {$ p: v3 _0 p- return status;3 u, n" S0 w' b9 L* e2 Q: C
- }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world! K" r9 k" R, V, S
- SRCS = gtk_hello_world.c
. v# O. w$ ^# K - & p, O/ `2 d5 P
- CLEANFILES = $(PROG)4 g- p9 u$ h) \& v3 H8 p$ g+ m* U
- - N3 j4 u$ W5 J( p( ?9 M
- # Add / change option in CFLAGS and LDFLAGS. k, e& l& _9 x- f+ x/ ~. U; }
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
0 K& U+ _7 j/ T; n: {+ D, q k3 ^3 a - LDFLAGS += $(shell pkg-config --libs gtk+-3.0)5 ^' w4 U' [# Q( R5 R1 }0 \7 b
- ( x6 |, ~; i) c/ }, D/ \' s8 {
- all: $(PROG)( J; V3 K. `; }2 ~
( }2 p- H$ `; Y' j) v9 e. ~: E- $(PROG): $(SRCS)
' L m( P2 V/ k4 w7 v+ ]1 L F; i0 G - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
}# k4 A" j& c. n3 L$ i9 b: Z j
5 E @% ~, N: R. p3 B- clean:
$ b' p5 Y3 H- q" j, z* J T' Q - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。& Z: b" l7 C' j2 Z$ L
: V# w5 P4 C4 b* J 接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。. D: @- p3 @* Z. r5 t
, C( \; N7 m* h) Y2 N' ]0 [! D- #include <gtk/gtk.h>) p6 d% f [5 o3 }7 w
- #include <stdio.h>
( {4 s4 j2 `( V - #include <string.h>
. N9 r; U: F0 ~( @. D* J8 A1 l - 0 ^, J3 o( O1 T$ m) U1 H6 O0 {4 \; L
- char buf[50] = "";
) g0 |0 E/ v2 o& { -
2 }# V/ S/ ^* \. g - void calc(GtkButton *button, gpointer data)8 d9 {. Y! P: R* u0 A' w% b
- {
0 p$ V5 P' k. A ^0 o/ l8 w - const char *text = gtk_button_get_label(button);8 j4 H7 o3 N! c7 z
-
- y! m# d/ G6 F! o2 o4 f4 P# a9 U! l' n - //退个操作
- G1 R% o2 J9 T4 Z - if (0 == strcmp(text, "c")) 5 D6 x' M7 [9 U3 Q1 ?* \: S* K
- {
! D9 b- m. j, r' g: B - buf[strlen(buf) - 1] = 0;
" B! `0 g" D( T2 n - }else{
+ z, e! ~% t! d; V7 c* ^" A o -
2 p: ~: h ~( L9 I- L. t! u - int a = 0, b = 0;
; }5 U! D$ ]" e. y& s - char c;
5 P1 O# Z2 f* v$ U& w - strcat(buf,text);7 e. W8 ?1 [1 b4 o: `
-
) A8 o) `9 P, x7 f - if (0 == strcmp("=", text)) {$ F# D4 l9 l) n8 c( z3 O
-
: ]6 z* i$ M/ @ - sscanf(buf, "%d%c%d", &a, &c, &b);0 d+ J! O) P- |6 q+ @4 H+ S7 P
-
$ o$ _& [: ^0 \ o - if ('+' == c) {. ~2 |* b3 m, }+ H
- sprintf(buf,"%d", a+b);
; _/ H6 P/ h7 o1 x! l - }' t$ d& y: @7 e7 D" a( S. ^
- else if ('-' == c) {7 ~ l9 ?. D0 H& i' a! l: R
- sprintf(buf, "%d", a-b);
' [; H2 w7 W ?3 b' O j - }
: D3 J6 {5 {6 \0 z/ y - else if ('*' == c) {/ i! H+ ^6 m6 Y- q' |
- sprintf(buf, "%d", a*b);
3 I" ?( B2 U5 X2 U/ S - }
1 g: ^/ ]$ q* n) }7 T8 \1 z - else if ('/' == c) {
7 s- u' h6 t0 m. ] - sprintf(buf, "%d", a/b);
/ }, D+ d4 F0 C- c9 F9 b* G - }& n2 |% ^ e- N& x$ p- A2 J( A
-
n A0 s, s' o& t; x g! ]% V" E - }, b- N2 K8 a; T- E- m' X! E2 g
- }4 ^! p6 U0 Y& [
-
6 m( S. g( Q1 ?( J - gtk_entry_set_text(GTK_ENTRY(data), buf);" e1 [5 r2 O( B4 Z4 l7 y1 K
- 3 Y p5 A/ G6 S! e$ ^% p9 H
- return;) m) I, P* u% l/ M/ K
- }: j. b- m; |+ b$ q6 \& V a
-
9 U" V" n$ H5 M3 P) q/ j7 W2 | - int main(int argc,char *argv[])
( H2 r( K' U* B7 j! ^: K - {
' y2 v7 I0 h+ v0 J! C2 | - 3 r. c* H" _7 T2 r# k- D* p6 g6 V
- gtk_init(&argc, &argv);4 M' @1 o3 S, M5 A
-
1 W3 [/ a8 `/ R2 V$ P6 Z3 ]0 U, F - ( }: X; G W j) b
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);4 h. _" s: ]* S/ a* e3 C7 {
- gtk_window_set_title (GTK_WINDOW (window), "calc");5 p4 y3 c& f0 i; c
- 3 o9 \" q N/ @7 U9 A0 h! ^7 X
- //创建一个表格容器5行4列1 t3 q) {, [9 }. S7 h
- GtkWidget *table = gtk_table_new(5,4,TRUE);
" b( K% r; s+ a6 E' y3 ~
% R4 w7 q) K4 k. J) B8 O4 K- gtk_container_add(GTK_CONTAINER(window), table); x! w6 K; q2 b( w, [4 A
- / Z+ [4 v8 d. d/ M/ o
- //创建一个行编辑. X( V% ^( @: e; {
- GtkWidget *entry = gtk_entry_new();( ?! C7 R- t6 X% L- `* N T C
- 2 g. ]/ T4 D; b/ A2 G5 ?8 n
- gtk_entry_set_text(GTK_ENTRY(entry), "0");
5 c5 e$ n. y( Q; T2 J/ O1 B- ^
5 {. K6 {: H+ A4 R- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);$ x, z7 I) ]+ _# ~' [
-
6 Q: ?& ~+ a, v% d8 G1 J8 E - //创建多个按钮
* V: z1 J/ W9 R' p- ] - GtkWidget *button0 = gtk_button_new_with_label("0");5 Y3 T3 J+ Q M7 m) w+ l) I- I+ P
- GtkWidget *button1 = gtk_button_new_with_label("1");
* S% d& e+ e& h8 f7 a" l( a - GtkWidget *button2 = gtk_button_new_with_label("2");4 D/ P+ o8 `2 G' j$ ~
- GtkWidget *button3 = gtk_button_new_with_label("3");$ G* O" f, x0 O, ]/ h
- GtkWidget *button4 = gtk_button_new_with_label("4");
- H! J: R8 a4 f% P2 N2 ^5 _ - GtkWidget *button5 = gtk_button_new_with_label("5");$ j# O9 y8 ^: I, n, y1 Z o4 h0 ?2 {3 w. d
- GtkWidget *button6 = gtk_button_new_with_label("6");
# u5 w6 q" k- }" `1 ~ - GtkWidget *button7 = gtk_button_new_with_label("7");
6 D. B b4 @- W+ u- J - GtkWidget *button8 = gtk_button_new_with_label("8");
8 f& G7 d6 `+ T3 p: K& e- _. [ - GtkWidget *button9 = gtk_button_new_with_label("9");" X/ \0 M* F9 t# H" b& `6 j
-
; v" \8 ~7 A1 X2 Y# w - GtkWidget *button_add = gtk_button_new_with_label("+");) |5 G* \+ r( w
- GtkWidget *button_minus = gtk_button_new_with_label("-");
6 H& [9 H. L9 v3 Q1 K - GtkWidget *button_mul = gtk_button_new_with_label("*");! A' {8 s* ^# h2 o4 E" K) i7 }
- GtkWidget *button_div = gtk_button_new_with_label("/");
; x3 a* Z! y. E% B5 i/ C; ` - GtkWidget *button_equal = gtk_button_new_with_label("=");
6 r" Q. t3 g' K) L" y2 S6 v7 \ v - GtkWidget *button_delete = gtk_button_new_with_label("c");( d1 p3 G) u" N' ^5 ?1 a8 w6 C1 }6 s
- 5 B1 D& X3 w. P: Q
5 c3 h0 m( [8 u7 b& w- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);8 l' [. x" m- F" `, S
-
; T5 G3 x+ r+ N. ~' Y- y - gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
; t8 L% P# i( S0 Z" F0 T - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);; B$ N& Q, T" b$ R2 g
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
$ ^8 d& k3 v! }" Z& Q - gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);- l+ C# y; z3 y
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);2 m0 B% {* e1 l- y4 e
- gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);0 C- J9 G, C5 L. ~7 t/ T
- gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);0 {: C3 t9 ?7 Q& u5 I! m ?0 |0 Y
- gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
4 E+ a4 e& z4 j0 E$ U- x+ a! L - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);& A* ?0 v3 M$ a. v6 o# f0 q
- gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
I6 W1 w5 T3 P -
+ m+ h2 G1 U1 o. [ - gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
. A" {6 ?& U/ w2 E4 T - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
' X' x- y) \3 k. e) } - gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
/ U6 c( M0 z9 s4 M4 [. T. s$ t - gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);0 A! w- N# z) Q2 n" c8 Q5 @
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);# }# Z1 {8 U, i& K8 \$ k
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);* x) V3 j1 @' v
- 1 y1 e# n/ Y' s8 ]; w
- //注册信号函数,calc()
' a2 S: p9 l- a2 S5 U _1 C: p0 e - g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
$ |* m2 m+ o) ] - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
- [7 ]$ j7 R/ e$ J" z - g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
6 @4 w3 n! X, o - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
; M6 g E( S% _3 ] - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
8 v+ ^1 |) A- p' ?0 f$ r% H8 T# b - g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
/ T6 {* P- M2 Z; c: b - g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
$ l: }5 H {, p' w/ V - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);2 a; s$ P9 E" a) h0 A! d+ z! c5 e
- g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);6 }) w: D; g3 l' X0 s4 Q
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
6 ]- J: N' r" h# C -
+ d( k/ n: T: n8 S - g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);1 }! L J9 p& ?4 L. Y' E4 m
- g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
6 u7 F$ O, q' h7 J8 \ - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);$ b1 K5 c# m9 w9 v
- g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);; Y; E7 V" z- ]
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);: o/ H$ {6 O+ u4 z: ]0 p6 t/ ^
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);) N' Y6 K% T# v, R6 Q/ N$ G
-
) o& W/ `- P' Q5 w- T$ k$ P - 1 k) Q$ k0 @" o! P" Z& C: K
- gtk_widget_show_all(window);3 G& q8 S5 u$ B/ z$ l9 Q9 b
- 7 y( u, T6 k6 W' ?# l: }
- //主事件循环
! h, @3 D6 h9 p3 F - gtk_main();
A7 s% s1 K) l2 m' S! L - ' T1 H* W! d% A5 f7 ? Z- m' }
- return 0;# B& s8 K( O& v7 e, A
- }
复制代码 以上程序,编译运行后,就可以有以下得效果。
$ a( p$ v- S, T( l/ _4 j
8 E n, K1 _" M7 @* y& k' w9 Q' [
操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。0 H. M* X8 `, `& K3 K
搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。+ n8 X9 c/ R$ M
7 ]6 L" }2 T# r% p+ q7 r8 \: m
|
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习