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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
/ p# {8 [1 P  S, Y1 `     基于Ubuntu18系统,补充安装所需要的库和小工具
- k7 ?$ v4 v3 F( [' K" A% F      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3   
1 N/ B9 b7 }5 V  ?! l6 ~
  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; P& Z- R" M! j. x# V7 @
    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
  l9 M! p3 `" E2 K% h0 o    1.png
0 O( y$ @4 o) P4 U  然后就学着官方文档的样子去验证下SDK是否安装成功。
  m$ e3 {( W1 t2 ]$ w& r   2.png
8 S8 y5 D6 T* {8 G' J8 E: f( m& D. V  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。' {( o/ K% j/ Y# P5 v2 s
  首先拷贝官方给的demo程序,基于GTK得hello world。2 P( Q' |  U) `  T, O( B) @5 l0 F

$ P% i" r3 \1 E3 {
  1. #include <gtk/gtk.h>" n% B( E! Q+ t  ]! F0 C/ p. v  ]
  2. ! N$ t$ r) a& b7 [
  3. static void
    # z9 A: G0 C; B5 c% K
  4. print_hello (GtkWidget *widget,, C9 B4 T0 d" W1 i+ a+ h
  5.              gpointer   data)% p  }$ p% R( Y
  6. {3 _8 E' Z  H3 h+ }0 @
  7.   g_print ("Hello World\n");/ d5 T' G* o6 @5 n- ^0 f3 W
  8. }
    6 q0 B+ G( n/ _. |' h

  9. " V& K8 g  Q; o9 S; F  R$ h) k
  10. static void
    , \2 k* O" d* N! S$ q! |
  11. activate (GtkApplication *app,
    # q2 d- e: y5 |( \
  12.           gpointer        user_data)
    ' [0 _1 [) O& n- q. L2 Q1 h$ r* L
  13. {  f3 z6 g" O9 H+ N* L$ [. [4 G
  14.   GtkWidget *window;
    3 p) ^; w- o1 T
  15.   GtkWidget *button;
    ) h# n3 _5 i3 Z0 W$ B! r1 G
  16.   GtkWidget *button_box;
    + R4 V+ G. g" S
  17. 7 J  {% x7 g9 }) F9 E9 T
  18.   window = gtk_application_window_new (app);' c3 K. R: C$ |
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    / |1 a% a  i; z( K& P* l7 L* ?
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    : y. i9 h, x- j

  21. 5 H7 u: L! w1 C+ j: D8 p
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    ; P" z2 ^" i' y2 G; c+ }! N7 G
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);6 @# s$ O5 A& a! s! c- \" q

  24. + ~1 o+ J* T7 e3 o! X
  25.   button = gtk_button_new_with_label ("Hello World");
    9 ^4 h& k: m+ C3 y2 c5 w& g
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);3 x7 t( x! Q2 W8 I
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);5 t  \- A9 g9 Q4 h" j( Q
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);& z- S9 o* p- M/ P

  29. 6 U! e' n; y7 e, l) S, A
  30.   gtk_widget_show_all (window);
    ; q! k+ D& u/ J: ~
  31. }
    7 l' o' c( K4 c* [

  32. 5 I, v; g* h4 i( m
  33. int
    & f" u' p- I3 z# U6 S
  34. main (int    argc,  o0 ~' ^# ^7 W4 h
  35.       char **argv)
    + i7 T0 \2 l1 M! W7 `, I
  36. {3 C. X1 X# P1 c1 Z0 W' G+ c- s
  37.   GtkApplication *app;) [& v- `( c2 h) G  @. ?4 b
  38.   int status;
    7 t0 s' ?1 V0 \# V% N
  39. ! x3 z/ H; o1 _. H: }. N) y: {0 z
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);+ m+ d; Z& W! Q" l& z6 A8 v5 I5 h
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);; n6 r& j& m. M" O$ k5 U
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);
    & A$ \3 c3 z' G. }4 _1 \* Y
  43.   g_object_unref (app);
    . M/ G$ U* b5 N1 N4 n* q; U
  44. # Q( Y9 @2 C# ]( W- c
  45.   return status;' u  Q) v4 n1 I
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world
    ! B5 \# \$ t# r% U/ H6 Z* Q8 A; q
  2. SRCS = gtk_hello_world.c
    & S. w% F# Q- T! B2 H/ M
  3. & [+ `6 @4 r3 I! R5 }0 D5 S
  4. CLEANFILES = $(PROG)
    ! L) b* c  p. `0 L+ Z

  5. * |% Y' a+ u' V0 t$ X& U# f  E
  6. # Add / change option in CFLAGS and LDFLAGS
    : z' U. Q. n& m& m! i' x' B% \# X9 @5 m
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0); m+ s0 _- s8 H9 |- S
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    - e9 s: j8 S  J6 T

  9. 9 e4 x9 @- j6 g* A
  10. all: $(PROG)- |0 \2 S0 P! E1 S
  11. / a/ N" P( F1 d9 T+ l; U! y
  12. $(PROG): $(SRCS)
    9 y+ Y& X& c! S6 n) u. W
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    5 a' A) ^0 C0 r- u, B

  14. 3 O2 M" J% Q) g+ k/ i4 d4 l5 x. m
  15. clean:
    ( [. e! k# K" X% \1 i
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
+ k, o. j/ c' j9 z- ~   4.png : p, L- s9 b% ]' d4 K
  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。! M7 s8 W$ a. r+ m; V
; T! E) P  Y' P* J0 S) ?
  1. #include <gtk/gtk.h>8 ~2 y& Z; j" Q  I2 |" j3 x
  2. #include <stdio.h>
    ; J, v. r% O8 [% e) q- C1 R
  3. #include <string.h>( D( i. b' W, Q  F) j7 U9 s

  4. . k. S( R2 k6 @# f; V7 c
  5. char buf[50] = "";2 x3 X* k) Y; S- ]
  6. ) X  r  }0 t- g
  7. void calc(GtkButton *button, gpointer data)
    : e! F4 |2 j9 A4 c5 @3 Q$ ?' W. K
  8. {
    ( j; E6 @  [' S1 V( ?$ s
  9.         const char *text = gtk_button_get_label(button);
    ) r+ D; ]! k& Y
  10. 1 F& \8 I" @" n2 M
  11.         //退个操作; G/ b3 H! k* d5 L- N
  12.         if (0 == strcmp(text, "c"))
    # ]2 M" b, q+ A2 ?. x; C
  13.         {
    5 T2 z; A' j  b. {, f4 ~. r
  14.                         buf[strlen(buf) - 1] = 0;8 G8 K6 T- N6 {) U# Q$ n2 P- C
  15.         }else{# s$ @" F2 ?, U: V
  16.                 , k: ]' D4 i' z' e9 E7 X* c. Y1 [, U
  17.                 int a = 0, b = 0;
    / Y# Y% G- L1 g7 V* u+ |0 s4 D
  18.                 char c;* j4 h) u1 T" P
  19.                 strcat(buf,text);: }9 O6 _" _2 H8 t- @8 {

  20. ( K/ Z9 V# [- p" `; T
  21.                 if (0 == strcmp("=", text)) {5 Q1 ]0 I" B, ~+ h0 r  w) f2 s0 ?
  22.                         
    , N2 T4 G* @5 ], |4 \* B* \9 A
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);
    6 v2 |) `  Y# G+ r/ K! r
  24. ; M! E5 O! ^: c  F. l- `
  25.                         if ('+' == c) {1 N( |( A& p* d  y, o7 F6 |
  26.                                         sprintf(buf,"%d", a+b);
    & v2 l3 t9 `4 R
  27.                         }3 i3 U, ]7 g9 Y, u! v
  28.                         else if ('-' == c) {
    ) U, P& c# n' r% `' z& Q1 H
  29.                                         sprintf(buf, "%d", a-b);
    * W! F8 g+ q5 _4 g, |) ^
  30.                         }
    ( J7 U9 g5 D4 ~- Z$ O# a8 b0 r: l
  31.                         else if ('*' == c) {
    + X/ P* Q. W; e+ |- S+ }; t- |
  32.                                         sprintf(buf, "%d", a*b);
    & f  Q0 z0 ?/ V
  33.                         }
    . E8 Q, N: f, y: t# t- @
  34.                         else if ('/' == c) {
    - G1 x& g; I% \1 C
  35.                                         sprintf(buf, "%d", a/b);: F  e1 B: [: J- H, G0 j
  36.                         }
    3 t# M  h7 T" f

  37. / P) r1 p. W# g1 K- k9 V
  38.                 }/ W% N3 D( m) L0 N2 ?
  39.         }# x! l; ~0 d: N; Q) t! C* y6 a

  40. - R9 K/ p5 ~- y: o
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);; o) |- v, B8 @; X9 L& j# g

  42. 2 i' s! J* X3 V9 c; b7 j' V
  43.         return;; C  a  ~2 K- M! i9 G2 D6 B
  44. }
    7 c! N/ I9 C+ t# v2 }! D( ]

  45. 9 Q& U' n7 s! z: L- m# f2 y
  46. int main(int argc,char *argv[])6 E2 `2 p- l; r( F+ w: p
  47. {; `" o" W5 D# `; r$ {1 |) [7 d

  48. ; `; ]" O% O3 j+ P
  49.          gtk_init(&argc, &argv);
    2 a2 C4 I8 r$ t( z2 n8 B

  50. 9 @9 c5 {' U+ D; O( a" q

  51. - F. }5 [9 l+ x' Q2 R
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);, M" [' i+ c1 Z0 ~6 T7 R9 J
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");0 p" S) d9 ~" U
  54.   
    / Y7 c% F% S4 ~  b) a& G( q/ {
  55.          //创建一个表格容器5行4列
    ( Z7 s6 {  M2 X( K0 n
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);
    , U' S$ [  ]9 r, |$ T. u
  57. # X6 u+ a0 @+ o4 ~$ R0 Y. k
  58.          gtk_container_add(GTK_CONTAINER(window), table);
    9 z/ n# C+ I% s$ H3 i& L
  59. " k' s( w- C% X( i, l: Q5 l9 i3 I
  60.          //创建一个行编辑
    / W: K, e( ?7 [" F5 Q3 N8 j
  61.          GtkWidget *entry = gtk_entry_new();
    1 B7 O1 U  D2 |8 t
  62.         
    # B8 a9 j" r* a' d2 d$ v
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
    ( {& d8 A2 H8 Z* n  G2 E$ {
  64. 7 E+ j) g) v, G% v2 a
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);2 O- ^% |1 e* g- }0 F( Q9 g7 |! X

  66. * `# L* p$ d2 _( q1 ^
  67.          //创建多个按钮' a; h/ m7 `; `5 L( a
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");
    - Q* h& Y3 b; t& J' D7 u
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    # E2 U/ N3 l* _, t
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");3 b  b( A+ d0 I# J& s' [# u
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");
    : ?: n% b0 B. w3 _( T: C
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");0 ^; T( c% D8 M  V
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");9 [* R) ~7 `: `: ^0 v
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");
    8 ~5 @7 n: v5 u3 T" u7 l
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");; k+ b( x, Q. q. U
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");
    ( Q& }3 V1 u! [& p
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");
    7 ?! \% L; A: o3 O& X6 H
  78. 9 l! V) |# Q3 H# N4 z$ E* k
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");8 C* z4 C% t7 i% [2 g
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");
    - n+ f: t) V8 M) S
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");7 h" B% y! X0 |% p* A8 B+ g
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    , u7 R+ l4 j1 p5 H6 w' z$ S4 Z% a
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");8 N( z+ c3 i6 j. Q
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");, R7 t9 U' o$ ]
  85. ; A. b" _; i/ A9 n: w
  86. ! _! G4 X) j& s; M! U
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);5 H9 S' H# q) A" o7 V2 s
  88. % S5 y4 }8 w% e# P( q  F, Y7 C
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    5 I% b1 d/ [% Y# m, q2 d
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);9 a& X# G+ ?" ^; I
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);8 j( C7 e' l4 v2 v6 x
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);6 Y# ?$ b) e1 ~$ i2 H# a3 Y
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);0 J  U; o" _% A$ w( Y: m
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);" Z$ w1 F' d4 w; Z- y
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    6 d2 G% k) Y1 y1 U; D4 ]
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    7 R  W' e8 X3 S. }1 y% E& D
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    " k. M6 }5 `7 R5 g) p5 n' m
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);( u/ L0 Y* v6 ]0 y
  99. ; D6 ~/ I! K+ n4 i# j
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);& y' N6 {8 A+ [* s$ W; V
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);* U4 W  `) u- @$ B' t. l
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    & W( E4 |3 \# D: k5 E. _+ E* b/ J
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);; d( u1 f$ _2 c: W* Y
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);: U" {% E2 i# P( o' \0 C: N) D
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    $ L$ ^$ p! s  O3 ?
  106. ( `2 Q9 I1 h$ Q  `- L& r
  107.          //注册信号函数,calc()0 o7 m1 y  y- c% m' j4 P) a8 G# F
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);! t2 _8 Q, S* s- B. V2 X, M% A
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);* A( P- N5 H' b' Q
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    / Z, N0 H2 D$ O% Q2 Q. d
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    / }# @! Z2 h/ M' z0 _% F
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    # z9 |$ V% I% {! t
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    ! J4 L! e  o: A5 ?! o0 |6 w
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    & K4 u- i# s) W  W, B# M
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    & |7 z3 |+ _% c+ v/ P# Z& ?
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);! [! D& P5 ^. r; u: ?$ w; J
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    0 {: c% C4 H# ^& s$ I+ P

  118. % K- m" Z6 r( x7 ], W
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);5 f" \5 I8 q) ^. K$ k9 c
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    + |3 E$ G5 ^3 P5 V: R) {7 z
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);8 t: G/ s6 r& p& O, k. ]' q3 K
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);1 i9 P0 [/ r5 U" }( l4 a( d
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);' O& ~* V; n. }. u; x9 }9 s
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);' c" z& U+ t9 i3 b: f# O, q
  125. % a6 S& J7 @2 q8 Z1 L. V  K% K* ^

  126. 8 P. s" F5 i" c* z
  127.          gtk_widget_show_all(window);& H' J- f. U/ ?% Z! _
  128. , V, \/ u4 M. s" p$ @4 @2 G
  129.          //主事件循环
    ( e& M2 S% ^( O% l  \+ }% i5 g
  130.          gtk_main();/ A0 U8 f* @1 a& o+ A0 u+ e2 a8 f4 N
  131. 9 ?0 k5 \2 ~; X' c. l, w5 p) [4 T) m
  132.          return 0;: O& n/ P: I# |# p& c8 G
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
: r- L  Y( C6 `7 ?3 g8 x. W    5.png * A% P; P9 G, S( S
   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。' M$ [- J9 R0 j
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。' E4 n* m" W- w

! Y# C% H4 J* \  `' G* w$ X$ C- w
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 手机版