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

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/,,这个路径就可以,直接继续安装。
" V* C5 |# \+ q7 K8 k. L/ `3 I0 i 1.png
* L1 P% G; U* j  D) ?+ i  O5 g   然后就学着官方文档的样子去验证下SDK是否安装成功
/ D, Q  [2 A/ D- `8 m    2.png
9 O. H! e8 b" k8 o  u
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>1 I' Q) q6 N8 q. a0 O8 |7 `7 w5 h
  2. / e) F- B* i1 J0 Y$ C4 [9 p) W8 v
  3. static void* {! u% @) k# Q9 Q
  4. print_hello (GtkWidget *widget,: h' F% n' _- g2 h( S  |) v
  5. gpointer data)
    # l* d7 N7 x  `) w
  6. {7 f7 K% q* X1 Z2 }! g
  7. g_print ("Hello World\n");' m+ _# u4 T1 M( B, f' g
  8. }( c( _+ l7 K: X/ ]3 s1 c. }3 p

  9. 7 @6 W" ]: V/ Z) x" N* N& P, g  W
  10. static void
    % B+ @# q9 u" i4 t$ X9 Q3 F4 c
  11. activate (GtkApplication *app,& U+ ]3 y1 c" J2 M3 `
  12. gpointer user_data)
    ) r( @# w' ~3 u' K  i
  13. {% ?  S) ^; y/ m6 O
  14. GtkWidget *window;' w5 n8 A) D, P1 n
  15. GtkWidget *button;: c3 G3 G, P! y6 G
  16. GtkWidget *button_box;$ d+ K8 `2 [) a4 @0 `+ G) A

  17. $ i( m! r0 ~9 d8 a) C/ T
  18. window = gtk_application_window_new (app);) C9 N+ v9 \" k$ `
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    - i' ?0 f4 f! a# b! k' F
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);9 Y4 g1 u4 Q6 ?4 Y. }8 y7 d6 J
  21. 8 i; B% J1 ~4 Q, r, \
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    5 X4 O( [# m3 n7 }2 D7 E5 @7 y
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    4 o+ ?- P0 F; I: w4 h

  24. , B: d7 d+ Q' ?  r5 Y1 p
  25. button = gtk_button_new_with_label ("Hello World");3 Y8 k  i0 t0 H' V* l3 r9 y: }
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    3 m, l& ^; X% g3 B' E  i" D
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    5 R& n( k* R* y: _4 [" x8 U' Z
  28. gtk_container_add (GTK_CONTAINER (button_box), button);- A" w& l: B/ s' f  P( e; c
  29. / ]7 e, g9 ?. U" E( F' n' x# Y& k3 d7 @
  30. gtk_widget_show_all (window);2 U3 u$ Z& Q5 ~
  31. }
    5 [, q# [  s* g! O  Q- }1 `

  32. & {% b4 N0 ~4 L- U2 |% f* ]
  33. int
    $ T7 u  O4 s& q1 q. o; S& O+ X1 |7 }
  34. main (int argc,
    ( O9 I$ v9 a$ q
  35. char **argv)1 h: T. J% u+ H4 c
  36. {
    1 m8 j8 N( k- {6 t
  37. GtkApplication *app;+ E3 X- u/ R2 X; G
  38. int status;
      V3 D, K& `; a7 D/ s6 a
  39. 8 g2 d) A& Q  A" h; f8 j$ M2 {( x
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    : k8 H) @4 W7 q! x
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);& ]* V/ {- M/ S* I( G8 K6 P
  42. status = g_application_run (G_APPLICATION (app), argc, argv);& K+ b" F3 U  a7 F4 [
  43. g_object_unref (app);
    9 q: j7 k) o  y! F! d1 K0 |2 X
  44. 7 E# z. J  s# M; |( s
  45. return status;7 Z7 Z3 ~+ a( F# I: U2 B" m
  46. }: s% ^/ m7 j0 B, n+ z# O1 c
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
) |$ e, X3 |( a2 a3 P' s
  1. PROG = gtk_hello_world- m* F  Q8 z4 T( U4 O
  2. SRCS = gtk_hello_world.c3 }  l3 |* x/ c# l' N' R( ^
  3. $ U! y( u5 {" p( X
  4. CLEANFILES = $(PROG)
    6 Z1 u  K" L5 p1 }* x( m- ?1 E/ n

  5. ( S7 K; f# n; D. f  k! S
  6. # Add / change option in CFLAGS and LDFLAGS
    ( v# b: N3 _0 x& }
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    3 L1 k0 H' Q3 j. @; @1 P
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)% H" C; J+ N8 J# b) K1 }
  9. ' m% _+ j; O  ]. L/ X0 E/ p) @! \3 h
  10. all: $(PROG)
    ; L7 B8 d" p# V+ O7 p2 q) [3 j

  11. 2 ?$ [. i# Z3 ^: x9 v- `
  12. $(PROG): $(SRCS)
    8 h( g$ E* p+ \8 |
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)( R& j* x6 `0 ]  N
  14. 3 s: D: T& T+ t
  15. clean:
    & ]  z9 Q, b9 b) L
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))' J9 e# d$ m3 c3 S* S
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png % G, _1 e# L( o! H1 q6 ]
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。3 z6 H- l! K' c+ C

2 Q2 e# |+ ^0 o; Q
  @' Z6 B  b8 S6 M7 n
  1. #include <gtk/gtk.h>
    / f3 m4 A7 F2 r+ L8 P
  2. #include <stdio.h>0 Q4 ?0 @. N& _( w2 p" G
  3. #include <string.h>+ P6 d5 B8 t( H' V6 p# [/ s

  4. 3 [. R/ D* m5 U' o7 j, }- b3 V
  5. char buf[50] = "";; g1 g5 W! s0 X: k6 |7 K
  6. 2 I" [* m4 s2 I) U0 \. e
  7. void calc(GtkButton *button, gpointer data)
    , K& K0 h/ z* h3 ~( ~( j
  8. {& _) C# n- X2 E/ C
  9. const char *text = gtk_button_get_label(button);- o* a9 [& l5 C* K
  10. & D; E$ T: ~4 B; R4 j
  11. //退个操作  r; o& @: g/ p3 |" w
  12. if (0 == strcmp(text, "c"))- `1 l. U8 }5 ?$ H% O8 J( r6 T
  13. {
    $ x+ k% R$ V2 J8 d# \5 c+ b0 T
  14. buf[strlen(buf) - 1] = 0;
    . d- g8 [) R; `* J4 ~+ |$ R6 g  K! ]6 j
  15. }else{$ b) ^/ z! |9 n1 j( J! m: b+ W
  16. - V* [7 v' x, M# d4 T
  17. int a = 0, b = 0;' R; v  E9 `  Z5 t
  18. char c;0 D+ v" p3 M& N, N7 b% P: g
  19. strcat(buf,text);1 q1 P0 O- [; c+ L1 ~, p

  20. 9 O0 H0 \- N* y3 c1 b  P
  21. if (0 == strcmp("=", text)) {" g, g' ~0 }) c7 l( }

  22. % a$ b( |. f3 g+ |0 \) }6 e# w
  23. sscanf(buf, "%d%c%d", &a, &c, &b);- c: ?/ ^3 S5 _5 F' ?1 w

  24. % t$ l4 Y* a1 v. x) p. J  e) R
  25. if ('+' == c) {) ~; @3 h* I: {* K- O
  26. sprintf(buf,"%d", a+b);
    * O+ P0 l% \  \5 G! f" J) u: Q
  27. }
    + U9 h. r8 r$ c$ e8 ?2 H
  28. else if ('-' == c) {4 W1 x& @( F6 j1 I& t
  29. sprintf(buf, "%d", a-b);
    4 }4 x: H8 F& T2 c3 H; {
  30. }5 l! d/ l6 f1 b! ?% O0 M
  31. else if ('*' == c) {
    2 A4 U' r0 {- _4 [; |
  32. sprintf(buf, "%d", a*b);
    0 ~  M/ c4 r5 ?1 @" u0 h/ y
  33. }: i+ \& z0 ~; O3 G- C7 _# r8 K
  34. else if ('/' == c) {# M9 P3 `9 i* Q
  35. sprintf(buf, "%d", a/b);
    1 h) v/ H' z$ b
  36. }
    * n; d- Q1 P; S0 w- V
  37. 3 j' @2 i* e9 o5 ~. E
  38. }
    5 e; V3 D' s4 S6 x/ u+ |: K' J
  39. }6 E7 a1 z7 v- V! W0 b' Q; \
  40. & d6 Q4 V  ^& d* _) z. J$ p
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    . H1 X: W, {" |' C! d, q
  42. ( ?1 P" b3 F( G
  43. return;1 P6 N, P* n, X
  44. }9 ?2 l; }  {: h# ]
  45.   f' I' {6 a0 ?0 u# {* H& ]% P9 p" L
  46. int main(int argc,char *argv[])5 O" m3 ^/ [; a. o
  47. {
    ) P, }4 |# B- a' ^. V$ t

  48. + y1 \( J% ?; @7 k. c5 ?
  49. gtk_init(&argc, &argv);% U% e# L3 S& X3 a! z, {& ^
  50. 1 ?* t/ A( ]. O; Q9 _+ n3 c; q
  51. 3 E5 V* I+ K5 Q" X. P) ~9 f
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    6 n* H! R9 X7 q& O
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");: K' v# Z+ l1 r0 g
  54. & l" Z/ f; [) K+ ~9 H9 [/ A
  55. //创建一个表格容器5行4列
    ; Q( v4 H' g; I7 O" H
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);. m( ^1 ]6 F& y8 o5 g
  57. 8 u* x, p0 ], e4 ^" H$ v) J
  58. gtk_container_add(GTK_CONTAINER(window), table);4 x( X+ C% P( q* m9 i5 C: o

  59. ' a0 B& o8 b5 i( g
  60. //创建一个行编辑% _$ z9 Y% V- ]- q6 R
  61. GtkWidget *entry = gtk_entry_new();( H& A, S  t: Z5 v! r; K$ T

  62. 0 w% ^# Z* t+ B7 W
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    : E) s2 N/ i0 l6 Z

  64. 0 ~$ R9 X1 j. t& ?% h8 Q
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);0 [+ @  T  t6 ~( J9 U
  66. 6 M+ _' f3 l* u
  67. //创建多个按钮, o! F3 ^7 J2 Z/ }2 @
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    0 n. e5 t# u' H7 P: {8 A% U5 L
  69. GtkWidget *button1 = gtk_button_new_with_label("1");
    4 V$ p6 w5 m5 o4 ?- |
  70. GtkWidget *button2 = gtk_button_new_with_label("2");/ O: {  v% D) o
  71. GtkWidget *button3 = gtk_button_new_with_label("3");# S" e- A3 x* ]8 e& E" k
  72. GtkWidget *button4 = gtk_button_new_with_label("4");
    , E8 m: L$ p4 B( k. n% X5 T
  73. GtkWidget *button5 = gtk_button_new_with_label("5");1 t7 u; v  L1 J; R% e( Z
  74. GtkWidget *button6 = gtk_button_new_with_label("6");# {# ]7 h, Y9 {, C5 e: E" L
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    2 r0 F) i8 E. W& K3 _3 j, ?
  76. GtkWidget *button8 = gtk_button_new_with_label("8");
      f! a0 X* P/ m, b' A" x
  77. GtkWidget *button9 = gtk_button_new_with_label("9");
    4 x7 Q9 Z2 B) P& W, n

  78. 3 u  n, v$ p; r' s2 c
  79. GtkWidget *button_add = gtk_button_new_with_label("+");% O- g& H+ [2 Z0 R; Z7 x
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");; r* ]; `! ]- ]  z7 V
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    3 Q: A0 g+ @4 a/ P6 n7 d) {
  82. GtkWidget *button_div = gtk_button_new_with_label("/");; X- m( q) a; N7 e" a6 i
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");" k6 [* C! W- x8 F7 T0 @
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");) d. E/ \$ m- z* l& B0 P* d3 G

  85. 6 a7 G/ K1 H3 L+ s' }# t

  86. 6 a6 i9 m2 n% {* G0 @: |8 Y+ \0 f; r
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    ) _1 g% z$ Y& q8 K* a9 }
  88. - @/ F2 [8 W8 Z& ~; y# d6 y' ?$ t
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    & r7 w. E8 @+ i/ {5 J3 o9 \& ]
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    ! y6 R. [) \( d, B
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);6 ?  s! X/ L6 d9 z5 z, A, ]8 f
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);2 @1 }% |: R) b' g- ]9 p. o
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    # p3 s( \) A" E6 z; `- h# G
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    % D& d6 I' G2 v  u2 {
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);7 }" i# h7 t9 c/ l+ g' W0 M0 ]( D
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    * A1 G5 _+ I. Y# o
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    ( j5 I8 c" x4 F% W
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
    4 }+ _3 ~$ h8 x3 N
  99. ) G  Q. r+ f. f: s3 g/ I  q
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    # B- O  o: k, D4 O
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);% R2 P  t5 o0 ?
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);# t! r4 {- R+ Z- ?# e  Q# d
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    % r+ P" E$ i" m4 y- ?! v$ w" `: x
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);/ m5 H' g  }* K* S+ G+ m2 b
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);6 Z- z7 M  p# |! g# s8 f% x
  106.   n: _! @! x6 C
  107. //注册信号函数,calc()! ?" R( d5 R8 B% {. A
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    5 Q! ]( x) ]7 H) ^8 z
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);% Q3 m. T& J, B* _+ X( M
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    8 u3 A! P3 W+ n3 `( j. c
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    5 U2 H3 V1 T7 q
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);$ t% g$ g) ]( R- [: E
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    0 N- a) _5 @0 u6 l# N
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    1 y$ V$ ~( h0 b8 G
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    % z% F/ i6 s( Z7 Y+ @6 X
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);$ ?6 A. [- k& I0 X) I0 R
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    + x4 m/ ]  I2 k: o) l0 _, O
  118. ! ]- A% y2 ^& d- r9 [
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    + j5 D, {6 c0 v+ Z. h+ X
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);  |; ^8 y; n# H" k  C
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    ' w. j' V& o; E$ W1 i4 N# w
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);7 _/ x6 W  z% t
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);7 \  w+ d6 ]/ _4 _6 E7 I! j
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);/ ~  Z5 ]5 P+ }$ s) m

  125. . B0 [) f6 K1 i# B3 L" r$ }

  126. $ d6 D8 ?' v' u  H# ]7 t+ E  n
  127. gtk_widget_show_all(window);
    7 X* `3 Q9 e6 m0 g7 U) i3 K
  128. & n4 h" B3 @& A, @7 ^; E, C
  129. //主事件循环
    * v  y3 C2 m& E1 y
  130. gtk_main();
    & l- T: _) {3 t2 i; y

  131.   T% a) J( V+ w0 B
  132. return 0;1 ~6 F+ ~9 K" w& w- k4 V6 H1 G
  133. }
    ( q- c  H5 c5 N( ~6 T
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png   r# k0 Q1 i" t" n& T

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

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频1 V% h7 c3 r/ T5 S" ^8 O

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版