上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
# l9 c# n( ?) [6 { 基于Ubuntu18系统,补充安装所需要的库和小工具
' |8 y, U# x1 N. I7 L. q; d 更新软件列表 安装python3
2 [& v8 q0 y' O+ z; [$ H# o" Z ?- 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
' j4 `1 ?+ [& x4 G& a- ` 我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。+ Q: P" P5 G% J
- N+ \4 ?- o; ~" t3 H' j8 G
然后就学着官方文档的样子去验证下SDK是否安装成功。
# @- l( m. J8 h: t. j
1 I# N' Q6 K ], P0 w" d6 L 以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
5 l5 K# ]# g8 M$ W9 i6 M 首先拷贝官方给的demo程序,基于GTK得hello world。 h" r4 D) @* h2 x9 O- h5 x' v
1 i( e$ L4 t; H4 T! O, L. z! n: x- #include <gtk/gtk.h>
/ J1 i8 y) }# L- r* G: S. F - ) Y: c& _0 `% J9 U- O* @8 k* P8 l
- static void
' y! d8 [1 w! F7 f9 R - print_hello (GtkWidget *widget,
- P9 e5 S k( o5 j9 { - gpointer data)
1 ]; h& ]/ B0 a# d - {) _2 U2 `- n8 w- P0 ^' E. |( b
- g_print ("Hello World\n");
! }) Q/ T: T" t9 y* `" W& n# S - }
1 R/ w- H. `, P3 w( U - ( P0 [: a) n5 m# ^( i# k& q
- static void
3 a, M6 G6 l5 o, Q; b3 U - activate (GtkApplication *app,
% C# C8 ~* P$ C# ^$ {. _) O% B- c - gpointer user_data): p% w( y8 }! R6 {' H
- {
4 s3 _5 y9 e8 {7 @: G$ ^ - GtkWidget *window;
9 I! Z0 s1 @; o5 g3 ]6 X - GtkWidget *button;
9 @4 V! a( S- _ - GtkWidget *button_box;
" W6 b# y! g( W6 | L$ m+ w
% t1 V4 O8 ~" q1 S" q3 f- window = gtk_application_window_new (app);8 R: G ?1 U. K
- gtk_window_set_title (GTK_WINDOW (window), "Window");
" H4 [: ~" E+ ?4 n7 p - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);8 g1 N {, y* o
- / S _7 c) r3 G# u6 T
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
) w" }' F5 i1 F - gtk_container_add (GTK_CONTAINER (window), button_box);7 Z/ n( j2 J8 f) @% M
2 ^/ j; t, y+ w) c- button = gtk_button_new_with_label ("Hello World");
[: o2 ?. o# ~, M- G; C, u - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);4 R" x; s* U0 v- E+ k
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);) f+ X" Z) f, O) ?0 O4 U5 m" `; Q' Z
- gtk_container_add (GTK_CONTAINER (button_box), button);
& N$ ]9 H* ^& h% B) P
2 R& @4 S, B0 b& G9 f- gtk_widget_show_all (window);
( G/ O" [* ]+ O - }
`& Z2 F% y: [9 D. N7 d
: e6 A2 r1 M' G* c2 A- H t- int, N: ]: O! p; H1 N+ Z
- main (int argc,3 [8 n+ M! C- c) e8 j. K* t
- char **argv)/ y* G: o$ n; r& a, }/ T" ]' a
- {; \+ }& f& R8 y( z, T2 I
- GtkApplication *app;5 }6 y" v( c% ~# g
- int status;! l- f* H# v8 [' H! k
- 8 R7 F* [+ Q! O9 ~- B6 w7 i
- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);1 ^- j; Y8 ~" E; t& i# t: j
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
7 ^) p4 E& t/ ?' c7 x: [ - status = g_application_run (G_APPLICATION (app), argc, argv);+ z8 F0 L: @ U* J2 M0 D
- g_object_unref (app);4 G* M+ X; z5 [6 r3 l* w* ]& s2 o
- / f4 B) Y2 P$ g- q4 h( q& a+ X* e
- return status;% E4 g/ L6 \0 f
- }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world
" V$ \4 L6 G/ ]4 |$ L - SRCS = gtk_hello_world.c9 }1 e6 B8 m- t# d; k# U
- ; q* @0 J" d j1 a3 i. h2 e* `
- CLEANFILES = $(PROG)7 C& _1 G+ b$ v6 P( M2 t! ?$ e
8 m8 F+ s$ m% l t% L5 h+ J- # Add / change option in CFLAGS and LDFLAGS+ G9 m8 B0 d, T) @& r
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)9 t0 O- t6 I3 l9 Y: `' w' V
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0). L' c0 L* m% i* P
- + p. V! w3 a3 d7 u2 i
- all: $(PROG)
# s: a& n# p6 o; u6 t& [
+ p7 a5 A& @- e9 l* S$ E1 M+ C9 H- $(PROG): $(SRCS)
$ a9 R6 L! }' x - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)5 c- g% n8 Z( `$ e Q1 s9 j
- + a6 y) Q* z8 |/ D/ w' D0 G6 E
- clean:5 @/ Y, n% J* s. R3 t
- rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
4 |, V! Q$ t% j8 j
! s" H3 S3 Q5 L" y8 w 接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
3 j q+ l t( e2 V+ L4 f( _/ @- m+ C9 n4 U2 `/ ?. x# y& y
- #include <gtk/gtk.h>
/ k2 H+ r: o" o' _2 _# M) Y, p0 Z - #include <stdio.h>. c& V3 ~3 l2 P# h/ N
- #include <string.h>
2 [! [+ T2 K' H w9 C - + C; e, s% f) \: K+ R/ C
- char buf[50] = "";
! a3 _- [8 s) f$ ~3 a+ W+ t; p -
x% K z# d$ L5 J* O - void calc(GtkButton *button, gpointer data)
$ S! H" e! U6 C5 R# H% r2 b - {
% k2 m8 m2 N# \: Z- Q8 j - const char *text = gtk_button_get_label(button);
; d J$ {6 C5 e- o; p- C$ x: k - 5 @3 {3 D; k3 R* [* j! n
- //退个操作; |3 ]; ?4 [6 F6 W2 h; ?
- if (0 == strcmp(text, "c"))
) l! `* J7 `+ ^( T( W2 n) v - {" O" ?. I, b+ U( Z) B. U7 R1 |
- buf[strlen(buf) - 1] = 0;
$ G7 a. a* X: X; X - }else{) r* Y% R2 L7 t* W1 k+ e
- 1 z! d4 E3 t. h+ ]6 K
- int a = 0, b = 0; r/ u+ J% f1 `/ G: M0 G
- char c;' B( [# E! l* B8 p
- strcat(buf,text); u, W+ l ] T5 L- l! K: J
-
2 i8 k# ?6 y& h4 L - if (0 == strcmp("=", text)) {
; |! [- P7 B7 f/ n* I( O) } - 1 }5 C6 X; A9 c, L- C u; R
- sscanf(buf, "%d%c%d", &a, &c, &b);1 h* H) A& _3 \8 Q& o8 T+ u
- 5 N- f& ~: V3 W& @5 K( l7 Q
- if ('+' == c) {: P. s8 Y' D5 ]/ n
- sprintf(buf,"%d", a+b);' A. R; T+ j _: m" }/ ?; W
- }* e: p# Z1 g& {( ?
- else if ('-' == c) {
4 O ^0 |) d2 n1 l& F7 R - sprintf(buf, "%d", a-b);, U; [+ H/ l; u8 ?4 n2 d2 o( t4 C- X: \
- }
9 K1 P) H& [3 ~# F - else if ('*' == c) {
, h) v6 f7 H" f* e* f/ ? - sprintf(buf, "%d", a*b);
! [& i8 v6 q/ k! P$ i# y9 K - }
8 N% T5 Q% `$ J7 {2 k6 z - else if ('/' == c) {6 k" C9 _$ D4 T
- sprintf(buf, "%d", a/b);! W. @' f5 J1 O+ Y
- }+ B* Y/ o7 U' P8 ?1 y; r9 t' J
- - z, h* r/ ~6 D$ y; h$ ?: H
- }& M3 z) L) H; b' H
- }
2 W( R4 L5 l) h" ? - 2 p, m8 C1 d6 K$ g3 K
- gtk_entry_set_text(GTK_ENTRY(data), buf);. z2 y! |' P& r) F0 |4 b/ M
-
6 B( I6 @; [2 v2 O) Y: D- G - return;
- U1 D) X. ~$ J; t - }
7 F; o# V$ P9 Z' T% c) [ -
1 P4 M0 Y, r7 k: i$ k9 v4 ~. V - int main(int argc,char *argv[])
* p. p% q# T' u" u5 Y& ] - {
/ D: @/ r+ Q" D5 W( I% k0 }
! T) x2 L& I9 g- gtk_init(&argc, &argv);
) Z" ^. P; F4 C. t+ _2 o+ S - 2 O. G/ y, _6 u7 c" g
- ( e" Q% Q0 H3 @% ?4 h' P
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
" b9 p2 u5 s1 v - gtk_window_set_title (GTK_WINDOW (window), "calc");
4 d/ {; i( _# l* K4 U -
4 n1 ?& T1 x' ]0 a( C - //创建一个表格容器5行4列4 L f, F0 Q( X' G* T: l8 v2 C
- GtkWidget *table = gtk_table_new(5,4,TRUE);# d5 ?, p- B# \. L! ]
0 A% m: J, O% I& |2 c- gtk_container_add(GTK_CONTAINER(window), table);
" P. N& B2 I: a( C- ~' _ o9 ^ - f+ c) H, H% Q5 x3 d L. x- {6 R
- //创建一个行编辑) N5 S6 j O; ]7 o* r
- GtkWidget *entry = gtk_entry_new();
2 C z v' [. u6 r3 J3 F -
- J# u8 a% \ F/ p - gtk_entry_set_text(GTK_ENTRY(entry), "0");
1 C: L1 w1 r' v" ^# S3 K& q8 O$ p% e - % q8 B" k* r1 M/ i
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
. [: n7 W+ e+ V, [& ]& F1 l -
m: [" n! q4 ]- r - //创建多个按钮6 {0 \ Q! [2 Q- Q2 l
- GtkWidget *button0 = gtk_button_new_with_label("0");
2 e) U; ]) k0 L0 ?+ G - GtkWidget *button1 = gtk_button_new_with_label("1");% J- N, T! d: M' Y) d
- GtkWidget *button2 = gtk_button_new_with_label("2");
: f; Z5 ]( x. ~7 a s - GtkWidget *button3 = gtk_button_new_with_label("3");1 G: Z+ D4 U u: t6 J% U3 b; A& f) K
- GtkWidget *button4 = gtk_button_new_with_label("4");
8 `2 e; `# S, L - GtkWidget *button5 = gtk_button_new_with_label("5");
+ o. H' T. c3 m- i/ W) ^* E - GtkWidget *button6 = gtk_button_new_with_label("6");
- I, r3 w' U f! J/ U* W - GtkWidget *button7 = gtk_button_new_with_label("7");
% {4 Q. X6 A6 Q9 F - GtkWidget *button8 = gtk_button_new_with_label("8"); N6 H$ e$ d1 {9 o) [" U: B
- GtkWidget *button9 = gtk_button_new_with_label("9");
" I% X$ N, ^5 k2 F1 T$ u" j1 | - 6 j+ A7 E) Y& [3 P; p2 o+ | [3 A) X
- GtkWidget *button_add = gtk_button_new_with_label("+");% D" K8 b | M2 Q
- GtkWidget *button_minus = gtk_button_new_with_label("-");
! O$ }3 P- w, m4 e9 ] - GtkWidget *button_mul = gtk_button_new_with_label("*");
( ], H/ o$ M8 `2 |) |6 ] - GtkWidget *button_div = gtk_button_new_with_label("/");
! v& Z* C; c; P) a - GtkWidget *button_equal = gtk_button_new_with_label("=");
, a+ y: A. n |, |9 H3 G8 } - GtkWidget *button_delete = gtk_button_new_with_label("c");$ j& W! A" X4 S! k$ F
- : R9 E9 l$ J9 i, Y X
- ' P, z# a1 G8 W; e
- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);" n5 f ^( O+ W
- 1 w& U( B0 c% ~9 B$ Z
- gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
q6 L3 u. i2 A% T+ ^6 }5 K( i F - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);7 G \ J2 ^# U8 k6 a8 N& w
- gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
v; ]) y8 _* @7 ^ - gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
# Y7 j, N' Z! u. n. d - gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);) C( b& i* e8 s
- gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
1 g3 X, { S! E; }3 p3 W8 f - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
. K! A; b$ B+ O( U: P4 A) S$ N - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
, E2 d" U/ _) q+ h8 M - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
( u: w" m+ i8 e% m9 g - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);5 R1 P$ u4 \( e1 f
- ! y7 V+ @) o( D' ^% x6 P
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
4 B! Q, x# p, S - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);( @, ?4 M0 \$ J: j+ G+ ~4 n- M
- gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
% _1 a% u5 \# Q - gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
+ e. I: G- n+ C, y" T+ e3 m5 J - gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
6 r0 |. r& Y$ E H+ j - gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);( I& u; X# v8 E4 Q1 g+ S7 w
- + Y2 @2 Z: e+ F8 T# H. ~! ?
- //注册信号函数,calc()% K9 l- ~9 d# n3 m5 f9 M# e- m* q
- g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);& k' a7 b4 V# {' U/ u
- g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);- [8 j% {, u1 H; g
- g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
8 G' t) [- h3 Q) B7 \5 C! R - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);) s# ~7 s3 I2 F/ r
- g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);+ s( [0 A9 h( H1 P4 h
- g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);- V7 ]+ |7 g3 s0 P1 E/ _9 D6 _
- g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
; Z8 D! |. k' |/ k - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);% ^" s- I, b+ W+ O
- g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);+ i7 j% Z6 H7 P1 `2 }7 O
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);3 X& ^7 ^' A# b: h [/ R
-
+ Y0 Z" D# n1 G: B* L - g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);: d+ ~# k6 b" F$ P( C( b, W
- g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);; k: F5 F. b2 c& P* O9 b
- g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
( r: k; E3 w5 U* H& }5 D - g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);) ~: P* x6 s! B6 D4 {
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);+ T6 d& T/ y% I4 O3 @* l6 x. u. W$ l/ j. p
- g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
% Q; P# G* v0 v1 U - 7 E5 N [( C& Y& c( g/ E+ W: C
" ] i. k3 ~+ [# p$ m- gtk_widget_show_all(window);
! G! ]% _/ M" O& F d - ( H' \- h7 u1 D0 y$ ~
- //主事件循环% n7 e4 g7 x- }
- gtk_main();1 A1 _+ d2 H. O8 V) b
-
3 i. V$ m3 z7 `$ h; X - return 0;6 {* I% k9 i6 p; E
- }
复制代码 以上程序,编译运行后,就可以有以下得效果。 ! R; F; c8 ?& q: |1 ]
% @9 Q4 ]6 P7 {* p+ E! t+ p 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
1 {: F6 |- T4 j 搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
! e/ I: r& k3 R0 x7 h
+ _- v9 p0 H& u( ]* p |
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习