你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP135F-DK开发板评测-Linux系统下的GTK计算器

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
! O! v7 v  U! b6 w% E/ \: r     基于Ubuntu18系统,补充安装所需要的库和小工具) t) v) T0 {6 y1 q
      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3   
- V' `3 D* b* T8 I# C6 V
  1. sudo apt-get install gawk wget git diffstat unzip texinfo gcc-multilib chrpath socat cpio python3 python3-pip python3-pexpect
复制代码
    其他工具
  1. sudo apt-get install libssl-dev libgmp-dev libmpc-dev lz4 zstd
复制代码
      编译器等组件
  1. sudo apt-get install build-essential libncurses-dev libyaml-dev libssl-dev
复制代码
        默认使用python3
  1. sudo apt install python-is-python3
复制代码
        其他有用的工具
  1. 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. f& d% d7 k+ |9 r5 U  B
    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。* [0 X0 Z) T$ t3 M
    1.png
2 H' M5 M5 x, c! d- b! v  然后就学着官方文档的样子去验证下SDK是否安装成功。
8 S7 G4 t" n: c5 F+ q7 o   2.png ) H% o! R! M: Y' l9 q5 l! O
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
$ Q0 U( w  ]  i: O! f  F  首先拷贝官方给的demo程序,基于GTK得hello world。
1 ^" V$ T' }! f# v  M0 A4 {" n7 f
  1. #include <gtk/gtk.h>; q' P+ m3 B' ?8 n% V6 N0 O* F

  2. ( N; e1 P  a) b6 T
  3. static void2 U& l1 v+ H* T  _! ?
  4. print_hello (GtkWidget *widget,+ i1 b- U( G3 b6 s$ l, T: S
  5.              gpointer   data)) W9 w0 k3 S& Z6 q0 L0 Q- ?
  6. {. [; `1 M6 c' o
  7.   g_print ("Hello World\n");
    . C7 f* {3 w& ]0 c2 {% G6 i: `
  8. }
    5 e0 S  {0 [+ y8 H# W
  9. * Y& y2 {3 l' I
  10. static void, l' L/ Y' \% T1 D$ [: j% ?
  11. activate (GtkApplication *app,. H/ S2 u2 A2 }& o" g7 T  D3 W
  12.           gpointer        user_data)* y4 a7 I( f# m$ c
  13. {5 j7 l  U' S# \3 L3 ^
  14.   GtkWidget *window;" N* \8 F8 O3 F0 s* y
  15.   GtkWidget *button;2 K' R8 R7 L4 W- t2 A8 o- g
  16.   GtkWidget *button_box;
    # |: H. O+ K% N- P4 v0 G9 E
  17. 4 p7 W7 O% R: c" m
  18.   window = gtk_application_window_new (app);
    + U& G7 d" J* {! ?
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    ) C) D* b- w$ M  J( E/ Y
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);% x  p1 S0 s* E1 j8 y% \
  21. 8 [) ]7 Y' k  f! J/ p/ m! W+ D: e8 f
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    & z9 B9 V2 h9 C7 U4 \3 Y+ B  w
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);6 C( y2 C/ U1 Y' N

  24. 1 d/ @- a/ y7 ~' ]1 l5 ^! k
  25.   button = gtk_button_new_with_label ("Hello World");0 m7 Q) f  E) K2 w& @  }5 }+ K
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);1 q1 I8 m. U9 {( C/ m
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);5 s1 `; D! X% Q' u) f9 s0 ~: L
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);* F( I9 m7 R- i5 K, {. q
  29. * T" r/ h) @" q# p
  30.   gtk_widget_show_all (window);
    6 F. W1 e9 A+ D8 e+ I1 a1 a: p8 @
  31. }- p# o( T" |0 v& B* K- K
  32. 0 Z3 V7 ?' `# i. ~3 U
  33. int' u; @( \* J( X* ]; k9 l7 A
  34. main (int    argc,
    1 I; P+ |+ A' ^6 l$ z! g  o
  35.       char **argv)
    - X9 i7 x$ }$ B1 [. L5 M* q
  36. {
    ; r; ^- I( {. P6 c
  37.   GtkApplication *app;# f# i/ a) n6 @7 \/ d; K
  38.   int status;
    5 C$ t: I4 ~* ~5 [) q
  39. * }; }6 m% s  \3 \- K9 c
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);4 _: J8 _" b9 O" r7 W( `
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    ; @% \. G0 I" x' K( {
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);( H, y4 N, k: S5 g
  43.   g_object_unref (app);; G* J# y. Y" u! f3 d

  44. 6 p5 ]1 x3 ^6 C7 Y3 h2 i2 X
  45.   return status;
    * s' O3 @/ ?- Y& F6 i+ U1 `
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world; D; d" x1 W: T: M
  2. SRCS = gtk_hello_world.c! r: y* h6 ?. F) P% n

  3. % o2 W- p' f: n9 q
  4. CLEANFILES = $(PROG)
    & |: k4 K) n! g. V/ b
  5. : }7 B7 R% e% w& V; M
  6. # Add / change option in CFLAGS and LDFLAGS
    ; K5 j$ n4 p' M; h* o# _
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)# j! x5 ]3 P2 f  _5 C
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)2 v! {5 T/ B, u, ?$ }
  9. # w1 U0 p0 D1 \, E) Q3 k- X! }& G
  10. all: $(PROG)  `, r% s. @6 Z( W; n5 L; ?) P

  11. 3 a1 S4 @# x; x, n
  12. $(PROG): $(SRCS)
    6 x+ x) Y& Y- ^
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)! ]$ f# X5 S, U9 ~- `- z4 c0 J% }
  14. ) M5 P" w" M% A3 m+ _- Y2 x
  15. clean:
    3 y$ }- }+ p2 w1 B9 U& l
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。+ V' n' Q8 o% }& w" V& r) T
   4.png
