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

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/,,这个路径就可以,直接继续安装。
+ f0 x4 P, ^6 l5 o; p7 n& w+ K 1.png
2 B$ M9 m6 ?3 z. @$ a   然后就学着官方文档的样子去验证下SDK是否安装成功2 y$ q/ u- a' h0 G
    2.png 4 r8 q- B- l) T* Z8 w
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>
    - n4 O$ S- k4 K/ J3 i7 K, P

  2. 2 v* T  ]: O, K* |; E( N
  3. static void; w1 T- O& Z  ^7 `4 x0 L2 P
  4. print_hello (GtkWidget *widget,
    ; k3 Q- Y7 Q- Y# Z, y
  5. gpointer data)9 Q* F% S  T% c/ u, ~
  6. {( K! o, m# N# h% p2 J" B
  7. g_print ("Hello World\n");
    0 o" c) ^0 \* v
  8. }
    + x! D# p+ b# o: P( m

  9. 5 \! w- e: Z2 \* {
  10. static void: M" j& _0 }) m! d/ ]( O% O
  11. activate (GtkApplication *app,
    5 Z5 G8 d$ F: M
  12. gpointer user_data)
    5 _. W7 i: x8 b' _* q
  13. {
    # b2 H  g1 A2 p" e2 t( T% c
  14. GtkWidget *window;
    $ E( k, }8 w* o7 v/ c, \# r) e
  15. GtkWidget *button;
    4 G/ ~2 W9 b! V0 Z" ]3 [& ~4 }6 J
  16. GtkWidget *button_box;2 o7 l6 U, E% [8 \

  17. 2 T4 U- a. v# L9 a
  18. window = gtk_application_window_new (app);
    , X$ D% M9 q1 G5 n) j; l
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");' M" u7 \" u1 ~+ x
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);1 M7 c2 T" k# E1 o

  21. " a. u* k4 D* s6 o% Y" E
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    , N0 J& n8 @4 f! S7 H
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    8 q3 }# Y, q) L, _! O
  24. / V3 S# [0 m; G8 f1 K# i. k
  25. button = gtk_button_new_with_label ("Hello World");5 G) f# N4 A2 k" R' g
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);; z6 A3 G) r% D  y
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    $ c1 X4 f/ L( e( r: c
  28. gtk_container_add (GTK_CONTAINER (button_box), button);2 R  ^0 l6 C6 ~: t- N7 z& C

  29. : @3 T! a7 K) B: t9 x4 p6 ^8 a( }. t
  30. gtk_widget_show_all (window);. {" U0 C3 k% A% x$ \% z* e
  31. }! L0 p# B. d$ N( K
  32. ' S/ c3 H5 l8 K  e; q9 I
  33. int
    5 `5 `( s6 ^: c3 f+ d: _1 T
  34. main (int argc,
    ( p$ S& `! i, `8 B' R/ P- {4 [
  35. char **argv). ~1 U, W) U" X$ s
  36. {- P. c6 \  @7 o, l( L
  37. GtkApplication *app;. D5 g) Q: `+ |0 \
  38. int status;7 T. ?" X6 ]: l; y- D' Q' a2 X
  39. " E$ K+ A5 ~% h9 Y
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);" w4 B: f' g5 M/ s
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);: K% q# k( _' s# S9 O
  42. status = g_application_run (G_APPLICATION (app), argc, argv);
    % o/ q  A# q/ l6 U8 _7 f
  43. g_object_unref (app);5 X9 ?- [# ]/ }5 b
  44. ' H1 W0 T) z$ t: d$ t, k/ F; x# ?
  45. return status;1 t7 s* O# @6 F- u! s1 p) v
  46. }" s# P6 M- s5 i
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  7 R# f/ B2 W- l2 J, G$ ~
  1. PROG = gtk_hello_world
    " k- R5 ?7 y. N3 r
  2. SRCS = gtk_hello_world.c
    1 ~2 T1 K+ ?0 x, Z' _8 @. a! B
  3. $ a2 c1 L0 t, S
  4. CLEANFILES = $(PROG)7 |7 a0 c7 W  q6 r- }/ s, Z
  5. 5 [# M( ^" r! a; `- {3 l
  6. # Add / change option in CFLAGS and LDFLAGS1 ?- G  Q" _& d  V6 X( N
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    ; T- J  q; i: _  J6 u
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    / Y1 u5 w6 M' x& c5 f

  9. # s, Z  v6 I* j9 U5 _
  10. all: $(PROG). m0 Q3 c2 x2 {! M6 n" @
  11.   I6 ^( |0 z/ k1 t
  12. $(PROG): $(SRCS)
    ( L5 I1 `' t! J5 r$ K
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)7 t$ I# K; S6 K2 g3 P. D" c. Q

  14. , ?, K7 A4 U4 n5 T0 f. U" Y
  15. clean:9 ]1 ^+ j+ ~" R9 B" ?7 a: Z
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
    ) ^7 N& o$ ?- O/ c
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
2 G( T2 }& a& ?
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
1 S& p# e% J, E/ x7 |! c5 |
$ J7 T$ g; f# A. w, {
0 K. x0 A; b1 L0 v, o8 U' [1 l
  1. #include <gtk/gtk.h>6 D" d& `; ~1 u. D  h& x# A/ v
  2. #include <stdio.h>7 t0 Z3 X& M4 k2 @. }
  3. #include <string.h>8 E7 |4 k1 {8 S, E3 d
  4. 5 K: |( V" V. Y) [  v3 N2 K8 E
  5. char buf[50] = "";! J3 @  h  m, p$ P: p8 T$ ~

  6. ( g2 I) T4 H, N  z# W" q. `  A, H6 P
  7. void calc(GtkButton *button, gpointer data)( s$ R4 f3 g. P# Q/ n* ~+ r/ c
  8. {
    ! T6 P# G8 @4 V4 a! a) ]! i
  9. const char *text = gtk_button_get_label(button);- ~4 a% U3 J1 g

  10. . ~8 a3 [& {4 ^: K1 d1 Z& d
  11. //退个操作/ G' l* B" O: d. y
  12. if (0 == strcmp(text, "c"))
    " W+ X+ L2 o/ a
  13. {
    0 S9 j1 r9 Y: i" K9 E4 N2 ?
  14. buf[strlen(buf) - 1] = 0;
    , @# k5 D# P1 c( I- \1 U
  15. }else{
    4 h/ N6 k* x2 N

  16. 1 |4 G3 P- }# \! \  V4 V4 y6 ?
  17. int a = 0, b = 0;
    & V6 Y& c1 T% u% Z' U/ ^4 [0 U1 t5 b
  18. char c;
    ! v8 d0 y, K( ^, x. L: b
  19. strcat(buf,text);
    7 X  ^0 V3 z: r

  20. ! c* Q/ R( b, x' q$ \
  21. if (0 == strcmp("=", text)) {
    & Y8 U0 [3 U, n4 [) N/ R0 h
  22. , r- j' Y4 a$ x9 D: ~
  23. sscanf(buf, "%d%c%d", &a, &c, &b);
    0 ]* w! d  P5 }- E1 W6 g, |
  24. ; d7 P( R9 K' C* [+ B
  25. if ('+' == c) {
    2 `+ l, @  h# Q6 _, i0 n
  26. sprintf(buf,"%d", a+b);
    ( I% _9 h) h  p- c* D* F
  27. }* _2 a+ c7 g' S4 }6 j' T8 O
  28. else if ('-' == c) {2 Z4 a" m: y1 e" o* A2 a
  29. sprintf(buf, "%d", a-b);
    ' f6 L  [9 Z6 d$ ?
  30. }) b7 {! d! D+ O& a1 z+ }9 ^$ r
  31. else if ('*' == c) {
    ; h% K2 }2 m/ y5 L
  32. sprintf(buf, "%d", a*b);* Z9 _6 @' _3 O$ M# k
  33. }6 @; w9 g% ~3 _, V# `
  34. else if ('/' == c) {9 @& N( n! E% O; a* a4 ~+ k
  35. sprintf(buf, "%d", a/b);
    + v, [/ f0 m, }" w5 R3 H% C
  36. }9 r3 E$ p+ H4 u8 a  a* h8 j+ \& s

  37. % \8 d$ {, z. \/ h
  38. }
      V2 D' w1 k2 u
  39. }
    # c+ Q- ?5 O8 ^. p, D

  40. 7 N% c; W( X0 x! m4 l; i3 f2 }+ U
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    ; f7 o: t/ B7 H  O- L& n! n& ]

  42. * j( D6 {- ?6 E) T% {2 m. q, q
  43. return;: P( R  U% b" }; G( N, M) H; A
  44. }
      I& X; X5 {  H" k7 E+ U

  45. . N3 Q7 |. S5 w! p- ]" F9 ~
  46. int main(int argc,char *argv[])
    3 A0 b0 a) I( e0 {
  47. {3 K# N) Z& C4 d' _0 I0 x* z

  48. * c& f, C0 @) u" y7 v' C
  49. gtk_init(&argc, &argv);
    , c$ Q$ T2 |9 G

  50. 4 d7 Y$ L$ h4 X* F

  51. % ~" v6 W$ B2 j/ p
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    ) l8 |9 m: A  k
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    ; {7 c5 p; |* A/ S5 E5 n. w
  54. 9 r+ b7 s5 p. j/ e9 i* u, D1 y
  55. //创建一个表格容器5行4列- U/ j' j7 H5 U# {7 e# r' }4 D
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    . c3 r/ s0 E" E& G/ C

  57. ) Q7 t7 _1 C& |7 r
  58. gtk_container_add(GTK_CONTAINER(window), table);
    . G. y: R/ L" ?$ H7 v+ h

  59. ! |$ A- c0 o2 H% E
  60. //创建一个行编辑
    6 B  `" S* g" ?
  61. GtkWidget *entry = gtk_entry_new();
    ! R2 T8 U7 Q3 p. Z" s

  62. , j+ z3 y+ E# @4 I. H1 c8 D9 G
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");$ |3 Q4 x4 n* E2 w3 O( w
  64. 1 a$ e0 ~: B( ?: s9 M
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);: m# z+ x1 u8 Q% |

  66. 6 o5 y3 _2 c: E# {6 J
  67. //创建多个按钮- V9 W+ V5 `1 Z: M! C
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    4 e& \8 P' y2 [
  69. GtkWidget *button1 = gtk_button_new_with_label("1");: M! X# T) E  P' V
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    , x, D/ o) N; K/ ^1 o: s
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    / H% ]" p. }5 I" G3 X( u
  72. GtkWidget *button4 = gtk_button_new_with_label("4");$ e8 O5 k& b8 X, R1 |1 G
  73. GtkWidget *button5 = gtk_button_new_with_label("5");4 ]+ [2 s6 {/ W8 o: |+ g3 q
  74. GtkWidget *button6 = gtk_button_new_with_label("6");. b3 v* N; f: |( M1 S) Q! I
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    / V5 Q$ n0 e4 V% N; |- U
  76. GtkWidget *button8 = gtk_button_new_with_label("8");, H' p! h$ U, Z4 d
  77. GtkWidget *button9 = gtk_button_new_with_label("9");
    # Y5 P0 S' N  H8 F; F' P2 R
  78. ) Q  ^$ t6 V* B9 e
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    ) Y6 s7 w6 v( M% F3 f* E  j1 A
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");
    1 |  S+ J8 h+ d
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    0 C. |! I- G% ?! a- w1 A
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    ' T- g$ X  z& i8 @
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");6 g. s% |& S* r; ?! O4 u
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    , {" M4 m6 H) t+ Z
  85.   c# P! j4 o" \. ^  `8 \/ m
  86. 5 }7 N. c: V% v, @
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);! Y; y; c) ^& r1 t; E- Y
  88. , ~) N% p9 r; n+ x( r8 D9 P+ r" _, A
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    # ~4 @; E1 r1 _2 }! w
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    / _& ]1 S' x. Y, O1 n
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    + D% o0 V) A- s; o0 t$ |" e- z" w
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);' @8 Q7 @+ h4 ?( T& J! T" F
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);' l  c9 x4 ?2 ^; O3 F
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);! d& y) z' P9 t3 h: }5 Q' o
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    ( L* t! e8 r7 M
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    ; ^7 A5 ~: N  q# R$ Y9 F, i* s
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);' h- q3 B- Y% i7 p& n; W
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);! g- ?1 \; k! h
  99. ' e8 \3 ]. G! l1 o1 @9 R# e
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    8 g8 ?3 c* f+ b7 H; p2 q% C
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    + y( \$ r. E2 w$ ^! T2 c
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    . W7 m! o1 J0 s9 y+ ]+ e  ]! |
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);' ~5 o& I$ x4 N; Q
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    & E" Y3 A% O# a
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);/ w% o3 v8 w0 g. d

  106. 8 C3 }$ B: W) r6 _8 V. Q
  107. //注册信号函数,calc()2 X1 `4 _8 s" ?. W! r
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);4 t# }' [- A1 F. R- c
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);4 ?. m0 E/ p6 h6 n! A+ t
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    ' Y% c! e! S2 g
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    % i& p' B( s9 S! @
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);* h8 k5 s1 F- ~4 E4 }
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    9 H: k! p9 X- h4 @/ {1 y" ]3 A" p7 I
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);- f0 D; |7 S; I/ M2 k& G5 M
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    # Q( v0 W/ H- U# X" @
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);! q( b6 z' D5 _* J. Q
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    9 P1 ^& c$ ]2 U/ F" g" N* [

  118. ) t/ H5 X, z2 U% M- P
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    ) M8 L! U  ]( g$ V/ z
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);( D# w) _; J$ P5 i4 H& E
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);4 p/ F5 ~% D# E* o- y, p" R
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);' _5 }% c; S" X" ]! [" |% l
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
    3 @; r/ @% G; h5 F" h1 c: s
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);) C" o+ J& d, C% T( J9 [
  125. 1 d, \. R5 N( D: C3 f' K& O4 u

  126. 1 n; y- R2 D  E% Q6 s8 S8 ?7 g& n
  127. gtk_widget_show_all(window);' M& t2 n' u3 t7 ]2 H
  128. 5 P% W) w6 T4 G! t
  129. //主事件循环2 `  Z1 k% i+ G
  130. gtk_main();
    9 J7 K4 d7 X% L! R( ~. f

  131. + n' b5 }' s! S$ y$ H9 O. {, R
  132. return 0;9 e/ F* \2 j% g! _+ Q
  133. }1 E/ L+ ^3 A: S9 L3 g9 u
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
4 \+ z. r8 V$ S0 |# F1 b4 e4 z. `
: d2 W+ ~( w1 V" }
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
赞 收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
! R+ r# Y- F6 D3 E4 [

所属标签

相似技术帖

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