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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
6 I) D2 ?! G( G& l( V     基于Ubuntu18系统,补充安装所需要的库和小工具3 i7 p: x9 r3 U2 D7 e
      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3   
# x7 |1 f/ T, q, ^# U2 s0 \
  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
1 Y, U3 [( U+ l* B* {    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
: y: M, q5 U* W) ^$ A0 ^9 @* E) R    1.png 5 v9 d3 F. t! c4 N2 L
  然后就学着官方文档的样子去验证下SDK是否安装成功。
% P, X5 W# v0 i/ W# K4 k5 h9 w' d   2.png
# L) r4 D% Z% [# n  Z1 B0 t  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
3 T0 t) @4 l3 \0 j  首先拷贝官方给的demo程序,基于GTK得hello world。+ V$ l. B# x7 \2 P" U
5 F8 L8 |+ ]$ y! V; g
  1. #include <gtk/gtk.h>
    3 l2 p1 }6 d" m' U

  2. . E/ S* S3 ]. X4 w5 L
  3. static void5 J% {5 r" y6 u/ r
  4. print_hello (GtkWidget *widget,$ n! |+ j$ [) M% C
  5.              gpointer   data)1 V5 M0 x0 }9 Z4 m
  6. {' R7 _  U. S( T3 X
  7.   g_print ("Hello World\n");9 r3 h: v; }% B) y1 P- z
  8. }/ Y4 j; B* ^7 ?3 p9 C
  9. . }$ Z2 c! r* p# Z! O* M' |+ h
  10. static void
    4 i& Z! l1 D2 u  V+ C  F
  11. activate (GtkApplication *app,
    4 {2 C. e# A) U( p- Y- W
  12.           gpointer        user_data)
    1 C3 @& y# ]5 X* f. i
  13. {
    7 D/ q" [' S" Y( a% z. l
  14.   GtkWidget *window;
    ( @. ^( V# s" d( E: T4 ]# D3 f# @1 I
  15.   GtkWidget *button;
    ! f$ B' ]% c  {$ O* j7 D- C1 ~
  16.   GtkWidget *button_box;* S8 J. I$ `3 i4 y' R5 F0 j% S. |

  17. % E& l) \/ a3 T) D/ `, W. j$ S
  18.   window = gtk_application_window_new (app);
    & q% H2 R- r( V" \
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");8 K% n0 {6 M/ Y$ F0 H& i' u) L
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);/ U2 z. Z. E$ b$ a6 k
  21. 1 J, U" W& O* {/ Y
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);" v4 i* W7 V# W! U0 ]
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);
    " D& ]  g+ E+ u$ V! K6 u; O4 _

  24. 9 u; B: a. i+ G7 k2 ?/ v3 j
  25.   button = gtk_button_new_with_label ("Hello World");" L. G3 k  j9 k4 `$ Q& @, Q
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);3 D  e0 ~" M) s+ P
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    * b% r1 A% k! Y/ d; Z+ O
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);
    % g" g: }0 Q, ~
  29. ; F% n% Y. }9 k5 n3 ~" t- J
  30.   gtk_widget_show_all (window);
    * z; k( S8 |0 I# P
  31. }
    - S6 R- Y* B% r0 D$ Q% o$ h

  32. : Q3 y2 X9 j4 Q( @
  33. int. C0 n( Y5 A. m5 T0 l8 f/ X
  34. main (int    argc,7 C- b# l4 n' P, `
  35.       char **argv)
    : P/ ?& @6 h- l; ~0 ]/ I
  36. {% \4 h! B6 q7 U7 \) Z
  37.   GtkApplication *app;
    ! k: ]! a7 L% H: ^" L
  38.   int status;
      L/ D+ l) P) i/ h$ d2 [# g

  39. % s1 W9 X8 Y0 i
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    / q0 u: [% u5 u
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    1 t8 ^) v9 `$ J# ?% m# N; g4 F
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);
    9 ?! S9 N& ~# \( ^
  43.   g_object_unref (app);: w! ~6 c6 c5 U6 g5 T4 |

  44. + y; d# r, Y4 J+ p9 t+ u
  45.   return status;
    . Q! t; D/ [& _; q. I" c
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world
    3 I% R- a; s( D& L/ Y$ ]0 v
  2. SRCS = gtk_hello_world.c7 c, [: w$ F7 g. l! r9 Y
  3. 6 ~! q% @5 t# K* Y; D; _( C, z% p
  4. CLEANFILES = $(PROG)
    0 C0 T: e" f) o0 p; M( |% l; |

  5. 2 q& q3 H! k3 |
  6. # Add / change option in CFLAGS and LDFLAGS- w0 @( z) `# x5 G
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    $ W( N0 W  C, G3 |9 e- _- J
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    5 i: n! E' G: {
  9. : E' n/ H& V* q: a  k9 r7 {  N
  10. all: $(PROG)" S' f( X2 H' X7 q4 }# `/ M

  11. 8 q9 ?, c. b! r/ h
  12. $(PROG): $(SRCS)+ _  n# Y; K+ H3 `- g
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    , @( r+ d  `% e
  14. 5 Q* B& B  J7 E  |7 h  V: s
  15. clean:
      b, p' x5 d) n; c
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
# f; C4 T) j+ U% Z( I' A" D   4.png ; D. F' u1 l! \$ M; y' Y" G
  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
8 H0 S8 p+ a) B* G  b( V" H0 b5 h5 c2 c0 z/ A1 z; t6 D
  1. #include <gtk/gtk.h>
    ! f" O7 z) b$ l1 X9 c: @1 I+ H8 s
  2. #include <stdio.h>
    1 y& G  r! J$ [
  3. #include <string.h>9 b3 @3 v# K9 w% P$ E
  4. 1 Z, c$ w$ C" R! O4 U. {% M
  5. char buf[50] = "";( P7 `( W8 H9 g9 H# Z

  6. 5 t0 K- D' R0 y; l
  7. void calc(GtkButton *button, gpointer data)$ g; _$ a3 U. }" C0 [, D1 y
  8. {
    + Z+ g. G1 F* C& _
  9.         const char *text = gtk_button_get_label(button);8 _# q# _' U# v- W4 {+ a

  10. 2 a+ O; V5 o) M% l! |/ @
  11.         //退个操作: q0 C9 B$ ^4 d' u) x. H
  12.         if (0 == strcmp(text, "c")) ; x1 U! A3 n7 p  v$ o: z: H2 G. X9 c
  13.         {/ [2 R% j- y, y4 `6 v! `
  14.                         buf[strlen(buf) - 1] = 0;
    6 {* z8 c: e$ \) V
  15.         }else{
    1 x3 }  t. s& R& g/ N9 t) ^
  16.                
    + b& i3 E- }0 C. x6 P. q  Y0 Q
  17.                 int a = 0, b = 0;" x- ]0 u: A# n9 C1 x8 }
  18.                 char c;
    , E2 G1 b& H. ^) H0 _
  19.                 strcat(buf,text);
    # l  w. a8 ^. O2 }/ k4 X* o% P

  20. ; o6 f/ g0 C( }8 l1 c, I
  21.                 if (0 == strcmp("=", text)) {$ k4 L8 k& O" _
  22.                         2 Z3 z# A' K: _! i3 W. R
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);% E  ~( |; H6 i8 ]( ~, C

  24. ) U2 n3 n: `; l. W
  25.                         if ('+' == c) {
    ( E  I2 L0 ~) t& z
  26.                                         sprintf(buf,"%d", a+b);
    5 U  \+ N- l/ i$ V
  27.                         }
    8 T3 n; d6 E. g1 t3 }4 i" }
  28.                         else if ('-' == c) {7 ]! L  I, @3 R- M3 f0 V9 ?
  29.                                         sprintf(buf, "%d", a-b);
    ' {7 Y; ?$ ~9 Z3 J% e. V
  30.                         }
    $ E2 W6 m* V/ B- l/ z) I
  31.                         else if ('*' == c) {
    ! o/ t: o$ z+ b. K9 N: G5 s  z
  32.                                         sprintf(buf, "%d", a*b);
    + A* @: W: C  I- y) i! y6 y
  33.                         }
    * I$ X; b# U& y; ^. r  w* e, }
  34.                         else if ('/' == c) {
    5 J! |: T% e' K/ o
  35.                                         sprintf(buf, "%d", a/b);5 I5 e8 l( c; i1 }+ j' ]. E& w& F
  36.                         }
    " `2 K6 B' H8 Q) S& o  \
  37. 7 y) r. Q% Z: A' R
  38.                 }
    / J. t# l: B0 X3 {8 _2 y$ U8 n
  39.         }$ o3 Q1 `" v  p- y2 X
  40. 9 }4 T5 o. U' q% B
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);
    " ^; f" c8 ~$ T) {* c% N/ r
  42.   {; l7 L0 s/ l! e5 k
  43.         return;
    4 }7 |: E# B" |1 I! y
  44. }* z) ?& v, s- Q& |! w8 x! n
  45.   r' h( m' I6 T
  46. int main(int argc,char *argv[])7 x8 p- r1 o4 C' j! G! N6 e. F8 |
  47. {4 g8 H# @0 p$ b% K8 ?- x

  48. ; [/ [; r$ u4 B: H: ~6 q
  49.          gtk_init(&argc, &argv);( W) g9 S/ b! b, R& U0 v/ `9 p

  50. : [) H; h* s1 \$ A8 A$ Z

  51. 1 E1 b+ U. \8 }) h: v/ N
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);, j* a$ s6 S' J
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");
    ( s  E  t( [3 I/ q) \
  54.   
    $ S* s0 W* i, z6 D
  55.          //创建一个表格容器5行4列: G6 ]9 F1 H# G9 n0 U$ E. U
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);, J2 m, V% a2 B( p6 b, V4 G

  57. 5 F; R2 L! E) V% C$ C/ k; h, u- `
  58.          gtk_container_add(GTK_CONTAINER(window), table);  a/ r5 i9 _5 j$ A

  59. 0 M: z6 R8 z6 w+ @/ Y3 J8 X* x
  60.          //创建一个行编辑
    ; D) [; x- r+ m# A7 U. y% c/ o# R
  61.          GtkWidget *entry = gtk_entry_new();
      K3 g" w3 @. z7 _6 _
  62.         
    $ [, x. I# n2 I6 Q
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
    ! J0 p+ Y( h& W5 G5 A% b  u

  64. 1 C+ V1 R, X( z/ F6 V" M$ W' l
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    " q$ a8 H; {2 I8 _  ]

  66. 9 w, f/ w; x: T% L3 K3 |
  67.          //创建多个按钮
    ' z6 f7 J9 P' ^& {/ T1 U
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");" D- _* X" D" ~
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    6 m7 X$ I, e7 ?3 G
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");& c& Y. Z3 l  Q* p
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");
    : i" \) y1 `( a" q; b4 h
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");
    , ?9 E& U& M2 z4 m8 Y
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");2 u! L7 E' f! b$ v" {" D
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");, m; }, R# M5 I2 {7 m
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");/ O& g! M* V0 ?, h! @
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");# C$ Y+ H" D8 j% u2 d/ D$ ~) G
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");' B) z, K+ U3 r3 \; Y

  78. " z8 L8 {0 N3 ?. I9 G
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");
    / I% ~4 L, H7 u/ m( U
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");5 {0 C8 r6 ]" R) [- w0 }* S* }* R
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");
    $ V/ i" w8 w6 T7 l0 k: Q
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");$ Y5 M/ i+ d3 l5 J
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");. B0 J& S& z. b; c/ W9 W2 r( F" \
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");; V5 {6 w- \$ g: p( ]3 }7 o# G

  85. * `. L; k  y$ [# o6 o. f8 B

  86. 4 P1 b: Y5 z# i2 Q' J
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    - R/ q, f; e5 d0 p' U. z# {& j
  88. 6 V# e+ Z; y$ r% e
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);* Z. L( {( {3 ]
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);/ o; I: T" M6 b0 n% M) ]% R
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    8 u0 @; J. Z( y( x/ d5 l! v
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    8 t- Z" o  I& T2 F: a% l
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    5 g- Y" [% F) k% X+ x5 o1 ?
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);2 Y+ Q! G! |3 e# N, T/ r1 ]0 G
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);; @0 C8 h! u7 ?2 v# ?
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    - H# R$ K. c; a$ _7 }  z$ j
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    / }# x; j; C) _
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
    " p4 w8 v* F, |
  99. ' x7 o, F+ p+ R0 B
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);+ Q/ e6 ^; S& D7 L
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    " ]/ F  Q: ~1 N0 W7 i. k+ i
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    8 k+ `/ U4 B2 C7 i$ ^2 T" J) n
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
      d( D" ~& O- r; y
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);  W  I; O4 u) V6 `
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);. w/ S. B! U% u/ W5 {8 }7 a, h

  106. / s$ N8 z! }7 T5 ^# X4 v
  107.          //注册信号函数,calc()
    ' Z& Y5 b8 y/ U* n
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    6 g( @/ ]" z. \* `! s( |8 {3 ?9 H
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);6 R9 L7 ~7 E5 e
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);9 N5 u% C9 E7 [
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);0 e- J7 Q, B* X/ ~  i# [3 ^. K: ^
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);# g0 M3 Y6 D' c% h: F$ U/ P
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);1 d1 v* x- [# ^* }7 _
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);' V& @; \, n# D9 {0 K% T
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    4 @6 ]3 I) h+ e2 Z
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);2 t, w8 T  ^# n7 j, O
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);6 A2 O: l7 }* X2 A7 y; {
  118. 3 r# G. Z7 V4 z$ I) h# p6 t, {. N. z
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    . Y0 T; u, O* J" R5 x
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);- p$ F* m- z. q! b# [  J2 @
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);  t1 d) t7 a' N) F" T+ @1 h8 _  M
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    4 C1 I9 Q6 R, K0 h
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);& I1 y/ C* b) s7 y* v
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    + W  g/ o7 D1 @! ]9 y
  125. ) \2 I" [& V0 f+ I# h- J
  126. 4 n: x9 }) i- H. X  V5 G. |5 s
  127.          gtk_widget_show_all(window);. o: ^! {7 p4 l6 w7 p

  128. 8 ^: [. b: ]! K1 s/ D9 Q8 B
  129.          //主事件循环
    6 [2 Z4 j$ n2 p6 U; q; S
  130.          gtk_main();
    ! \6 E. l+ j! V* p* f
  131. , |9 ~$ p* [$ ?4 v
  132.          return 0;: g- t+ @& j) A- ~# A6 w0 E
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
3 l7 X; {" a4 `0 F    5.png
  _. g4 X; {; a& b4 r# R. R0 B   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。) y7 L! {1 n+ t" X. }# `
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
1 N  d( r5 k( i  f' `: V# I0 x
" d4 B8 |% t. f7 V4 e
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 手机版