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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。! ^1 b8 f( V6 _7 @% K% u
     基于Ubuntu18系统,补充安装所需要的库和小工具
: i" G! a6 N  j& [- s6 O  o      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3   
+ S* {$ A6 y3 H
  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-software7 L4 a# V7 _: a6 {& ]3 Q8 x6 l  l
    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。8 _* Z" l, ~. m" P+ P! ^
    1.png . h3 @7 h: J; b/ @
  然后就学着官方文档的样子去验证下SDK是否安装成功。
' `6 Q3 `; w$ A$ g0 q   2.png   C7 w9 w7 P- g' k
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。% z/ L6 s4 e3 ]; n. k4 _
  首先拷贝官方给的demo程序,基于GTK得hello world。
* \1 [; g& W* o% Y- w+ A2 V/ ^# h. b& D
  1. #include <gtk/gtk.h>
    " L# R( h4 a) O: c9 ]- S

  2. 2 ~  [. u9 r. Q+ N/ e- R
  3. static void
    # @- f$ H, X" w  S+ ~8 d& Q; U- F8 |
  4. print_hello (GtkWidget *widget,8 H. L8 m2 B. H8 r& Z
  5.              gpointer   data)
    8 A* o7 i: A  s) E# t+ f1 c* G& O) t" J
  6. {
    ) C" ?; U/ e; o$ p
  7.   g_print ("Hello World\n");
      t) [9 N  e7 R, o
  8. }
    ' B1 L3 r+ u2 Z) h8 m
  9. 6 B3 U. r/ U. X5 l/ n
  10. static void
    " H+ Z- k9 R5 e, B0 f8 K2 |
  11. activate (GtkApplication *app,' O1 E' T( V, [1 U+ S
  12.           gpointer        user_data)
      R# o0 ~  O) z5 L# X( z
  13. {& }/ _9 W4 z4 T: W( k, G! y- ]
  14.   GtkWidget *window;
    . z+ d/ Z. k( d8 a+ R
  15.   GtkWidget *button;: H. h6 K, J' }& w- V) O
  16.   GtkWidget *button_box;6 n; j) O6 A: ^+ M, O8 }
  17. ) D$ B( Y" H& H
  18.   window = gtk_application_window_new (app);
    , B, w  C0 e7 ?* [! B, C
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    ' F; N$ d% Z0 r) X/ a
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);: q6 N( c) D" v6 v( L9 j

  21. ) D8 b$ @2 ]- K# ~  [
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    & P8 |" y  B5 P6 I, I( ~/ \, B
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);
    4 X1 O0 B$ r  O+ c3 D1 r

  24.   Q: l" ^! Y& m; G% P
  25.   button = gtk_button_new_with_label ("Hello World");) x+ M5 n  c7 p( G
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    1 Y2 j7 H; v- b: E
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    3 e; \$ k* `$ T5 O, J
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);. b/ H% Y$ X7 _$ t, L) }
  29. 8 o/ f$ a- E3 {# e! G+ `8 F
  30.   gtk_widget_show_all (window);
    $ f  D$ ?- D6 g  b  V0 O
  31. }2 u+ g( W5 U. i) L$ z* Y/ i
  32. : e0 K: P1 ^  l  k/ J
  33. int
    ' a  E/ C3 O* I2 s  d
  34. main (int    argc,
    ; x6 `2 R( S3 d4 f. k7 g8 ~5 t
  35.       char **argv)
    + G8 e  C. l' T8 g1 P5 n* W
  36. {
    6 M! Y! T- P4 f  L* s6 X2 s
  37.   GtkApplication *app;# A1 s( [: W0 V9 i* V) U, S
  38.   int status;8 x0 ]. H; M! H% W$ B: ]( M

  39. 4 F% S% h7 D* k( N3 I1 c* b& I
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    2 d. P7 V, a: S" Y# _- m& s1 M
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);0 P9 `4 [( J: S8 [( q
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);
    * i) @* j% Q$ }! A; `8 C
  43.   g_object_unref (app);" v9 l9 ]3 z/ j4 h/ j, [

  44. # z4 t3 t" w  S' x% X+ N
  45.   return status;# C2 H" @3 W/ a+ E+ N
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world& o* A! r: D/ i# S  N: v7 W5 o
  2. SRCS = gtk_hello_world.c' q. @; A* O# T9 C6 [* W# ?. o8 [- @

  3. 6 }* {, L' I  a1 V0 a
  4. CLEANFILES = $(PROG)
    : |9 B& ]5 H# @7 A

  5. / `2 u* U4 m, b) f% Y# {* J2 x
  6. # Add / change option in CFLAGS and LDFLAGS) |: V/ R& m2 @5 Q
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)% y/ \7 u) t7 W8 U0 x
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    ; v  `* u; V( y. X8 n# I1 E$ I
  9. 1 M0 U# w) K1 }! m) [
  10. all: $(PROG)
    2 _$ W, x6 h5 p8 o) r5 \5 T$ y7 ^1 E
  11. 9 P( W" O0 }+ [% d4 {# D
  12. $(PROG): $(SRCS)
    1 u# b6 i: r0 N! q) P2 S" C
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)9 g0 [. f% A) s( A

  14. / P; B/ X4 J9 _: }0 C( ^+ W  }3 D! R% r
  15. clean:9 v* H9 k: r$ }+ f# x  Y. c& w
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。" C5 X+ g8 b: Z, T/ K
   4.png
* r) T: k; F1 u8 h9 T" E; Z3 P$ ]  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
, H( i# t% Y0 ]% }, x
. m& n# F* C* a+ z9 r$ t* ?
  1. #include <gtk/gtk.h>& \, `% r0 ?3 E2 S  O% G/ Y$ i
  2. #include <stdio.h>, `- B5 x+ ?' b' Q6 p
  3. #include <string.h>5 M- e$ C- o+ z7 u' L( C  Q
  4. 4 n$ G4 j( @& J& \7 P
  5. char buf[50] = "";6 F3 x; L- T9 N( @' b) J0 P
  6. 4 q* ^" _& |  h& W  N
  7. void calc(GtkButton *button, gpointer data)
    / ?/ K1 ^* \& `6 y& d. k
  8. {
    0 ^, N; Y" f! m- D
  9.         const char *text = gtk_button_get_label(button);1 @8 o7 \2 V6 W- P: B
  10. 3 w& S& {. I0 v/ Y6 }7 V
  11.         //退个操作3 V; U$ ~7 W' D, S
  12.         if (0 == strcmp(text, "c"))
    7 H* `( \' w8 Z6 E3 Z! }
  13.         {# }9 O  @) i1 ~0 m# `6 Z
  14.                         buf[strlen(buf) - 1] = 0;
    ! ~0 P0 i6 w, L5 A. ]+ H# p
  15.         }else{' V1 `) u( y4 W0 x5 f+ C) w
  16.                 ! i& |& M2 F' A6 L% Z2 C
  17.                 int a = 0, b = 0;
    ; {4 Z" N9 |) ^' x" a5 n+ Q
  18.                 char c;
    . ^, H" O9 s& [, x, X- i, c% @
  19.                 strcat(buf,text);7 T6 [0 J- x0 w5 w+ ~, g
  20. 8 a' c9 R; V5 J5 u5 U
  21.                 if (0 == strcmp("=", text)) {7 w, [0 D, [" n9 [/ B* B1 s" `
  22.                         2 @2 o7 d9 K5 p1 ?7 b
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);
    9 J9 s( A5 q) ^8 i% u9 V* C7 U
  24. / G3 A  S% j1 C) g; v0 S& \
  25.                         if ('+' == c) {1 W5 [; P- _' P* P: b5 y, G( f
  26.                                         sprintf(buf,"%d", a+b);' K! a; [3 D8 {& m
  27.                         }) ^$ r! K; v! G! I) M' f
  28.                         else if ('-' == c) {8 {& [( O5 k# n+ s, i
  29.                                         sprintf(buf, "%d", a-b);* O% ~, ]1 b' R. j
  30.                         }
    5 I' c! W+ M9 y" V2 y
  31.                         else if ('*' == c) {' z+ u1 M8 [4 ?$ j
  32.                                         sprintf(buf, "%d", a*b);% v7 ]7 E2 K- T) U
  33.                         }
    ! W1 D" ^( P& {& j2 ?5 c% K4 M7 F
  34.                         else if ('/' == c) {7 R& \8 P* N" w- b1 d
  35.                                         sprintf(buf, "%d", a/b);  B! n* m1 o- t& C5 ]) G' M
  36.                         }: s& J! ^# u3 i
  37. $ P" S4 n; P& ~' Q7 E5 D
  38.                 }3 ]$ u$ m' c$ t- r
  39.         }. W* N- v! k- _6 W$ Q

  40. 4 G  r3 L( h6 s. e
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);
    ' D" a8 f  `" l5 t+ `. x7 `- }) m

  42. 7 R' p6 V/ T1 T
  43.         return;- t% e6 K- G6 B" {) L& V8 B3 B( r
  44. }
    0 C; \) m" g7 [, U3 U
  45. 1 U% `; ]  M. r- l  `2 ]9 I
  46. int main(int argc,char *argv[])# T5 z1 G, K! v
  47. {
    0 G* @+ `, C; p: P# f

  48. + y$ n; U9 l# }) }1 ?
  49.          gtk_init(&argc, &argv);
    - i* y& h% J: ]+ k  g4 `

  50.   t+ Y1 z6 U2 @

  51. # N. t: b9 ]+ o
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);1 i/ N8 I# ?" c0 Q" a
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");9 R' I: T  a) k5 U$ ?0 Z$ W, j+ @
  54.   
    2 B0 z3 I- o4 G: ~
  55.          //创建一个表格容器5行4列$ M2 h5 @  f  m. I0 D
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);3 R" M9 A6 ^3 b  C" k5 I6 g0 I4 `. j
  57. . z! _- K* q& I" ?4 _
  58.          gtk_container_add(GTK_CONTAINER(window), table);
    ( H' R6 p1 c# P) Q8 {2 p1 z

  59. 4 j, t3 J8 y. e3 d6 V2 i
  60.          //创建一个行编辑% S1 e5 K. Y: b& d
  61.          GtkWidget *entry = gtk_entry_new();% [6 ~; ~) V4 {3 [( w. s' c
  62.         - s4 X7 R& b5 j2 b2 Y, t
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
      I, S6 p1 ]) e% X- Y) S. \0 H% F

  64. ' Y; e3 D' z7 ?) L/ D1 {- _) a1 A
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    ' o" K3 e9 P  ^; S8 ?

  66. ' [  v0 a, l. R9 S1 W# v$ I" @. Y" I
  67.          //创建多个按钮" z3 z8 _7 ?; t) N
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");
    , m7 Y8 k6 h! ^3 V, X2 }* T
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    * U. G0 L4 n- F! f  A: h
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");/ h$ d$ p# B& m; h) A0 p
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");
    4 G- s8 d5 z% x! T- f9 V6 [
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");1 S2 m* ^' ~$ j$ u
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");
    % P5 B- [& N% x' ^# S* x9 u
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");
    $ M9 n5 W+ D5 {0 i4 P7 z
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");) J- ]3 k" Z' {; y2 B  O$ S9 s/ m
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");2 [. `8 r6 L8 B6 `
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");2 A) k8 X9 d/ y+ S8 T
  78. 8 b6 A% g* c( Y" y& f' x
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");, f, R( t2 W) P/ q7 c
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");+ J: h7 b2 q5 M" p
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");/ r+ i3 O# l0 G8 w  y5 r
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");6 K: j8 z& n4 C" \7 N
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");, W4 r7 K5 i: {8 c8 S
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");* I' l2 {" [/ A: ~: m0 s
  85. 0 ?5 X. v5 O# E" ]/ p
  86. 4 B) e/ e; t+ b  a6 R
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    # u2 i) K. Y# H& D* I

  88. 9 s7 e' Q/ p" I* t) V& L! k: {
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);- {0 g& c. T4 t. P0 O) C
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    % [* U8 E" G9 \" D7 \
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);* K8 A% n: j+ g3 [, |+ N
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);1 L& R/ T  Q5 U: u0 s1 c
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);/ E/ V% e0 m+ C
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);0 F) s: R3 B5 Z6 m! C1 G
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);& t  G- |4 x- m7 G7 _" `
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);6 Y! A6 T- j5 ]3 n$ M
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);6 `  b' u  f+ h# j
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);2 i! C/ |. w6 q( R, v7 g
  99. 8 D2 z9 r) o3 `+ E+ O
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);) ]' L9 J. m% ~5 v$ g9 \
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    4 W9 l4 U+ h( i& Q/ ^) E' [6 V
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);' s- E+ s4 ?6 ?1 f
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    ' Y. {4 j; m) o/ p( P  b! d
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);+ d* n' s& x: r; S8 A# t
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);4 ?- T4 w! j6 [2 E

  106. ' Z" o' j3 J( _  M  n
  107.          //注册信号函数,calc()+ z5 N% S0 Z# H. X% M
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    ! ^) r) F6 H7 e5 ~) e7 `. P
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);$ Z/ n2 W& O5 k  A/ D+ B
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    ; T" a  K& y2 o5 y
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    6 f$ v+ y7 P3 n4 v* p
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    , y( j. C2 L& ?/ {; u4 }5 n
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);" A) H6 w5 P- ?3 F. k
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);0 G( ^% j; @# D4 H0 K: V
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    8 v: t% c& y6 `  Q0 [! V# }
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);! s% w4 ~# s- x5 n/ X( S
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    ( M  N! K/ d# a# C; ]

  118. ) d6 C) H( i3 p% j4 V, ~
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);. b5 \9 r9 x& ^, p. c( d' @% J
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);2 A/ C0 C% ?5 F
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    3 Z! `* n8 J) e
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    5 C: g& r. r/ p, @8 }; \! v( k& s  |
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);1 p3 `3 y7 p+ n! |0 G6 I8 `
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    ! B  C& h5 Q+ N4 w$ G

  125. " k1 G) j4 w9 X  k

  126. $ M4 N* G/ x6 J3 G- ?0 ?8 D
  127.          gtk_widget_show_all(window);* [2 Q  w( H+ I+ t) z  l: f
  128. 0 b# C; L$ H9 g/ X+ b
  129.          //主事件循环6 s2 g( Y( m- I$ l$ g; K
  130.          gtk_main();0 W% t2 ?, v; w) o$ d0 I
  131. : ~# }$ m4 k$ H' C; @9 |7 s3 L
  132.          return 0;
    " P3 J2 e3 ]0 Q5 @0 Y( N
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
& n' P' J5 E* G$ }5 I( \) d: ]    5.png
2 ]( H9 K3 n2 U, B9 |+ @; T! k   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
- K3 R( J% J6 t4 }* P   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。5 y3 E" j; {' W( Z/ q/ Z3 d9 ~
6 U# W0 a% V" I9 P, e) ~
1 收藏 评论1 发布时间:2023-12-1 14:42

举报

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

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

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版