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

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/,,这个路径就可以,直接继续安装。* r# L9 @  L7 D% G' v8 y* Q
1.png
/ h' g9 K1 t4 v; @   然后就学着官方文档的样子去验证下SDK是否安装成功
& a2 y2 O0 I1 K; y; p8 W# x    2.png . ]) X0 y& O$ b1 @$ |) s
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>$ J, R7 W5 W; d& `* U2 n

  2. ! _" X3 p$ A  m+ l7 H+ \; W
  3. static void8 S* F6 b8 ]$ y3 U0 k) [
  4. print_hello (GtkWidget *widget,
    6 L( ^. g- \2 m
  5. gpointer data). H; \$ K  k% A% j- _3 |' q
  6. {
    % V0 e2 P0 O! [1 A5 e# h$ w6 ~
  7. g_print ("Hello World\n");
      W4 _! E0 u2 P; i  \" `7 z3 f8 E% I
  8. }
    ' ?& z7 ~% j5 L2 E
  9. 0 k4 w) q0 a5 i8 N' a# l
  10. static void
    / I0 I6 Z. N( K3 _, c$ X& p3 B
  11. activate (GtkApplication *app,  V2 ^3 m2 t3 p2 |
  12. gpointer user_data)
    " ?8 A+ T: `1 j/ _3 A8 y
  13. {4 O( ]6 X3 y. a) K& X/ ]
  14. GtkWidget *window;
    ( w# m7 @6 @) `4 m, ?: L
  15. GtkWidget *button;
    ( \0 X  E5 l  ?1 V( R
  16. GtkWidget *button_box;
    ; K7 u. Z) L1 w$ x$ i' t5 n; p$ m

  17. 7 `% q. G- e. d8 d' g
  18. window = gtk_application_window_new (app);1 C# G+ V) {: m) `6 `
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");. R- F$ R. O9 ]( H
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);' d1 Q4 m* p) r; C4 J/ M$ c
  21. # }3 W: {% N" i  H
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    3 u1 P. }! W6 t6 z! ?$ k' r
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    . @% z  u2 w: U' ~' U4 [3 M2 e/ u

  24. ; o- q" h2 E) a& [5 P
  25. button = gtk_button_new_with_label ("Hello World");" S/ i8 b. ~! J' k4 W! f. `
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    " }& S7 Y/ z' N( s/ y. w
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);( L3 D  ]2 D/ G2 r. G- p' T; M
  28. gtk_container_add (GTK_CONTAINER (button_box), button);. G7 j. S+ i2 r6 [

  29. 3 y, o2 L; N" `7 C
  30. gtk_widget_show_all (window);
    " ~4 h7 y, E* U8 e" \1 I5 z1 q  p8 V
  31. }
    7 p0 I# f: k1 }

  32. # L: Q# j2 P: G3 p
  33. int* _6 K/ {" p; X% N( w( ?0 O9 A2 k
  34. main (int argc,+ c. j6 \  a* j! X6 E' O
  35. char **argv)1 Y9 j- R5 Z; D1 Y! ]
  36. {
    5 O% u2 g1 S9 ~. m2 U
  37. GtkApplication *app;5 j) \7 P- t6 a+ K# i
  38. int status;
    # u# w6 G. Z  E5 l% G7 b$ O. Q
  39. ( u: E& Z9 l5 c% A( R0 n" r. }
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);( z/ t$ l- Y3 P7 ]3 u
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);% _/ |8 {3 ^( q2 g1 D8 j
  42. status = g_application_run (G_APPLICATION (app), argc, argv);: X& n- t6 M9 @: S( l# \5 E
  43. g_object_unref (app);/ {6 }" R. u- L5 g& ]1 S

  44. # A/ Z" ?9 j0 |! R( B$ h; ^
  45. return status;8 S$ S; a  A. o' w. ^
  46. }
    ' K0 s2 ?3 h  X3 I
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  7 }) L# B( o# j+ v  {/ P# u
  1. PROG = gtk_hello_world
    : `' a/ M9 F5 d) Q# m4 z  ]
  2. SRCS = gtk_hello_world.c
    ; A+ h/ _  y$ ?- s( \( s

  3. 1 I- Z- b/ l! i. }0 {! a
  4. CLEANFILES = $(PROG)' z  [( g8 B, \! U

  5. - L2 x" x9 e2 u' H
  6. # Add / change option in CFLAGS and LDFLAGS
    3 J. \( @( m6 f2 K
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    & }/ v8 V6 E$ G7 c3 v! W: C5 P
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)6 _$ D  x! p5 C" L6 q7 {0 {* m
  9. 2 `& |% x: w- j9 ?6 C4 h$ D
  10. all: $(PROG)6 q. e8 v; o/ ]( I0 L
  11. ) v: v# m( g! b& c1 `
  12. $(PROG): $(SRCS)7 b" [) @; k. U- d1 C: I: a
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    " i) \0 r) A& d0 Q9 g
  14. # m: l" L) u/ [( R9 v8 g) p; p3 t  `
  15. clean:1 R) f; j+ P% u
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))! y$ O/ f/ @3 V( ^# a, h
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png 7 @2 K0 @! f: t  b! v; U
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
+ M2 W4 C. ~: D& _0 [3 S) ~6 N$ h% X1 [% d4 \
/ |* R0 z9 p. m0 {2 g
  1. #include <gtk/gtk.h>  G5 p( D: y/ j; e( k& V
  2. #include <stdio.h>
    0 o4 C& D9 I2 [( D
  3. #include <string.h>
    % Y1 q- N$ N) T9 }3 H7 m0 r1 \7 d

  4. ! ]0 O3 f9 ?) Z! w  V0 A
  5. char buf[50] = "";
    % n" V; ^) b* y+ D7 W# L

  6. , o+ }8 U' j, X- }  W# w
  7. void calc(GtkButton *button, gpointer data), y. k0 X' p) j+ o1 c/ A' x
  8. {% u. G9 L3 _' _# `
  9. const char *text = gtk_button_get_label(button);
    , i% t$ i% I2 U( o* V$ V, {
  10. 2 v! T, A* w2 A$ K( u" F
  11. //退个操作
    - Z$ j' g4 j' b+ \' Z
  12. if (0 == strcmp(text, "c"))& {0 i% m1 i" f
  13. {
    ! M6 t. Z) l: t. [+ Q
  14. buf[strlen(buf) - 1] = 0;
    8 h& _: i9 Q, @, ^8 a
  15. }else{
    . {% N3 ~; a/ t$ X
  16. 1 P, F6 Y- `( a
  17. int a = 0, b = 0;) A! N' g. n; M
  18. char c;' Y5 C9 r" Q) ~) Q- a0 |) u2 Q
  19. strcat(buf,text);
    ( j8 _% y" \$ k& |3 r' Z; n* t( ]9 n

  20. ( V7 @8 i/ g+ @) _; \! o' Y% t/ z
  21. if (0 == strcmp("=", text)) {
    / B' f# E- u- u4 j3 H6 a% g
  22. 7 K) m2 S1 V; J# j3 H8 ?: k% }
  23. sscanf(buf, "%d%c%d", &a, &c, &b);+ ]6 N+ r5 z# n
  24. 5 r0 v6 k! w4 d
  25. if ('+' == c) {
    6 t3 P7 F( \' }( s
  26. sprintf(buf,"%d", a+b);# @- y. y- {& J
  27. }
    5 x. e; a6 \5 ?4 G
  28. else if ('-' == c) {
      Z* W8 _2 D1 w" U1 M
  29. sprintf(buf, "%d", a-b);
    % N: S, K6 i- z! ~5 P
  30. }
    1 I+ d& u* A% X" s- I
  31. else if ('*' == c) {# B. R9 q! W# k0 A/ I5 @
  32. sprintf(buf, "%d", a*b);6 k& j% {- R) [' o& j; I+ C& M
  33. }
    7 D0 L8 `; b% T( I" ]/ a/ w
  34. else if ('/' == c) {/ L. P) h- Y/ K$ A
  35. sprintf(buf, "%d", a/b);
    ! Z6 k# I* E/ m6 U- c# N0 S( N# c
  36. }
    2 A0 ?0 ?: q, O# d  G

  37. 1 A. U5 C" E7 P3 g' f" i# g. x+ q- B
  38. }3 W4 y5 C( L) R" N& i& @; B
  39. }
    / V. y- Q, o  ~& r9 w3 q- Y2 i( h- n
  40. 2 Q5 K+ ~: f8 p: G1 @8 R
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    ' Y$ F9 N6 {5 y% K$ W$ z- v3 W

  42. 5 P. e8 y: ]# g/ r
  43. return;
    0 o+ Z/ p! d2 ~9 v
  44. }( P. S. Q- \! O0 j9 Y3 |& G( L
  45. . F2 Y: |" P4 ^
  46. int main(int argc,char *argv[])
    1 i8 K  `" o7 i7 H, q/ [0 n" `
  47. {( V0 Q% P3 @/ U4 ?1 d
  48. . M% y1 |* `4 S  E
  49. gtk_init(&argc, &argv);" @4 a3 J0 q. y5 n
  50. ; f4 q" @, z  l6 Y9 T3 x
  51. : z" j- X/ ?: K5 v) Q
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    - W3 e; X) X, R8 k! C' u0 y0 _% |
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    ( R; D+ ?$ ^2 w4 S

  54. 3 X+ |3 {/ ?  K" j0 E
  55. //创建一个表格容器5行4列, @7 v* }, _" m
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);* s9 N$ i+ q9 D& l& I" Z
  57. - `7 p. u* [4 D$ V/ J/ _
  58. gtk_container_add(GTK_CONTAINER(window), table);
    1 C  L$ i# ?" y3 t: G5 n% p' n4 A  B

  59. 8 C; j$ p3 B5 x7 T, w
  60. //创建一个行编辑
    . [8 e# _1 X6 b7 a. T
  61. GtkWidget *entry = gtk_entry_new();0 V* z/ a' {: W  D& i2 U" g

  62.   _" k  N  N, P# b) W7 c
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    : X' p# k" B" g& h, U
  64. 5 v) W. S9 o, Y# q# e6 `3 ?: X
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);- h6 W* C+ M% W8 n3 K

  66. - }8 Z# @1 h, {; r1 F
  67. //创建多个按钮3 D; }5 o1 C1 z8 A! W
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    ( O7 F/ E7 f1 d  w: v
  69. GtkWidget *button1 = gtk_button_new_with_label("1");* T% A7 `7 j% O, w6 r& J3 L, i
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    : Y9 X9 A( A( K" L/ z/ c
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    * x" S7 k$ f- [% e& k/ L
  72. GtkWidget *button4 = gtk_button_new_with_label("4");/ D: N- v! }7 q
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    . O( m8 n/ ~& f7 A+ L$ {
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    ) v3 Q5 J7 I* ~: v1 A5 \
  75. GtkWidget *button7 = gtk_button_new_with_label("7");6 ^  d7 V' x: |+ A
  76. GtkWidget *button8 = gtk_button_new_with_label("8");& u) l0 h! q6 d
  77. GtkWidget *button9 = gtk_button_new_with_label("9");7 s6 `& ~% S2 {  t

  78. / F2 P6 S+ n9 ~8 u5 ]  L0 q/ ~
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    , b( y. d% B- D8 ?: C
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");
    0 Q9 q; \( s5 J# M! g# X
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    6 v: y+ l' R, a$ p# W. k: I
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    " m, Z4 t5 T  s4 n) n6 w
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
    2 k7 ~9 L; o- T, g+ \& J
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    + {) G: }; Q+ t
  85. " v5 q" b% K# H8 I2 e7 {

  86. - Z4 p2 ~1 C6 o& ~4 o- ~+ X
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);+ }  N6 l, ^, G; F7 L0 i
  88. 8 X% S3 Y, N, L. f1 i6 x0 N) c
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);! Z; Y! n9 t; O' }$ ?
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    2 J$ A& p! `, p1 E
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);% Z: \4 A3 i- l* L) }0 j7 e
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    ! \1 p: W1 m5 B+ m
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    % h1 b) H% I! E& t
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    / l6 z  i  D1 K" x. a
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);& A2 B$ D4 j5 i$ `5 \5 l6 S+ m6 \
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);& _! Y$ M% H; M# ~0 g
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    . C2 N" B. X# R+ C
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);$ d1 F* A/ S) w& K

  99. : |8 k$ t- T; V' \! L/ R0 V
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    , O& [7 t1 ^3 J% A7 L
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    ( j( W6 D% Y8 W! W4 b& j9 \
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);: t2 T3 e; O1 e, A5 [! S
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    - x) w% G- n+ I4 a" Q6 {
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    0 q( H" W& h: g" w/ s. Q
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);. ~1 l. n- T6 W/ I" F8 W0 O

  106. * g# Q6 h% j' {0 M
  107. //注册信号函数,calc()
    + F  m# }+ i. r# O& W8 p# I
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    3 d0 l( ~+ N( C/ u: S4 D5 P' J: Q
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    ! h! F. Z' Q. }5 N- |/ Q
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    2 I* H3 t; d3 K' d; I6 [  s
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);5 Q$ n7 I: E- p9 n( D; p) `
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    8 K6 {; b% K- F5 ?, M
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    ; B/ P. m. ^$ |' G! |) ?3 n! ~- n
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    0 H; g0 k3 j3 ?2 F$ ]' Q2 |# p
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    + `. K) J3 W  M$ k$ `( }
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    ! T. d- h: |; b( G, A0 a; f" @
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    2 `$ o, W$ l: c, h
  118. 2 [+ R% n- D; |" H' V/ t
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    ) p- z" [/ B, t: T# L2 {
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    & r6 L, Y- i1 Y% ^. y# T
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);, g( V( g# p7 u3 d6 t9 Y  Z) f) @. `7 v
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);; T- f. t* K7 g
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
    . Z/ ^  o6 }, Z4 ~5 J6 b
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    : I9 V. m% q7 K; X4 @

  125. " G* N1 H* Y, E; k4 j: Y* y, M, M, ]/ ^
  126. ' d& a  ^9 K+ Q
  127. gtk_widget_show_all(window);$ @$ ^' a6 |2 G% F. }& r9 G# |

  128. " I1 q) i: H+ u# ^) v
  129. //主事件循环$ A; R3 i: z: E
  130. gtk_main();
    * R9 J/ B. r9 M9 z) e, u; w
  131. : Y) f" o- f6 `1 E# t- f
  132. return 0;
    ( d7 g. S6 m& J  R5 V. c
  133. }
    . t1 @% N  _3 a1 Z* w
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png * y% \( R5 n: w

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

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频5 u" z$ P1 `8 n) v1 L# F
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版