上次已经开启了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/,,这个路径就可以,直接继续安装。
' Z: N8 @- v+ j e' L
1 W8 V$ R0 N" F8 T+ K4 R 然后就学着官方文档的样子去验证下SDK是否安装成功4 X+ H) i+ G# V' d. Y) C) ?
n K9 ~* ?, i% r
以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。 首先拷贝官方给的demo程序,基于GTK得hello world。 - #include <gtk/gtk.h>2 G" y3 o0 n) V! D( L$ ~6 _
- z+ t' b2 t- ?2 r8 w6 W
- static void
' |; H8 z, K6 { - print_hello (GtkWidget *widget,
- L/ b) L; {$ L' W - gpointer data)
% x2 a6 C7 N1 J. p* l+ Q) ^5 X - {
% x$ `0 p5 H! @" W - g_print ("Hello World\n");
+ _9 {5 @) p0 {+ Z5 \% v - }$ j; [) F: i- P, U, l, j
- 3 O( e. y' E0 u! S. h4 F
- static void
- R- k( c; `% ?) f6 ?, E: S2 y8 n - activate (GtkApplication *app, p8 o# o2 d _4 Z6 m
- gpointer user_data)
" |3 D l$ |% R' c- N9 B4 c - {' l6 C+ O- M5 h2 p. M# x
- GtkWidget *window;
/ j# A! D. m3 o: J/ }. e1 [ - GtkWidget *button;
- P6 |, E( J) A# P( W2 b7 ] - GtkWidget *button_box;% u5 a* r5 z5 n5 N; D8 P2 \
, ^' |. i" {$ d2 ~1 A, j+ p- window = gtk_application_window_new (app);9 \/ K$ G5 ?2 C! R3 M, u) u9 p1 c
- gtk_window_set_title (GTK_WINDOW (window), "Window");
/ [6 x9 \( S5 O/ V5 z - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);$ N! ~3 l& F1 K. v
- 5 B T, G. G% s' _
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
$ \( c, m& Q O7 T6 u P4 U - gtk_container_add (GTK_CONTAINER (window), button_box);
: Z1 M6 m: @3 w) l
! I% _/ q( `1 z6 Q- button = gtk_button_new_with_label ("Hello World");
) C$ m- e2 x) E1 z2 v% _6 a - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);. N6 v5 Y; F6 n' g, y
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
* j! [" q/ g7 C+ w$ i' M5 d - gtk_container_add (GTK_CONTAINER (button_box), button);. g' v! I$ }; u8 y* @5 o
- % x. [3 |7 i) U
- gtk_widget_show_all (window);
0 N" M/ L M# ]: t - }
1 g7 E. q' @2 Y
, q# D+ q! w# g6 m! y' [- int4 }/ y: F% |7 b1 Q# q
- main (int argc,: t8 }" F) D: p. o8 k+ j
- char **argv)8 y4 e- m4 z7 K6 E) e, t& ~# {
- {
8 u8 T: A. u% D; ]6 O - GtkApplication *app;1 U! ~1 F+ ~: [; u& h* u, ?1 {
- int status;5 c/ b' c" h) D
- 1 E: n, |2 B% s0 k5 t7 S3 C
- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
7 j! y' y: ?- t" A9 \! M* W& e - g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);/ N" N& U% E- f( R5 r
- status = g_application_run (G_APPLICATION (app), argc, argv);
2 [0 A0 D/ L% [/ D0 B3 b$ F0 w - g_object_unref (app);4 f/ Z& f$ c" e
- 5 P5 y" O8 r+ ?2 K
- return status;+ I9 h4 a1 O/ ^$ H1 D! }& ~
- }
5 F; w' W [2 p+ m7 i! U
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 4 p0 i% f7 P5 b- v0 a
- PROG = gtk_hello_world
% Q5 I9 ?5 T/ c3 H: b) u M - SRCS = gtk_hello_world.c
! ?: G- Q4 f0 J" j
: M( F' h$ Z" {7 |' a) E* R- CLEANFILES = $(PROG)
9 Z: u1 H/ X* O& Y% a/ S
0 r+ R0 R( P2 ]! \# |, L7 s6 ^, `- # Add / change option in CFLAGS and LDFLAGS I( t( k9 A% a
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0), l _& K* q8 d. Z* w5 _. }, s
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
V. b6 D3 E& z - 3 J3 ]7 g( w3 ^" c8 f; X& K( e
- all: $(PROG)
' g2 j1 X( Y) `- v3 g; A9 n# |
4 x, X4 _ Q4 Q: p- $(PROG): $(SRCS)
, B; C9 h$ ~$ l/ q7 ` - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
/ P6 ]/ ^$ F# b0 Q - C: Q- m. i7 V+ Z' A
- clean:
: ~8 S: z+ o( | - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))6 Q- B" x% F% G% g& n
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
) J+ x% r) N U8 [% q( L# C, i
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。% l2 }$ Q2 |* j7 i3 `0 i4 _
+ u3 X, Y8 B& x% p& m$ Q, x" T
@9 |( C( f+ G& f& `" y
- #include <gtk/gtk.h>
, e1 C/ H; J6 M) h$ K - #include <stdio.h>
; K7 ?) _6 `! K8 S: N: { - #include <string.h>& u7 ^$ a- H( y, F! D
4 u, T3 N! U" u( u- char buf[50] = "";
6 d1 q+ y$ }% N3 V: B5 [
7 G% t+ a" g2 S! P& Q' H) v- void calc(GtkButton *button, gpointer data)
8 B+ Y+ r, C4 T4 {3 M1 n - {9 `' V2 ` S I3 V" J& v
- const char *text = gtk_button_get_label(button);' G Q8 A1 @7 w* }+ n
- 6 _% x- r7 B: A, {8 n
- //退个操作/ ]8 e6 X8 g7 o, {0 T
- if (0 == strcmp(text, "c"))
: R( f& _% E" z - {
1 u) J# L$ F. @' M0 \. D/ D6 F - buf[strlen(buf) - 1] = 0;
" Y' p9 y* @; i, j$ D3 o* F K4 f - }else{; l# }. _2 b, n
- ; J& R! l' t) _
- int a = 0, b = 0;7 k2 M, E1 w0 O- {
- char c;
. M, f, d8 V& ?* C: [3 r - strcat(buf,text);5 L- q* `- U6 B \6 B: {
- 4 b2 O, M" B+ e
- if (0 == strcmp("=", text)) {
* N- n2 m, d) S: r+ y
' R* F+ e4 A+ s5 L2 |" A+ l- sscanf(buf, "%d%c%d", &a, &c, &b);" x1 [! ~ ^+ T- r! \$ I
S, R8 G: h5 q( }& |/ y- if ('+' == c) {% e5 \7 [3 z3 x" p8 j
- sprintf(buf,"%d", a+b);6 ~+ R7 m, o" G7 u
- }' q& p" f& U: M/ I
- else if ('-' == c) {
: h& ~" D9 V- [) K# F& V% k* C - sprintf(buf, "%d", a-b);6 ?; D+ Q c& P0 e+ P' g
- }% u& a# v5 U2 f4 R% K9 S
- else if ('*' == c) {$ D# T. a. K, V6 l6 E2 w* I5 E
- sprintf(buf, "%d", a*b);
# z+ H0 S( O, ^" K/ w' U" U - }5 B4 X8 `' m6 g
- else if ('/' == c) {
( s4 m2 T: P5 O3 P x - sprintf(buf, "%d", a/b);
# t! ]. t! O$ | J- ^8 H - }' p6 F' K. ]) _. `
5 \; M8 C+ ^6 g1 E5 [- }8 ]9 u' X1 c* _
- }
0 p8 Z0 G O* O! R
C; E, r4 M6 s3 P2 {' r- gtk_entry_set_text(GTK_ENTRY(data), buf);) w; c, B4 b2 @9 h
- 7 D7 Q$ z* s j7 {: k/ x
- return;
# Z1 `7 A( C6 l( Q; r6 d - }# @% e" z1 z) |3 ~9 |. `
- 6 r" d6 ]5 e" `% P# l' P' ^7 l
- int main(int argc,char *argv[])
: M' | m) v3 @% Q - {1 r* g. m" K. h7 a
- ' o# T- N$ j5 H% \3 ~( c) R
- gtk_init(&argc, &argv);
" l; B/ `0 Y7 x% G* ^1 Q/ Z1 `% E
1 X6 O4 C( }$ T2 Z- + P+ p! k+ X6 C; n& I
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g, R# _6 s9 z; K9 m& r3 d - gtk_window_set_title (GTK_WINDOW (window), "calc");3 B, x. R2 N$ B: h0 `/ p
- ; d% C% U: D- I1 [$ t
- //创建一个表格容器5行4列! [) Z' P) v3 t* I4 k. M
- GtkWidget *table = gtk_table_new(5,4,TRUE);
$ ^! k# q" b. g: j) o - ; q% T+ L6 z. _, e; L5 _$ ^. t
- gtk_container_add(GTK_CONTAINER(window), table);
7 Q. q) ?0 J' P; z' T! | - " D; y/ q# P2 D i: S
- //创建一个行编辑
3 p% g& N* x2 M! X r# u8 w - GtkWidget *entry = gtk_entry_new();) M: G4 H# K# Q0 X" |
- $ K* ^; `. ?% a' R, [; q) [
- gtk_entry_set_text(GTK_ENTRY(entry), "0");
6 i, C( \& v; p S2 `' J m1 }3 [" y# g - # [/ U4 \! O; v3 W3 Y9 L( z6 V
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);5 Z# K& l7 T5 V& \" H5 N1 I. [9 E
- / n; z( i+ u- s3 `) z1 c2 T
- //创建多个按钮9 }6 R, S$ Q, Y4 ]$ \8 W2 u1 _
- GtkWidget *button0 = gtk_button_new_with_label("0");
1 L5 V* Q: |8 i9 b - GtkWidget *button1 = gtk_button_new_with_label("1");. U, ]7 i/ O! W; m" r
- GtkWidget *button2 = gtk_button_new_with_label("2");
7 c0 j8 E$ |# q% R4 B5 ? - GtkWidget *button3 = gtk_button_new_with_label("3");
7 ?; n) c: x* t5 j - GtkWidget *button4 = gtk_button_new_with_label("4");
9 p- ^- h, L1 M" R - GtkWidget *button5 = gtk_button_new_with_label("5");
, T- L( m3 F( C) F$ u+ O/ T - GtkWidget *button6 = gtk_button_new_with_label("6");
* [2 ^- H$ I0 {, e* m. P7 k - GtkWidget *button7 = gtk_button_new_with_label("7");
1 L$ _. ^& Q3 M' ~ - GtkWidget *button8 = gtk_button_new_with_label("8");1 T1 d+ S# d. X
- GtkWidget *button9 = gtk_button_new_with_label("9");8 _* W1 G: r% E
2 W/ @0 f# ^+ d- `' ?+ Y% b( T5 c. u- GtkWidget *button_add = gtk_button_new_with_label("+");
# N: F6 H* d7 d# V- O! c7 d9 j - GtkWidget *button_minus = gtk_button_new_with_label("-");0 h) J7 m0 W6 o5 x7 o
- GtkWidget *button_mul = gtk_button_new_with_label("*");
5 Y' }* m& }5 ] ]* O. q' k - GtkWidget *button_div = gtk_button_new_with_label("/");' z* Y/ h+ [, L$ e c
- GtkWidget *button_equal = gtk_button_new_with_label("=");8 d8 k, @% _& ]) I: u0 Q2 O. ~
- GtkWidget *button_delete = gtk_button_new_with_label("c");
! m; m+ R5 t2 X( L% {9 _. ^# D3 N. w
) m0 }! j3 u9 e, A- 4 f+ J0 p- ], U2 v* q. Y& L z
- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);$ u6 ]4 O' B/ K# A$ Z1 T
l& e' W% i1 N. G, z; }" j- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
! B9 i6 n* L6 e - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);. K' h) O- L: j+ q
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);, u* ]3 x' j" {9 _
- gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);! y4 z# c: X4 B, @) |" n
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);! k! G/ e2 d, d3 p; ?* C
- gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
7 H) u- k8 m" r7 g& `6 ] - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
2 X9 ]# R- I# I' B$ u1 { - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
; l0 Q8 W8 \; C ?+ ~! ~6 Q - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
# j1 N3 k1 [+ A- i. A! b! Y - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);+ d9 j4 S# D' k1 ~# C+ p9 f# a
. K; \/ S: y8 ^$ P- W" W4 b- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);$ a/ C) Z+ [# T/ g4 L
- gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);. b; s) q4 {- c' w. G8 L# L: V
- gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);) \% H0 N/ z' X' y' | ^
- gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
: d4 Q& t+ f1 U: z8 t; F3 T5 B! B; V - gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);4 J' h5 N: P% e/ b8 [, {6 k9 v" T
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);8 s% x4 W5 m0 r2 W+ b+ w/ e3 L
' {& i* [7 L* d- //注册信号函数,calc()
8 [' u0 D1 F4 u, z/ B - g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
( p+ G" n. q' u* {( n3 y; l- B: t - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
2 a1 x$ v; M7 j: z - g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);; n1 F. |; `6 i" ~' x
- g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
* r R/ z4 t4 V/ b: R/ W7 U1 p - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
+ m" s/ |, m# W- O0 e& ^7 A4 B - g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);- c4 R% Y6 Y: g. `1 N" f% L; N1 J
- g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
5 y* d7 e! g1 {( { - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);) |& @$ Y% e: R- C8 A
- g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);- g$ h3 j& y0 ^$ F
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);0 i" m( n z) m: I8 U
7 D0 ?( d0 f" r) R- D5 C f( I( y- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
* ^4 c6 t1 G& O1 F; A4 G/ F - g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
/ }, j- e& j% S" T8 l2 U/ O - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
+ `2 M& J5 t' ^% w, m8 A' A9 m - g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);5 l# ]" Z4 ~9 k" S+ ]( a3 m+ m
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
1 A7 k% T3 R7 X' C - g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);* F1 D( B \ i5 [7 r4 N
- R7 X: w. G4 A2 O+ O! t' ]
- 2 E$ ~& `/ v3 h$ `
- gtk_widget_show_all(window);
6 j2 P; ^ |3 G4 f, d
& f0 Z' w3 \+ }5 g9 \' N3 b; f- //主事件循环: D& f2 ^6 G- l. ^3 k* Q& f
- gtk_main();" c1 f9 _$ q6 r5 B
1 ]/ `# [. `. X% H/ |; Y- return 0;( e: X: u! y7 F+ a9 x! M$ b+ X: E
- }
& F0 A7 b/ f. ?, F
复制代码 以上程序,编译运行后,就可以有以下得效果
* L. l: p. f4 V9 e* k: l" m
4 @" _6 G" A0 q$ X 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。 搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。 |