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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。/ A6 q1 J% B" P. w, t9 ^7 t
     基于Ubuntu18系统,补充安装所需要的库和小工具
. u5 R1 n0 s" j% e      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3    3 S. \* r: H3 Q/ C0 W, B5 ~7 D
  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 `8 D3 ~+ m! e* ]" T! j' P1 N( d6 j2 j
    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
7 v& u1 i( b: p3 e" W4 K+ H( D    1.png
$ O5 i4 o% a  R% E- n3 [+ g/ N4 h  然后就学着官方文档的样子去验证下SDK是否安装成功。
8 L! d7 t" v* t4 J7 C2 G' ]   2.png # [: T5 k" i4 ^' `4 k
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
( C! @  x3 e. X* Q  {* V$ l  首先拷贝官方给的demo程序,基于GTK得hello world。
0 L+ d$ c- r0 [* z' s2 i8 f7 m9 L# I% t
  1. #include <gtk/gtk.h>& l9 W6 R. ?6 U) V2 ?
  2.   r# s$ X2 m9 F, Q+ u1 i
  3. static void% p, S* v- R  y+ Y
  4. print_hello (GtkWidget *widget,' `5 z; j/ t. G- D1 o# h
  5.              gpointer   data); Y  Q/ ^: O8 ]  h( F
  6. {
    # \5 H9 ^3 o. W3 b# H' ?
  7.   g_print ("Hello World\n");2 x  B! f0 w+ s9 z$ q
  8. }
    + j, Q) S7 p$ }9 \8 n
  9. % Y% y. d0 h" k- w8 a" @- f, G
  10. static void
    3 Q7 Z6 O/ J, T. P8 p
  11. activate (GtkApplication *app,
    7 p% J  S4 x" {8 I+ g4 ]
  12.           gpointer        user_data)
    " |9 c; E( X: v* ]+ U
  13. {! ^4 O% }& ~# w) V* O
  14.   GtkWidget *window;
    / I. Q: N+ M! e( v7 ]
  15.   GtkWidget *button;
    $ |: Q$ f4 c% q+ d9 B) \
  16.   GtkWidget *button_box;! e3 S) B& ?* s5 m

  17. 4 ?0 |2 R" h# `( ~9 o4 G. a
  18.   window = gtk_application_window_new (app);
    9 s/ C! I7 A3 @! f, n  K
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
      V* v& J2 m* r% l+ I. E9 z
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    ' L* s! K1 g9 F

  21. 8 _- d5 _2 {& a; i+ }' b
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);" H, V6 D$ J# ]2 o, y$ R
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);; U) _  ^/ [1 a; l: r
  24. 7 Y9 Y# z( r6 {
  25.   button = gtk_button_new_with_label ("Hello World");
    / G/ g& j' {: |( L" e
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    0 V5 Q! m! w, J1 f  w' G
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);0 P1 {; f; }1 k/ A) z3 Q
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);
    - G% A/ O) K0 {0 G+ e* ?
  29. 5 S$ Q# H" O* R' a9 T: F
  30.   gtk_widget_show_all (window);
    / z5 a1 T  V) P2 N
  31. }: \6 p5 J* P$ t
  32. 6 f: c" Z6 N' w
  33. int
    1 G* w# R% U; @
  34. main (int    argc,
    , G& d  L! Z# z  D3 `1 A  s
  35.       char **argv)) Z: ~( t1 l, p8 R7 P) m" U) i, g4 J+ F
  36. {; Q! N$ U" K! Q- n2 d
  37.   GtkApplication *app;
    $ [, j& I( C0 l  E/ v. u  v( `
  38.   int status;: G: E- M) X1 H  f3 W& k

  39. + ]5 @8 f. E/ S4 W2 p
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    4 t+ C- q, ^* ^3 ~0 ^
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    ' \" C2 Q3 [, c' a
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);
    2 J' w7 w1 R( a2 F6 i3 P6 @! N# F5 m
  43.   g_object_unref (app);
    : H4 h8 f- N1 f$ t% r

  44. 0 ?5 G3 Y0 B+ v( Q  v7 G/ T
  45.   return status;  D: a0 o! A! L" u0 x
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world9 V- H6 r/ ?$ l1 V1 b: B) f' U0 ^
  2. SRCS = gtk_hello_world.c/ E1 k8 }' j' a9 [8 |: z0 |# z
  3. ; D  o# l8 b  K. N
  4. CLEANFILES = $(PROG)
    8 u1 j" I# B+ ]

  5. 8 N4 q6 x: q! i/ B8 D; S
  6. # Add / change option in CFLAGS and LDFLAGS1 ]1 ^2 R' @; @# Z
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)" M! {% L  Z- P3 @: b. K6 [( X
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)9 i/ _  D# W  ]: d: r! h8 e" X+ |9 m

  9. 4 q* p- _2 G' J
  10. all: $(PROG)
    ; d% _* Y! M, X2 x  a) l! m) ^$ M

  11. : _% _$ Y0 S4 b+ ^: Z; \. U# [! P
  12. $(PROG): $(SRCS)
    : F2 _' K2 L7 b4 e& p! M+ w* s" [9 i+ T$ a
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    ) t2 t0 `3 J8 g" F
  14. 5 P% i- `# N% p% B# i4 l% ^
  15. clean:( K- S) _7 B  {0 C7 d% ]# ^
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。3 _4 a/ r8 U1 y% I
   4.png % T( A- \* [0 \! z% E
  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。3 l7 O+ Q0 O& ]6 x! u% d. r

3 s* \- v9 ?7 d0 p& J' m5 `
  1. #include <gtk/gtk.h>
    $ v& |6 ]3 X* a; [1 w. [) v1 e; H2 O
  2. #include <stdio.h>
    3 }. G2 ~# I! _' ]+ \& g
  3. #include <string.h># U  }8 X. C5 ]  K' N; M$ Q
  4. 9 @  ~, G  `- d$ I9 R
  5. char buf[50] = "";; ?% O+ P8 Y+ X" B  D

  6. 9 c8 x0 j# o7 ^) g
  7. void calc(GtkButton *button, gpointer data)6 j% @7 e' `, L; h) e
  8. {
    ! [+ b3 i& O7 S' _# T: \0 E  r* _. |
  9.         const char *text = gtk_button_get_label(button);0 W( Z" A  J2 w5 }/ q

  10. - G! g- X9 _7 j7 t; W, I  {  L1 D
  11.         //退个操作( ~9 E2 n5 g; Y: ~0 D
  12.         if (0 == strcmp(text, "c")) ( v/ i& v. i! Y6 j/ t5 z1 R, X7 w
  13.         {' Z+ Q  ]6 b& D# N+ b" p9 q
  14.                         buf[strlen(buf) - 1] = 0;$ I9 _9 ?6 F7 A2 M8 W9 ~  v
  15.         }else{
    6 ~, z" K/ C7 D/ j: @
  16.                 0 f9 ?0 c# O' q6 b
  17.                 int a = 0, b = 0;
    ' T- P1 `) t! N. w2 ~1 E1 F
  18.                 char c;. Q, T4 Q# O; f) g: t) i0 K- O
  19.                 strcat(buf,text);
    " h4 j. e1 u  G! A5 o$ p
  20. : p) U6 l2 v2 @2 U, k
  21.                 if (0 == strcmp("=", text)) {# I" D. P. `9 {% v" }" n3 U8 `" G
  22.                         ) x. ^4 P6 f- u* l! T$ E
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);' E% i6 {: v' F$ f; R9 q2 T
  24. * ]' n2 d& j7 \6 o+ p6 b1 H
  25.                         if ('+' == c) {+ W' x1 Y% A6 W+ Q; x
  26.                                         sprintf(buf,"%d", a+b);& P' Y! b8 [9 ]
  27.                         }
    $ k8 s# n/ h% ^0 J2 \7 a: z
  28.                         else if ('-' == c) {
    0 J& j" ^8 g- s/ l9 {: Q
  29.                                         sprintf(buf, "%d", a-b);
    : r4 K" }+ R5 S6 ^
  30.                         }4 y! d5 ~* F( z; O! D
  31.                         else if ('*' == c) {
    . G- y) l' ?, N0 ?& M
  32.                                         sprintf(buf, "%d", a*b);- P, S. D) c& }0 U" ~& r: l* y
  33.                         }1 ~6 Y0 s$ J% B0 L" ?
  34.                         else if ('/' == c) {" G0 M2 j' ?  w5 e4 U/ }; F
  35.                                         sprintf(buf, "%d", a/b);* i/ F( q6 m4 P% s" y
  36.                         }
    - A. W: o" e% i# A+ c/ I
  37. % ~& P1 A! Z# r. j9 S
  38.                 }
    1 e9 c9 B, X7 M1 `  P5 G$ g
  39.         }5 y0 ^  K* C4 Z4 F: n) J
  40. - j: g  _6 L. T
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);2 z1 P( J, b& s* P+ t- M3 P9 y, B

  42. ) \7 X/ l3 B- \' z  w
  43.         return;
    3 T( R9 p& L1 l
  44. }; Q8 T* d4 t: Q( K- W

  45. & |2 J5 C( Y# X- j9 `
  46. int main(int argc,char *argv[])2 a. q& n0 C3 c# r# g+ ~. T0 d! S
  47. {+ F) T1 X" D# {
  48. % S, G5 J9 t2 H! y7 B
  49.          gtk_init(&argc, &argv);
    . U! Q0 i4 R; a* y9 j' L

  50. ' s1 x- J* F$ Q
  51. . {2 I7 L9 z; a& k
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    ' Q/ J. C3 _& H8 a; @; b: [
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");& U+ }( @( M  ~1 k4 \
  54.   
    8 ~2 G9 F: a2 A# K% m' p7 F1 F
  55.          //创建一个表格容器5行4列
    % d$ a$ m# [, g, g
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);2 T: V# b. F0 v) d! _
  57. 2 Q% {9 A0 ]' ^) G. x
  58.          gtk_container_add(GTK_CONTAINER(window), table);
    ! T& H+ d! V4 P4 c4 E; @
  59. , M# t5 }* q. w: G/ _4 Y$ y
  60.          //创建一个行编辑
    ; e  z" Z& T" z: Q
  61.          GtkWidget *entry = gtk_entry_new();
    4 v7 ]  R/ m8 V2 N* V' T2 z
  62.         % A& i5 _4 ]# V/ Z1 u& l) F1 U
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
    4 k, }- H7 V3 e5 r5 G0 f: J
  64. 8 X9 }: B6 Y, z7 r: E$ I5 k, Y
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    , D& c6 W: O1 v3 r

  66.   m& _6 Y4 t+ v' i/ q
  67.          //创建多个按钮
    0 f- n4 E! p) G3 p2 @
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");
    " l* _* E/ Y+ u+ ?$ [
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");; a- N) z2 X6 |+ E& l4 \) D
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");( m! h9 @5 ^* s$ W& T
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");) J/ P0 L" ^6 N$ T7 D# A
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");3 Q9 |$ u% ~1 b, T
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");8 k* Y: g; @& m% c
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");8 d. x3 E8 T. F4 s' _
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");
    2 \8 g: Z: G) y6 z/ V6 a
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");
    5 r# |8 b* J( m7 F
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");
    6 P) ]& e( Y( `  F
  78. 8 i( |4 o! P3 i/ V* |% ~4 H. w
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");
    ) s  A- {6 C! h; W: u/ u
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");
    " X% U! @* U# @; M$ B/ |  q6 {3 j
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");
    . P9 ]; r0 f6 ?
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    8 t) s) U8 p: f/ {1 N
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");; l. V" z, K) q; e% g
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");0 ~/ y' a; b  H6 j) \
  85. 0 V7 \- [3 O6 g  s, r

  86. ) S& B  J) d, f" k5 ^# e0 u
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    9 R& ^% p9 E) g+ j4 o3 ^
  88. 4 }3 Q- y/ T* R' E- W1 p) J* ]
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    + H/ M' }6 s. Y2 Y( c7 i
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    , m2 V4 u0 a" n
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    ' ^& A. w3 z  K6 \
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);" r% j) \. C% Y/ z
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
      N. P% Q& J& g6 Y
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    6 c+ _: ~) K, S* q
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);# q3 u& O$ S8 S& I/ N+ U- ]8 o$ n
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    6 s( p2 X2 M( E
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);) N: B( t% d* G
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
    % F4 S8 p/ c- |1 ^% O( n/ ~/ O7 |5 ^, _
  99. 6 e% [3 Z3 Y) p, O& {2 z' T7 @. j+ c9 f
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);! g& v  ]. t. H. ?- T2 b" ~' T
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    & I# C# X* ~" F- h# T* Y6 E
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);4 y$ I& r7 _0 E% \
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);  X6 O; ~: n7 \- @6 d0 \5 h; y
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);- U0 d+ d) G: N& L6 V, g  u
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);+ i3 h0 ^' P5 m5 e' M1 d2 F
  106. : w8 d  {% y5 F" J1 O
  107.          //注册信号函数,calc()
    : Q% u. h7 @" f6 j1 i1 q3 d: O- x( J
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    % V, Y- o5 E# @
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);, W8 }' w0 q  D, C7 ?# E
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    / c, {! n. R0 L" Z5 D7 m& k
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);- n8 l- w" w2 c& Q, E
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    , W" Y2 b# b1 |9 M, B
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    6 r$ W* T7 C* Z1 @, r- a2 \
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    2 O% R. ~$ U' d' b. k$ t" q
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);  m/ l3 j  a9 l! M  ?% ]( [5 B
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);5 A8 [2 r1 ?+ C, H, a
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);+ W8 j: u2 B- u, o
  118. 3 U# {7 p# w8 N! ?
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    # {4 ]: h) r0 y* d0 j& m
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    0 d$ Y% U+ j/ J* B  @9 Z% o( b  c6 g1 ]
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);4 A$ z3 z! `& O' B" v
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);' z- [' [1 ?  A! R3 G, A
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);1 p5 \0 _0 j' M
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    / n$ u; I4 x7 G% |4 ~. I/ @
  125. ) h/ Y* p( L3 e7 D1 P) Z% t

  126. 0 `  y* [9 @/ O
  127.          gtk_widget_show_all(window);) P7 o# L/ Z1 p6 K* y( q; I5 D

  128. ' T4 E' w8 t! h$ O3 V
  129.          //主事件循环
    $ @4 a9 X9 p& }. W* T
  130.          gtk_main();/ k- y. M+ G% }0 b/ n

  131. 0 J, h; O; n7 \9 v& Z
  132.          return 0;9 j& W" D/ Z- J5 L( n) p9 r' ~- G
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  ) m, `4 |7 d) N! y
    5.png : W: T+ ?8 F- o' D
   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。6 G4 \5 X7 ^7 M( @0 h: h
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
- W# M# s$ ?7 u; D; P; l, f9 R( g* C0 U1 e2 h8 W' b) a$ G: \
赞 1 收藏 评论1 发布时间:2023-12-1 14:42

举报

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

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

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版