上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。/ A6 q1 J% B" P. w, t9 ^7 t
基于Ubuntu18系统,补充安装所需要的库和小工具
. u5 R1 n0 s" j% e 更新软件列表 安装python3 3 S. \* r: H3 Q/ C0 W, B5 ~7 D
- 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-software7 `8 D3 ~+ m! e* ]" T! j' P1 N( d6 j2 j
我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
7 v& u1 i( b: p3 e" W4 K+ H( D
$ O5 i4 o% a R% E- n3 [+ g/ N4 h 然后就学着官方文档的样子去验证下SDK是否安装成功。
8 L! d7 t" v* t4 J7 C2 G' ]
# [: T5 k" i4 ^' `4 k
以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
( C! @ x3 e. X* Q {* V$ l 首先拷贝官方给的demo程序,基于GTK得hello world。
0 L+ d$ c- r0 [* z' s2 i8 f7 m9 L# I% t
- #include <gtk/gtk.h>& l9 W6 R. ?6 U) V2 ?
- r# s$ X2 m9 F, Q+ u1 i
- static void% p, S* v- R y+ Y
- print_hello (GtkWidget *widget,' `5 z; j/ t. G- D1 o# h
- gpointer data); Y Q/ ^: O8 ] h( F
- {
# \5 H9 ^3 o. W3 b# H' ? - g_print ("Hello World\n");2 x B! f0 w+ s9 z$ q
- }
+ j, Q) S7 p$ }9 \8 n - % Y% y. d0 h" k- w8 a" @- f, G
- static void
3 Q7 Z6 O/ J, T. P8 p - activate (GtkApplication *app,
7 p% J S4 x" {8 I+ g4 ] - gpointer user_data)
" |9 c; E( X: v* ]+ U - {! ^4 O% }& ~# w) V* O
- GtkWidget *window;
/ I. Q: N+ M! e( v7 ] - GtkWidget *button;
$ |: Q$ f4 c% q+ d9 B) \ - GtkWidget *button_box;! e3 S) B& ?* s5 m
4 ?0 |2 R" h# `( ~9 o4 G. a- window = gtk_application_window_new (app);
9 s/ C! I7 A3 @! f, n K - gtk_window_set_title (GTK_WINDOW (window), "Window");
V* v& J2 m* r% l+ I. E9 z - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
' L* s! K1 g9 F
8 _- d5 _2 {& a; i+ }' b- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);" H, V6 D$ J# ]2 o, y$ R
- gtk_container_add (GTK_CONTAINER (window), button_box);; U) _ ^/ [1 a; l: r
- 7 Y9 Y# z( r6 {
- button = gtk_button_new_with_label ("Hello World");
/ G/ g& j' {: |( L" e - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
0 V5 Q! m! w, J1 f w' G - g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);0 P1 {; f; }1 k/ A) z3 Q
- gtk_container_add (GTK_CONTAINER (button_box), button);
- G% A/ O) K0 {0 G+ e* ? - 5 S$ Q# H" O* R' a9 T: F
- gtk_widget_show_all (window);
/ z5 a1 T V) P2 N - }: \6 p5 J* P$ t
- 6 f: c" Z6 N' w
- int
1 G* w# R% U; @ - main (int argc,
, G& d L! Z# z D3 `1 A s - char **argv)) Z: ~( t1 l, p8 R7 P) m" U) i, g4 J+ F
- {; Q! N$ U" K! Q- n2 d
- GtkApplication *app;
$ [, j& I( C0 l E/ v. u v( ` - int status;: G: E- M) X1 H f3 W& k
+ ]5 @8 f. E/ S4 W2 p- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
4 t+ C- q, ^* ^3 ~0 ^ - g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
' \" C2 Q3 [, c' a - status = g_application_run (G_APPLICATION (app), argc, argv);
2 J' w7 w1 R( a2 F6 i3 P6 @! N# F5 m - g_object_unref (app);
: H4 h8 f- N1 f$ t% r
0 ?5 G3 Y0 B+ v( Q v7 G/ T- return status; D: a0 o! A! L" u0 x
- }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world9 V- H6 r/ ?$ l1 V1 b: B) f' U0 ^
- SRCS = gtk_hello_world.c/ E1 k8 }' j' a9 [8 |: z0 |# z
- ; D o# l8 b K. N
- CLEANFILES = $(PROG)
8 u1 j" I# B+ ]
8 N4 q6 x: q! i/ B8 D; S- # Add / change option in CFLAGS and LDFLAGS1 ]1 ^2 R' @; @# Z
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)" M! {% L Z- P3 @: b. K6 [( X
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0)9 i/ _ D# W ]: d: r! h8 e" X+ |9 m
4 q* p- _2 G' J- all: $(PROG)
; d% _* Y! M, X2 x a) l! m) ^$ M
: _% _$ Y0 S4 b+ ^: Z; \. U# [! P- $(PROG): $(SRCS)
: F2 _' K2 L7 b4 e& p! M+ w* s" [9 i+ T$ a - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
) t2 t0 `3 J8 g" F - 5 P% i- `# N% p% B# i4 l% ^
- clean:( K- S) _7 B {0 C7 d% ]# ^
- rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。3 _4 a/ r8 U1 y% I
% T( A- \* [0 \! z% E
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。3 l7 O+ Q0 O& ]6 x! u% d. r
3 s* \- v9 ?7 d0 p& J' m5 `- #include <gtk/gtk.h>
$ v& |6 ]3 X* a; [1 w. [) v1 e; H2 O - #include <stdio.h>
3 }. G2 ~# I! _' ]+ \& g - #include <string.h># U }8 X. C5 ] K' N; M$ Q
- 9 @ ~, G `- d$ I9 R
- char buf[50] = "";; ?% O+ P8 Y+ X" B D
-
9 c8 x0 j# o7 ^) g - void calc(GtkButton *button, gpointer data)6 j% @7 e' `, L; h) e
- {
! [+ b3 i& O7 S' _# T: \0 E r* _. | - const char *text = gtk_button_get_label(button);0 W( Z" A J2 w5 }/ q
-
- G! g- X9 _7 j7 t; W, I { L1 D - //退个操作( ~9 E2 n5 g; Y: ~0 D
- if (0 == strcmp(text, "c")) ( v/ i& v. i! Y6 j/ t5 z1 R, X7 w
- {' Z+ Q ]6 b& D# N+ b" p9 q
- buf[strlen(buf) - 1] = 0;$ I9 _9 ?6 F7 A2 M8 W9 ~ v
- }else{
6 ~, z" K/ C7 D/ j: @ - 0 f9 ?0 c# O' q6 b
- int a = 0, b = 0;
' T- P1 `) t! N. w2 ~1 E1 F - char c;. Q, T4 Q# O; f) g: t) i0 K- O
- strcat(buf,text);
" h4 j. e1 u G! A5 o$ p - : p) U6 l2 v2 @2 U, k
- if (0 == strcmp("=", text)) {# I" D. P. `9 {% v" }" n3 U8 `" G
- ) x. ^4 P6 f- u* l! T$ E
- sscanf(buf, "%d%c%d", &a, &c, &b);' E% i6 {: v' F$ f; R9 q2 T
- * ]' n2 d& j7 \6 o+ p6 b1 H
- if ('+' == c) {+ W' x1 Y% A6 W+ Q; x
- sprintf(buf,"%d", a+b);& P' Y! b8 [9 ]
- }
$ k8 s# n/ h% ^0 J2 \7 a: z - else if ('-' == c) {
0 J& j" ^8 g- s/ l9 {: Q - sprintf(buf, "%d", a-b);
: r4 K" }+ R5 S6 ^ - }4 y! d5 ~* F( z; O! D
- else if ('*' == c) {
. G- y) l' ?, N0 ?& M - sprintf(buf, "%d", a*b);- P, S. D) c& }0 U" ~& r: l* y
- }1 ~6 Y0 s$ J% B0 L" ?
- else if ('/' == c) {" G0 M2 j' ? w5 e4 U/ }; F
- sprintf(buf, "%d", a/b);* i/ F( q6 m4 P% s" y
- }
- A. W: o" e% i# A+ c/ I - % ~& P1 A! Z# r. j9 S
- }
1 e9 c9 B, X7 M1 ` P5 G$ g - }5 y0 ^ K* C4 Z4 F: n) J
- - j: g _6 L. T
- gtk_entry_set_text(GTK_ENTRY(data), buf);2 z1 P( J, b& s* P+ t- M3 P9 y, B
-
) \7 X/ l3 B- \' z w - return;
3 T( R9 p& L1 l - }; Q8 T* d4 t: Q( K- W
-
& |2 J5 C( Y# X- j9 ` - int main(int argc,char *argv[])2 a. q& n0 C3 c# r# g+ ~. T0 d! S
- {+ F) T1 X" D# {
- % S, G5 J9 t2 H! y7 B
- gtk_init(&argc, &argv);
. U! Q0 i4 R; a* y9 j' L -
' s1 x- J* F$ Q - . {2 I7 L9 z; a& k
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
' Q/ J. C3 _& H8 a; @; b: [ - gtk_window_set_title (GTK_WINDOW (window), "calc");& U+ }( @( M ~1 k4 \
-
8 ~2 G9 F: a2 A# K% m' p7 F1 F - //创建一个表格容器5行4列
% d$ a$ m# [, g, g - GtkWidget *table = gtk_table_new(5,4,TRUE);2 T: V# b. F0 v) d! _
- 2 Q% {9 A0 ]' ^) G. x
- gtk_container_add(GTK_CONTAINER(window), table);
! T& H+ d! V4 P4 c4 E; @ - , M# t5 }* q. w: G/ _4 Y$ y
- //创建一个行编辑
; e z" Z& T" z: Q - GtkWidget *entry = gtk_entry_new();
4 v7 ] R/ m8 V2 N* V' T2 z - % A& i5 _4 ]# V/ Z1 u& l) F1 U
- gtk_entry_set_text(GTK_ENTRY(entry), "0");
4 k, }- H7 V3 e5 r5 G0 f: J - 8 X9 }: B6 Y, z7 r: E$ I5 k, Y
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
, D& c6 W: O1 v3 r -
m& _6 Y4 t+ v' i/ q - //创建多个按钮
0 f- n4 E! p) G3 p2 @ - GtkWidget *button0 = gtk_button_new_with_label("0");
" l* _* E/ Y+ u+ ?$ [ - GtkWidget *button1 = gtk_button_new_with_label("1");; a- N) z2 X6 |+ E& l4 \) D
- GtkWidget *button2 = gtk_button_new_with_label("2");( m! h9 @5 ^* s$ W& T
- GtkWidget *button3 = gtk_button_new_with_label("3");) J/ P0 L" ^6 N$ T7 D# A
- GtkWidget *button4 = gtk_button_new_with_label("4");3 Q9 |$ u% ~1 b, T
- GtkWidget *button5 = gtk_button_new_with_label("5");8 k* Y: g; @& m% c
- GtkWidget *button6 = gtk_button_new_with_label("6");8 d. x3 E8 T. F4 s' _
- GtkWidget *button7 = gtk_button_new_with_label("7");
2 \8 g: Z: G) y6 z/ V6 a - GtkWidget *button8 = gtk_button_new_with_label("8");
5 r# |8 b* J( m7 F - GtkWidget *button9 = gtk_button_new_with_label("9");
6 P) ]& e( Y( ` F - 8 i( |4 o! P3 i/ V* |% ~4 H. w
- GtkWidget *button_add = gtk_button_new_with_label("+");
) s A- {6 C! h; W: u/ u - GtkWidget *button_minus = gtk_button_new_with_label("-");
" X% U! @* U# @; M$ B/ | q6 {3 j - GtkWidget *button_mul = gtk_button_new_with_label("*");
. P9 ]; r0 f6 ? - GtkWidget *button_div = gtk_button_new_with_label("/");
8 t) s) U8 p: f/ {1 N - GtkWidget *button_equal = gtk_button_new_with_label("=");; l. V" z, K) q; e% g
- GtkWidget *button_delete = gtk_button_new_with_label("c");0 ~/ y' a; b H6 j) \
- 0 V7 \- [3 O6 g s, r
) S& B J) d, f" k5 ^# e0 u- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
9 R& ^% p9 E) g+ j4 o3 ^ - 4 }3 Q- y/ T* R' E- W1 p) J* ]
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
+ H/ M' }6 s. Y2 Y( c7 i - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
, m2 V4 u0 a" n - gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
' ^& A. w3 z K6 \ - gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);" r% j) \. C% Y/ z
- gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
N. P% Q& J& g6 Y - gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
6 c+ _: ~) K, S* q - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);# q3 u& O$ S8 S& I/ N+ U- ]8 o$ n
- gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
6 s( p2 X2 M( E - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);) N: B( t% d* G
- gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
% F4 S8 p/ c- |1 ^% O( n/ ~/ O7 |5 ^, _ - 6 e% [3 Z3 Y) p, O& {2 z' T7 @. j+ c9 f
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);! g& v ]. t. H. ?- T2 b" ~' T
- gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
& I# C# X* ~" F- h# T* Y6 E - gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);4 y$ I& r7 _0 E% \
- gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4); X6 O; ~: n7 \- @6 d0 \5 h; y
- gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);- U0 d+ d) G: N& L6 V, g u
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);+ i3 h0 ^' P5 m5 e' M1 d2 F
- : w8 d {% y5 F" J1 O
- //注册信号函数,calc()
: Q% u. h7 @" f6 j1 i1 q3 d: O- x( J - g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
% V, Y- o5 E# @ - g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);, W8 }' w0 q D, C7 ?# E
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
/ c, {! n. R0 L" Z5 D7 m& k - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);- n8 l- w" w2 c& Q, E
- g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
, W" Y2 b# b1 |9 M, B - g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
6 r$ W* T7 C* Z1 @, r- a2 \ - g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
2 O% R. ~$ U' d' b. k$ t" q - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry); m/ l3 j a9 l! M ?% ]( [5 B
- g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);5 A8 [2 r1 ?+ C, H, a
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);+ W8 j: u2 B- u, o
- 3 U# {7 p# w8 N! ?
- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
# {4 ]: h) r0 y* d0 j& m - g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
0 d$ Y% U+ j/ J* B @9 Z% o( b c6 g1 ] - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);4 A$ z3 z! `& O' B" v
- g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);' z- [' [1 ? A! R3 G, A
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);1 p5 \0 _0 j' M
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
/ n$ u; I4 x7 G% |4 ~. I/ @ - ) h/ Y* p( L3 e7 D1 P) Z% t
0 ` y* [9 @/ O- gtk_widget_show_all(window);) P7 o# L/ Z1 p6 K* y( q; I5 D
-
' T4 E' w8 t! h$ O3 V - //主事件循环
$ @4 a9 X9 p& }. W* T - gtk_main();/ k- y. M+ G% }0 b/ n
-
0 J, h; O; n7 \9 v& Z - return 0;9 j& W" D/ Z- J5 L( n) p9 r' ~- G
- }
复制代码 以上程序,编译运行后,就可以有以下得效果。 ) m, `4 |7 d) N! y
: W: T+ ?8 F- o' D
操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。6 G4 \5 X7 ^7 M( @0 h: h
搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
- W# M# s$ ?7 u; D; P; l, f9 R( g* C0 U1 e2 h8 W' b) a$ G: \
|
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习