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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
, n/ Y% E& c: g- o     基于Ubuntu18系统,补充安装所需要的库和小工具' N( O8 o, ~( }% P% {
      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3   
3 X5 s; S, ^& B5 e7 }# n# H- F
  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-software8 ~/ o7 T' K2 W* U+ Q5 N
    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
9 J8 |' o, R$ ~    1.png
; G9 z& M7 ^( M( l' A" `# L# X3 }5 Z  然后就学着官方文档的样子去验证下SDK是否安装成功。
, l$ f8 z: x8 k  H$ ^& Z3 g   2.png
% B/ G( n) u1 N4 O- m  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。$ N$ g& s3 I$ [' r: Y* M* {* D4 z
  首先拷贝官方给的demo程序,基于GTK得hello world。
" t7 j% ~- j3 ~7 A9 F0 m" b8 |8 a
, z& O. H0 `) P5 I% i" e; a
  1. #include <gtk/gtk.h>
    $ Q+ {% j7 k/ O6 L

  2. * E# P- q8 O$ f8 {& d
  3. static void1 ~5 M5 g" p; W- k( A  i" H( `0 ]
  4. print_hello (GtkWidget *widget,
      w! S  ~/ A  s
  5.              gpointer   data)+ e3 s9 y9 _* i' _
  6. {, ~5 x4 B: @0 M% U4 }% ^
  7.   g_print ("Hello World\n");
    # B. i* x1 R8 r" A  ?7 L" ~2 N
  8. }
    1 a, ~% m- N0 G3 X6 G+ [' |

  9. 7 ^; ]% ]0 a' j; l" r
  10. static void' w. e7 ]' a! w% o- F& e( a6 S
  11. activate (GtkApplication *app,5 v2 z/ U* t8 H
  12.           gpointer        user_data)
    ' I2 ^3 F9 a) H+ N0 k8 y
  13. {. u  v' e* m* J8 r
  14.   GtkWidget *window;0 e* M7 M) ]0 O
  15.   GtkWidget *button;
    $ q& D7 E( U) s" w& ^0 G- T& C  h* }3 w
  16.   GtkWidget *button_box;
    % T. ~- q& F0 F7 i1 `
  17. $ W/ }$ g5 n6 y: @9 i- H
  18.   window = gtk_application_window_new (app);( H* L& [% ?* l% w
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    ) [1 J0 {, l. q& S% s/ G" g# M( X
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    ( l. G) _( w$ a2 J$ Z
  21. 0 X, ]) @. o4 f/ D* A3 A
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);2 U5 z( W6 m8 P0 l4 F  c. m
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);
    ) N: m. Q8 C3 t  ~: y, [
  24. 4 e, Q& E. Z0 F  f
  25.   button = gtk_button_new_with_label ("Hello World");3 n- R# ~* m3 v3 a3 U6 _# {- y, J
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    4 P4 C9 K% S+ U) D; \) i
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);6 C7 c2 X. }) P* i% n/ m
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);9 J! J/ \% f( Y( _0 s4 Y. m  N  D
  29. / u: `: o) E. ]* W
  30.   gtk_widget_show_all (window);  b& {1 f  v1 K% h. V9 h# _
  31. }
    9 I5 h$ O: @0 l' D
  32. ' }" z( V0 k3 c! H/ Q9 r
  33. int7 H3 r" ~8 K! ~
  34. main (int    argc,
    ! T1 Q* r% a# F6 k
  35.       char **argv)
    0 |* \1 {) A6 i4 B
  36. {
    6 S& X/ t& g; T- m/ d: B, s
  37.   GtkApplication *app;
    ' n% K7 R" x: A/ V" R4 e' K8 M
  38.   int status;
    8 _) J+ F# \" M

  39. $ Q+ ?! {& f8 Y& S/ s7 ~6 @
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    # {$ S: E$ n8 I
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    * h3 s( {8 |- i+ m/ k9 b: k
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);! q1 a2 L( J% n# p1 g- E
  43.   g_object_unref (app);  O& E" e+ F7 [7 \# Y! F

  44. & q5 a1 b+ @. a: @% a
  45.   return status;# o6 v2 a( p# j; G( ?9 h
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world
    + B; m5 U- W6 [, P% P) w
  2. SRCS = gtk_hello_world.c
    0 W1 k4 c0 Q; r5 j9 o/ ?5 V

  3. ' n4 V% y7 h2 x$ _5 {7 ~4 Z% q# \
  4. CLEANFILES = $(PROG)& A# r% n* |4 M
  5. # X0 E$ r0 }. t5 ], J+ A; S3 O2 L
  6. # Add / change option in CFLAGS and LDFLAGS* b* ?& m9 o, p0 |  m
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    ; I$ v" P1 p  |0 K
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    3 a3 R! W' B  }' L2 f4 c* w2 X$ W/ e
  9. ( @& F$ c6 b  E- o
  10. all: $(PROG); s' q& k; v# P/ w- z# S. I
  11. 2 }+ m/ \: K4 O1 l3 C
  12. $(PROG): $(SRCS)
    1 b" \9 z( ]! D( {/ g
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)1 K# ^* {% R1 k& ?( h

  14. " T/ p% u4 R, @5 t
  15. clean:. @6 v6 x% s, t1 j& I4 w" G
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。& M$ A2 e* n& O! X
   4.png
, U/ _% i7 a' o5 u  `3 o5 N. X  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。& a! c6 _) Z# T$ E

) w( Y0 U: D+ D
  1. #include <gtk/gtk.h>
    9 P3 |, E( m1 O9 \* e/ |' c+ J/ T
  2. #include <stdio.h>
    6 u* g) V# ^  R, n
  3. #include <string.h># G( I* p, B! Y6 {( v6 P8 C

  4. 7 }% h2 Z! P* \' n
  5. char buf[50] = "";/ @+ p8 w$ Q7 z7 i- s
  6. $ E. H" h- D, d  n# k
  7. void calc(GtkButton *button, gpointer data)4 z5 I$ y6 ]+ j5 a4 d) h& a
  8. {; ^4 Z! I( }( b  _
  9.         const char *text = gtk_button_get_label(button);
    ' C. e) t7 c0 y- s3 K1 N

  10. ( Y3 w+ A( X7 {; A$ E) Z
  11.         //退个操作% I4 N& H% j2 F
  12.         if (0 == strcmp(text, "c")) / @: `5 D" T, `* M: d' U, W. b
  13.         {9 X! ]5 }" A; G: P5 t" x# O. G9 E: T
  14.                         buf[strlen(buf) - 1] = 0;. z1 {3 h$ q. L1 g
  15.         }else{; |' P6 H+ C1 F8 b3 T- x
  16.                 7 x$ ]* k* b+ ?; m
  17.                 int a = 0, b = 0;3 P: J) T5 ~% y- j- W4 ^
  18.                 char c;
    : h! B4 `5 O# R5 o8 i
  19.                 strcat(buf,text);
    8 a& |/ m) t, J, s/ N9 U4 w
  20. ; Y3 N% O$ E) R- m  r
  21.                 if (0 == strcmp("=", text)) {  M' J' ~4 h& a) j. l  j% F
  22.                         5 ?+ u0 J6 D& s2 l7 D
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);! {9 i6 j, \6 w; m0 m. N) m! j
  24. & u( b' j5 a6 _! ?' `& I( c
  25.                         if ('+' == c) {
    0 g8 q6 i' X2 C1 E
  26.                                         sprintf(buf,"%d", a+b);, `) y7 G$ ?& E4 w. @2 @" U
  27.                         }
    9 c  _' k& h( p5 q, y7 n# j: `
  28.                         else if ('-' == c) {0 C; k& b) U7 o/ l: y5 y
  29.                                         sprintf(buf, "%d", a-b);* A5 Q' ~5 H4 ^& d: ^" i
  30.                         }
    * T. ^" i! i4 Q  Y
  31.                         else if ('*' == c) {
    4 ~6 V) y+ a" w
  32.                                         sprintf(buf, "%d", a*b);
      p" t9 d0 Z- @+ b
  33.                         }' s* v+ n7 Y+ Q8 B0 c( o% j* ^+ s
  34.                         else if ('/' == c) {
    - R8 h9 V$ N* X- P, n' X' {
  35.                                         sprintf(buf, "%d", a/b);
    5 s" \5 G* g& |( [, x% H; f  E
  36.                         }
      o; Z6 d1 c$ K( F: J
  37. " m, t6 g4 D2 ~. Q' b
  38.                 }3 T; B- V! ^( T' f3 N' ~* b8 ^, x
  39.         }
    5 f8 M" j* l8 u1 j* s2 R. V- T! f% }6 }
  40. , a7 |+ Z; E. c! e( h
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);$ ?( m; H+ B0 Q8 Q) ~2 ]0 ~6 n1 _
  42. % n: g0 W! L/ U4 \
  43.         return;
    , P9 L5 O; O6 i) o" ~
  44. }
    : I; w9 w* P" d2 Y) Q$ t
  45. ( h+ ~( X, I6 q) W
  46. int main(int argc,char *argv[])
    % n- x; H4 h3 [: ]
  47. {
    / ?1 M6 P# k5 G: m# R4 Q

  48. ; Y5 s8 {' X& B4 g* p: v  L7 v/ P, i
  49.          gtk_init(&argc, &argv);) O" b2 N# {9 |1 r
  50. - r- k) \" P+ V$ p8 U- l7 N$ C
  51. ( P3 p- V9 m3 S" {  {% X9 ]+ f
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);2 z3 z' m3 c; z2 _& g. j* |
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");
    + K8 k8 F' f9 Z3 b6 Y9 c- Y( ^
  54.   2 L5 T/ R. b+ |7 z* ]9 r9 a! ?
  55.          //创建一个表格容器5行4列5 }) _( \) Y, Q
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);9 v9 N+ M, C5 ]: P' [  W1 _
  57. " t. u) Z3 Z' ~6 `) `. z0 A' q
  58.          gtk_container_add(GTK_CONTAINER(window), table);: f- E  o+ g* w  z8 o* Q
  59. 0 E7 V. r  w1 l
  60.          //创建一个行编辑
    6 P7 M" V3 B% g7 M7 M) V, p# d
  61.          GtkWidget *entry = gtk_entry_new();
    + D* `. ^6 q- K% Q! s7 f9 o, [+ I; N
  62.         # Z6 N3 V" k; J/ m
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
    ! |. o. t, S8 M# F. _" C
  64. 5 O# z% H9 s  w; @  Z. ^" O3 v
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    ; s: H* Q* |- K0 U) r. W! m. v

  66. + O& y7 T& c" H& S- U- l. V) R% p
  67.          //创建多个按钮
    / @2 x+ N5 h$ h6 y# d
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");+ O; k) u5 H8 D5 M5 V4 Y% U
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    ' ], R, I: R0 Z8 l- Z* W" H
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");! B( ]% t$ t0 W1 G
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");
    0 x& w. e- Q  j4 J7 E# ~' e
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");% J. D8 n* `: A+ J. u
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");4 G0 ^  [* q2 ?
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");. X. V) m) ?* w4 E5 N
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");
    / A: I1 @9 c3 [% `# }1 V
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");- q! W, C" l) ]! ]
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");
    ; z; |; u/ Q5 `& h4 f0 q

  78. . d- ]% b+ \5 g0 f. l2 U- b9 Y( J
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");4 o# H% g# y) I3 r5 i% D6 i
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");* h4 i- C1 E6 S7 f% N; C, L! n
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");
    5 H# k5 P! ?$ A7 G+ y' X
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    ; G5 y- G& C7 _' }" m: s# I8 R
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");5 |6 @" @. x5 a, W2 E
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");
    , n; ]5 w  \* F6 C$ h# @% h& o7 h0 v
  85. " P9 X9 h# V0 ~+ S8 r

  86. 5 u2 h2 S% y2 |+ g
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    , _: S$ H  k- u& G
  88. % c9 x+ h. _+ K# X* J7 E; z9 p' C
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);& x; ^# ?# W8 f" R+ ~0 f; s" a
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    0 r7 ]2 H( w9 W1 V( Y
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);" V' k+ }# R' h- M: B4 V# R
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);4 l; y3 D& _- U% {$ _9 m
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    : j$ Z6 I; S% ]; e
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
      |6 \+ H' m/ U! ^# r6 Z
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);  B& z! ?: A3 V9 L
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    ' [! S9 }9 g: ^
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);, ^. `8 N0 L4 b, F
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);' b# t3 m: M! S1 c3 O

  99. 6 y+ N, Q9 a9 l( l3 u2 h$ A# s& q5 J# h
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    0 n4 |" s6 F$ d# J1 ?$ K, [7 u2 D* M- _
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    & z4 Q5 D# i5 l5 [! p% \
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    4 L3 q* L7 L& I) U" t, o4 @$ P4 i4 W
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);% u9 f! i4 b7 K4 \
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    # {* y$ n/ a$ a+ I
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    . o/ t4 L" d1 ~9 \; \6 Y. G. X
  106. 2 R+ [1 @3 k, _- D! i8 u: d8 s+ r
  107.          //注册信号函数,calc()
    & _8 o. \3 S+ F0 i
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    ' ^& U0 y- S' T* i
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);" w6 y; X8 u  A" Q/ t% F2 Q
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    8 l1 b9 j! U! f/ k6 R2 y+ i, Z3 K6 ]1 s
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    6 f# S4 p; j3 l% v  z' u
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);5 I1 n9 V& O3 i! V' p& B9 e
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);* ]* K, d- {  Q
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    ! ]# O1 Z. q0 s$ C+ @2 ^$ R
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    ' D; C! m5 r$ v# I
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);, P/ p. i6 a$ F, [; V
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    % `: b9 v( F2 o) z$ u

  118. ' Z- h& O) f2 U8 g2 T, _* E
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);1 n% _' U2 C2 r
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);% O8 D! h; _  Y/ T
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    ' R7 f( q7 z) i+ ~3 X
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);( S. l0 J# ]6 V0 e, V% |
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
    - Y! u+ Q# H. L7 y! @
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);! X% s! j7 S1 x
  125. / N- b8 P- c5 }8 r7 u- K/ C

  126. 0 x- [  \& j  j, U. K
  127.          gtk_widget_show_all(window);
    ; F. \% r7 t% s) [# o& a/ \" l
  128. 1 Q3 F) G. `7 {4 W3 p1 O
  129.          //主事件循环
    : Z6 P: H8 |* z3 a# H/ b
  130.          gtk_main();
    ' I* o7 v1 O" n1 v+ d

  131. ( z) [' ^, T: f. ^
  132.          return 0;
    4 W2 u  Z& n& [" R: z# C2 b
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
( r" }' ^/ h( ?; q, r5 m    5.png
$ H3 s& ^& {6 t5 F- s   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。7 o1 d/ s* f: E6 X, n
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
- F! V9 K2 n/ v+ S1 `$ ^4 P* |. \1 u+ h4 A6 q% d8 _
1 收藏 评论1 发布时间:2023-12-1 14:42

举报

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

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

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版