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

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/,,这个路径就可以,直接继续安装。9 f) R5 t$ h4 L+ j$ R4 N2 J8 x
1.png # l* [) J. Z) x6 `7 o
   然后就学着官方文档的样子去验证下SDK是否安装成功1 N5 T' f& v5 o$ W# C4 S& k9 F) x- @
    2.png 1 e  G( v/ e' p2 d. R
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>1 k( J# }$ c* m. z5 M8 X
  2. ' y4 y! S- ?' m
  3. static void
    / P, B2 x% b& Y+ K, W. M! \; H
  4. print_hello (GtkWidget *widget,
    : M8 F+ T- H- _
  5. gpointer data)4 \0 Z1 c1 K/ P# o) S
  6. {* _0 n7 a' A2 u7 r4 u, v
  7. g_print ("Hello World\n");
    . T/ P/ k# B0 P& I. y# N: m
  8. }9 Z7 N$ i* H9 \, _: r3 I, M6 e7 Z
  9. # B) j* o6 W9 B
  10. static void
    9 t  g1 E! F9 j/ I2 G; J: m  h
  11. activate (GtkApplication *app,  x/ _' S6 x% r" X2 m  K' y
  12. gpointer user_data); B% H. h* l( U+ J) M, g2 {& t6 K; b
  13. {
      x, D! M3 E" G; @
  14. GtkWidget *window;$ \2 _# `) X# b) y: W7 `7 |
  15. GtkWidget *button;
    / A( O5 U1 ~7 V$ P) C
  16. GtkWidget *button_box;% t9 b& y' c& U* A: x% _2 n

  17. / ?) x" \; h( c. Z. H& V
  18. window = gtk_application_window_new (app);
    . T" l/ J6 @) }" b  \3 N9 h
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    ' M, n6 L# ~( q: V$ `, U, ^
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    / J( ^' p. D" W# S8 w% O, l9 R5 w) |
  21. & b# U3 ?0 p- O2 W* M* R" j7 B5 `9 \
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);( D# j! u  \: h$ ~0 P
  23. gtk_container_add (GTK_CONTAINER (window), button_box);* @( Z1 c1 Z  {: H

  24. 1 ]+ T" D( G' Y  q, k& s' j
  25. button = gtk_button_new_with_label ("Hello World");
    8 M, q( y9 e8 F6 ]9 r% i
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);6 M' p) |9 f0 E. ^" H. r; r) z
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);& r- O2 @+ o7 T9 v# ]' {
  28. gtk_container_add (GTK_CONTAINER (button_box), button);8 c) ~7 u. }2 g8 ^& }

  29. ! s3 J! ]% y' j( X* G
  30. gtk_widget_show_all (window);
    / v% Z7 \3 u2 @0 K' r! y. W: N* v
  31. }
    9 L" |3 N8 b/ u( I* Z

  32. 2 ^2 D( J8 l$ K% w9 i
  33. int. d0 Y* ]* T# T8 J+ h  n$ P8 f5 s! r
  34. main (int argc,# E# P& \6 _" ]* J, l! S
  35. char **argv)3 N! S* |/ L2 P; h9 W$ Z
  36. {
    ( Z: H3 S( I' i# K, [  o: a
  37. GtkApplication *app;: Q# K0 Y; Y1 c4 y( t6 f9 z
  38. int status;2 s8 P( b1 j, G0 {& S$ F

  39. 3 W: W4 w8 ^+ a7 }7 [) E; t- {
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    , z* `+ s2 Y# G% C1 n2 ^
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);; H+ M0 g# u' y! O$ U! _
  42. status = g_application_run (G_APPLICATION (app), argc, argv);1 `/ @$ j' i1 H" N. O" |
  43. g_object_unref (app);+ E+ N7 e' u5 C3 }5 h
  44.   c( i3 v4 T+ }& k
  45. return status;
    1 Q9 I# [0 ~! ?0 O
  46. }
    6 @; i1 w) z. k1 s, W  r/ W$ N
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
% t+ P/ H7 f$ H$ F; L. V
  1. PROG = gtk_hello_world' y1 s" R  b+ S3 B
  2. SRCS = gtk_hello_world.c. _/ Q+ Y' B( [4 [# I4 z

  3. , K0 _9 f6 h9 u  j5 g  F7 B
  4. CLEANFILES = $(PROG)3 X" o' J/ ?6 \7 t- K  M8 Q( z1 T

  5. ; @4 q2 L" g3 j* l
  6. # Add / change option in CFLAGS and LDFLAGS5 x9 K+ d1 c( N' O- }
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    9 ~( W* f  T- S( z6 |+ _3 k
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    ) @: e  A1 k' Q' N+ y! A. `6 W

  9. , u* {4 e8 y0 ?
  10. all: $(PROG)
    : V9 y& ^# R6 m- Z2 H7 \, u0 U9 b
  11. ! E$ o5 y% l; K+ c7 q; V" s1 h
  12. $(PROG): $(SRCS)
    ' R, `4 V; V( y7 B% _% n% g
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    ! m) q/ \3 M( |8 n" s7 K# c

  14. 9 Z- J1 p% t0 w2 Y- p' S' M: x
  15. clean:
    $ c5 N# K7 }/ l( X6 ~' {" ~
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))% P/ I, o9 H3 n  g
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
; ?6 j! s0 \* F6 y; m* q
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。9 T9 n! {4 [7 L4 G
5 |# G: Z' r1 ~, q  N: J* |

0 q4 @% Q0 H4 W$ g$ o
  1. #include <gtk/gtk.h>
    4 w8 B, D  B% m) M
  2. #include <stdio.h>
    - [  r9 c3 T; J1 y! }! y  y9 u
  3. #include <string.h>" H4 s( l0 s. p
  4. 5 v0 a7 g" R0 M+ F2 Y+ I
  5. char buf[50] = "";# A$ n5 s2 f( T4 Y. ~9 s# I
  6. ; z+ t- c5 O9 J2 p9 r" _7 Y6 k
  7. void calc(GtkButton *button, gpointer data)% d0 Q. S+ ~0 g) K% D0 k) F
  8. {
    $ R8 p+ \7 V' V/ L& n
  9. const char *text = gtk_button_get_label(button);  u, E# ]/ r1 B. T% r6 _8 Z

  10. / @, _! q- t! o1 d9 W0 i
  11. //退个操作" V1 S9 s7 O0 _6 i) p5 O( k
  12. if (0 == strcmp(text, "c")). G/ Q8 ~" d) y0 K* u/ I5 V
  13. {: F/ [/ c- y9 C. Q- N
  14. buf[strlen(buf) - 1] = 0;
    : |) W7 J2 ]% o' ?/ w  T
  15. }else{+ J3 N$ o& K  n0 p3 ]
  16. ' \' N2 B; N+ Y/ P( G0 z" c/ s
  17. int a = 0, b = 0;
    * t1 d: p  m7 U0 r3 C( x" n6 I
  18. char c;
    + T' H* D7 C: F- r  t# K
  19. strcat(buf,text);
    6 H+ _& q* k; {! G9 n& q" {
  20. ) P& G: i  g. z
  21. if (0 == strcmp("=", text)) {
    4 s$ ?$ ~" `4 V0 f5 N2 m4 b
  22. 3 _; t* q, `* H' G$ c6 ^7 e! Q
  23. sscanf(buf, "%d%c%d", &a, &c, &b);9 s6 l- K3 _- U6 ]

  24. - y0 p1 L; H. q$ s4 z" U
  25. if ('+' == c) {
    * u/ Y/ |( g2 K6 X$ A% X: `# m
  26. sprintf(buf,"%d", a+b);) E* X/ Y- r0 m9 ^1 E# r
  27. }9 V6 L1 p. F' b
  28. else if ('-' == c) {
    ; l3 \& E9 e8 v( D; y
  29. sprintf(buf, "%d", a-b);) B2 R+ E" o0 o; d# f! L
  30. }1 L$ C- z! C- F7 ?) C6 V, }
  31. else if ('*' == c) {
      I7 [% d8 [. b9 d0 F
  32. sprintf(buf, "%d", a*b);
    % N5 @! t& z! k
  33. }
    . F2 a/ b( j9 b, J
  34. else if ('/' == c) {1 I& n. g: k( Y) {( C- q8 a
  35. sprintf(buf, "%d", a/b);
    / J8 ^/ k# B# K4 G4 Y
  36. }
    # ^* U4 M) v# {2 o- f2 l1 \
  37. : |: p* f2 E; f  g' F
  38. }
    . W- U4 E+ A# h
  39. }
    % v' C  A9 R7 J; Z9 U

  40. ( C2 j7 V5 g- ~2 _  F$ ]/ e
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);5 z, b* @& R: ^- A* E
  42. / P. O, s- [; N9 {: m
  43. return;' w, d# a: k5 o& d
  44. }
    6 i, J( X8 I9 W+ S  K" H& W4 n
  45. % G) c9 r4 u- O7 M6 e, u
  46. int main(int argc,char *argv[])# T) \: w( h2 c- n9 n
  47. {0 q4 g( D1 H4 R' ^4 w5 a$ V( j" j
  48. + _( o& i) W6 m# E, e4 n0 t4 z
  49. gtk_init(&argc, &argv);4 v7 w3 f+ w1 p5 j. X

  50.   Q" h# D% o: y$ b2 p  X- @

  51. 4 P, G; t; v5 M# ~$ }; C2 J2 v
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    " J4 [) i% S% P, |- P: e
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    , T, x' }" k0 a, h3 M9 n& c0 |7 _

  54. % L' @" o) p" Q2 U0 x" \/ w/ L
  55. //创建一个表格容器5行4列, i1 F7 V* o( \) b' F
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    3 |$ }- |/ N  q0 _. L' A

  57. ! [3 O/ X6 J* ~$ M8 j1 i+ T
  58. gtk_container_add(GTK_CONTAINER(window), table);
    : }3 l/ V5 e1 A8 O- }1 _: B- o5 L

  59. 1 n# c  b$ c* c  X
  60. //创建一个行编辑
    ) r6 {8 W- Q. E' d# n7 Z. x
  61. GtkWidget *entry = gtk_entry_new();
    ' y3 R9 a# r- h3 D/ }0 ~& j: U5 i
  62. 3 v7 t& M) F# K8 F
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");: m) U7 Q( e- v* L% d, P$ T/ a" F
  64. / q2 t& x$ ?4 G1 o% u
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    # q8 a7 L% Z8 X. T
  66. # B! D; ]8 D& {; C2 Q
  67. //创建多个按钮% s, z- a8 m$ U
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    , |4 b3 H. W. T
  69. GtkWidget *button1 = gtk_button_new_with_label("1");" l7 R4 O) [" e) h
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    " H/ |3 S6 U, m+ T$ q: H
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    . z7 F% k' }5 `6 p* N$ K$ J
  72. GtkWidget *button4 = gtk_button_new_with_label("4");# Q) K  C6 e: ^0 O8 C
  73. GtkWidget *button5 = gtk_button_new_with_label("5");# O7 N2 v1 |! t% S
  74. GtkWidget *button6 = gtk_button_new_with_label("6");$ U  a1 J+ l; R6 q) E! u
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    3 B1 S) B4 j4 B- Q+ R, ^8 Z
  76. GtkWidget *button8 = gtk_button_new_with_label("8");
    6 `1 ^8 ~2 ~+ H) D5 m( b0 `+ K: p
  77. GtkWidget *button9 = gtk_button_new_with_label("9");' u9 Y1 o. U; [" T" |$ G

  78. . T( g6 L- ~  j2 _# B9 S
  79. GtkWidget *button_add = gtk_button_new_with_label("+");& `6 S5 W1 ]; P( y
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");3 K) ~1 |: K9 H. A
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");8 y1 Z( B- s! a5 q5 _  S
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    . i& x* z. I2 W, z4 p2 w
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");/ y! g8 X: z7 n2 B* K  ^' ^
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");* I+ W  X6 U! H: \. q  g/ _

  85. ' _- ~4 O& Y, H: x% y
  86. 1 h4 l& @/ k5 H: @% h( L% W
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);+ O+ f. ^+ M# V0 }

  88. / E2 N; M/ q  }1 `; I+ S" Q6 i
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    " b6 }( `0 ?( b! B  D( Z
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    4 W' b" b$ t. f/ k
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    % I: q- X! z1 r/ ~$ j8 r6 |
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    $ p5 Z- m* Y3 N+ G$ w8 e
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);, S9 p$ r/ W: i( s
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    " k( @3 h' n1 a9 Y" n
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    * L- L( ]) z2 [+ M
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    ( z' E5 a+ j( O0 v3 l8 B8 p; y
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    0 i, w* J+ h1 X1 Y. }4 C
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);& q7 {: J. r+ q
  99. ; Z6 k( r/ J3 b9 L' \- K
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);$ w4 k4 I7 [6 n6 \9 _- Z; T2 t: [
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);: l2 w8 v* E- E  B& B# ]9 K
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);4 [, ^" q) C" D
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);" L$ H: e6 n" y# v. \
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);; ?" I6 M# S0 K( Q( d! A, c% D
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);% Q6 b" d2 m  l) \; L4 f8 U

  106. - C3 b& N! }* T9 V
  107. //注册信号函数,calc()( j' l3 o  l. |7 C4 M% i8 m
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    3 w/ q& [& a. i  {! w
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);6 o4 q) z+ R( ^2 @8 s- W+ E
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    ) R7 I! `) z6 C& V9 N% m3 \
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    ! `! k* M) ]8 f2 A4 G+ e* S+ _
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);$ c2 V2 K& N! |# K# ]5 F1 w( a
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);; e" S3 [) y* G1 B: D- s/ p
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
      C& a1 l" N! r- R* P4 Q; ?
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);$ K& R1 t0 h9 B5 j9 T3 P
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);0 |2 W* j, m3 [
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    8 F) y/ z- q6 P; A

  118. & Q( t( O' O' _* I! d
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    % x$ j" c( x6 ]! P) d6 z
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);9 `3 N, }8 w* f" f4 ^- y5 u. Y
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    ) b* y* Z/ S, G* |/ q3 N1 n+ P
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    / g! i8 ?9 Z" n
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);6 J/ k7 Q! B" _9 V
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);0 `( }0 R" ~" h3 Q0 s/ F; ?" w
  125. % F, v- R) k8 W4 U& H* z( r& X0 t1 d; I
  126. 8 f- O# A9 g# w1 ?5 K. r
  127. gtk_widget_show_all(window);
    # M" [" M' g7 _3 A  X, ]
  128. 7 n3 U# y9 L4 J: o+ B! O. r: U
  129. //主事件循环
    2 ?2 `! d/ E* z9 ?
  130. gtk_main();: ?$ W0 X* A5 ^9 Y' Y

  131. . ]) v, {& ]! @! Q: o* N- N! k9 S
  132. return 0;0 W5 l! c& O$ d/ A
  133. }
    - l) {) ~8 |, N; u. d: ]7 o
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png 1 I, h6 f; K5 s

# k' d* U  h8 m+ S) d
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
赞 收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
+ K( C5 i5 i+ E5 [- a% E8 `/ g% }

所属标签

相似技术帖

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