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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
# l9 c# n( ?) [6 {     基于Ubuntu18系统,补充安装所需要的库和小工具
' |8 y, U# x1 N. I7 L. q; d      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3   
2 [& v8 q0 y' O+ z; [$ H# o" Z  ?
  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
' j4 `1 ?+ [& x4 G& a- `    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。+ Q: P" P5 G% J
    1.png - N+ \4 ?- o; ~" t3 H' j8 G
  然后就学着官方文档的样子去验证下SDK是否安装成功。
# @- l( m. J8 h: t. j   2.png
1 I# N' Q6 K  ], P0 w" d6 L  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
5 l5 K# ]# g8 M$ W9 i6 M  首先拷贝官方给的demo程序,基于GTK得hello world。  h" r4 D) @* h2 x9 O- h5 x' v

1 i( e$ L4 t; H4 T! O, L. z! n: x
  1. #include <gtk/gtk.h>
    / J1 i8 y) }# L- r* G: S. F
  2. ) Y: c& _0 `% J9 U- O* @8 k* P8 l
  3. static void
    ' y! d8 [1 w! F7 f9 R
  4. print_hello (GtkWidget *widget,
    - P9 e5 S  k( o5 j9 {
  5.              gpointer   data)
    1 ]; h& ]/ B0 a# d
  6. {) _2 U2 `- n8 w- P0 ^' E. |( b
  7.   g_print ("Hello World\n");
    ! }) Q/ T: T" t9 y* `" W& n# S
  8. }
    1 R/ w- H. `, P3 w( U
  9. ( P0 [: a) n5 m# ^( i# k& q
  10. static void
    3 a, M6 G6 l5 o, Q; b3 U
  11. activate (GtkApplication *app,
    % C# C8 ~* P$ C# ^$ {. _) O% B- c
  12.           gpointer        user_data): p% w( y8 }! R6 {' H
  13. {
    4 s3 _5 y9 e8 {7 @: G$ ^
  14.   GtkWidget *window;
    9 I! Z0 s1 @; o5 g3 ]6 X
  15.   GtkWidget *button;
    9 @4 V! a( S- _
  16.   GtkWidget *button_box;
    " W6 b# y! g( W6 |  L$ m+ w

  17. % t1 V4 O8 ~" q1 S" q3 f
  18.   window = gtk_application_window_new (app);8 R: G  ?1 U. K
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    " H4 [: ~" E+ ?4 n7 p
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);8 g1 N  {, y* o
  21. / S  _7 c) r3 G# u6 T
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    ) w" }' F5 i1 F
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);7 Z/ n( j2 J8 f) @% M

  24. 2 ^/ j; t, y+ w) c
  25.   button = gtk_button_new_with_label ("Hello World");
      [: o2 ?. o# ~, M- G; C, u
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);4 R" x; s* U0 v- E+ k
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);) f+ X" Z) f, O) ?0 O4 U5 m" `; Q' Z
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);
    & N$ ]9 H* ^& h% B) P

  29. 2 R& @4 S, B0 b& G9 f
  30.   gtk_widget_show_all (window);
    ( G/ O" [* ]+ O
  31. }
      `& Z2 F% y: [9 D. N7 d

  32. : e6 A2 r1 M' G* c2 A- H  t
  33. int, N: ]: O! p; H1 N+ Z
  34. main (int    argc,3 [8 n+ M! C- c) e8 j. K* t
  35.       char **argv)/ y* G: o$ n; r& a, }/ T" ]' a
  36. {; \+ }& f& R8 y( z, T2 I
  37.   GtkApplication *app;5 }6 y" v( c% ~# g
  38.   int status;! l- f* H# v8 [' H! k
  39. 8 R7 F* [+ Q! O9 ~- B6 w7 i
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);1 ^- j; Y8 ~" E; t& i# t: j
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    7 ^) p4 E& t/ ?' c7 x: [
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);+ z8 F0 L: @  U* J2 M0 D
  43.   g_object_unref (app);4 G* M+ X; z5 [6 r3 l* w* ]& s2 o
  44. / f4 B) Y2 P$ g- q4 h( q& a+ X* e
  45.   return status;% E4 g/ L6 \0 f
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world
    " V$ \4 L6 G/ ]4 |$ L
  2. SRCS = gtk_hello_world.c9 }1 e6 B8 m- t# d; k# U
  3. ; q* @0 J" d  j1 a3 i. h2 e* `
  4. CLEANFILES = $(PROG)7 C& _1 G+ b$ v6 P( M2 t! ?$ e

  5. 8 m8 F+ s$ m% l  t% L5 h+ J
  6. # Add / change option in CFLAGS and LDFLAGS+ G9 m8 B0 d, T) @& r
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)9 t0 O- t6 I3 l9 Y: `' w' V
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0). L' c0 L* m% i* P
  9. + p. V! w3 a3 d7 u2 i
  10. all: $(PROG)
    # s: a& n# p6 o; u6 t& [

  11. + p7 a5 A& @- e9 l* S$ E1 M+ C9 H
  12. $(PROG): $(SRCS)
    $ a9 R6 L! }' x
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)5 c- g% n8 Z( `$ e  Q1 s9 j
  14. + a6 y) Q* z8 |/ D/ w' D0 G6 E
  15. clean:5 @/ Y, n% J* s. R3 t
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
4 |, V! Q$ t% j8 j   4.png
! s" H3 S3 Q5 L" y8 w  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
3 j  q+ l  t( e2 V+ L4 f( _/ @- m+ C9 n4 U2 `/ ?. x# y& y
  1. #include <gtk/gtk.h>
    / k2 H+ r: o" o' _2 _# M) Y, p0 Z
  2. #include <stdio.h>. c& V3 ~3 l2 P# h/ N
  3. #include <string.h>
    2 [! [+ T2 K' H  w9 C
  4. + C; e, s% f) \: K+ R/ C
  5. char buf[50] = "";
    ! a3 _- [8 s) f$ ~3 a+ W+ t; p

  6.   x% K  z# d$ L5 J* O
  7. void calc(GtkButton *button, gpointer data)
    $ S! H" e! U6 C5 R# H% r2 b
  8. {
    % k2 m8 m2 N# \: Z- Q8 j
  9.         const char *text = gtk_button_get_label(button);
    ; d  J$ {6 C5 e- o; p- C$ x: k
  10. 5 @3 {3 D; k3 R* [* j! n
  11.         //退个操作; |3 ]; ?4 [6 F6 W2 h; ?
  12.         if (0 == strcmp(text, "c"))
    ) l! `* J7 `+ ^( T( W2 n) v
  13.         {" O" ?. I, b+ U( Z) B. U7 R1 |
  14.                         buf[strlen(buf) - 1] = 0;
    $ G7 a. a* X: X; X
  15.         }else{) r* Y% R2 L7 t* W1 k+ e
  16.                 1 z! d4 E3 t. h+ ]6 K
  17.                 int a = 0, b = 0;  r/ u+ J% f1 `/ G: M0 G
  18.                 char c;' B( [# E! l* B8 p
  19.                 strcat(buf,text);  u, W+ l  ]  T5 L- l! K: J

  20. 2 i8 k# ?6 y& h4 L
  21.                 if (0 == strcmp("=", text)) {
    ; |! [- P7 B7 f/ n* I( O) }
  22.                         1 }5 C6 X; A9 c, L- C  u; R
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);1 h* H) A& _3 \8 Q& o8 T+ u
  24. 5 N- f& ~: V3 W& @5 K( l7 Q
  25.                         if ('+' == c) {: P. s8 Y' D5 ]/ n
  26.                                         sprintf(buf,"%d", a+b);' A. R; T+ j  _: m" }/ ?; W
  27.                         }* e: p# Z1 g& {( ?
  28.                         else if ('-' == c) {
    4 O  ^0 |) d2 n1 l& F7 R
  29.                                         sprintf(buf, "%d", a-b);, U; [+ H/ l; u8 ?4 n2 d2 o( t4 C- X: \
  30.                         }
    9 K1 P) H& [3 ~# F
  31.                         else if ('*' == c) {
    , h) v6 f7 H" f* e* f/ ?
  32.                                         sprintf(buf, "%d", a*b);
    ! [& i8 v6 q/ k! P$ i# y9 K
  33.                         }
    8 N% T5 Q% `$ J7 {2 k6 z
  34.                         else if ('/' == c) {6 k" C9 _$ D4 T
  35.                                         sprintf(buf, "%d", a/b);! W. @' f5 J1 O+ Y
  36.                         }+ B* Y/ o7 U' P8 ?1 y; r9 t' J
  37. - z, h* r/ ~6 D$ y; h$ ?: H
  38.                 }& M3 z) L) H; b' H
  39.         }
    2 W( R4 L5 l) h" ?
  40. 2 p, m8 C1 d6 K$ g3 K
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);. z2 y! |' P& r) F0 |4 b/ M

  42. 6 B( I6 @; [2 v2 O) Y: D- G
  43.         return;
    - U1 D) X. ~$ J; t
  44. }
    7 F; o# V$ P9 Z' T% c) [

  45. 1 P4 M0 Y, r7 k: i$ k9 v4 ~. V
  46. int main(int argc,char *argv[])
    * p. p% q# T' u" u5 Y& ]
  47. {
    / D: @/ r+ Q" D5 W( I% k0 }

  48. ! T) x2 L& I9 g
  49.          gtk_init(&argc, &argv);
    ) Z" ^. P; F4 C. t+ _2 o+ S
  50. 2 O. G/ y, _6 u7 c" g
  51. ( e" Q% Q0 H3 @% ?4 h' P
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    " b9 p2 u5 s1 v
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");
    4 d/ {; i( _# l* K4 U
  54.   
    4 n1 ?& T1 x' ]0 a( C
  55.          //创建一个表格容器5行4列4 L  f, F0 Q( X' G* T: l8 v2 C
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);# d5 ?, p- B# \. L! ]

  57. 0 A% m: J, O% I& |2 c
  58.          gtk_container_add(GTK_CONTAINER(window), table);
    " P. N& B2 I: a( C- ~' _  o9 ^
  59.   f+ c) H, H% Q5 x3 d  L. x- {6 R
  60.          //创建一个行编辑) N5 S6 j  O; ]7 o* r
  61.          GtkWidget *entry = gtk_entry_new();
    2 C  z  v' [. u6 r3 J3 F
  62.         
    - J# u8 a% \  F/ p
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
    1 C: L1 w1 r' v" ^# S3 K& q8 O$ p% e
  64. % q8 B" k* r1 M/ i
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    . [: n7 W+ e+ V, [& ]& F1 l

  66.   m: [" n! q4 ]- r
  67.          //创建多个按钮6 {0 \  Q! [2 Q- Q2 l
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");
    2 e) U; ]) k0 L0 ?+ G
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");% J- N, T! d: M' Y) d
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");
    : f; Z5 ]( x. ~7 a  s
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");1 G: Z+ D4 U  u: t6 J% U3 b; A& f) K
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");
    8 `2 e; `# S, L
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");
    + o. H' T. c3 m- i/ W) ^* E
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");
    - I, r3 w' U  f! J/ U* W
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");
    % {4 Q. X6 A6 Q9 F
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");  N6 H$ e$ d1 {9 o) [" U: B
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");
    " I% X$ N, ^5 k2 F1 T$ u" j1 |
  78. 6 j+ A7 E) Y& [3 P; p2 o+ |  [3 A) X
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");% D" K8 b  |  M2 Q
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");
    ! O$ }3 P- w, m4 e9 ]
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");
    ( ], H/ o$ M8 `2 |) |6 ]
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    ! v& Z* C; c; P) a
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");
    , a+ y: A. n  |, |9 H3 G8 }
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");$ j& W! A" X4 S! k$ F
  85. : R9 E9 l$ J9 i, Y  X
  86. ' P, z# a1 G8 W; e
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);" n5 f  ^( O+ W
  88. 1 w& U( B0 c% ~9 B$ Z
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
      q6 L3 u. i2 A% T+ ^6 }5 K( i  F
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);7 G  \  J2 ^# U8 k6 a8 N& w
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
      v; ]) y8 _* @7 ^
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    # Y7 j, N' Z! u. n. d
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);) C( b& i* e8 s
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    1 g3 X, {  S! E; }3 p3 W8 f
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    . K! A; b$ B+ O( U: P4 A) S$ N
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    , E2 d" U/ _) q+ h8 M
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    ( u: w" m+ i8 e% m9 g
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);5 R1 P$ u4 \( e1 f
  99. ! y7 V+ @) o( D' ^% x6 P
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    4 B! Q, x# p, S
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);( @, ?4 M0 \$ J: j+ G+ ~4 n- M
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    % _1 a% u5 \# Q
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    + e. I: G- n+ C, y" T+ e3 m5 J
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    6 r0 |. r& Y$ E  H+ j
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);( I& u; X# v8 E4 Q1 g+ S7 w
  106. + Y2 @2 Z: e+ F8 T# H. ~! ?
  107.          //注册信号函数,calc()% K9 l- ~9 d# n3 m5 f9 M# e- m* q
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);& k' a7 b4 V# {' U/ u
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);- [8 j% {, u1 H; g
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    8 G' t) [- h3 Q) B7 \5 C! R
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);) s# ~7 s3 I2 F/ r
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);+ s( [0 A9 h( H1 P4 h
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);- V7 ]+ |7 g3 s0 P1 E/ _9 D6 _
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    ; Z8 D! |. k' |/ k
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);% ^" s- I, b+ W+ O
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);+ i7 j% Z6 H7 P1 `2 }7 O
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);3 X& ^7 ^' A# b: h  [/ R

  118. + Y0 Z" D# n1 G: B* L
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);: d+ ~# k6 b" F$ P( C( b, W
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);; k: F5 F. b2 c& P* O9 b
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    ( r: k; E3 w5 U* H& }5 D
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);) ~: P* x6 s! B6 D4 {
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);+ T6 d& T/ y% I4 O3 @* l6 x. u. W$ l/ j. p
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    % Q; P# G* v0 v1 U
  125. 7 E5 N  [( C& Y& c( g/ E+ W: C

  126. " ]  i. k3 ~+ [# p$ m
  127.          gtk_widget_show_all(window);
    ! G! ]% _/ M" O& F  d
  128. ( H' \- h7 u1 D0 y$ ~
  129.          //主事件循环% n7 e4 g7 x- }
  130.          gtk_main();1 A1 _+ d2 H. O8 V) b

  131. 3 i. V$ m3 z7 `$ h; X
  132.          return 0;6 {* I% k9 i6 p; E
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  ! R; F; c8 ?& q: |1 ]
    5.png
% @9 Q4 ]6 P7 {* p+ E! t+ p   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
1 {: F6 |- T4 j   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
! e/ I: r& k3 R0 x7 h
+ _- v9 p0 H& u( ]* p
赞 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 手机版