: v# Y) Z. n8 J* v$ y, }  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。7 S' X, G1 k7 y% G
! J, U+ U1 P8 u1 m
  1. #include <gtk/gtk.h>6 z% \( f2 K7 b, f: z: `/ `4 R
  2. #include <stdio.h>8 ?5 o+ J" z. M& m  z  ?* W  y
  3. #include <string.h># Z+ M/ s6 M. |) V

  4. 3 b5 Z) b3 h* d! ~& \. P; b
  5. char buf[50] = "";/ `& V2 h1 L' ?

  6. 6 d: j* e3 E  B4 v, n! Z) L+ v
  7. void calc(GtkButton *button, gpointer data): K0 z, y- E9 ]1 f, Z* g6 d
  8. {! `* M+ B2 l1 W
  9.         const char *text = gtk_button_get_label(button);
    $ A3 e; Y( M) t6 o' U
  10. ; i4 M: V0 o# A. j4 Z  C. a. |- K( f
  11.         //退个操作
    7 O9 P0 ~- [7 Q3 |4 L# L- P
  12.         if (0 == strcmp(text, "c")) : J8 e' k( i! x
  13.         {
    - I8 M% l1 I2 q: e9 W- _
  14.                         buf[strlen(buf) - 1] = 0;
    ! `# x' k$ S2 ~8 a8 a: z# F
  15.         }else{9 g+ F! r  Q9 P
  16.                
    ' p, J( ]9 n# y4 P
  17.                 int a = 0, b = 0;
    8 ~6 b" K# n" f. G5 o
  18.                 char c;/ J) l! G3 F& k$ g3 o
  19.                 strcat(buf,text);
    # o; [' V* H8 ]

  20. ! z" U$ j; b1 n) U' l, Z
  21.                 if (0 == strcmp("=", text)) {
    8 i6 o$ o9 O$ M- S* e
  22.                         % z$ q8 y7 Y% f2 X7 J- L+ o
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);+ m) ]& U- C% {* e& {5 a* B% U" m
  24. 7 S, ]6 r2 V" Q  t0 j
  25.                         if ('+' == c) {' g. n. u8 a1 B$ I" A( b( K0 J) ~
  26.                                         sprintf(buf,"%d", a+b);5 p1 e1 B- m$ h. |& ^% D/ i
  27.                         }* k# u/ R. Q( L
  28.                         else if ('-' == c) {
    ! v! A8 J( E1 X, P1 v: X6 V  B: B
  29.                                         sprintf(buf, "%d", a-b);8 [7 A, m6 K" |
  30.                         }
    & e+ H1 e" l" W  E: g5 E
  31.                         else if ('*' == c) {; C; s' Y: a* L  h
  32.                                         sprintf(buf, "%d", a*b);
    6 E% `4 x, y  ]1 Y. F2 t
  33.                         }
    7 S. a2 H, F$ d
  34.                         else if ('/' == c) {0 k1 v: L- R7 M
  35.                                         sprintf(buf, "%d", a/b);
    3 h* q. m) ^( ~9 G  O* J
  36.                         }/ R0 W' G, [7 j) Y) r" `( j! C3 w
  37. 3 J4 l" k/ O! `8 y2 j
  38.                 }
    # L* S7 J6 n! u4 W
  39.         }# X* X+ v/ b) Y2 l2 r$ C# I1 @1 q1 ]
  40. $ K, J6 H- L" u$ n% ~' u
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);
    ! r# X" i+ q, a$ A7 d- t# N
  42. 2 u& C8 ~) w( o+ b. d$ Q
  43.         return;* K/ ?3 l3 S5 P) y( K, T
  44. }
    - Z- o5 V0 u9 R$ o
  45. : B. t9 e1 {1 L8 D& X
  46. int main(int argc,char *argv[])1 ?4 f. Q# }. w) n
  47. {
    ( y$ o4 W( R4 ^9 m) X
  48. ' u5 o1 B! l# V* r% R
  49.          gtk_init(&argc, &argv);5 R/ Y0 l+ W7 W) {6 y$ g

  50. 2 s/ X- B' g( E

  51. 1 M) Y5 i9 \3 E1 |' U2 l
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);. X. x, z, O/ Z: B1 N
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");8 \) p  ^# L. m- {3 d: y
  54.   
    ' b( g6 c) e! n8 F5 a6 a
  55.          //创建一个表格容器5行4列
    # T9 r) {4 ~5 @" i, Q% K6 C
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);3 T0 G  W/ |6 v) O1 n2 o
  57. 4 T/ n" E4 p0 w, q) ]
  58.          gtk_container_add(GTK_CONTAINER(window), table);
    " n: I4 }% b! s* ~7 n% M6 h( J) g. H

  59. 5 E8 q/ r7 D7 \( c+ D1 c1 @
  60.          //创建一个行编辑! V* Y( H! K$ O
  61.          GtkWidget *entry = gtk_entry_new();2 ]5 M4 [) a0 E3 `( R& @. f5 ^
  62.         
    4 Y0 F$ s4 R5 A" q7 @7 K0 G
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");9 W* T& ~1 I- J, ~8 L$ m5 W% q
  64. " v: x+ r$ f( t6 ]% ]  @. j
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    9 f6 H. ~2 |. t; \* A$ n& s0 ?0 E( X
  66. " B& G' Z/ i& N' U
  67.          //创建多个按钮; y0 S% {; X2 j
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");3 q& E0 S! [/ @) T/ N' u
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    ( u. t6 O- m5 [3 K( C% R
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");, L2 q6 n# I/ H3 h2 O
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");, e& v0 q; B* j, t+ i# P- ~
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");
    9 o+ j( C6 T0 D
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");
    " X* I) G0 L1 `! L( v4 e9 J+ Z
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");
    6 p4 W; y5 j5 V6 z2 A' u& X
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");5 O1 n$ S9 d( R+ P0 q
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");
    " X* y' J% E( L4 B7 J
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");
    , r2 U% ]4 M2 ?' i, _6 ]" K

  78. # a9 m) G& g0 B; Y$ I) D9 j1 c5 c
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");/ B) @8 r" w. n0 r5 e
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");/ \* {( F3 o: @9 p9 g% x  U' }" r+ o; T
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");
      X0 x. J: a3 p% ]8 r
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    . e( ~+ G) b5 \9 f$ x% y7 S
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");
    ' j- m' a. q$ z. ^* c
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");
    4 I6 L+ p! _( I5 U" f

  85. . t, u/ y1 @. D$ z" `
  86. / d5 O/ Q. z1 ]- {* K! H) D
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);) Z+ z$ H7 O! c* V7 G* D: y# p

  88. 8 |5 U5 @1 ~( e; b, A! T9 y
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    , b7 j# S1 U% P. A4 ]
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);/ Q0 g$ [) l* G3 N$ y2 h2 s
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    3 T  m/ g; K% k& Z$ Y: Y! {6 ^3 T
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);# i" h. E  o8 S2 A$ s/ S4 F* @- f
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    + k1 y$ G" `. C% L% I& _
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    " ?* ]4 l0 E  H/ S+ k! y
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    % m& p9 d; A0 N5 X' \
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);9 N2 O' B/ B1 y$ r4 ~/ L& x% U
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
      `9 G7 M' w; N. q$ @# m
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);6 e: p% C8 E$ p- j( C
  99. ) ^" w- b) b4 ]* q" W
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    7 D8 n: F: G+ a5 M2 M* A1 a3 j
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    ) t! Q" z- p, ^5 A
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);9 O, Y" k: A. B' h% _; O$ A
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    5 q8 U2 J3 D% Z( i" D& F. l( E
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    9 m. V, W. r/ W# t+ l
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);' j1 S4 _, ~9 ~1 F3 o" k# c
  106. 8 F7 \; N) M# t7 c' J0 ]& ]
  107.          //注册信号函数,calc()
    : q6 d* h9 d. Q- p9 K$ J
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);" }! t7 F# Z% Y! m
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);: f; e) z3 n1 H! Z$ u, ?
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);5 z0 I) i2 y( h+ w( ^3 _7 @
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);5 m9 k/ g& Q6 D1 h
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    6 g. u, a9 b: f; g9 R  r- `
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    ' u3 Q  y5 q3 X. A, I2 V8 Q9 l# m0 M2 X
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);& ?8 h# }0 R2 e, z
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);7 a- |$ v! N5 I1 Z2 ?
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    ! r4 J; ~  K4 {2 S& ?0 t$ ^
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);: H  n: C0 d, m/ N
  118. + @, m% |: u# [+ m, U7 i2 K
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    ! v0 M, d$ C7 E  R& {( k
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);: ~6 `) p5 b, Z# S3 Q
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    2 Z- ?. }* d/ D9 @) p
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);9 I+ d5 ~' \8 E, V2 y' M0 i
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);8 b7 O2 @* m4 d
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);9 U: m; C5 a) b, ^! q

  125. : Q7 d$ [: b! A+ _" H. s) H- K

  126. : W% M5 N3 q2 a6 V2 G9 n7 x
  127.          gtk_widget_show_all(window);% K3 C9 T! `3 J; K
  128. " U5 R; i' ?" U, u
  129.          //主事件循环
    9 p5 Y( N0 f) ]1 `
  130.          gtk_main();5 S  g0 x3 m0 B- A0 y8 T! Y
  131. + w2 F! r1 K: v4 E- c
  132.          return 0;$ w9 i$ z7 U" q. e1 B
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
0 w1 G% U; u2 L& }    5.png
& F1 L, e+ n- g   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
. N& o8 v6 \( A7 {. |   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
5 I4 K7 z7 w! H7 }, \
, B( j& N! q# K0 S( b1 y3 y$ O4 N
1 收藏 评论1 发布时间:2023-12-1 14:42

举报

1个回答
watershade 回答时间:2023-12-5 18:53:40

官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版