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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
# e: M, d! Z' p6 g5 u* X+ W     基于Ubuntu18系统,补充安装所需要的库和小工具
# u5 R- U# s5 M" x  l      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3   
, \& H. s! a9 Z  R1 n
  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
- g. G* j+ w  `" `6 Y; [/ }/ t: J) `    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
* C1 U+ F- X" f% X    1.png
; I* N9 C4 q7 I! ?8 P2 j  然后就学着官方文档的样子去验证下SDK是否安装成功。
) Q1 r1 s. S! a$ }8 Y# s* N: H   2.png
) [+ V( u6 x3 F0 B4 g( u  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
3 |" U% i) R' i/ V' j  首先拷贝官方给的demo程序,基于GTK得hello world。
& r' x  {, @) j. b5 _- f) N9 V2 ?6 @% w) z3 {! h6 }6 G( t8 B
  1. #include <gtk/gtk.h>4 O" Q- W3 H( y" d9 y! y8 u
  2. $ n- X. ~8 k# q7 C/ y. ]! q
  3. static void
    : n4 q8 E* }( K, k
  4. print_hello (GtkWidget *widget,
    & o( Z: u' [& ~- P
  5.              gpointer   data)
    : t( p5 o$ e, P& D
  6. {4 N$ A8 U) z5 v, y5 e1 U9 G
  7.   g_print ("Hello World\n");
    % _3 Y: D# ?- J: `
  8. }" y& g  H, ^- {/ u4 ]( \6 Q
  9. 5 B* j- i% s# k2 q& r9 r9 J0 S  W
  10. static void
    # E9 L4 p% Y& X5 W
  11. activate (GtkApplication *app,
    . A3 D+ M; R+ E! o+ l! K) L" J
  12.           gpointer        user_data)
    4 t4 }/ h5 ]* z- C3 N3 H/ S# P
  13. {
    $ K; Z4 c3 r1 k( A0 q
  14.   GtkWidget *window;
    % s  U4 b  m" a" F
  15.   GtkWidget *button;
    9 P6 u- n5 I* W1 z4 ]7 P8 t+ Y
  16.   GtkWidget *button_box;; T# U1 d! H( m4 t9 ]& T

  17. . S/ H7 o5 \( j9 |# N
  18.   window = gtk_application_window_new (app);9 a( P0 H! t/ L0 n
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    ( S3 }: d- C7 h$ q( v& |$ d
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    8 E: i; ]9 G& E7 F
  21. " d+ d# H7 ^1 a
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    0 i' G" ^' B+ \8 R
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);0 ?8 P( `, Z+ e- E! i

  24. , m5 w. x8 A* U" Y! y2 ~
  25.   button = gtk_button_new_with_label ("Hello World");8 N) V* w. c! o3 l
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);* n8 V9 l& o8 d( J/ N) k) m
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);+ J$ b) H% N5 C8 k& M- k! s
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);
    0 _$ I9 Q  T. j. G, d
  29.   c8 \. E+ Z) r' V
  30.   gtk_widget_show_all (window);
    $ Q3 ?5 H* t1 H' ^  B4 z- }) }
  31. }
    7 U# |8 l$ K2 y) D2 O! F
  32. # q/ ?( w( T% E+ c' v
  33. int5 O; K- O$ h, k1 ?8 |
  34. main (int    argc,/ F/ X  a  W, a. ~  s8 y+ d
  35.       char **argv)  q9 d( F+ b" A  ~/ r# l2 T
  36. {$ E9 ^) B3 E% e+ F/ i! j/ h
  37.   GtkApplication *app;
    7 n/ z& L8 q8 ~& j' _! x
  38.   int status;7 Y6 l3 `- U- J8 V; i

  39.   |) _) ^! p- y1 V
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    1 Z) c7 E( B( q( f
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    ; D# d) Q% R4 v: m7 Z
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);
    1 F/ h) D2 z# B
  43.   g_object_unref (app);
    ' c( `+ a8 ^/ n* p+ G- n) B
  44. 7 S0 @6 X( ~2 T5 }- I1 P# {$ ~
  45.   return status;
    0 J+ l9 k7 Y1 J& e9 q; a4 }
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world5 t! D* v( d" g
  2. SRCS = gtk_hello_world.c
    0 N0 o. W9 }1 Q) \
  3. 6 T/ U' f4 \& U9 u8 n
  4. CLEANFILES = $(PROG)
    & h% Y) r1 T- o
  5. + n5 V0 v% S0 R: p" a- s. W$ T' |8 h: ~
  6. # Add / change option in CFLAGS and LDFLAGS
    ; J2 R" r+ g. a* [3 R) d3 i
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)1 S1 S- p# l$ P$ h
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)9 {+ L: [" L: R
  9.   E2 ]1 i$ Y) _; k1 l  u  P. j
  10. all: $(PROG)
      n% J8 I( j1 k

  11. 3 [: D: K! ^) z& }: K, e
  12. $(PROG): $(SRCS)
    5 b# v- v( H, S$ r. `
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)3 u8 |. F+ u/ n2 |* G4 B

  14. . ?2 g) t7 y# H7 T+ P
  15. clean:
    7 g% a$ f0 }. R
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
1 `9 m$ ^5 B2 x% k$ h. d   4.png
* j5 D) D. E+ g9 K4 U4 W  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
4 K- \3 \& F/ N; s+ Y4 x% D6 g$ ]+ V8 M# v" t5 ~  |, Q
  1. #include <gtk/gtk.h>
    $ r. u* [* N  r
  2. #include <stdio.h>
    ' ~1 I7 V, |3 F5 P, h7 d8 o. y' Z! _
  3. #include <string.h>9 F( p& {6 H8 F. |: ~

  4. - Q5 p( k' Y& u; N2 X
  5. char buf[50] = "";; i4 Y* h4 x4 B9 q: O, E$ j
  6. ( a" \4 n1 w1 j- ~& Q
  7. void calc(GtkButton *button, gpointer data)! h' f0 h2 Y: a+ q8 ~
  8. {
    1 X" p: z! C+ t4 s
  9.         const char *text = gtk_button_get_label(button);' T0 @7 ]1 H5 m

  10. . v  H) H7 b1 j7 z% R
  11.         //退个操作3 m  ?) B+ u/ P
  12.         if (0 == strcmp(text, "c")) % ~5 b# K3 s4 r% o$ [
  13.         {
    9 |: K  Q5 O2 ?5 x' ]  o
  14.                         buf[strlen(buf) - 1] = 0;4 t) Y; j1 v6 B
  15.         }else{
    8 M& O. [: w# o) i
  16.                 6 ~/ ^  b! J) b+ ^1 n
  17.                 int a = 0, b = 0;
    + E% q9 h5 I7 |) [' h
  18.                 char c;3 W  y. e3 t) T2 Y# m
  19.                 strcat(buf,text);
    , j) L- Q* }4 C
  20. " B! _# b) l  V( q& C
  21.                 if (0 == strcmp("=", text)) {
    6 E9 c- K  E$ f- J
  22.                         
    . b+ K! z8 z) w7 a, }  x
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);, q; R# s6 E! P* x( {
  24. / y0 E1 e% C% K3 p
  25.                         if ('+' == c) {3 e) W/ o/ N% \7 o
  26.                                         sprintf(buf,"%d", a+b);% s% @7 o1 N) r- X
  27.                         }
    ) |' a" C: m  E$ }& B
  28.                         else if ('-' == c) {
    + H9 W+ x9 ]2 e/ Y
  29.                                         sprintf(buf, "%d", a-b);3 T- w" I5 l" f1 n5 ~4 ^
  30.                         }
    5 {! c) G* B* C8 J6 ^% Y
  31.                         else if ('*' == c) {& D$ M/ K0 \' r0 s+ H1 g7 G
  32.                                         sprintf(buf, "%d", a*b);5 ?1 W9 t) I# n# q% I
  33.                         }& L8 W0 P2 R% [6 x; V2 M% W
  34.                         else if ('/' == c) {
    . U6 L# }& B/ U9 m- [! n! Y
  35.                                         sprintf(buf, "%d", a/b);( ~4 f1 i' ]6 l
  36.                         }
    . z2 |5 \+ G0 }( `: }
  37. ' ?4 [- F1 c8 H
  38.                 }" O* a1 Y, l8 a1 D
  39.         }
    / ]6 Z; c! Y8 B- x/ m
  40. / H8 e! @% S0 E6 N& W' |6 a, |
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);
    2 h0 @0 c4 Y( h

  42. & R2 t7 H7 @0 M* [/ F) b4 U; p6 Q
  43.         return;1 K7 u: E4 j8 C: [! }0 P2 z
  44. }
    " |# L6 H- f: |9 p5 X% ?; i2 F' |
  45. : X  s4 n' N: A( G; T
  46. int main(int argc,char *argv[])' F/ A) o7 A# N* V9 _+ h7 z  U
  47. {
    ; h! x# U; U9 b
  48. 1 D; g+ [& g3 f- A
  49.          gtk_init(&argc, &argv);7 {7 n* |6 ~, p7 J# U5 R) L! }8 t
  50. / `7 A8 V5 ?# U7 V) O

  51. 8 m) K! d: I# k! B1 b
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    . g7 ]3 b9 P6 ^+ z+ `, m* C3 B" `; E5 ?. s
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");/ K, y1 m, \$ I' I. G
  54.   
      U: P2 @) J1 E2 o3 a1 y
  55.          //创建一个表格容器5行4列- X  Y+ n- W/ Q/ Z- W, H; p
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);
    . U0 n% x# R! R& y+ _& M9 |/ m0 A: B
  57. ( G& Y# d+ m+ {: n3 Z3 n
  58.          gtk_container_add(GTK_CONTAINER(window), table);, F/ }  F7 s$ D, r* G7 y
  59. 1 i/ T$ a" r  Q
  60.          //创建一个行编辑  @* w4 G) H6 ^8 a# T5 [5 h
  61.          GtkWidget *entry = gtk_entry_new();
    . n4 W9 O& g) J$ o  d
  62.         . g$ l+ C" W+ v* O1 i7 Z
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
    8 X! L3 G: \- A- {' Y

  64. , Y/ D! P" x2 M/ z6 k9 c0 d# D
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    ) B9 |- q0 [, T7 o3 }# v

  66. 4 p9 J" o) e" l5 k# x( c; A
  67.          //创建多个按钮5 s# v/ S: p$ `" i
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");, W3 V2 ?5 t+ p1 c; A
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    ) M0 w* t: F2 A( U
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");5 R: D" {5 d) u6 z/ B
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");
    9 ]& j( V( U2 X! G3 [4 T5 C
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");5 m! _( V2 c& {& s8 r$ K
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");
    5 L7 R! q) i  s' b
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");( f3 d# Q" O# _, h
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");
    * x7 W  H8 F4 Q3 R& _: d+ J
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");5 _+ N5 `4 o' ~0 \6 S
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");' m) \7 \  L; u, k/ T

  78. - j/ X6 q7 j* [
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");, g0 H  |, k. G, d: f
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");9 s& G4 @* u  z. b" _' p
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");
    4 D0 g6 m8 u; x4 F6 s3 [
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    , ]' o9 N2 r0 p, p3 [' x
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");
    ' w+ W6 Q7 q5 H% A
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");2 k+ ^, O+ s  w1 B; v0 T) R0 ^

  85. 1 s( X0 C" U: J
  86. & o7 E. F/ Y& C* G  U# |  Q
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);5 O  d! T- @" S* U; y
  88. 0 k$ S/ k: Z: W5 q+ _; L7 G  T
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);& E$ O8 _# n4 ?4 D& S: r+ d) n
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);% g2 z$ X" G: u7 C% V$ f  [
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);8 n/ l7 H* u5 m0 \: m* `, J: ^
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    - H8 C. [1 F9 D8 b; ^
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    9 G, O( P0 M  U6 t8 l
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    8 j, F2 o4 I8 j% G% W+ m8 d
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    % n- M+ o* i$ h5 Q& q
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    / l/ ^0 \9 t' O* m; Q$ e
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    # t8 m2 @* J: f; `, X
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);* k; M' R9 X1 f! N8 J; N0 c  J
  99. ' d' z8 R( j0 a! Q1 Z: X
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    & C, x; Z- K8 d: M& G5 L' |
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    , D: p8 R4 f2 j. Y; ^. d8 z+ S
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    1 }0 e- s3 h) l  H
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);" `4 R  d' A9 {+ I! ]
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);' [4 t% z3 c% S3 @# l$ u. d% s! x
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);/ `- L8 x3 i8 \0 F' k+ n

  106. 6 A  j# _3 i; E  S3 S2 u
  107.          //注册信号函数,calc()
    7 p+ H" ~# h" o# H
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    : B+ t9 _+ t5 H, p5 ~- }/ g9 j$ \1 S
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);. A0 m- T/ l9 b  h
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    6 _! D/ z4 f7 T8 x. R
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);4 a2 J. P4 d; M# M& R, C
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);3 [' }2 z9 [; ]: W+ s7 K1 v
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);/ c" I0 `$ D( a) X& R8 [$ B
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);0 Q* {. K8 f9 _
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    $ K6 X8 n+ R" g% T. U% ~
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    8 a  G% v. ^* ]+ Q6 g% h
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    6 R4 o) v  z: R- {! f0 Q8 L7 Z
  118. % a% d6 n8 T2 L7 T
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    1 o7 e9 t# B2 X  k
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);- X  a# l7 s) g1 d4 M
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);1 ?0 E7 r+ z( ^
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);, `3 o, A4 m; R5 j5 d( p- v6 F
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
    2 v: x+ m5 T7 T
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    ! v. ]# [' l( k. R
  125. 2 \7 B3 r" ~; ?) \& w
  126. * t/ @+ Y3 g2 N8 D; R( h
  127.          gtk_widget_show_all(window);6 U# @5 t7 C2 k$ e8 Y( _  u' n

  128. 5 N2 \+ m% \  O8 Q2 B4 f- L
  129.          //主事件循环1 U' R; m) l, s  n
  130.          gtk_main();
    7 f7 R$ J- {6 [# ]* c, M2 Z: c7 U: f
  131. & }2 T& p! Q# H" d, _2 J& D
  132.          return 0;! [6 U! M5 }( x, n% d( C' `3 Q5 B# I' b+ G. k
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  ; L' B; n5 l0 _
    5.png & B4 ]% `; z7 [+ o8 y( c, }
   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。* b1 s# U6 }9 t1 j9 h7 g/ F
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
1 M. Q: W" E$ j, W- G( ~  W4 U( g5 ?( `( C, Z' k( k
1 收藏 评论1 发布时间:2023-12-1 14:42

举报

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

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

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