|
上次已经开启了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/,,这个路径就可以,直接继续安装。9 f) R5 t$ h4 L+ j$ R4 N2 J8 x
# l* [) J. Z) x6 `7 o
然后就学着官方文档的样子去验证下SDK是否安装成功1 N5 T' f& v5 o$ W# C4 S& k9 F) x- @
1 e G( v/ e' p2 d. R
以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。 首先拷贝官方给的demo程序,基于GTK得hello world。 - #include <gtk/gtk.h>1 k( J# }$ c* m. z5 M8 X
- ' y4 y! S- ?' m
- static void
/ P, B2 x% b& Y+ K, W. M! \; H - print_hello (GtkWidget *widget,
: M8 F+ T- H- _ - gpointer data)4 \0 Z1 c1 K/ P# o) S
- {* _0 n7 a' A2 u7 r4 u, v
- g_print ("Hello World\n");
. T/ P/ k# B0 P& I. y# N: m - }9 Z7 N$ i* H9 \, _: r3 I, M6 e7 Z
- # B) j* o6 W9 B
- static void
9 t g1 E! F9 j/ I2 G; J: m h - activate (GtkApplication *app, x/ _' S6 x% r" X2 m K' y
- gpointer user_data); B% H. h* l( U+ J) M, g2 {& t6 K; b
- {
x, D! M3 E" G; @ - GtkWidget *window;$ \2 _# `) X# b) y: W7 `7 |
- GtkWidget *button;
/ A( O5 U1 ~7 V$ P) C - GtkWidget *button_box;% t9 b& y' c& U* A: x% _2 n
/ ?) x" \; h( c. Z. H& V- window = gtk_application_window_new (app);
. T" l/ J6 @) }" b \3 N9 h - gtk_window_set_title (GTK_WINDOW (window), "Window");
' M, n6 L# ~( q: V$ `, U, ^ - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
/ J( ^' p. D" W# S8 w% O, l9 R5 w) | - & b# U3 ?0 p- O2 W* M* R" j7 B5 `9 \
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);( D# j! u \: h$ ~0 P
- gtk_container_add (GTK_CONTAINER (window), button_box);* @( Z1 c1 Z {: H
1 ]+ T" D( G' Y q, k& s' j- button = gtk_button_new_with_label ("Hello World");
8 M, q( y9 e8 F6 ]9 r% i - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);6 M' p) |9 f0 E. ^" H. r; r) z
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);& r- O2 @+ o7 T9 v# ]' {
- gtk_container_add (GTK_CONTAINER (button_box), button);8 c) ~7 u. }2 g8 ^& }
! s3 J! ]% y' j( X* G- gtk_widget_show_all (window);
/ v% Z7 \3 u2 @0 K' r! y. W: N* v - }
9 L" |3 N8 b/ u( I* Z
2 ^2 D( J8 l$ K% w9 i- int. d0 Y* ]* T# T8 J+ h n$ P8 f5 s! r
- main (int argc,# E# P& \6 _" ]* J, l! S
- char **argv)3 N! S* |/ L2 P; h9 W$ Z
- {
( Z: H3 S( I' i# K, [ o: a - GtkApplication *app;: Q# K0 Y; Y1 c4 y( t6 f9 z
- int status;2 s8 P( b1 j, G0 {& S$ F
3 W: W4 w8 ^+ a7 }7 [) E; t- {- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
, z* `+ s2 Y# G% C1 n2 ^ - g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);; H+ M0 g# u' y! O$ U! _
- status = g_application_run (G_APPLICATION (app), argc, argv);1 `/ @$ j' i1 H" N. O" |
- g_object_unref (app);+ E+ N7 e' u5 C3 }5 h
- c( i3 v4 T+ }& k
- return status;
1 Q9 I# [0 ~! ?0 O - }
6 @; i1 w) z. k1 s, W r/ W$ N
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。
% t+ P/ H7 f$ H$ F; L. V- PROG = gtk_hello_world' y1 s" R b+ S3 B
- SRCS = gtk_hello_world.c. _/ Q+ Y' B( [4 [# I4 z
, K0 _9 f6 h9 u j5 g F7 B- CLEANFILES = $(PROG)3 X" o' J/ ?6 \7 t- K M8 Q( z1 T
; @4 q2 L" g3 j* l- # Add / change option in CFLAGS and LDFLAGS5 x9 K+ d1 c( N' O- }
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
9 ~( W* f T- S( z6 |+ _3 k - LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
) @: e A1 k' Q' N+ y! A. `6 W
, u* {4 e8 y0 ?- all: $(PROG)
: V9 y& ^# R6 m- Z2 H7 \, u0 U9 b - ! E$ o5 y% l; K+ c7 q; V" s1 h
- $(PROG): $(SRCS)
' R, `4 V; V( y7 B% _% n% g - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
! m) q/ \3 M( |8 n" s7 K# c
9 Z- J1 p% t0 w2 Y- p' S' M: x- clean:
$ c5 N# K7 }/ l( X6 ~' {" ~ - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))% P/ I, o9 H3 n g
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
; ?6 j! s0 \* F6 y; m* q 接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。9 T9 n! {4 [7 L4 G
5 |# G: Z' r1 ~, q N: J* |
0 q4 @% Q0 H4 W$ g$ o- #include <gtk/gtk.h>
4 w8 B, D B% m) M - #include <stdio.h>
- [ r9 c3 T; J1 y! }! y y9 u - #include <string.h>" H4 s( l0 s. p
- 5 v0 a7 g" R0 M+ F2 Y+ I
- char buf[50] = "";# A$ n5 s2 f( T4 Y. ~9 s# I
- ; z+ t- c5 O9 J2 p9 r" _7 Y6 k
- void calc(GtkButton *button, gpointer data)% d0 Q. S+ ~0 g) K% D0 k) F
- {
$ R8 p+ \7 V' V/ L& n - const char *text = gtk_button_get_label(button); u, E# ]/ r1 B. T% r6 _8 Z
/ @, _! q- t! o1 d9 W0 i- //退个操作" V1 S9 s7 O0 _6 i) p5 O( k
- if (0 == strcmp(text, "c")). G/ Q8 ~" d) y0 K* u/ I5 V
- {: F/ [/ c- y9 C. Q- N
- buf[strlen(buf) - 1] = 0;
: |) W7 J2 ]% o' ?/ w T - }else{+ J3 N$ o& K n0 p3 ]
- ' \' N2 B; N+ Y/ P( G0 z" c/ s
- int a = 0, b = 0;
* t1 d: p m7 U0 r3 C( x" n6 I - char c;
+ T' H* D7 C: F- r t# K - strcat(buf,text);
6 H+ _& q* k; {! G9 n& q" { - ) P& G: i g. z
- if (0 == strcmp("=", text)) {
4 s$ ?$ ~" `4 V0 f5 N2 m4 b - 3 _; t* q, `* H' G$ c6 ^7 e! Q
- sscanf(buf, "%d%c%d", &a, &c, &b);9 s6 l- K3 _- U6 ]
- y0 p1 L; H. q$ s4 z" U- if ('+' == c) {
* u/ Y/ |( g2 K6 X$ A% X: `# m - sprintf(buf,"%d", a+b);) E* X/ Y- r0 m9 ^1 E# r
- }9 V6 L1 p. F' b
- else if ('-' == c) {
; l3 \& E9 e8 v( D; y - sprintf(buf, "%d", a-b);) B2 R+ E" o0 o; d# f! L
- }1 L$ C- z! C- F7 ?) C6 V, }
- else if ('*' == c) {
I7 [% d8 [. b9 d0 F - sprintf(buf, "%d", a*b);
% N5 @! t& z! k - }
. F2 a/ b( j9 b, J - else if ('/' == c) {1 I& n. g: k( Y) {( C- q8 a
- sprintf(buf, "%d", a/b);
/ J8 ^/ k# B# K4 G4 Y - }
# ^* U4 M) v# {2 o- f2 l1 \ - : |: p* f2 E; f g' F
- }
. W- U4 E+ A# h - }
% v' C A9 R7 J; Z9 U
( C2 j7 V5 g- ~2 _ F$ ]/ e- gtk_entry_set_text(GTK_ENTRY(data), buf);5 z, b* @& R: ^- A* E
- / P. O, s- [; N9 {: m
- return;' w, d# a: k5 o& d
- }
6 i, J( X8 I9 W+ S K" H& W4 n - % G) c9 r4 u- O7 M6 e, u
- int main(int argc,char *argv[])# T) \: w( h2 c- n9 n
- {0 q4 g( D1 H4 R' ^4 w5 a$ V( j" j
- + _( o& i) W6 m# E, e4 n0 t4 z
- gtk_init(&argc, &argv);4 v7 w3 f+ w1 p5 j. X
Q" h# D% o: y$ b2 p X- @
4 P, G; t; v5 M# ~$ }; C2 J2 v- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
" J4 [) i% S% P, |- P: e - gtk_window_set_title (GTK_WINDOW (window), "calc");
, T, x' }" k0 a, h3 M9 n& c0 |7 _
% L' @" o) p" Q2 U0 x" \/ w/ L- //创建一个表格容器5行4列, i1 F7 V* o( \) b' F
- GtkWidget *table = gtk_table_new(5,4,TRUE);
3 |$ }- |/ N q0 _. L' A
! [3 O/ X6 J* ~$ M8 j1 i+ T- gtk_container_add(GTK_CONTAINER(window), table);
: }3 l/ V5 e1 A8 O- }1 _: B- o5 L
1 n# c b$ c* c X- //创建一个行编辑
) r6 {8 W- Q. E' d# n7 Z. x - GtkWidget *entry = gtk_entry_new();
' y3 R9 a# r- h3 D/ }0 ~& j: U5 i - 3 v7 t& M) F# K8 F
- gtk_entry_set_text(GTK_ENTRY(entry), "0");: m) U7 Q( e- v* L% d, P$ T/ a" F
- / q2 t& x$ ?4 G1 o% u
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
# q8 a7 L% Z8 X. T - # B! D; ]8 D& {; C2 Q
- //创建多个按钮% s, z- a8 m$ U
- GtkWidget *button0 = gtk_button_new_with_label("0");
, |4 b3 H. W. T - GtkWidget *button1 = gtk_button_new_with_label("1");" l7 R4 O) [" e) h
- GtkWidget *button2 = gtk_button_new_with_label("2");
" H/ |3 S6 U, m+ T$ q: H - GtkWidget *button3 = gtk_button_new_with_label("3");
. z7 F% k' }5 `6 p* N$ K$ J - GtkWidget *button4 = gtk_button_new_with_label("4");# Q) K C6 e: ^0 O8 C
- GtkWidget *button5 = gtk_button_new_with_label("5");# O7 N2 v1 |! t% S
- GtkWidget *button6 = gtk_button_new_with_label("6");$ U a1 J+ l; R6 q) E! u
- GtkWidget *button7 = gtk_button_new_with_label("7");
3 B1 S) B4 j4 B- Q+ R, ^8 Z - GtkWidget *button8 = gtk_button_new_with_label("8");
6 `1 ^8 ~2 ~+ H) D5 m( b0 `+ K: p - GtkWidget *button9 = gtk_button_new_with_label("9");' u9 Y1 o. U; [" T" |$ G
. T( g6 L- ~ j2 _# B9 S- GtkWidget *button_add = gtk_button_new_with_label("+");& `6 S5 W1 ]; P( y
- GtkWidget *button_minus = gtk_button_new_with_label("-");3 K) ~1 |: K9 H. A
- GtkWidget *button_mul = gtk_button_new_with_label("*");8 y1 Z( B- s! a5 q5 _ S
- GtkWidget *button_div = gtk_button_new_with_label("/");
. i& x* z. I2 W, z4 p2 w - GtkWidget *button_equal = gtk_button_new_with_label("=");/ y! g8 X: z7 n2 B* K ^' ^
- GtkWidget *button_delete = gtk_button_new_with_label("c");* I+ W X6 U! H: \. q g/ _
' _- ~4 O& Y, H: x% y- 1 h4 l& @/ k5 H: @% h( L% W
- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);+ O+ f. ^+ M# V0 }
/ E2 N; M/ q }1 `; I+ S" Q6 i- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
" b6 }( `0 ?( b! B D( Z - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
4 W' b" b$ t. f/ k - gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
% I: q- X! z1 r/ ~$ j8 r6 | - gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
$ p5 Z- m* Y3 N+ G$ w8 e - gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);, S9 p$ r/ W: i( s
- gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
" k( @3 h' n1 a9 Y" n - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
* L- L( ]) z2 [+ M - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
( z' E5 a+ j( O0 v3 l8 B8 p; y - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
0 i, w* J+ h1 X1 Y. }4 C - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);& q7 {: J. r+ q
- ; Z6 k( r/ J3 b9 L' \- K
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);$ w4 k4 I7 [6 n6 \9 _- Z; T2 t: [
- gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);: l2 w8 v* E- E B& B# ]9 K
- gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);4 [, ^" q) C" D
- gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);" L$ H: e6 n" y# v. \
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);; ?" I6 M# S0 K( Q( d! A, c% D
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);% Q6 b" d2 m l) \; L4 f8 U
- C3 b& N! }* T9 V- //注册信号函数,calc()( j' l3 o l. |7 C4 M% i8 m
- g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
3 w/ q& [& a. i {! w - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);6 o4 q) z+ R( ^2 @8 s- W+ E
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
) R7 I! `) z6 C& V9 N% m3 \ - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
! `! k* M) ]8 f2 A4 G+ e* S+ _ - g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);$ c2 V2 K& N! |# K# ]5 F1 w( a
- g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);; e" S3 [) y* G1 B: D- s/ p
- g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
C& a1 l" N! r- R* P4 Q; ? - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);$ K& R1 t0 h9 B5 j9 T3 P
- g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);0 |2 W* j, m3 [
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
8 F) y/ z- q6 P; A
& Q( t( O' O' _* I! d- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
% x$ j" c( x6 ]! P) d6 z - g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);9 `3 N, }8 w* f" f4 ^- y5 u. Y
- g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
) b* y* Z/ S, G* |/ q3 N1 n+ P - g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
/ g! i8 ?9 Z" n - g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);6 J/ k7 Q! B" _9 V
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);0 `( }0 R" ~" h3 Q0 s/ F; ?" w
- % F, v- R) k8 W4 U& H* z( r& X0 t1 d; I
- 8 f- O# A9 g# w1 ?5 K. r
- gtk_widget_show_all(window);
# M" [" M' g7 _3 A X, ] - 7 n3 U# y9 L4 J: o+ B! O. r: U
- //主事件循环
2 ?2 `! d/ E* z9 ? - gtk_main();: ?$ W0 X* A5 ^9 Y' Y
. ]) v, {& ]! @! Q: o* N- N! k9 S- return 0;0 W5 l! c& O$ d/ A
- }
- l) {) ~8 |, N; u. d: ]7 o
复制代码 以上程序,编译运行后,就可以有以下得效果
1 I, h6 f; K5 s
# k' d* U h8 m+ S) d 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。 搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。 |