上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。 首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。& a* ?' |7 Y2 w# @, E x
基于Ubuntu18系统,补充安装所需要的库和小工具
7 o+ _. R) j9 X, k( L 更新软件列表 安装python3 # T* U8 }% v3 p0 i2 p- B: H8 p
- 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
3 z; u& M" Q( d* L 我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
7 I3 T, p7 e1 Z$ V, t
# R. ?8 R" g* G4 W7 A 然后就学着官方文档的样子去验证下SDK是否安装成功。
6 B- z2 \. H; f. J
# T. _ K( p( O. a8 a6 o2 e: }
以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。2 A- D5 @, x' e# f& F7 i
首先拷贝官方给的demo程序,基于GTK得hello world。3 B: o$ N9 H0 \9 F9 q
) O! R$ U+ x: z' Z% B5 d- #include <gtk/gtk.h>
) C' }3 P. x9 R1 r6 G4 d$ n - 8 l, r$ X/ L: T- [6 B* g
- static void
& z @- Z% n3 B. G8 Q5 i1 E - print_hello (GtkWidget *widget,9 B r* C8 L* M* @; g4 f, O
- gpointer data)/ R4 i( O+ E v5 {, H- p
- {
- q; H( W0 D$ F( l7 n$ B T - g_print ("Hello World\n");5 S5 B( Y# b: t4 i1 i
- }
9 K' Z7 |7 K0 c( A( q
. C+ |: K3 f) ]" f6 f- static void
) Y4 O1 g2 G* s - activate (GtkApplication *app,2 {1 x1 ~7 [4 ~
- gpointer user_data)* N, O/ x. r/ I
- {
w/ U4 Q- k; ^. d) V/ t - GtkWidget *window;
. h4 A$ \/ j- j: o V2 V8 O - GtkWidget *button;* j2 g6 L, x! S4 R( A3 q7 C
- GtkWidget *button_box;3 ] B [9 V% h* S% \
- 6 \1 I/ I. |1 Y$ o8 o+ I
- window = gtk_application_window_new (app);' r+ L/ c8 N+ \8 t
- gtk_window_set_title (GTK_WINDOW (window), "Window");
7 o8 t, x& s, c, a; U, f - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
2 V- [* H3 {1 f3 }1 ] - / u4 H. Z( ^! Y* F! G, I0 r- s
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);% [+ L6 |2 E" S7 _$ T7 H6 G
- gtk_container_add (GTK_CONTAINER (window), button_box);; | `& p& i' ~- E' j; ~ s) Q
0 ]* Z8 D: [8 c1 o6 j- button = gtk_button_new_with_label ("Hello World");
6 |& Q9 n1 S1 B! } - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
! i/ K, G+ v, D: v3 z - g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);8 v$ r. K: a# |6 ~4 o8 |
- gtk_container_add (GTK_CONTAINER (button_box), button);* m8 n" k" S1 y/ X0 G" Y& G# x% C
. Z" [4 n Y: D- gtk_widget_show_all (window);* P0 Y, u* F& E8 r2 w
- }
* Z) T7 X3 ^7 y5 T6 I9 J/ C
! n7 i f: N$ {5 Q9 R- int
- |) ~- \. L& h o- J3 ~3 m. w: ~5 a - main (int argc,, T- ^' s" @1 m9 H5 n+ R
- char **argv)
# `4 l9 G% m h! G - {
4 ^; I& I- @9 g8 n/ f7 m" f - GtkApplication *app;
$ X4 [: j) S1 y2 ^! }8 |, x - int status;
, L+ g' i9 A* S' L/ Y' v" n - ) V, U0 \( m( }0 W' T& c
- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);' @. Z/ [, @& O! T) H
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
) y+ _! K* f, r( V - status = g_application_run (G_APPLICATION (app), argc, argv);
; ^( G7 T" o. @1 ~# Y - g_object_unref (app);* X5 z4 D- I) p p. D! W4 A
- _4 Z v+ j" |( E- return status;
8 u" i3 g1 ]/ ~6 b* E# M - }
复制代码 然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。 - PROG = gtk_hello_world
6 Y8 c( c* y" w+ }6 R - SRCS = gtk_hello_world.c. ]1 J: Z6 W' {6 n
- 9 `; {( g- I' Y; V0 F% [; ]4 o* D
- CLEANFILES = $(PROG)7 K- g% y: o. X/ X& R( U5 s
- 7 G, { L' r6 ]( @
- # Add / change option in CFLAGS and LDFLAGS
3 O+ i* V0 c8 h) d - CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)9 D) [6 k& q2 D! L' G3 F
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0); ]( _) h+ G/ A9 @6 G8 c8 b
- 7 S/ v/ S; F5 \3 f3 u' Y. Y
- all: $(PROG)
' C" k/ Y. t- t; b7 s: g - & S" M0 `- F: M2 m) Y+ _. a
- $(PROG): $(SRCS): R- C0 @- R5 l
- $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
3 p2 @. P2 Z5 W3 r( \' G - 1 Z! `# t8 e2 k3 u- S
- clean:
' e* m# z% w9 a. T$ A - rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码 然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。& N, X9 U0 D7 s! X6 R% v+ v
" h0 [' p4 a9 x4 X" A* i6 X/ O5 g" y
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。9 B8 K- p9 t. Z& m5 e0 }2 C
7 B7 p+ R" P# X+ T# i* P2 k# k
- #include <gtk/gtk.h>
1 W9 @% E6 u- `, n1 s) G1 l - #include <stdio.h>
' b* w# F" H+ G0 ` - #include <string.h>( I$ |& ~7 _2 [$ E
-
: C$ y5 x7 q2 u1 H/ a - char buf[50] = "";
4 C% ?7 Z' {) w9 ^. c( @0 s+ l9 z - 9 ?4 l* b6 Y/ R. L2 k7 m
- void calc(GtkButton *button, gpointer data)# M7 F5 [7 E# Z2 d0 g
- {
4 q& X' f4 l/ w - const char *text = gtk_button_get_label(button);
: A, |+ m0 m" q7 ?* z' [8 m$ D - 2 t4 [3 F+ ]7 ?3 L# Z4 P+ Y+ V4 |
- //退个操作& T( \0 ~, A$ D9 `& l6 c
- if (0 == strcmp(text, "c"))
, _* Q" j6 ]3 d$ u. N. q; I - {
. _4 f2 G: D, L( g - buf[strlen(buf) - 1] = 0;
& U2 a/ t6 I: ^5 P# O" |( e - }else{
4 ]# O0 |( x( ^7 V* f; @9 W - 6 L' K! F ^: b k
- int a = 0, b = 0;
' Q. f" z- e1 u& ? - char c;
- {' Q4 a/ x7 D+ d1 f! |. o - strcat(buf,text);
, k8 e( T% `8 u -
4 B3 Y3 Y# Z$ T( J3 J% | - if (0 == strcmp("=", text)) {
# a2 q% N @+ ^ -
6 G% s$ H6 M) | - sscanf(buf, "%d%c%d", &a, &c, &b);6 M% x D3 C: B% o
- 0 d+ j, u: q' @
- if ('+' == c) {
+ ~" [3 W) j9 A- e2 `; n- h4 A! g - sprintf(buf,"%d", a+b);
: Q5 z% D$ L/ ] - }5 `8 h: y( n3 M3 u( m
- else if ('-' == c) {7 p! i q! j; l' G( R' d. F
- sprintf(buf, "%d", a-b);
. _6 s$ L+ u* \+ Y; Z7 F" j - }$ t( f- Z, L% _& i* a. g
- else if ('*' == c) {
- P Y) L2 N, V6 H7 V, v1 R - sprintf(buf, "%d", a*b);7 i) C" B% s+ q8 w, y8 [
- }7 s% A8 K* {# k
- else if ('/' == c) {1 z; q* G0 \, V4 U, _. A
- sprintf(buf, "%d", a/b);
; L. E8 t5 _! T7 x - }
# v; _6 C% Y: h9 d - X+ s D) i: |- @8 W
- }/ @" B! c+ w, M) G; r
- }0 e) C0 Z, P/ { Z- e
-
( e3 z& j! Z9 @' q5 q# m) T$ N& C# x - gtk_entry_set_text(GTK_ENTRY(data), buf);: Y: U; R0 u; \1 p$ x3 l5 i
-
5 q3 _9 K; f: [* m' J) { - return;5 {2 W. h7 D2 j+ a: e0 j
- }7 b% ]+ ~# u6 j* |& A Z% [
-
! F. t: g% C- X5 l( B - int main(int argc,char *argv[]), O) w& u: r: M/ d7 D
- {
' [# Q- u# X+ d& {9 ?) o - 2 n8 x8 V; o: i- t& G
- gtk_init(&argc, &argv);1 ~) M- t- ]1 {8 H% b
-
9 x7 k) F4 ?' b
6 s+ L, p7 p2 Q7 J$ n8 l& d- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
! ~4 _9 Y b# v- w - gtk_window_set_title (GTK_WINDOW (window), "calc");" k3 N& k1 V0 d: _) C/ j
-
) q M- p1 e6 D4 u9 x* U - //创建一个表格容器5行4列
& x$ Q" V. K6 i8 H - GtkWidget *table = gtk_table_new(5,4,TRUE);
, g% T0 }& U; G/ E2 T
" P& d+ o6 Q# _- gtk_container_add(GTK_CONTAINER(window), table);
! w6 g w8 f% h4 W! l3 n8 T - G) s' r8 s. {
- //创建一个行编辑
B% r% Z8 `$ T: o, h. n8 K" u - GtkWidget *entry = gtk_entry_new();7 i b2 v1 v& h' S
- 4 V$ y1 |- z! U! Z) z5 ]
- gtk_entry_set_text(GTK_ENTRY(entry), "0"); B9 ?3 ?+ q5 x+ H
O E+ f- f# s. g! x: z- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
+ i {( [" s# h+ O7 H0 R+ A# {! O -
0 V/ ^9 H% W$ Y8 f, _2 |* y( u h- h - //创建多个按钮
. ?. f1 A0 d) n - GtkWidget *button0 = gtk_button_new_with_label("0");
/ ?/ l( v8 ]" U9 ^ - GtkWidget *button1 = gtk_button_new_with_label("1");
$ j: V* u4 q5 R - GtkWidget *button2 = gtk_button_new_with_label("2");! r4 |2 v! d: [% t" x0 K; I1 E3 u3 {
- GtkWidget *button3 = gtk_button_new_with_label("3");9 x2 H9 ^! K$ W* d
- GtkWidget *button4 = gtk_button_new_with_label("4");
8 ~9 p) I" v0 R - GtkWidget *button5 = gtk_button_new_with_label("5");8 `% B! d* t4 k' l1 ~. ~( ]
- GtkWidget *button6 = gtk_button_new_with_label("6");
& A: M" |$ V0 r0 k, l% b" E7 O - GtkWidget *button7 = gtk_button_new_with_label("7");
) W6 M- e a- C# @! p0 ?& A# ~ - GtkWidget *button8 = gtk_button_new_with_label("8");0 l b' `5 \- {1 U" l( e ~
- GtkWidget *button9 = gtk_button_new_with_label("9");5 x9 \& B3 R, w4 M% h& n+ ^# J
-
' X# y+ v0 }; }- ^; C - GtkWidget *button_add = gtk_button_new_with_label("+");
$ I" C& A7 V1 J- {7 N' Q# S - GtkWidget *button_minus = gtk_button_new_with_label("-");
- X; c" H: C# {, f* u% p - GtkWidget *button_mul = gtk_button_new_with_label("*");
}* J3 M( f \1 H8 i9 R9 }- z# p - GtkWidget *button_div = gtk_button_new_with_label("/");
5 x2 ]7 w' M2 U& E3 _ - GtkWidget *button_equal = gtk_button_new_with_label("=");
7 W$ A- _3 Z7 Y7 T5 c D7 V, T - GtkWidget *button_delete = gtk_button_new_with_label("c");
5 T3 S" Z; B+ u* M -
# p9 ^, _; S/ J$ q
& r6 E; ?3 d& f' Z: z- gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);9 y. Y6 b$ w/ y. L6 v. Z
-
6 c$ }3 p" w: _/ p - gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
2 L0 d+ O: U5 C: g5 \ - gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
' l" \) O" f# m% k& V - gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
& X% A+ |# K. _- H - gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
; u1 K3 w+ c, }7 h; S" E - gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
/ g: }4 M( l# i$ d( v - gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
" C8 |$ R6 y: R2 n- d - gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
$ I# _$ M. u5 K2 i& B/ l% H - gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
8 e/ F( c$ e- t3 N5 ? z t - gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
# @% r6 t3 S& ?" l8 B - gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
J8 v! k1 y$ \8 i: }# ^ - 3 [- P6 o7 x8 A9 p, U
- gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
" h- x @' H% ` - gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
1 u$ u+ i% P0 [* o6 ~: e0 R" | - gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);! v! p9 u2 T% \- ]
- gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
" z% ~# `: w* j- `+ [& W% s# q! J - gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);6 G$ f9 X: K2 `5 f# C+ w4 q
- gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
0 k( l5 j& C: e/ ` - 5 E2 |% W$ X' B7 D% Z6 x, i
- //注册信号函数,calc()
4 _% \- X. [$ j - g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);% b8 [; i+ D) o) p# p
- g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
3 O+ O+ v. y6 n - g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
" [8 v. o5 w1 g& ?6 n1 t& i - g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);8 b2 O6 l) W/ c/ {; n9 T
- g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);) K# j0 ^1 X. b% ?: `8 `! _ }
- g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
! V" e6 e& d5 U3 ^2 T2 V - g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
5 V2 G! z- p' E% k - g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
6 T X1 l& \, |- A8 g8 y: u1 H - g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);9 K3 U+ |' x3 ~5 ?- a9 S
- g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);$ f( N) R" j# l1 w
- 6 M) E o6 A+ K* i
- g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);0 g, @9 z6 C, H. d& x) a1 F: C( P5 b
- g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
' d0 k( V7 U8 u) V - g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
5 |8 n) a, q( n' t% l - g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);; ~( G5 b& G* `! O" x
- g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
# Q( |7 }1 c$ Q' X - g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);4 i6 L4 t+ s! @, K% W6 ]! W
- + Y( O1 _+ O2 E9 H/ J
- + `' c# i/ w+ B: l- S' }+ ]0 [
- gtk_widget_show_all(window);) j/ O/ Y% n. m8 e1 i/ j4 s
- 7 e6 K6 z0 s, j7 _
- //主事件循环
4 O/ j$ [! _1 I9 A, N - gtk_main();
% v, [ A: a5 T/ o1 n - 4 ` K/ U; N( \* P& |6 Y5 P% v: D
- return 0;' a# R7 @8 D7 D! U- v t7 I4 [
- }
复制代码 以上程序,编译运行后,就可以有以下得效果。
3 P D8 ]1 {" P+ C- b- C
9 j3 w+ {* a& \+ d2 ]5 N- K 操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
# }2 x$ y8 R* T* { 搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。4 }* X/ s8 i d0 v5 p
% `+ n7 W [5 n3 ~7 c4 w. D1 v
|
官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习