上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。6 E e8 F, o1 j; v
基于Ubuntu18系统,补充安装所需要的库和小工具
. A1 B& C: `/ F* H' y. r- f 更新软件列表 安装python3
) `3 V- a4 V- X' ?! [5 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-software
! W% c. `- i" P, h& v6 R 我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。2 R8 y+ B! R; Y* F
7 a! L, n( d: D6 K( Y8 A( x6 N
然后就学着官方文档的样子去验证下SDK是否安装成功。
1 n% V8 @& ]! z) a$ ^
8 j; W& K) Q( S. q, {* f4 J
以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。8 `$ s0 F# b6 R0 Y
首先拷贝官方给的demo程序,基于GTK得hello world。( s( ~, s. o8 J1 z9 u- B6 J* D
6 A$ X4 N( J, |- #include <gtk/gtk.h>7 B; y- T2 @& O
- 3 a/ B# D" Z/ I% {
- static void
# y# D$ O7 f3 j e; K; ]4 A - print_hello (GtkWidget *widget,
" R( {& }/ a1 O/ _. X8 P - gpointer data)
9 M3 L4 j* F* i - {
8 V% K. D) J4 u2 G2 o% I - g_print ("Hello World\n");
" c. x& W5 R7 T. P' Z- e. T - }
2 m: U# W: I, p, [4 h* ~) M
! h% d( V8 D; O( U0 f+ W V) [) b- static void
4 d( S7 X2 i2 L. n! \, @1 Z1 t - activate (GtkApplication *app,
9 s8 @1 h) x# w+ f2 A1 t* Z* j - gpointer user_data)
" E F6 q! L- t/ ~8 q - {! h$ S. W* B6 P7 N
- GtkWidget *window;
% [% s2 k% g, _5 D! q' ` J - GtkWidget *button;8 E# l8 {: z$ f# c
- GtkWidget *button_box;4 n. P$ @- ]9 y* C+ ]
, G" p7 c9 M4 w- window = gtk_application_window_new (app);
) O( }& z o0 C4 M - gtk_window_set_title (GTK_WINDOW (window), "Window");
' B6 i5 j1 q' F - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);) Q. E; {5 \# T4 @" e
/ z9 K2 X+ o9 H" |- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);$ c+ J i8 }/ w; O1 ~
- gtk_container_add (GTK_CONTAINER (window), button_box);2 O0 ~) i r9 @
- 7 i+ U, _0 Y# A0 U+ l# P4 n
- button = gtk_button_new_with_label ("Hello World");/ Y/ D: O$ r4 i7 g& P' p8 V) [
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
8 F2 _' n4 }6 e0 J- n+ s$ V - g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
4 O1 Q9 P" S& L& G1 C( C. U) ~ - gtk_container_add (GTK_CONTAINER (button_box), button);8 ]' B. A# j8 g( Y( w, H
) T$ b4 f2 k( e2 U: N4 e( b3 o- gtk_widget_show_all (window);0 U; q' E8 b& ]$ K4 w
- }
" {7 i/ s' o. r3 E; s
% y8 {5 t' I# k- _5 T) g0 N- int Z( {8 H. q" J1 k$ S
- main (int argc,
2 A. r. w5 l& P8 v& G5 g( K! j - char **argv)$ n# H" @9 P# m; A2 n! [
- {
8 T8 i( K( ] s: a! _. t" x- c0 q* T - GtkApplication *app;% p" _) N! V3 M7 C" _5 W2 v/ X6 M
- int status; F' P- u a* p$ Q# U% ]/ G
2 ~6 [9 w1 v3 H4 L& p- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);: t1 n* C9 b b4 h z( S: y' s
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);8 {( T" W8 Q2 D% e: A
- status = g_application_run (G_APPLICATION (app), argc, argv);" ~" l" x: p u
- g_object_unref (app);
5 r% m7 ^) |2 c/ Q0 a - ( K; E9 W/ E6 B1 P; U F+ N
- return status;
) U7 i+ i# a! S0 q* t% u - }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world) ^) `% N+ o' {5 @( e0 H
- SRCS = gtk_hello_world.c
+ n. W0 F0 `0 y) k) G! G8 Q
9 [. l) ]+ N" g4 M Z- CLEANFILES = $(PROG)% N8 e h" v- s! g# v8 z1 q
- 7 U; N3 [7 u5 ~! M( N' E* j& ?
- # Add / change option in CFLAGS and LDFLAGS4 Q2 S, K* E8 F, b) I( D
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
, Z5 @ R7 y5 N: u1 e% Z - LDFLAGS += $(shell pkg-config --libs gtk+-3.0); K3 l( ^% k; x5 I" {
4 q0 [. N' ~2 ^" m- all: $(PROG)
& e% K) c2 e* p$ ~
3 v$ n9 ]7 C) U: s- $(PROG): $(SRCS)
, m ^3 C) Y$ \' F - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS): W, i+ P. Y9 R% M k5 T
* I {3 g$ i; h4 B' ?# H. j9 w- clean:
5 h/ E9 H8 K# Y' [7 G$ @; `9 Z - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。, a9 `7 A/ w. j) r' Q/ U
; o# Z' ]+ O' ?% X8 Y
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
: I8 F( N. G0 m1 b+ b7 c6 } b" s* s% b/ F: }
- #include <gtk/gtk.h>
8 N6 {5 D/ u7 L/ \5 t2 w - #include <stdio.h>& f& O/ k0 z+ Q' j
- #include <string.h>
6 c* T6 n6 z+ S& J" ?+ Q$ M" j7 K -
& B; g1 t$ l; _. m2 b J - char buf[50] = "";0 D6 r% d0 L. y9 a; d' B
- ; a1 K, x9 i0 ?5 l3 A
- void calc(GtkButton *button, gpointer data)+ i1 m6 ^0 U! W. H/ e& J
- {
7 ~+ |/ ^& L; {7 E; M7 u - const char *text = gtk_button_get_label(button);
/ u; y. V9 r$ P - # m: f% ^5 @; w$ V4 x) G0 x: J5 m
- //退个操作
, V( p) p$ z, c - if (0 == strcmp(text, "c")) 6 t) i) O$ v+ j) U% G
- {1 u/ d- ]9 D g: B
- buf[strlen(buf) - 1] = 0;
9 G# c) A2 J8 b: K" l$ t - }else{
' _0 p0 E4 U% c% u/ q, h, ` - % A0 [+ D4 `) w& E
- int a = 0, b = 0;- ]0 R6 M" M& K" }: q+ u/ ^9 E& ^9 o$ w
- char c;
/ H! z5 W) ]$ V/ ~' d! ?+ D - strcat(buf,text);
8 I4 l: |+ g; l" b" b7 k -
# p# s2 g5 t; g7 s9 n+ r: J - if (0 == strcmp("=", text)) {$ ]8 D3 b) o9 G @' M( _
- 7 ~' F! g( |# _4 b3 y
- sscanf(buf, "%d%c%d", &a, &c, &b);
* S8 K3 [1 O) e, g" P7 P -
# x# {0 g$ S" N! @9 F3 C5 Y6 y+ f - if ('+' == c) {
7 K4 s1 _, u+ I6 d2 ^ - sprintf(buf,"%d", a+b);
' u1 q ?0 Q; u {) Z: O! L8 l - }# @- E% F+ \ R# n
- else if ('-' == c) {" [, q) h B, z
- sprintf(buf, "%d", a-b);/ O& [9 Y' X7 I% V9 D+ t
- }
& C( @% B8 f% A6 f1 Y; R - else if ('*' == c) {, F0 J( ~* v( A0 F- g. i
- sprintf(buf, "%d", a*b);
" u/ t- n( |4 w+ i! Q# D0 @ - }) a: S; f0 ~8 h+ Z* J; i, G7 g" C3 j6 @
- else if ('/' == c) {6 t+ x. T: J% E2 U% ~
- sprintf(buf, "%d", a/b); B7 i1 c- ^- @. V6 |8 l( Z; X
- }. u$ x, w9 W! C/ ]4 t
- ) M) B' t2 a) N3 i2 `/ l
- }
# R/ Y& Z. J+ ?8 B, Y6 R( t: r - }, C9 O2 |4 A5 L2 f9 y3 X g+ F+ D0 s
-
7 Z1 i4 z2 ~ u+ c8 o; h - gtk_entry_set_text(GTK_ENTRY(data), buf);. Y+ B7 R6 b5 Q$ x, L, w8 r& Q
-
7 H* L2 d# M) e- m# E - return;$ N3 S3 Q' s) C7 L
- }2 y+ v" P# C' W7 x/ K3 O t
- 5 ^" ^! @, _. ?
- int main(int argc,char *argv[])* P* @+ I& s3 m# l, N6 t3 R% h
- {
) A: w# Q! p, \, c1 @ - 3 u# T" r0 e- g: m2 r3 p) ?$ K$ A
- gtk_init(&argc, &argv);7 U- i6 ^9 ?' n; R
-
3 J, E# z0 P D6 u: L' w$ D' y8 |
. X; [. E1 Z9 X9 k- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- w1 Q- M& ?7 e4 d9 ]9 V8 F - gtk_window_set_title (GTK_WINDOW (window), "calc");
) S- h+ s3 v1 c g% F+ w3 u -
- l. Y/ Z2 Q7 d- T; ^" K5 M - //创建一个表格容器5行4列; A) |$ H1 J; F% e0 S) w5 Y
- GtkWidget *table = gtk_table_new(5,4,TRUE);
% K5 `9 f! v# k: \" V8 E% ]' v( \ - , C8 R# |. X0 }6 J
- gtk_container_add(GTK_CONTAINER(window), table);! D: }& G6 {0 U2 ?. D6 G; C, s
-
J6 m$ _4 O0 W: U9 {4 a# F - //创建一个行编辑
$ F: C, I: v7 e) c! X( V - GtkWidget *entry = gtk_entry_new();
) A, [/ b7 q8 `" F) [8 c$ ^, X -
q+ v, L( Q6 N3 q$ Z/ W5 Z - gtk_entry_set_text(GTK_ENTRY(entry), "0");9 i4 f, O% D, Q" ?( L1 W" c4 H- ^
1 U# W3 W% r J5 a- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
/ Z# h8 f- z8 L) [; Z8 `1 ] - - W) I( i7 @+ l
- //创建多个按钮8 z1 T7 p5 o) V9 L) t9 G$ R6 \# c! h3 E
- GtkWidget *button0 = gtk_button_new_with_label("0");
4 c; R' _* i/ |% s - GtkWidget *button1 = gtk_button_new_with_label("1");8 ]9 a* T1 c% M) B& J* _
- GtkWidget *button2 = gtk_button_new_with_label("2");. [; W& y1 F# q: x. }6 ]# i
- GtkWidget *button3 = gtk_button_new_with_label("3");" }& z% Q7 M" L" \
- GtkWidget *button4 = gtk_button_new_with_label("4");+ {1 o2 ~$ k6 L% {9 F% A
- GtkWidget *button5 = gtk_button_new_with_label("5");* [) @3 L$ {0 A/ @9 p5 s& Y
- GtkWidget *button6 = gtk_button_new_with_label("6");6 m2 _5 |0 S4 m9 J+ x
- GtkWidget *button7 = gtk_button_new_with_label("7");2 s4 o# B' v1 D. T4 H: Q; R- t
- GtkWidget *button8 = gtk_button_new_with_label("8");* h; I! d, y% R0 Z1 k# i
- GtkWidget *button9 = gtk_button_new_with_label("9");
) z e+ l. ^6 z: r* ]: ?* T - % l8 f: a" ~8 u% { c
- GtkWidget *button_add = gtk_button_new_with_label("+");' {1 I; M4 d2 Q; |9 r
- GtkWidget *button_minus = gtk_button_new_with_label("-");
1 J; n/ k4 I2 }2 n! n8 V2 N - GtkWidget *button_mul = gtk_button_new_with_label("*");
; r1 |8 t4 h v - GtkWidget *button_div = gtk_button_new_with_label("/");/ e/ G$ ~1 d0 G ^
- GtkWidget *button_equal = gtk_button_new_with_label("=");8 r' P5 _2 G* F& i# Q
- GtkWidget *button_delete = gtk_button_new_with_label("c");/ n8 a4 T( _3 }
- 3 V0 x! y# r0 y% U/ r; T
) g [9 P5 W! m1 T/ N) P# b- ]- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);, }! _0 O2 V1 ]) u
- 4 j& q; Z2 `" c1 K
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
+ b3 L1 O/ b i - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);2 `, X7 f8 T( l; O
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);* v5 D- K) v( z% F
- gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
7 y- K! j! N+ A, X/ M - gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
! S% q" ?8 \/ P8 O. k+ K7 w# h - gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);5 c7 O! U; T- e& m
- gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);( B# e# v0 ? ?
- gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);1 V3 U; y: @1 S( U
- gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
% z7 ~+ T, z. {' @5 ` - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);6 D! }: z6 z5 E4 g F$ a$ v# w
-
. G" A7 m Z" [- \! F3 k - gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
3 I# l9 k; Z7 L% g - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
) Q9 r% V+ A; N- v - gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);) s1 a8 O7 i1 I, O5 G
- gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);; g2 h/ Z( S; j( d
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);, U2 {8 n" z* {' }- L. [! L
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);' e* w" J q. Q T2 f# Q) e
-
) s5 w9 A2 _( P/ c - //注册信号函数,calc()% [1 w4 _+ Q; S
- g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
0 X N2 Z* p. z" F - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);2 v4 q9 G1 }3 ^8 _3 A+ V
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);7 h3 g# E- l8 i
- g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
5 [+ U3 B% N; I& M' c: Q - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);% o& C U! j, W
- g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);! h" t8 N0 [( z- W5 P6 f3 p8 d
- g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
) L+ X) U+ h( T- B - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
% n& X' d% p8 ^# U - g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);1 C! b) f: w O' N" M
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);8 H/ ^6 Y& @5 s, L9 [
- ; L2 ], n6 \) s. f4 T5 ?0 E Q! k
- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
* J8 \& ~6 Z4 V! \ - g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
T5 s/ \. |% Q( g3 v8 x - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);" b' W7 R& R2 d% c' T' K8 T
- g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);! U/ A1 @6 t6 `% J5 K5 O
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);) O4 q% `5 D; _ V' \0 K9 D( b
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);# q7 `8 n0 q# N* d: |4 Q: V- Q9 Q) P9 P
- 9 {3 a7 B- z. w# K9 Q
- 8 o% u$ M. Z1 E, n0 N( F
- gtk_widget_show_all(window);
" z: @2 k( T+ l8 w7 R* t! E -
4 q" E" `& k$ s6 j8 L! o - //主事件循环
3 z. L+ L/ z9 v" R7 w: F2 F - gtk_main();: f( P+ i7 u3 `' X. C7 O0 R! C4 @' R
-
8 j. x. P+ J* x# M8 z$ P - return 0;
2 c3 k$ r+ f. m. J - }
复制代码 以上程序,编译运行后,就可以有以下得效果。 ' n# M# x$ ?) L; b3 \ t4 ^
3 o7 s% ]9 M2 n w2 V/ R
操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。. u& Z4 g/ \0 m1 n! ]& _
搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。0 m8 W6 h0 j/ r" S* r" Q
- g! M/ ~3 b! G; Z+ c# {8 \' ~ |
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习