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

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/,,这个路径就可以,直接继续安装。
' Z: N8 @- v+ j  e' L 1.png
1 W8 V$ R0 N" F8 T+ K4 R   然后就学着官方文档的样子去验证下SDK是否安装成功4 X+ H) i+ G# V' d. Y) C) ?
    2.png   n  K9 ~* ?, i% r
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>2 G" y3 o0 n) V! D( L$ ~6 _
  2.   z+ t' b2 t- ?2 r8 w6 W
  3. static void
    ' |; H8 z, K6 {
  4. print_hello (GtkWidget *widget,
    - L/ b) L; {$ L' W
  5. gpointer data)
    % x2 a6 C7 N1 J. p* l+ Q) ^5 X
  6. {
    % x$ `0 p5 H! @" W
  7. g_print ("Hello World\n");
    + _9 {5 @) p0 {+ Z5 \% v
  8. }$ j; [) F: i- P, U, l, j
  9. 3 O( e. y' E0 u! S. h4 F
  10. static void
    - R- k( c; `% ?) f6 ?, E: S2 y8 n
  11. activate (GtkApplication *app,  p8 o# o2 d  _4 Z6 m
  12. gpointer user_data)
    " |3 D  l$ |% R' c- N9 B4 c
  13. {' l6 C+ O- M5 h2 p. M# x
  14. GtkWidget *window;
    / j# A! D. m3 o: J/ }. e1 [
  15. GtkWidget *button;
    - P6 |, E( J) A# P( W2 b7 ]
  16. GtkWidget *button_box;% u5 a* r5 z5 n5 N; D8 P2 \

  17. , ^' |. i" {$ d2 ~1 A, j+ p
  18. window = gtk_application_window_new (app);9 \/ K$ G5 ?2 C! R3 M, u) u9 p1 c
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    / [6 x9 \( S5 O/ V5 z
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);$ N! ~3 l& F1 K. v
  21. 5 B  T, G. G% s' _
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    $ \( c, m& Q  O7 T6 u  P4 U
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    : Z1 M6 m: @3 w) l

  24. ! I% _/ q( `1 z6 Q
  25. button = gtk_button_new_with_label ("Hello World");
    ) C$ m- e2 x) E1 z2 v% _6 a
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);. N6 v5 Y; F6 n' g, y
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    * j! [" q/ g7 C+ w$ i' M5 d
  28. gtk_container_add (GTK_CONTAINER (button_box), button);. g' v! I$ }; u8 y* @5 o
  29. % x. [3 |7 i) U
  30. gtk_widget_show_all (window);
    0 N" M/ L  M# ]: t
  31. }
    1 g7 E. q' @2 Y

  32. , q# D+ q! w# g6 m! y' [
  33. int4 }/ y: F% |7 b1 Q# q
  34. main (int argc,: t8 }" F) D: p. o8 k+ j
  35. char **argv)8 y4 e- m4 z7 K6 E) e, t& ~# {
  36. {
    8 u8 T: A. u% D; ]6 O
  37. GtkApplication *app;1 U! ~1 F+ ~: [; u& h* u, ?1 {
  38. int status;5 c/ b' c" h) D
  39. 1 E: n, |2 B% s0 k5 t7 S3 C
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    7 j! y' y: ?- t" A9 \! M* W& e
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);/ N" N& U% E- f( R5 r
  42. status = g_application_run (G_APPLICATION (app), argc, argv);
    2 [0 A0 D/ L% [/ D0 B3 b$ F0 w
  43. g_object_unref (app);4 f/ Z& f$ c" e
  44. 5 P5 y" O8 r+ ?2 K
  45. return status;+ I9 h4 a1 O/ ^$ H1 D! }& ~
  46. }
    5 F; w' W  [2 p+ m7 i! U
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  4 p0 i% f7 P5 b- v0 a
  1. PROG = gtk_hello_world
    % Q5 I9 ?5 T/ c3 H: b) u  M
  2. SRCS = gtk_hello_world.c
    ! ?: G- Q4 f0 J" j

  3. : M( F' h$ Z" {7 |' a) E* R
  4. CLEANFILES = $(PROG)
    9 Z: u1 H/ X* O& Y% a/ S

  5. 0 r+ R0 R( P2 ]! \# |, L7 s6 ^, `
  6. # Add / change option in CFLAGS and LDFLAGS  I( t( k9 A% a
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0), l  _& K* q8 d. Z* w5 _. }, s
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
      V. b6 D3 E& z
  9. 3 J3 ]7 g( w3 ^" c8 f; X& K( e
  10. all: $(PROG)
    ' g2 j1 X( Y) `- v3 g; A9 n# |

  11. 4 x, X4 _  Q4 Q: p
  12. $(PROG): $(SRCS)
    , B; C9 h$ ~$ l/ q7 `
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    / P6 ]/ ^$ F# b0 Q
  14.   C: Q- m. i7 V+ Z' A
  15. clean:
    : ~8 S: z+ o( |
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))6 Q- B" x% F% G% g& n
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png ) J+ x% r) N  U8 [% q( L# C, i
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。% l2 }$ Q2 |* j7 i3 `0 i4 _
+ u3 X, Y8 B& x% p& m$ Q, x" T
  @9 |( C( f+ G& f& `" y
  1. #include <gtk/gtk.h>
    , e1 C/ H; J6 M) h$ K
  2. #include <stdio.h>
    ; K7 ?) _6 `! K8 S: N: {
  3. #include <string.h>& u7 ^$ a- H( y, F! D

  4. 4 u, T3 N! U" u( u
  5. char buf[50] = "";
    6 d1 q+ y$ }% N3 V: B5 [

  6. 7 G% t+ a" g2 S! P& Q' H) v
  7. void calc(GtkButton *button, gpointer data)
    8 B+ Y+ r, C4 T4 {3 M1 n
  8. {9 `' V2 `  S  I3 V" J& v
  9. const char *text = gtk_button_get_label(button);' G  Q8 A1 @7 w* }+ n
  10. 6 _% x- r7 B: A, {8 n
  11. //退个操作/ ]8 e6 X8 g7 o, {0 T
  12. if (0 == strcmp(text, "c"))
    : R( f& _% E" z
  13. {
    1 u) J# L$ F. @' M0 \. D/ D6 F
  14. buf[strlen(buf) - 1] = 0;
    " Y' p9 y* @; i, j$ D3 o* F  K4 f
  15. }else{; l# }. _2 b, n
  16. ; J& R! l' t) _
  17. int a = 0, b = 0;7 k2 M, E1 w0 O- {
  18. char c;
    . M, f, d8 V& ?* C: [3 r
  19. strcat(buf,text);5 L- q* `- U6 B  \6 B: {
  20. 4 b2 O, M" B+ e
  21. if (0 == strcmp("=", text)) {
    * N- n2 m, d) S: r+ y

  22. ' R* F+ e4 A+ s5 L2 |" A+ l
  23. sscanf(buf, "%d%c%d", &a, &c, &b);" x1 [! ~  ^+ T- r! \$ I

  24.   S, R8 G: h5 q( }& |/ y
  25. if ('+' == c) {% e5 \7 [3 z3 x" p8 j
  26. sprintf(buf,"%d", a+b);6 ~+ R7 m, o" G7 u
  27. }' q& p" f& U: M/ I
  28. else if ('-' == c) {
    : h& ~" D9 V- [) K# F& V% k* C
  29. sprintf(buf, "%d", a-b);6 ?; D+ Q  c& P0 e+ P' g
  30. }% u& a# v5 U2 f4 R% K9 S
  31. else if ('*' == c) {$ D# T. a. K, V6 l6 E2 w* I5 E
  32. sprintf(buf, "%d", a*b);
    # z+ H0 S( O, ^" K/ w' U" U
  33. }5 B4 X8 `' m6 g
  34. else if ('/' == c) {
    ( s4 m2 T: P5 O3 P  x
  35. sprintf(buf, "%d", a/b);
    # t! ]. t! O$ |  J- ^8 H
  36. }' p6 F' K. ]) _. `

  37. 5 \; M8 C+ ^6 g1 E5 [
  38. }8 ]9 u' X1 c* _
  39. }
    0 p8 Z0 G  O* O! R

  40.   C; E, r4 M6 s3 P2 {' r
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);) w; c, B4 b2 @9 h
  42. 7 D7 Q$ z* s  j7 {: k/ x
  43. return;
    # Z1 `7 A( C6 l( Q; r6 d
  44. }# @% e" z1 z) |3 ~9 |. `
  45. 6 r" d6 ]5 e" `% P# l' P' ^7 l
  46. int main(int argc,char *argv[])
    : M' |  m) v3 @% Q
  47. {1 r* g. m" K. h7 a
  48. ' o# T- N$ j5 H% \3 ~( c) R
  49. gtk_init(&argc, &argv);
    " l; B/ `0 Y7 x% G* ^1 Q/ Z1 `% E

  50. 1 X6 O4 C( }$ T2 Z
  51. + P+ p! k+ X6 C; n& I
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      g, R# _6 s9 z; K9 m& r3 d
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");3 B, x. R2 N$ B: h0 `/ p
  54. ; d% C% U: D- I1 [$ t
  55. //创建一个表格容器5行4列! [) Z' P) v3 t* I4 k. M
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    $ ^! k# q" b. g: j) o
  57. ; q% T+ L6 z. _, e; L5 _$ ^. t
  58. gtk_container_add(GTK_CONTAINER(window), table);
    7 Q. q) ?0 J' P; z' T! |
  59. " D; y/ q# P2 D  i: S
  60. //创建一个行编辑
    3 p% g& N* x2 M! X  r# u8 w
  61. GtkWidget *entry = gtk_entry_new();) M: G4 H# K# Q0 X" |
  62. $ K* ^; `. ?% a' R, [; q) [
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    6 i, C( \& v; p  S2 `' J  m1 }3 [" y# g
  64. # [/ U4 \! O; v3 W3 Y9 L( z6 V
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);5 Z# K& l7 T5 V& \" H5 N1 I. [9 E
  66. / n; z( i+ u- s3 `) z1 c2 T
  67. //创建多个按钮9 }6 R, S$ Q, Y4 ]$ \8 W2 u1 _
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    1 L5 V* Q: |8 i9 b
  69. GtkWidget *button1 = gtk_button_new_with_label("1");. U, ]7 i/ O! W; m" r
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    7 c0 j8 E$ |# q% R4 B5 ?
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    7 ?; n) c: x* t5 j
  72. GtkWidget *button4 = gtk_button_new_with_label("4");
    9 p- ^- h, L1 M" R
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    , T- L( m3 F( C) F$ u+ O/ T
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    * [2 ^- H$ I0 {, e* m. P7 k
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    1 L$ _. ^& Q3 M' ~
  76. GtkWidget *button8 = gtk_button_new_with_label("8");1 T1 d+ S# d. X
  77. GtkWidget *button9 = gtk_button_new_with_label("9");8 _* W1 G: r% E

  78. 2 W/ @0 f# ^+ d- `' ?+ Y% b( T5 c. u
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    # N: F6 H* d7 d# V- O! c7 d9 j
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");0 h) J7 m0 W6 o5 x7 o
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    5 Y' }* m& }5 ]  ]* O. q' k
  82. GtkWidget *button_div = gtk_button_new_with_label("/");' z* Y/ h+ [, L$ e  c
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");8 d8 k, @% _& ]) I: u0 Q2 O. ~
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    ! m; m+ R5 t2 X( L% {9 _. ^# D3 N. w

  85. ) m0 }! j3 u9 e, A
  86. 4 f+ J0 p- ], U2 v* q. Y& L  z
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);$ u6 ]4 O' B/ K# A$ Z1 T

  88.   l& e' W% i1 N. G, z; }" j
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    ! B9 i6 n* L6 e
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);. K' h) O- L: j+ q
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);, u* ]3 x' j" {9 _
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);! y4 z# c: X4 B, @) |" n
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);! k! G/ e2 d, d3 p; ?* C
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    7 H) u- k8 m" r7 g& `6 ]
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    2 X9 ]# R- I# I' B$ u1 {
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    ; l0 Q8 W8 \; C  ?+ ~! ~6 Q
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    # j1 N3 k1 [+ A- i. A! b! Y
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);+ d9 j4 S# D' k1 ~# C+ p9 f# a

  99. . K; \/ S: y8 ^$ P- W" W4 b
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);$ a/ C) Z+ [# T/ g4 L
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);. b; s) q4 {- c' w. G8 L# L: V
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);) \% H0 N/ z' X' y' |  ^
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    : d4 Q& t+ f1 U: z8 t; F3 T5 B! B; V
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);4 J' h5 N: P% e/ b8 [, {6 k9 v" T
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);8 s% x4 W5 m0 r2 W+ b+ w/ e3 L

  106. ' {& i* [7 L* d
  107. //注册信号函数,calc()
    8 [' u0 D1 F4 u, z/ B
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    ( p+ G" n. q' u* {( n3 y; l- B: t
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    2 a1 x$ v; M7 j: z
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);; n1 F. |; `6 i" ~' x
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    * r  R/ z4 t4 V/ b: R/ W7 U1 p
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    + m" s/ |, m# W- O0 e& ^7 A4 B
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);- c4 R% Y6 Y: g. `1 N" f% L; N1 J
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    5 y* d7 e! g1 {( {
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);) |& @$ Y% e: R- C8 A
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);- g$ h3 j& y0 ^$ F
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);0 i" m( n  z) m: I8 U

  118. 7 D0 ?( d0 f" r) R- D5 C  f( I( y
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    * ^4 c6 t1 G& O1 F; A4 G/ F
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    / }, j- e& j% S" T8 l2 U/ O
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    + `2 M& J5 t' ^% w, m8 A' A9 m
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);5 l# ]" Z4 ~9 k" S+ ]( a3 m+ m
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
    1 A7 k% T3 R7 X' C
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);* F1 D( B  \  i5 [7 r4 N
  125.   R7 X: w. G4 A2 O+ O! t' ]
  126. 2 E$ ~& `/ v3 h$ `
  127. gtk_widget_show_all(window);
    6 j2 P; ^  |3 G4 f, d

  128. & f0 Z' w3 \+ }5 g9 \' N3 b; f
  129. //主事件循环: D& f2 ^6 G- l. ^3 k* Q& f
  130. gtk_main();" c1 f9 _$ q6 r5 B

  131. 1 ]/ `# [. `. X% H/ |; Y
  132. return 0;( e: X: u! y7 F+ a9 x! M$ b+ X: E
  133. }
    & F0 A7 b/ f. ?, F
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
* L. l: p. f4 V9 e* k: l" m
4 @" _6 G" A0 q$ X
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
0 ]7 P* w2 I  @7 n+ Y
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版