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

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/,,这个路径就可以,直接继续安装。- S, X* i( }, k6 v3 m; ~7 o$ k, e& E
1.png
2 W3 k- ~& s0 C& y   然后就学着官方文档的样子去验证下SDK是否安装成功
1 N. x! E  j* d2 A. \2 B2 k# x9 m: Y    2.png
) f3 x! `1 T# B9 n. G
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>7 w! F; P1 `0 \* Z% Y
  2. * `% t9 f9 R5 d5 T; t7 Q
  3. static void
    , }. U2 v; E6 r0 I6 a/ T
  4. print_hello (GtkWidget *widget," H% [- U5 a% j) x& t# z" Q) X( G
  5. gpointer data)
    ! l) v. s) T" I. |2 A+ f
  6. {& |: L7 N5 D: Q6 D$ t
  7. g_print ("Hello World\n");  l$ a7 L9 M/ D, E2 L, f! c
  8. }
    , c& f5 m7 x# l& {+ I
  9. ; P* ^4 {5 I% z( l$ |+ Y
  10. static void
    , X" D7 j% Y$ R6 O; |! r/ I
  11. activate (GtkApplication *app,$ E) Q0 D" F' R6 W2 a
  12. gpointer user_data)
    # ?) g% y4 [! z) m
  13. {
    # }" V) w3 \; ?1 `- k- d8 N
  14. GtkWidget *window;+ T/ Z. \/ g. F  ]6 }4 \
  15. GtkWidget *button;
    4 W' U& `! I2 A$ p4 h# y. l2 I0 p. |
  16. GtkWidget *button_box;( v# c* O5 G! ?
  17. , p+ e: l4 @% W0 c; G
  18. window = gtk_application_window_new (app);/ y. @, I  ^5 Z, t% C6 l2 t6 }
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    % \4 O( O& N( k* N2 K
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    , }0 ^$ J7 F: n7 G- v; _

  21. # `7 d, `- e; |2 w
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    ( X6 a' f9 I: [8 h- E$ ?
  23. gtk_container_add (GTK_CONTAINER (window), button_box);- K7 @3 [2 C/ b/ W5 [& Z
  24. + L! F3 U7 n1 s6 A
  25. button = gtk_button_new_with_label ("Hello World");3 H+ i! D# q+ O# j6 o
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);4 X% w& w* O1 g' U! g
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    ) K7 w+ p/ W( B( w) k4 ]% ?
  28. gtk_container_add (GTK_CONTAINER (button_box), button);
    : l. w& x, D+ \2 c

  29. ' C8 T  x8 X0 _. V) P- f- b* W: z
  30. gtk_widget_show_all (window);6 _: w3 X$ a( w3 V$ j0 G
  31. }
    6 z; Q- Z' N" F) j7 T9 u

  32. " j0 p& c# c( C' Z1 G" i/ k
  33. int
    " ^1 [' f9 l% I
  34. main (int argc,
      N) ?: ?1 r  D( R, L" [9 O0 {
  35. char **argv): B* V+ T' Z, [4 ]! l/ Y
  36. {, B: c) Z0 j1 l( m: w5 `  s
  37. GtkApplication *app;  y' I9 G6 w) l- j( V5 P" s4 ?
  38. int status;
    ! f+ Y7 L/ y+ r

  39. 3 h3 @' Y: S& ?3 F. M5 t& \8 P$ d. v
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);) P& m; d$ c  _: Q) g& s0 E
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    & z( g" k, G& [6 N. H
  42. status = g_application_run (G_APPLICATION (app), argc, argv);
    : h7 t! n! t/ o8 L/ n4 y
  43. g_object_unref (app);
    % j" r9 U4 Q# L+ O
  44. 7 y2 j" L; R! f
  45. return status;: b% {" L6 o: p8 u6 V
  46. }
    " Y9 C0 g: ~: y- [; m7 O
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  4 ~# r7 X) T0 ~" @& w  f
  1. PROG = gtk_hello_world6 T) R0 r( D: W
  2. SRCS = gtk_hello_world.c
    ) b, {( a. R3 _) L$ S: c2 R8 g4 I
  3. $ {3 F$ d& i( T5 a3 _% C+ G
  4. CLEANFILES = $(PROG)
    ) g5 c( F1 ]3 a  L0 G& U
  5. & Q$ O: ~! D) S6 J
  6. # Add / change option in CFLAGS and LDFLAGS
    - f6 E2 _9 X' ~7 a$ d+ ]6 w
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    9 @  ^* ~0 ?" P. s& [
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    9 m1 b$ y. J0 B
  9. 1 C' r% w1 P$ \) V* x; s- S
  10. all: $(PROG)
    * X2 r3 v3 x4 k' N: @

  11. 9 I3 X' d% r# O$ y* g
  12. $(PROG): $(SRCS)- v# Y$ _& u9 o$ T5 @% k; r
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)' z+ T- x5 s% ~

  14. / L  [) U8 K' t( M- m; Y
  15. clean:
    0 S8 Y) W! ], c& h
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS)), c# d! r$ U( s2 h$ U; R% d
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png 3 P, G8 J$ U6 K+ A! v
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
' [% ~1 p; s" i6 R5 h% M
7 C2 c7 X  o9 ]6 {- L5 T. U * u& ?# m3 m! w7 w( r
  1. #include <gtk/gtk.h>5 E, V6 ?2 M7 P: D9 ?' v" e
  2. #include <stdio.h>5 o! x' v3 S. g% s
  3. #include <string.h>
    ; g3 j7 N( j: V9 X) q0 K5 J

  4. 9 ^4 {. t* e) m3 N; J. P, I& r' A, L
  5. char buf[50] = "";6 z- L( {( ?5 q7 @: Z

  6. : d5 Z. J& K) T+ V: ^) x% A
  7. void calc(GtkButton *button, gpointer data)% b. H& P$ x& |# G& r2 S7 V
  8. {! v, }' B: n& s' E. z% s
  9. const char *text = gtk_button_get_label(button);8 z' V; H$ c8 K1 j+ A0 M" p; H; _

  10. % N* ?9 `8 w2 D, G$ P8 }0 b( Y
  11. //退个操作. V( I, Q8 S, K% X  r( P
  12. if (0 == strcmp(text, "c"))
    1 b: [% F5 ?; i3 t, b& d/ L
  13. {, j% Q4 q- D) \. K) S0 b
  14. buf[strlen(buf) - 1] = 0;
    ; t9 \- I8 p* P( x! C
  15. }else{& F9 \* t; p- Z/ ^9 y( f; O$ i, Q
  16. 6 Q; Y2 ]8 P# M- E
  17. int a = 0, b = 0;
    $ Z4 T) h2 F# n, n0 D9 O
  18. char c;
    # b. e9 K# j( E( @: s; S
  19. strcat(buf,text);% [3 `- ^0 U* v) f8 A

  20. 1 z8 P8 J( r5 a+ c' |4 A& B
  21. if (0 == strcmp("=", text)) {& X4 L& [" e( |' e. \

  22. 4 O$ f0 x8 Q3 P, T9 g
  23. sscanf(buf, "%d%c%d", &a, &c, &b);5 ~, ]* ?0 M, E" o* N
  24. 0 W7 O- ^+ u" O- M/ i
  25. if ('+' == c) {1 b8 u  M# e0 [7 M
  26. sprintf(buf,"%d", a+b);  }" v$ c6 v) q2 S+ y5 \
  27. }
    % a( @, {( W3 T, O" F
  28. else if ('-' == c) {6 s9 U; C( C& e2 L( d  Y" H5 c: S
  29. sprintf(buf, "%d", a-b);8 J! l: p+ M% F' O, J
  30. }. ]- v3 J) y9 K! q8 \0 i9 t: b0 n% b
  31. else if ('*' == c) {4 i) T) G  f- w" A# Q  |6 T2 q
  32. sprintf(buf, "%d", a*b);0 c% Q3 A* z% s% T1 n2 m0 G7 f, f! _  \
  33. }- R# g, _4 v: [
  34. else if ('/' == c) {
    / p: q; m0 c) a* i6 U# J: B
  35. sprintf(buf, "%d", a/b);
    ! q! j7 V0 b% C2 ^
  36. }
    1 j& R# W2 X( J# ?* |. n. ]
  37. 6 H2 A! E+ p0 q; g9 c% I
  38. }8 T, a1 @' w$ ~  l9 A
  39. }: L- G( C) p+ A# \4 R
  40. $ t/ A% }0 c4 N5 n) ?
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    / p- u4 d8 h( f8 @  i3 W/ Z

  42. ( k5 _& G: L2 e; O: a# O
  43. return;
    ' t* q# m1 C: l7 d5 O
  44. }4 _7 ^2 [0 ~9 t3 a# q  c+ g7 w
  45. 3 I* a+ i' x* r9 v
  46. int main(int argc,char *argv[])- r, o: m- a: I6 s0 Y
  47. {
    : M- z" B, {" u1 k* T5 k& h
  48. ( j  }3 w. l: a2 d8 A8 P! k1 d+ E
  49. gtk_init(&argc, &argv);- m2 h+ s; d- z) b) h2 w. q
  50. 8 p- r  D5 W, Z  @0 _) W# l
  51. " H3 A; I( i2 R8 R1 C
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);# Y- o3 m( s' d7 v; }+ b
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    9 N/ V* [7 i7 N  Z/ B
  54. + z3 ?- h& P; a6 ?$ M
  55. //创建一个表格容器5行4列2 ~/ ]- h# |  I) r! m# z+ I
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);+ f) s; x3 P  p6 ]- h; l; Z6 D4 ?

  57. 0 E0 O, _. Y. b5 i, p8 O0 u3 v
  58. gtk_container_add(GTK_CONTAINER(window), table);
    4 L) B8 f% u. O1 H0 d& z3 B

  59. 4 o/ ?2 n; j$ K- g! Q1 v; N0 e
  60. //创建一个行编辑
    3 |3 f# D1 Y% w5 c9 ]5 [6 [0 q: P
  61. GtkWidget *entry = gtk_entry_new();
    ) e6 ^1 S# h9 T+ R% {

  62. 8 F* |0 I4 z' }  |
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");' J7 j- e9 ^( c/ j4 ?6 O; _2 j

  64. & W4 O& h; t# B
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    " R4 H- `% b6 b4 g1 W; q3 z
  66. : B1 }2 \) g2 k) r
  67. //创建多个按钮
    % H; m5 d" c" f& q, ^8 N! y
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    6 F: g, ~$ ]- g
  69. GtkWidget *button1 = gtk_button_new_with_label("1");
    4 c! s( U% U! ^" O* C
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    : ~8 F& c# n% d" F( s( [! r
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    2 v' v  O% N7 A0 N7 Q+ Q
  72. GtkWidget *button4 = gtk_button_new_with_label("4");; v6 ?# E8 a0 l" u$ W3 e- J
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    $ A$ U0 z# t7 w: C- m( A
  74. GtkWidget *button6 = gtk_button_new_with_label("6");) S' _' \0 ^  @0 g, y+ _# |) @
  75. GtkWidget *button7 = gtk_button_new_with_label("7");6 }+ p) B7 m( S
  76. GtkWidget *button8 = gtk_button_new_with_label("8");
    . g! Z8 Y( e8 z+ s: k
  77. GtkWidget *button9 = gtk_button_new_with_label("9");8 g0 J* T$ h" V/ O6 f. t0 C- o( \

  78. " H. D& F2 S6 @
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    ) z# N( y$ c/ k6 e4 z; V, d5 \
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");
    " M+ o- x# ?  b/ Q& ]
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");' f4 n( A9 e! d9 B
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    : Y3 `' i. _. \( T! Z4 n! M
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
    7 N" C- ?% V) Y0 d
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    ( z3 s$ V5 M  s8 W- \* I
  85. ) X# u- z6 q' h* G  X" u

  86. 1 b  T1 u8 G. ^+ h5 A& a1 c; Y9 ~
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);3 t8 C1 q. {# n, l4 _
  88. 1 Q) c! p3 `1 R+ y% t
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    ' \& z6 G; K) n- W7 f8 I
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);% L& a6 f: ^7 f' @0 E/ W* V& @
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);) V+ g; |& r7 I
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);- e, |1 }5 ^1 H% p6 n  S0 N
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);* [# |$ o& N. j# ?0 F
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
      ^$ n) E) N+ Z  P
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);2 j& p) k9 d# D0 K
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);$ ]% `$ Y$ b4 h/ a' F- g
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    + `2 n1 @' O; O6 d" ?: n
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
    9 |( u* i- y% ?+ Z+ W

  99. / i4 g' x. `$ y' m  z* c. s
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);8 Z2 @) ~; L3 O/ g! _: N! X
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);: ?: t8 i: J' N7 n2 Q
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    3 G  H+ I3 p: T: Q
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    6 f" m+ P7 M, `5 R4 V1 Z
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    : k5 G' v+ l/ v3 y, x# {6 O: f
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);/ j2 e7 F# I4 Y8 C
  106. 4 j* _: W: I" ?' q: b
  107. //注册信号函数,calc()7 a7 T, w. I- K& s4 n* z
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    1 v% L! v! `, A
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    0 |1 D/ q8 a' v+ q% J
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    & p( N4 y: S  t$ i
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    7 p) W% n! N6 c6 ?& j/ r  s5 b- ]3 _
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);, v! m4 }6 R. ~$ A
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    " I5 i! x* e! o7 e4 Y
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);' R$ I$ m  Z, G% W4 N6 B3 A
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    7 B. V! h6 Q" m) \8 d7 C' h
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    - D6 v2 w/ O2 C, D
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    - R+ \( }( j% F: X# J0 y

  118. - `7 @8 s# t0 v6 O2 e5 j; S; j
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    & U8 g) n: F4 p: e5 ?
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    4 a7 R- j" ?5 e( q% S8 g) j
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);1 n! Y* n% ?6 |$ G
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    $ V1 z* |- Z2 j5 @! p7 k
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);7 @, A0 Q+ ]6 J: Z* c8 `9 b; L
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    - Q9 J" M. m2 y! d" d
  125. 0 d( M# D) V* ]# E" M) i+ r
  126. / v& }3 p8 K9 P4 L0 M/ J" p
  127. gtk_widget_show_all(window);, h+ T7 y  u2 P  R: N

  128. % `6 K4 a2 E9 C: K
  129. //主事件循环6 T# z+ O4 i1 ~% d' n: {- F8 g
  130. gtk_main();+ C2 K: I) d8 s/ A
  131. 3 l  H+ r5 B( P, Y$ p* W
  132. return 0;6 Y) o8 V# f" n' i
  133. }
    ; s1 b: V% t- |2 D6 W2 b/ z
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
' d3 F  @$ x8 U" G; y5 E
7 m( B6 ?7 K' G  \" X1 S
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
赞 收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
% M/ V2 E0 N( F4 O

所属标签

相似技术帖

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