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

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 ]  r; {: H6 ^0 m/ @! b 1.png / i2 O: x9 i7 O7 X; }% r' |
   然后就学着官方文档的样子去验证下SDK是否安装成功
1 {; T" L3 [4 F8 Z, r. S* K    2.png 9 J7 N" L* D1 V5 X9 ^
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>% y8 P4 g( t' U3 o4 q3 V0 u) t; _

  2. 6 s3 `1 [6 x; W* V
  3. static void, U  @7 ?0 f+ G8 u& R8 w/ M
  4. print_hello (GtkWidget *widget,
    + a0 o  k7 V- N0 z: x) \
  5. gpointer data)" ~, L- s/ ?: v
  6. {$ g( G1 O' @# X" ^
  7. g_print ("Hello World\n");4 I  E/ ~: g1 D# i& `
  8. }
    0 ]4 [5 t% C- e) y2 e

  9. 3 _' d  G+ ?3 x: P9 A* m
  10. static void
    ( ^% @5 Z. D5 K! [: y
  11. activate (GtkApplication *app,3 G9 l% T" g2 M  I8 V' c8 \
  12. gpointer user_data)  K" l: ?$ A( |" q' O1 l
  13. {
    : Q' B3 H0 b* k2 J$ x/ F
  14. GtkWidget *window;
    ) Z" m) _4 B" N8 E2 l
  15. GtkWidget *button;
    $ p4 w! p( I% Z. W+ w. K' I: m
  16. GtkWidget *button_box;& ^$ m  N6 _; w. E) c: C8 u& e
  17. / d8 r- t  _# O$ V
  18. window = gtk_application_window_new (app);# y; @7 E; L  t; c, U* v
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");1 H3 j& P2 W5 U
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    % k1 w% u7 P) z5 o/ q
  21. 4 {- y! J$ x( E
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    0 h# b/ S. ?7 q4 C
  23. gtk_container_add (GTK_CONTAINER (window), button_box);/ S: A3 ?( b) s& ?, T
  24. 4 I* X% @: D) s0 O- n5 u5 g
  25. button = gtk_button_new_with_label ("Hello World");
    ' F+ w. _3 k' _+ p  X" N! Y
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    1 A8 }: b7 z1 |  L9 B9 o) k
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    0 m# T# L( p# U. n7 p+ i: E
  28. gtk_container_add (GTK_CONTAINER (button_box), button);
    % J6 F! b% F0 e8 f

  29. ) C/ R; d) k' o& E% o
  30. gtk_widget_show_all (window);& e: d7 S! x+ w4 B6 t* i8 Y
  31. }
    4 \- w# N2 L" w2 O! Y% v
  32. , q0 f4 K7 v" H9 d6 w% C3 Y
  33. int
    3 L9 {" B# C4 R
  34. main (int argc,
    ( J6 @6 o: e" a: M- y$ e$ o
  35. char **argv)* t+ o% e) M2 }2 [
  36. {
    6 z6 S+ W  d+ q* I; z) B, L: o5 y
  37. GtkApplication *app;  Y, H3 U' }+ D, C' G* X( k3 X! u
  38. int status;/ v; \2 F' p" S% f6 H
  39. 8 D3 E9 h. q7 \: r
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);+ G  \) q; M+ G; ^5 e/ a3 t
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);) s% G/ ^& p6 h9 |# j
  42. status = g_application_run (G_APPLICATION (app), argc, argv);' Q  A0 W; f# |' \# \2 J9 L' `
  43. g_object_unref (app);1 x( ^$ Q% L  n: c

  44. - D7 a1 ]4 _7 i5 z
  45. return status;5 D8 b% t- o" [" K9 S1 D+ Y5 V
  46. }2 S1 w! o& ?4 n
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  3 B, e7 m0 S/ j: c6 j
  1. PROG = gtk_hello_world. Q5 [) `1 o( |- {- x
  2. SRCS = gtk_hello_world.c& M6 D' \# Q1 ^2 ]* b

  3. - K, t+ E& ?4 G; t( F" O
  4. CLEANFILES = $(PROG)
    + O2 o* p5 v1 G; r  e
  5. 4 n( S# k# c: x5 h  @' H
  6. # Add / change option in CFLAGS and LDFLAGS8 U, I5 a. K! t* f! @
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)2 z1 E; K# x* P* q  Z- ^
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    ; q  M& {# \; ^/ n
  9. ' O. H7 {, C: K$ p8 q
  10. all: $(PROG)% f4 D& Y! G  [8 m( M
  11. " ?2 f% Y; N9 ^
  12. $(PROG): $(SRCS)
    9 w* e( A' l! Y+ ~
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    : E$ w3 D. F; t
  14. % g! B  S2 L+ |) G
  15. clean:
    ! B5 H# T9 R) N  c. d. x, e% J& Y8 c  a
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))8 _* t- l  i6 s9 j
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
7 o) U+ K7 r  T8 Y# ^7 ~$ Q
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
. D" h4 n$ g3 {
# X6 W9 U8 u9 F4 d# u" Y* P0 i " N1 F, K0 l; S3 ~6 W2 ?# n% Q
  1. #include <gtk/gtk.h>
    # o2 `9 }# S$ o6 B; O& Y& K
  2. #include <stdio.h>- e3 c$ u1 O0 G6 {) f
  3. #include <string.h>
    - {. q% C" o2 Z, z% N

  4. 3 v8 X% e4 P4 R+ O8 v# E
  5. char buf[50] = "";
    7 t" u/ t; |1 f

  6.   m% o- o# k( y3 r& m2 R, b* ~6 q3 z
  7. void calc(GtkButton *button, gpointer data)
    - r' R1 W$ ?5 J
  8. {
    - Z0 q" z& c7 A8 t: U
  9. const char *text = gtk_button_get_label(button);
    6 s, j7 X4 ~4 }1 P: |' S2 W
  10. 0 R* F+ `. A% c5 v
  11. //退个操作
      l0 A1 ^% W% N9 U  ]% n. x) h
  12. if (0 == strcmp(text, "c"))! S) p' x" _, ~9 Y+ P0 x5 z. p
  13. {
    4 Z" o" K: g) ^/ y1 r( I  _/ z& f7 v' `
  14. buf[strlen(buf) - 1] = 0;
    + e4 D. n. c& b+ Y+ p1 h
  15. }else{/ W# |- y; w' W% a5 ^+ \

  16. 2 ~, B! v2 p. L% n4 a; n
  17. int a = 0, b = 0;( e% N- u, i9 J# a& r$ s' s$ k, z
  18. char c;4 t- c, c# U( C" b) L" J$ E
  19. strcat(buf,text);1 a: s8 q( t$ l/ ]6 Z

  20. " a7 ]' B; k4 n' \6 r9 D+ f; c
  21. if (0 == strcmp("=", text)) {* P5 N% [( L+ B( Q$ l# c

  22. . \3 G' R* b3 B: f
  23. sscanf(buf, "%d%c%d", &a, &c, &b);
    4 W$ o5 p  ^; t; f% U4 Z; k

  24. - F- |$ }) j" h/ m  M7 e2 w- p% k
  25. if ('+' == c) {* Q& _2 [1 O2 y. [# _2 Y+ Q
  26. sprintf(buf,"%d", a+b);4 A$ t6 M8 F# w' R; d
  27. }
    ) G/ J3 n$ ^. j" }2 E2 k
  28. else if ('-' == c) {4 F  f: ?% D7 }* G
  29. sprintf(buf, "%d", a-b);. c: ]  J1 F! e
  30. }
    2 c0 i: y4 c6 C: Q6 @1 F4 I4 [+ p- [
  31. else if ('*' == c) {
    ! V, S* W2 v# e4 Y3 q4 x
  32. sprintf(buf, "%d", a*b);: Y1 M% J$ ?* B/ _  q, J
  33. }
    $ @& W( U; |. _( h
  34. else if ('/' == c) {5 O/ G4 W, e: P0 @$ F) j5 t- ?; \2 p
  35. sprintf(buf, "%d", a/b);
      Y6 ?: c; i) u6 y* F4 y
  36. }
    ! |1 s+ B5 ?, K4 T' {; ^

  37. - e0 ~+ t0 F+ k: w
  38. }. L/ W, U# b% g# y
  39. }
    ' ]( n; i* G+ C9 Y
  40. " ]  }3 U4 @2 o# Y, @
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    1 r( ?2 n5 t9 S, q' {7 O
  42. ' _2 Y2 H% I8 {! p) W
  43. return;: _1 j" h' B3 V! G' }( i- w  u* Q- R
  44. }& Y; X1 }9 v- I/ z; T( @
  45. 7 D/ i2 S) ^3 s5 v6 k  A$ g6 a  u
  46. int main(int argc,char *argv[])- b# I& o* a& T6 _8 K
  47. {/ Y/ m# ~$ ]/ \+ e

  48. ; H2 y5 y# C% J) I" Z
  49. gtk_init(&argc, &argv);& B% m2 j7 l9 V1 {1 I

  50. ( n& N" H! ^. i

  51. + z+ R( r2 R% j  c* O1 `) n
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);6 Q6 l  @( j% Y+ [9 N
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    $ u9 I4 _5 x9 _" `" u

  54. ( R. V' X, w% m9 E# }
  55. //创建一个表格容器5行4列# ]) N# M0 j$ J' [
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);' N, ~- Q. z# y% J  N) p: J* G
  57. ( M4 Y6 d; X$ c# U; _) f
  58. gtk_container_add(GTK_CONTAINER(window), table);" G1 N* F4 l- p! ~( c1 A2 ~' ?- s

  59. 9 b0 U* C' B3 U1 g6 D; H; }( L8 B
  60. //创建一个行编辑
    ! v8 Z; f- f8 L* C
  61. GtkWidget *entry = gtk_entry_new();
    9 ^* j- y% x/ S9 ]) q/ K9 ]

  62. # P' Q& _7 o/ O; d  ], |8 \( s
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");! D* [$ x; A: u; Y" }7 Y: ~6 K
  64. 9 J" U7 J# ^6 v
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);& \- `; o' p3 w6 r; t- g9 {( N

  66. , d9 ^( w% C5 K9 Q
  67. //创建多个按钮, B: ?9 v+ @( U9 V
  68. GtkWidget *button0 = gtk_button_new_with_label("0");' G" h7 j0 k9 o
  69. GtkWidget *button1 = gtk_button_new_with_label("1");) R) I' Y$ R6 W5 y- B. `, i
  70. GtkWidget *button2 = gtk_button_new_with_label("2");4 ~4 h; a2 e2 X) ^
  71. GtkWidget *button3 = gtk_button_new_with_label("3");3 U' \! s! ~6 n8 ~% G& u
  72. GtkWidget *button4 = gtk_button_new_with_label("4");3 [0 p0 g; u! C, n$ {; C5 I
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    8 W/ m" g0 S" ?( ~# d5 ^
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    ; {7 \6 }2 ~- Q+ c. f6 ~  S7 N, V! y
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    5 l  J4 g# }0 A6 D; A% m6 x
  76. GtkWidget *button8 = gtk_button_new_with_label("8");6 g* L9 ^. h7 r
  77. GtkWidget *button9 = gtk_button_new_with_label("9");0 s9 @. t4 Z, {" K. m: ~

  78. 2 |& X, l& A3 `  B
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    6 E) s& ?  G) W* v. Z; H7 \
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");1 ^5 ?5 |; ^$ i, b" b
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    * @0 w* _  }& a# [, M( }( A
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    % A2 u4 F9 V' e" h& f- K
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
    6 t4 o- K" m5 P, n8 p! j4 d$ I% n
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    - h! D4 d' K' V  S  D
  85. 5 i, \( v; N, b/ S
  86. 6 X' N' W( [. i
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    2 q) M- U5 x9 d* w

  88. # l6 Q: Y6 F# ~' H" H1 d
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    / Q, \$ S/ O3 @* h$ ]
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);5 `$ a4 y$ }# z% x% u% J
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    ; |8 h: n5 h- j1 A* y
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);/ Y$ M- u4 C% r0 r
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);0 G; k+ y8 H" x. t$ B0 m# z' ?7 N
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);3 n- {  X. i% S  H8 I
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);! A( }6 _( Q1 G0 b. _+ w. \
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    " c) W( h3 ^. N$ D, u- I
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    % t9 ]. ~7 W& p, f% w" j
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);( P2 [% i7 L: |, g3 G) G
  99. 9 ?& O! \- G, p' K, J  q
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    : v7 M( ?: `* Z( s" h( L; _. O
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);6 b2 u& r5 ^" ^: ?( Q7 f
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    . @( \1 J) w- `4 r' P
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);& h4 s9 R; n1 S+ ~1 U- k; i
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    - b; `6 O2 f" a1 S% ?
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);2 e5 F4 w5 Z0 o
  106. 6 A$ X6 V' X3 l  R
  107. //注册信号函数,calc()
    " \  c' k  H& C- N
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);0 d/ |2 B! ~8 c% v0 e1 t1 L+ J( }( q6 N
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);5 A( Y( b* ?# ~2 G; E
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    ( h" i0 I( s, S1 t
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);7 C7 U/ ^- _) [+ J
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);' J+ _  e$ e( Z8 y% ~
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    5 ?" T8 I; M1 p3 ~/ M9 O
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);4 R# G. h) y: ~9 G9 }( i
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);. d! f! Z' b# q8 P- k
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);" ?+ e* @4 k7 a# p1 ~! K' p
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);8 Q: d, g0 w# D
  118. 0 H+ d: w, \' S! x9 \
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);1 y; D. c5 b# C. C, N1 M
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    5 _9 g. [" k5 V1 S
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);% c8 n7 b, n8 h  Y2 P! A
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);1 i! d: q. B8 I; M6 L
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);. T+ Q. |' x7 |2 J- }5 V
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);" n, f8 h& ^+ I4 x8 o
  125. 3 r% Y8 u$ ^3 B; W+ F- ^9 @

  126. 8 g! d2 ^  c8 r5 n9 x0 ?
  127. gtk_widget_show_all(window);
    - }3 ^8 K8 U# E) y( k3 H- c
  128. 1 o! _( S( o) w; I3 ]0 G- L7 Z& B0 l7 S
  129. //主事件循环
    * e/ ?" x) J/ a2 f9 Q" i1 `" N
  130. gtk_main();
    0 g# v" R, C7 S: T% G4 w& D6 {
  131. ; x* J% ^4 F- n  o! h$ [
  132. return 0;
    2 _1 E0 q7 R' d  q" P- ~* t
  133. }
    3 H, T" a/ s" c, y
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png % `7 B1 R& j1 d. O. Z
; s  a  o( N' R( M
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
" O) ], K. I, z" k) K7 j  [

所属标签

相似技术帖

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