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

STM32MP135F-DK开发板评测-Linux系统下基于gtk的计算器应用

[复制链接]
BinWin 发布时间:2023-12-4 09:53
  上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。
  首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。
  基于Ubuntu18系统,补充安装所需要的库和小工具
  更新软件列表  
  1. sudo apt-get update
复制代码
     安装python3   
  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   我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
6 D* ?6 K* j1 t2 {( t. @8 K 1.png   r4 C+ [8 m8 C; ~& X. D% ~1 F
   然后就学着官方文档的样子去验证下SDK是否安装成功8 H1 S$ w+ E" D4 X, ?6 ~8 y- \9 \
    2.png
' Z7 w$ k" T1 i% u
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>
      \5 t; D5 W8 X  b6 j9 _" [: i6 S2 y8 k

  2. $ n1 T& X+ r# [, ]% T
  3. static void6 \* U" Y& \4 c% i1 {; o) f
  4. print_hello (GtkWidget *widget,
    * K1 ]- N* Y/ F0 q
  5. gpointer data)
    - P+ q: M) ?2 P5 j) V
  6. {$ b  P3 D% E3 N1 y9 d3 q
  7. g_print ("Hello World\n");" c" x6 o% C+ v
  8. }$ h4 c, ]1 `  T% P5 U

  9. 2 F0 F9 C# H; F
  10. static void6 c* c$ R) G4 X1 ^3 R
  11. activate (GtkApplication *app,
    ' N; r1 ~# E6 b: H/ f
  12. gpointer user_data)
    9 ]- J- P1 x' E4 ^4 l4 o3 Y
  13. {# E7 q7 T- s3 L% `" `# y6 f% ~
  14. GtkWidget *window;; v7 F+ N1 `3 x6 ^$ R1 c9 y# }* H
  15. GtkWidget *button;
    / y; U( i4 H9 F3 T# S
  16. GtkWidget *button_box;
    2 y$ [/ A! t9 Y4 G3 l- ?: n2 l
  17.   D' N, ?4 @1 q9 J7 x
  18. window = gtk_application_window_new (app);7 Z/ I1 n) H: ~0 Z
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    ; U" ]) Y* N; K
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);3 ^* V% A; w1 n, }7 }$ ?

  21. 6 A  q( M3 V9 e  h/ M: N
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    & m. |" g* D9 g8 c
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    # n; i$ d' z( ]' K8 K  H, `

  24. + f0 `. B0 v$ g# Y% }" B
  25. button = gtk_button_new_with_label ("Hello World");5 N% h2 X- k  Q( a% `+ Q) [& V  O
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);6 y* D: q  s3 @0 O9 C. W$ U
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    ) q$ n# u' x- m8 ?3 c! a
  28. gtk_container_add (GTK_CONTAINER (button_box), button);
    8 x' x& k# W. j/ A' G
  29. 7 B# g  r( m# ]( t/ p
  30. gtk_widget_show_all (window);
    ' Y2 f& T, g6 K: t- c# u
  31. }
    - H0 W# g2 D: Y. I1 J
  32. . T" m0 C# M) E
  33. int, {( n% E: q/ @1 ^; \: [- \( Z* Z
  34. main (int argc,$ O  t1 @$ O' ~8 h- t8 l+ x% j; m
  35. char **argv)
    - K2 F# Z: l- p/ E% h% ]* g
  36. {
    : m7 s. P. s& t1 z3 H, b, x
  37. GtkApplication *app;
    . @1 U. t: q' X
  38. int status;3 S$ x  b; _! J6 t

  39. 9 R3 u$ n  ]4 L( C; g
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    ) T% r5 i9 m0 H( H
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
      z: U1 _0 M' {- O  c/ h
  42. status = g_application_run (G_APPLICATION (app), argc, argv);
    1 }" T0 A7 w! m) |/ f# u
  43. g_object_unref (app);
    - _/ D  p+ e& |* z$ {( b

  44. ' m$ \8 O" {$ Q6 i1 `' y3 V
  45. return status;4 t3 r- K, X4 `8 @9 b
  46. }
    / S& T  d! X/ P' O( [, c) P
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  ; L1 _8 n# F4 ?9 N5 G
  1. PROG = gtk_hello_world( g% L8 ]3 Y  y
  2. SRCS = gtk_hello_world.c/ D1 e  s" \. T3 I. B6 C; [4 c
  3. 2 C8 t# k( v! O8 V
  4. CLEANFILES = $(PROG)9 M  N+ m; p7 ?( K4 b0 S$ u2 P

  5. % R2 i5 {7 J* x2 f; p
  6. # Add / change option in CFLAGS and LDFLAGS
    % e  W8 J+ V0 `% Z& M
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)( k0 n6 c2 p2 o" H2 k; [( s
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    2 M# x6 I6 b+ _! \
  9. - b  T6 q# ]: w6 T# h. U
  10. all: $(PROG)
    / x( \) @/ X( O. x
  11. ; [% r" V& d; X! l0 n1 W7 u0 M% _/ W# n/ B
  12. $(PROG): $(SRCS)9 m! M5 d5 A. K' H" P& k4 m
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS), ?# q  J. o- l# }! Y+ ^# q% D
  14. ( ?- H( w) N4 v) H2 d: m  O
  15. clean:) J4 ^9 Z3 Z9 ]  K) V* W
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
    7 C; t2 S" r; @7 ?. R/ S
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
9 x* s$ k! p4 Y" \1 g% `
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。5 o  ~+ I/ R2 \# j
; T: p& p9 |' g& [5 `$ n! `

0 e; o! A8 l2 `' }& i- U( }
  1. #include <gtk/gtk.h>
    # \4 P2 S3 }+ P. P0 i+ ^
  2. #include <stdio.h>  H) q: d0 K  L7 M
  3. #include <string.h>7 B" W& }: `" I- M2 V* ~

  4. / ?3 ]" ^2 w! m& F
  5. char buf[50] = "";# R$ H9 X% x* R# S/ T
  6. 2 v+ c$ h6 N4 u8 ]& B0 N& F% B1 B
  7. void calc(GtkButton *button, gpointer data)
    ) @! v3 s% Y, O# e. e4 L7 n1 z
  8. {" _5 ~% c; Z1 E2 u
  9. const char *text = gtk_button_get_label(button);6 G% V/ P: v6 X+ r# c9 r- l- v

  10. % G2 F% }/ I+ I6 J) a; K
  11. //退个操作
    ! e% L/ Z- u9 o% _) b& ]
  12. if (0 == strcmp(text, "c"))9 L, q: S) T9 x* k1 \
  13. {8 H, h) _7 T4 x" E. N; Y0 D% b8 S
  14. buf[strlen(buf) - 1] = 0;" ?& {: }' G6 @/ i7 r
  15. }else{. A- ^* L( j9 F) E" ]: K

  16. ! ^1 U# ]# S9 D0 h
  17. int a = 0, b = 0;
    9 H+ X2 q1 L$ Q, p: |
  18. char c;
    / o' n( P  T( Z* R) Q6 t8 q
  19. strcat(buf,text);  u" J+ k1 I  V( x! W+ O, t3 `. ]

  20. - l, P  n) F* C. M
  21. if (0 == strcmp("=", text)) {
    # o* M7 O8 i5 k
  22. 1 a) }$ ~: @3 s( p
  23. sscanf(buf, "%d%c%d", &a, &c, &b);; |. M9 x7 M% y' }$ N5 G, }
  24. 6 K) O- a: ^4 g, q) I, e
  25. if ('+' == c) {0 H; m6 ~4 q0 J4 H) g0 P# G, `* v
  26. sprintf(buf,"%d", a+b);# O7 ^- @* X8 a7 A; W: g4 n
  27. }
    3 [1 k, e) A+ N& K' p: I
  28. else if ('-' == c) {7 L: ]; l; z; d/ @% [+ V' ^
  29. sprintf(buf, "%d", a-b);
      k/ e# H" u. ?5 l  y+ j" z
  30. }
    7 y$ o9 F  [. E/ x0 _; Y6 L
  31. else if ('*' == c) {; d6 c4 s4 h! ~' G* K1 w5 [/ l
  32. sprintf(buf, "%d", a*b);
    ) x# N9 V$ b* t$ Y
  33. }; T  j1 u9 C! A, V6 ?" K4 _6 P
  34. else if ('/' == c) {
    9 h; V5 @" Z4 v3 F+ i/ x' ~
  35. sprintf(buf, "%d", a/b);1 f( w( a1 q- R+ F& ~  {
  36. }) y6 C4 c' a+ C( g; V
  37. 7 K. f3 v4 p; l5 S: H. F
  38. }
    / c/ J6 n* f2 X( F0 \3 K
  39. }
    1 ?3 b2 R0 D! L$ L

  40. : j0 c% {* u2 y) f0 ~- ]4 g
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);; }" Q' c+ F2 l  H; C& D& `' T
  42. # |# S0 }, M5 A, B4 ?  b
  43. return;
    ! L' b" J! a. M/ O$ o2 J
  44. }! u3 S' o7 F& F$ V  U+ U. O) _' F6 Q

  45.   ?# D* N6 {9 j0 A
  46. int main(int argc,char *argv[])
    7 r8 [& g* V, z, i
  47. {
      o8 b) G( d* o  e+ }

  48. + f% E; D% y3 J5 X9 J; k2 A
  49. gtk_init(&argc, &argv);  S, }# D( U& P1 ~9 w

  50. : [8 l# Q4 j( J, a5 W  B( ~. v
  51. ; b" t) J) S8 w& |8 C) ]/ b$ U. h
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);' Q6 f# s% J  c% J& y- U9 h: {
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    ; ]. q, n2 U- E% m9 Q7 ]& j
  54. 2 o2 e/ I# ?* T/ O, D+ L: ^
  55. //创建一个表格容器5行4列
    2 c' P( n% t$ W$ I
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    # D  c8 p+ U- P7 z/ `" u) @9 C* o. u- K8 ]
  57. 0 ]+ g8 z& Q( `4 N; m
  58. gtk_container_add(GTK_CONTAINER(window), table);
    1 j1 v# D% |; O4 T( C5 R  [8 o

  59. 4 ^& t% `( Y' L. |% F$ A
  60. //创建一个行编辑7 t9 g6 d! ?. u9 s( v
  61. GtkWidget *entry = gtk_entry_new();3 D2 s& c* M0 g6 |5 `$ w2 R
  62. 8 I# \# T# I/ g5 Y
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");4 w) l$ j6 h1 q4 E
  64. 0 r- A- x$ H2 R# Q7 I! l
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    2 e" S3 t7 w8 y& M2 V! d6 Q- U

  66. / o! {" L/ ^0 P3 T
  67. //创建多个按钮
    5 h1 G5 o. d# C/ I3 s
  68. GtkWidget *button0 = gtk_button_new_with_label("0");% u6 u1 ?# ]3 g& o
  69. GtkWidget *button1 = gtk_button_new_with_label("1");1 I" H3 b! {2 T, G1 r& Z& M
  70. GtkWidget *button2 = gtk_button_new_with_label("2");4 E1 j5 w9 K9 b9 W0 d3 F0 v
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    1 Q$ w5 w# Z, ]& H& Y
  72. GtkWidget *button4 = gtk_button_new_with_label("4");6 z0 Z  u9 ]/ B: a
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    ' a/ A3 G- P8 c4 k
  74. GtkWidget *button6 = gtk_button_new_with_label("6");9 k# M/ F, _2 T
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    % l0 B5 a) `3 X/ f
  76. GtkWidget *button8 = gtk_button_new_with_label("8");$ p% g3 t  g- i3 ?# {7 d; A% o- N" I
  77. GtkWidget *button9 = gtk_button_new_with_label("9");+ D# j9 s# C5 x; j9 M
  78. ! T5 X8 b% l+ x2 l1 a
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    1 Y& O! H, b9 o# }+ W3 z; y6 S8 Q
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");
    $ j  M! z$ X5 k. e4 U1 w9 V$ M
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");) T. v! ?  [$ g
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    & \( u0 b7 J7 \2 `2 M: l9 z
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
      }! G! x% X& i
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    ! Y4 b; r7 G! k7 y  l! A

  85. * g; j$ O2 a4 d" ^
  86. % B5 X; r; k5 M
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    5 h5 C9 C2 r# m% u3 x: L
  88. 6 x; ~) y; I* N4 ^/ F
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    - {; L% e, d: D# }9 r2 X
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);. _% w8 f+ L. y* v! h  Q
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
      J! a, v; Y& a+ ^  h- b
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    2 y( R, `6 P& j/ g* k' |+ W  _
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);% Q# P6 F& t9 I$ h0 L2 J
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);- n# ~4 N. k: E7 {
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    2 f0 g' A& o7 D$ g8 l8 s8 h  A; r
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);" x; n# L+ P1 G6 v* x
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    , q- v, f& W0 g; A- [5 K  U, l
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);, j7 E) e0 M" G7 `& i

  99. % z- A2 m# T; m# J
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    ' l! R4 t5 ?& S; Q4 y, L
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);( O) I% a$ ^3 ]
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    7 r+ g8 x& n7 o0 d1 n* E
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);5 A- r2 _; }* I0 L
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    1 [8 S" X' I( A% |4 x# ]
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);6 m! x0 _$ F6 h) f! t/ R, l) ]$ n

  106. % q0 R$ [2 l  V- w
  107. //注册信号函数,calc()
    ' ]/ S$ @7 G6 _3 L
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    / m, ]% A& E: a- q, ?% }
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);" [3 z' Y7 F' R5 y# v1 [/ U0 T' D
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);: l0 m9 b1 D, U
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);7 G3 U" q" G# S# V4 L
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);# o; s- p$ L1 u2 k
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);# V3 F9 b9 C/ u: E% L8 M2 D
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);4 ]2 A  F. r6 G6 n5 A
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);9 w6 ]) h$ I0 p$ T
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);& {6 }( o( Y) c; {
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    0 `7 _/ [2 b; p, d; K% C

  118. . B5 L( G8 k' P, B6 ~0 i
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    - M% W2 I- F- c, o3 D5 n# Y
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);, y& ]5 ]! b6 W6 G6 m
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);/ @4 D) u, Q0 o! z
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    9 a2 }( u- f3 P' m
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);: P  G4 {% N9 {# C4 C+ F9 s) S5 _
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);3 K& }1 L1 X5 T' p: t

  125. ; d9 X: c" q; P$ h

  126. ' u: t" \/ S; g" x( A
  127. gtk_widget_show_all(window);2 f1 l4 m) U6 W3 s# x: B& E$ U8 Q5 x

  128. 0 U( F+ X; ~% S' `* h
  129. //主事件循环
    ; N# T0 n7 g% u6 e3 l
  130. gtk_main();
    9 @; d! F' d8 i6 J$ ~
  131. 6 K1 e$ C9 l4 x- [7 U/ `' ?/ [
  132. return 0;
    ! e# t- b5 N, l3 M8 y
  133. }" q( R) h6 i8 [# ?: s% G
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
& d; q& B$ {/ @7 ~9 A$ d: s# t1 _" p  Q
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频' T- ^3 i1 H: e6 S( ~
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版