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

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/,,这个路径就可以,直接继续安装。
' }( _& U' h9 `+ M' u5 h+ l 1.png & a' V6 C# c/ x$ M
   然后就学着官方文档的样子去验证下SDK是否安装成功
; ^' D6 O- L0 S9 ~1 ]( L- C8 x    2.png $ H6 E) Q8 F5 I# [' [
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>
    % t- p! o- n; c/ ?+ {6 ]+ L- N
  2. ( K, H5 \( z( h: x0 F! C! A
  3. static void/ z3 u* q0 Y. {
  4. print_hello (GtkWidget *widget,
    2 q1 @4 H7 V0 z  e  p
  5. gpointer data)
    2 S0 {4 W$ v, v! c6 g
  6. {' J" J+ W$ S! C$ m# N& i
  7. g_print ("Hello World\n");2 k5 z* V7 I- G/ ~9 }: W7 X  ~
  8. }+ K/ F4 r* z* M# a8 ~

  9.   L" b3 a+ n: b" ^" r$ T" F
  10. static void' {5 _5 X) ?% d* J- B) |
  11. activate (GtkApplication *app,
    5 ]  }2 r5 [& o. w) E
  12. gpointer user_data): `# q1 W: h7 I( d  u8 ~& Z6 L
  13. {6 ?; o7 y  K0 n' |( W7 l8 V
  14. GtkWidget *window;8 }! [0 M* v8 r* r  `5 f
  15. GtkWidget *button;
    7 {8 ?3 E6 p  c6 E6 I5 B- _
  16. GtkWidget *button_box;: j( k+ |5 ]6 ^" m# a5 d' q# ]
  17. 8 D; v' u; p2 f0 K: ~% ]2 e+ _5 t5 @
  18. window = gtk_application_window_new (app);* l9 n: R4 A& f8 z. K  p$ Q+ `- \
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    3 G$ K0 x" a5 k# c/ H
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);7 f& \( w5 \' v/ d. Q0 x. A) z7 o3 a$ x
  21. ' Y' {; i* V5 c$ ?; ^5 u, ]
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    & Y: G5 L6 ?2 |
  23. gtk_container_add (GTK_CONTAINER (window), button_box);- L& C8 d; T5 N" a0 r

  24. $ V3 c9 y2 p5 u. B
  25. button = gtk_button_new_with_label ("Hello World");! W6 e# Q; r' u" {6 I
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);2 @* z( P; _; v5 O
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    5 S' W9 G; `/ P7 {
  28. gtk_container_add (GTK_CONTAINER (button_box), button);
    4 R8 X8 `+ p7 v, Q$ a1 H9 T
  29. - f$ F+ i9 [9 K! h( H6 |
  30. gtk_widget_show_all (window);
    , d) n/ b+ ~6 u
  31. }
    # v  R1 y0 `5 ?3 F4 B, I/ |: ~! Z

  32. & f; ]! T9 H2 Y
  33. int. H* P8 F7 d# k  {  R
  34. main (int argc,3 o* \: H8 x! l. P! Y
  35. char **argv)8 y/ `0 S( [. |  L
  36. {5 C/ `0 v, G  V: p8 |$ p
  37. GtkApplication *app;
    . b% l* \" i. t5 V
  38. int status;
      d  h& ~7 [! |/ V# }8 {* g1 H* |

  39. ; N5 |; n+ A' Q- `
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);6 l( a8 ?, ]0 D! ^& f7 k- A
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);2 a- w# g, P/ t
  42. status = g_application_run (G_APPLICATION (app), argc, argv);) o1 B2 f. @4 k8 y) }( h) v7 r
  43. g_object_unref (app);! m- m1 w, F+ A% z% `8 u  |
  44. 0 n- H. J9 H% ?+ @$ c" o
  45. return status;
    # C. a. x; ]" T1 _$ v7 Y! y
  46. }
    4 g+ D1 m8 U7 _7 Y
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。    M" E( t" G6 j
  1. PROG = gtk_hello_world
    - ^3 X; Y/ z. \& V% u
  2. SRCS = gtk_hello_world.c; G' p& G- {4 Y; S1 t8 N8 O
  3. ; d. E* \* B. y& b! X. J0 t! l' C
  4. CLEANFILES = $(PROG)
    9 v/ y" J4 u$ j) l0 _" \, ~, q

  5. 9 f. V, a" n1 U/ u8 i0 a7 M
  6. # Add / change option in CFLAGS and LDFLAGS! ~5 Q- W! Y$ ^9 P7 Z
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    4 P2 {2 H) x7 I8 F# @: Q0 w
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)8 ~7 g. N- M& ?! z1 H
  9. 2 j- w( o2 g; }3 A5 {
  10. all: $(PROG)" ~1 r+ L3 |0 n) ~% b- y, f' f; l
  11. ; ~) `! X- t, p# N5 T
  12. $(PROG): $(SRCS)
    3 P% a0 I" R. M4 T) C
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    2 U1 f1 e4 i. ], i6 @/ t1 e
  14. & @  I, @. P  G: V% e. O
  15. clean:* z0 k3 I+ f8 _& I% ]$ `1 c; T" Q
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
    - h1 W! c. S- M# ?5 B" M- ~
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
% n: T8 h: @+ Q2 f0 @# F
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。" o8 n+ J5 l1 E- m9 J: R
' ?% G# L0 f  X7 k
$ v& f. r! r' g/ |7 G. N
  1. #include <gtk/gtk.h>
    8 N( Z) X6 O% V% p
  2. #include <stdio.h>
    + `+ }# M% W, l2 @, T* |
  3. #include <string.h>
    : R. |8 L$ U1 }# b
  4. - M  W/ F) ?; [* ~
  5. char buf[50] = "";7 z7 {2 G) D3 q4 N
  6. + _1 M8 ]( w* I% B8 {9 h, ]
  7. void calc(GtkButton *button, gpointer data)
    + k7 M1 L, j7 K5 h" I2 z
  8. {
    " }/ H+ n. |% X* d' K
  9. const char *text = gtk_button_get_label(button);' S) i1 n9 |. Y5 x1 R

  10. / @1 `; I' X8 q% J( t7 K
  11. //退个操作$ u$ y, \( n; y' P/ {2 @! A" y
  12. if (0 == strcmp(text, "c")); h; w3 K7 _; K, A% z
  13. {
    $ _, G3 m; T/ D% p
  14. buf[strlen(buf) - 1] = 0;& S7 Z+ b' s5 q; k  ^  [/ ]
  15. }else{$ K) h. E/ s2 B# r
  16. , X, T; |9 ], `  B1 V; G0 B- f
  17. int a = 0, b = 0;
    9 j" P9 T$ u+ J2 J! p& @
  18. char c;7 T4 i' p4 v" b
  19. strcat(buf,text);5 q1 P7 |' M& V; S, n. }) }1 n

  20. ) @# l& l) \/ j& o, m' Y
  21. if (0 == strcmp("=", text)) {1 b6 P( y$ B0 r4 Y

  22. $ u% }3 L8 a/ [% L, Y
  23. sscanf(buf, "%d%c%d", &a, &c, &b);
    1 J) Z) b# q1 d) n0 b; P

  24. 2 `0 c& [- J/ k; E9 ?3 l' ~5 ?
  25. if ('+' == c) {: A2 b/ m0 _7 H& L4 r: b
  26. sprintf(buf,"%d", a+b);' ^3 n  _, m0 y+ Q. C$ x
  27. }: |8 q  c& E3 p' x
  28. else if ('-' == c) {# ?! g7 k" U/ X6 O8 V: r/ j5 Y
  29. sprintf(buf, "%d", a-b);9 _: B1 a9 B- [# K- o  U1 |
  30. }
    & ]% N3 d8 U( p5 C) k0 \
  31. else if ('*' == c) {% k+ W$ N5 c2 |# Z7 z
  32. sprintf(buf, "%d", a*b);: ]" O/ z+ K) K$ Z* ~" |  K
  33. }
    . Q$ x) g' C5 p
  34. else if ('/' == c) {
    + O0 t  w. D$ q* @8 Z7 j& @$ Q
  35. sprintf(buf, "%d", a/b);5 S: Q( D. D( v! e& U! A# V9 R5 k
  36. }
    ' c- Y4 k2 W6 @1 ^8 e2 ?
  37. $ K; i5 Z. b& }8 f
  38. }
    3 B0 @  _; N6 A% ~
  39. }4 v, p2 D4 H2 B) V

  40. 0 k' Y9 M0 V! [
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    + a) j! S5 a& H0 i8 y' D! s
  42. * R1 @$ X# M/ n+ J5 ~2 ]
  43. return;
    5 @* @# z  s" X& t& J
  44. }
    ' l, T$ k4 H4 g& w( J

  45. ' e1 z" g3 j0 d( F2 W% I
  46. int main(int argc,char *argv[]): l! t3 c& l9 Z  s
  47. {
    $ B: t8 R/ _& C, |, G2 E
  48. . l% T6 ~) [4 ^" p( m# V5 F* a* X
  49. gtk_init(&argc, &argv);/ j  s. r7 b7 i0 S' _  y0 W
  50. : i5 e  j. x* q0 }, f% [( t  a
  51. & ?7 u- `) d$ K8 v% s$ X- v
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);9 V1 A3 y( K, p( L( N! `1 \
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");7 t7 O& P  \  |& i8 E

  54. ' B& n- E; B3 Y. {
  55. //创建一个表格容器5行4列. V, U# d( h3 n% `$ P
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    7 U0 c7 U1 T4 w8 P% U  ^" q
  57. : y$ V) s& D5 |, P3 S( o
  58. gtk_container_add(GTK_CONTAINER(window), table);
    . Z4 e$ b  L% R0 e7 J
  59. 5 b: `! V1 K  \5 W/ \7 l. t1 y5 U
  60. //创建一个行编辑
    ( G1 K: U: e9 r9 C3 n
  61. GtkWidget *entry = gtk_entry_new();
    % g& d3 i$ a7 [0 E  |% m6 [) P

  62. 1 x1 _3 h- I, r
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    1 B+ G( r/ g" \1 s# B( _
  64. 0 ^# r0 K4 d9 ]0 j
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    , e3 ]5 x% P, X) j; N

  66. 7 T* N7 E; @: J8 ?  F2 X: N4 s
  67. //创建多个按钮* }+ w* `% x2 [( f" q  w2 J7 z' g
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    . D. s' \2 ^* m/ l
  69. GtkWidget *button1 = gtk_button_new_with_label("1");2 y9 q6 S  Q. Q% `. r
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    2 b& m' R0 y7 s# F3 F" P$ G5 @
  71. GtkWidget *button3 = gtk_button_new_with_label("3");. W* ^+ L/ z8 W& n' x' P
  72. GtkWidget *button4 = gtk_button_new_with_label("4");
    % t; U. @2 e5 N* Z! a4 c' [
  73. GtkWidget *button5 = gtk_button_new_with_label("5");& s+ h  }# |3 _, J5 k8 L7 ~
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    0 p: a* O2 s" N9 ~: i3 J  n0 n
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    ) B8 X$ n# ~' }
  76. GtkWidget *button8 = gtk_button_new_with_label("8");( n$ ^# w9 \8 u
  77. GtkWidget *button9 = gtk_button_new_with_label("9");. s) g5 D' b/ P2 g# ~! x- f

  78. 2 u  i. I( h# L* x
  79. GtkWidget *button_add = gtk_button_new_with_label("+");9 V4 z; ?  r. Q
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");, N: T3 s4 R8 S9 F( L
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");! s& {4 D; p8 T# ^# ?
  82. GtkWidget *button_div = gtk_button_new_with_label("/");, k# j% G. n) Z
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");: m% R0 F, U0 H3 _/ u" G. @
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");9 w+ C% h) K  S/ G+ `

  85. $ w# L/ |" Z& l1 \. m& i

  86. 1 e/ F/ P% B" E, J5 q7 [
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    2 S5 ~) I& C% B" ~) J+ s! z2 a

  88. 6 j) q/ e  [' v% C6 f+ _% N# f# d4 Z% {
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    , W" d% ^6 k: n0 n& Z
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    . a/ H" K' K* A" `( K0 g
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);7 Z" k# S/ z8 @1 [) c) D
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    * i; |  V! a6 v
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);2 P" @- U2 d+ t+ f. ?* L) }; l
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    " q9 T$ e! i( a/ T
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);; j( A* m( \1 c. U. W5 j) B
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    & X( Y, {5 D$ u4 i4 h7 U- {
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    , A' {8 \0 m: d& \- |$ Q
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
    " g) d. O% ]# u! D- |' U
  99. * {. X- x1 {; Z8 K7 _- S
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    3 p8 y: A" {; S2 |3 X. ^/ o4 {
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);5 }) x- _  E. D$ L
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);" B! d3 t# E" W, r& V
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);# u1 I8 k1 o# k0 m
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);, g5 s& J- ~& O' l" D
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    ( t4 Y0 @6 ~& d6 t( o

  106. 7 n' C" x" u! x. y$ V
  107. //注册信号函数,calc()
    ) x9 Y! e" U& v( k. w
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    $ {' _9 I: e* j" g# ~
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);: {+ m; O1 {- \. O6 E* ^7 n
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    1 U  e4 C/ |* u3 S/ W
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);4 X$ D# K* t# z( y& B
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);. H/ \& z; B1 u4 g7 F
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    ! v5 l+ R5 e5 N/ O
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);3 t3 \5 ~5 s' k
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);7 y  |5 w1 d6 f  e6 ]! r$ Q6 ]
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    + Y& v1 p8 f) Z! A+ Q
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    ! y6 e2 O+ O% ~8 E1 C
  118. , y1 I9 j: H! Q' d, p# r- O) c5 ~
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    # c9 j1 t# _/ o3 B- u$ b- I
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    ' l  u2 @, n2 H; k3 w3 J, {/ m' k
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    , c3 `9 h! Z3 Q6 N+ Y% P  m* G/ ~
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    . k# [( S6 a8 d3 e; U
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);6 W* l# o  J- L1 S
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);5 l0 t$ j7 _1 R

  125. / j2 [1 Q2 M3 K% S% @
  126. 2 q+ ?- U6 k7 s5 x
  127. gtk_widget_show_all(window);. l% A( ?6 D4 E: C5 e9 _

  128. * F# H# `% m, z6 V' p
  129. //主事件循环
    : G3 s2 \' x1 l4 Y
  130. gtk_main();% g) }1 n$ }1 ~, N2 ^+ W

  131. 4 b$ h. t; |) v0 a" K' l3 ^
  132. return 0;
    6 P# X8 q% {( C) Y& U) t5 U
  133. }
    & A  ?1 @( `  z5 I+ k: U
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
# `" D# G* K' @( L% z- D9 b
" L! g# B7 |, k
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频& L& z2 A) F; K. J- a6 v" l

所属标签

相似技术帖

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