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

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/,,这个路径就可以,直接继续安装。- O9 E) p! I( c6 c
1.png
1 F1 ~# a7 l- G" R! n3 Q/ G   然后就学着官方文档的样子去验证下SDK是否安装成功
9 {! [" b7 a! `8 L4 J% s    2.png ) w3 F1 z4 e8 W( Z; S# h
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>$ k5 w. m8 p, K" D# K( |7 e
  2. / P1 t8 U" S& v: t7 @3 e
  3. static void" J9 [4 V7 E: p% {2 ?1 j
  4. print_hello (GtkWidget *widget,
    + ^& r6 D; Q* n1 V9 R! f3 h% n$ @
  5. gpointer data)
    / [0 J! b' c9 W& W( w# j/ e% G: [3 v
  6. {
    " O. J- q$ o% o& k4 Z- R/ n3 F
  7. g_print ("Hello World\n");
    % E: T. B7 A$ c1 K: D
  8. }
    2 Z, z2 L0 L# e

  9. : ~, E% s$ N6 ]1 S3 Q' x
  10. static void
    " x7 h( I  D6 F( h: p1 N, L
  11. activate (GtkApplication *app,( H" e5 U3 Q, d1 R& K1 P8 H# }
  12. gpointer user_data)
    0 w  W& ~+ p6 S+ o- C
  13. {
    - q6 R( j. H) i& x3 T% c
  14. GtkWidget *window;4 ]1 C' _5 G4 m$ x
  15. GtkWidget *button;
    7 _: v- V. a( j, W( j- B; d
  16. GtkWidget *button_box;
    . u$ l+ o0 z; F# Z! ~( x6 s

  17. ; y1 Z  F& k  G1 k# z
  18. window = gtk_application_window_new (app);4 O; Y( J" O1 Y" |$ }7 D1 D8 b; L
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    6 Q( i# ]9 z# G: Q) r
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    . X3 }" l3 k# c5 u* k9 S6 m

  21. * l9 H, D( C: G
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);1 g7 X7 n1 h9 y! m. x' t8 L; h# s
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    ! f& Y, t# w* t' F6 x6 T

  24. 2 D$ q4 g8 d& M4 d+ M. `$ A
  25. button = gtk_button_new_with_label ("Hello World");
    1 |  i& g8 M$ T3 A, J6 a
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    ) p' b6 y" r& |( L+ z7 s: q7 i- {
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);2 V9 h/ p# q$ T
  28. gtk_container_add (GTK_CONTAINER (button_box), button);; e2 W5 W; Y1 G1 M# Q

  29. 9 R0 e- \+ @( e; {
  30. gtk_widget_show_all (window);- i# O5 [3 M6 o& Z# w7 T/ N: A! a
  31. }
    . x; c! D( _+ w/ E

  32. 6 r0 T/ Y2 F9 F' g
  33. int; v5 f3 W4 M9 `  g$ P0 F* g( F
  34. main (int argc,
    + @* I7 {8 N( a4 R3 ?
  35. char **argv)
    # r# i" ~1 n0 }) K! s( p
  36. {! T% {- S+ K* [+ V1 B! q& N+ W
  37. GtkApplication *app;$ Z, t2 x) T6 K  l' z2 I5 k
  38. int status;+ a3 L9 O0 J! F) A! n
  39. 5 A) A6 k* M5 X* u5 k4 l
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    7 M6 A5 i: @7 C$ Y. Y( Q7 r
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);! v+ _+ T7 g. |2 e* w2 ^* e
  42. status = g_application_run (G_APPLICATION (app), argc, argv);0 ^% t2 j6 p. i7 Q' o
  43. g_object_unref (app);
    ; O, ?+ m! K4 j, \

  44. % Y5 _& N6 @" E' N
  45. return status;" l- Y- L; O9 b2 R
  46. }; P5 t# Y) c9 T5 r- @, ?+ ], d
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
+ Z/ q2 g! }. J$ _% }9 J' G! r  c
  1. PROG = gtk_hello_world/ N5 M  U6 J, X  S
  2. SRCS = gtk_hello_world.c( l. H6 q9 I) Y+ U

  3. - C& z& n8 x% _/ p+ s# I
  4. CLEANFILES = $(PROG)( b- R& H! B2 M$ r

  5. ! r( r" q. g7 |3 U; e# M
  6. # Add / change option in CFLAGS and LDFLAGS
    1 _: n, P% B- h
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    * Y0 M0 v& L& Z6 p  }0 W3 t* f
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    ) k# x0 u" z! U( K5 o" Z

  9. / u' |, N& N/ j# O. w
  10. all: $(PROG)4 F$ a5 C% k3 j! K$ R" v, A8 I

  11. + f* `1 w, k: ?9 D1 I) O
  12. $(PROG): $(SRCS)% i8 P5 J$ w5 t2 ?
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)% Y' B7 j) Y0 T5 @/ e- O

  14. 2 M$ m8 n. y/ v0 D
  15. clean:
    6 h( T  ^) i3 b0 u# ]3 O  Q! n
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))7 W1 u. q& G& i' V- n1 l; N7 d
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
5 I  s2 z- Q( c9 a; d9 p
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。+ _* M! ~3 t9 K

: \1 p# y* G0 M2 C9 v, O 3 E7 F3 k7 G5 v, }7 L
  1. #include <gtk/gtk.h># e! j& q& @% L1 l5 ~* H
  2. #include <stdio.h>4 L6 P, B* I8 L: h! K2 E7 o
  3. #include <string.h>
    5 k5 l$ q. h( E" t# o
  4. # ?7 |6 ~: f1 Z$ m/ a
  5. char buf[50] = "";& d; q1 h7 m3 n+ J: ~! p

  6. % J! H8 x8 _+ K  p4 |- Q
  7. void calc(GtkButton *button, gpointer data)
    - q4 b0 n  F( A9 W( v
  8. {
    / V( y* J+ i2 K' N% c. Q
  9. const char *text = gtk_button_get_label(button);
    / h! ~4 k* ?, B5 b( h' ^

  10. 9 j, w" N' J3 J' F; b
  11. //退个操作
    0 J) {/ A/ n2 s7 Q, W; s& f2 Z
  12. if (0 == strcmp(text, "c"))  Z( x+ ^( b9 Z8 K* ?; e: L4 Z4 T: M
  13. {# @0 m" z( W5 q+ W+ m
  14. buf[strlen(buf) - 1] = 0;7 b5 ^5 s: d9 d
  15. }else{* f: v3 ]. Z7 h1 Q

  16. 7 v# }+ S5 E9 V8 a" J: o/ d
  17. int a = 0, b = 0;  d; X& n3 Y% A: n' f! W. q. T( E
  18. char c;- m0 a% k6 x2 x! P4 c0 ?" D' S) g& i
  19. strcat(buf,text);3 R6 |" H' J. n& m% |

  20. 7 e% o1 N) A% J" b
  21. if (0 == strcmp("=", text)) {
    9 K- `' t" K/ b
  22.   j/ o3 N5 }% Q* U
  23. sscanf(buf, "%d%c%d", &a, &c, &b);
    0 [7 d+ o7 ?0 A9 B: Y

  24. $ {; N) z: q' g" \
  25. if ('+' == c) {
    ; j  B, x3 ~# ^; U" R( k
  26. sprintf(buf,"%d", a+b);
    , e+ @7 c5 b, m' s0 V0 B6 c" f
  27. }7 s. y, q. j( F6 I* |
  28. else if ('-' == c) {
    0 w3 y2 I1 ^" M1 w+ U4 @2 O
  29. sprintf(buf, "%d", a-b);; h7 o2 C  f9 G& Z/ |, l
  30. }' z6 a9 d1 U9 T+ U
  31. else if ('*' == c) {
    7 f& d& \- e, g
  32. sprintf(buf, "%d", a*b);# f2 A3 |) q. c) M
  33. }
    6 k" a( B& c$ K( h/ b
  34. else if ('/' == c) {
    & k% Y! h* W6 L, I+ T8 ~
  35. sprintf(buf, "%d", a/b);0 s6 k/ x6 U5 A, L) ?
  36. }
    . O: u5 d! H8 k9 U- p7 l
  37.   c$ q7 T2 [, A0 M1 s& x2 n; w$ m
  38. }
    # t2 Z1 H. Y" R
  39. }  l* \- n3 I, G, |( C

  40. 8 ^  k5 j& L! m. |+ Z7 K
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);) S& c8 e' a" ]. R' ?

  42. % u' J) K0 i1 G' t
  43. return;) d! u; @9 C* _8 A
  44. }
    1 ^  d* K2 n. l3 C

  45. - h( `/ V+ {' _7 |) [
  46. int main(int argc,char *argv[])
    1 u) s/ Y; s$ t8 _1 }$ [
  47. {3 F! q3 A2 g% y/ d5 V5 |- X
  48. ; e, Y  j+ }( W
  49. gtk_init(&argc, &argv);; @: \6 s, b0 v" Q; M8 ^
  50. $ R/ F  j- g& s, m1 r

  51. * ]$ |2 I* T/ c3 C; K
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);$ U0 c- ~+ C8 c  h" n8 j  X
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");8 P% _3 L# h$ F" m: n
  54. 4 l! w% C6 C$ h1 H' d
  55. //创建一个表格容器5行4列+ F' H, k5 c+ g7 o" z7 }1 k
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);( i7 A6 X3 d, N, m
  57. 7 ]3 B) Z5 w- H# [
  58. gtk_container_add(GTK_CONTAINER(window), table);
    % r' q  L8 ?1 x4 j# H) H
  59. * [- f# v9 m" B9 a3 ^! I4 G
  60. //创建一个行编辑
    / Z: H0 A. {$ N5 D3 g
  61. GtkWidget *entry = gtk_entry_new();
      w8 }! K2 r' `  v

  62. # S: D1 t1 t2 r& B
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    . r% [! ?4 b) F9 @

  64. 8 H& |% X9 F+ p, U1 K( \" B
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    - G4 Q& J- ^! ?8 U6 _* N

  66. $ h0 Q% G# }6 Z& N0 m
  67. //创建多个按钮
    1 K( ~$ i+ e8 P% o
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    2 K1 ?3 d; d: z' r- X
  69. GtkWidget *button1 = gtk_button_new_with_label("1");8 c& u& V* W7 b" n2 i* D1 a; n( r" G
  70. GtkWidget *button2 = gtk_button_new_with_label("2");% R0 K5 M* r4 P( K$ r
  71. GtkWidget *button3 = gtk_button_new_with_label("3");. V2 D- r+ r3 ~( U
  72. GtkWidget *button4 = gtk_button_new_with_label("4");; D1 R8 q, i8 j4 I
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    3 b- }( a: P* t
  74. GtkWidget *button6 = gtk_button_new_with_label("6");4 X2 I0 H3 v! F1 K: N
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    ' i9 q7 }+ F. s$ N
  76. GtkWidget *button8 = gtk_button_new_with_label("8");- b: [4 c+ O, n. J9 q7 [4 ^' d
  77. GtkWidget *button9 = gtk_button_new_with_label("9");9 M1 X8 H) \% X2 {

  78. % i( J& v, H. x" @! P
  79. GtkWidget *button_add = gtk_button_new_with_label("+");6 t3 Z8 `) V" K$ I# g
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");( p+ C* _3 f( [" D- H; \) O! H9 C
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    3 o2 l  V0 a; b5 \. L. n- h$ A
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    % b$ q) r& E+ U. S
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");; s" d" k1 L* Z! ~$ X
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");0 [" ?, A* r. ^# Z

  85. 2 T/ t0 r4 V' r4 `, |
  86. 5 l3 f& z0 T& a+ k
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
      h! `$ j' n3 d: a4 G8 F8 u+ h' S
  88. 0 w8 X: g: Y, S+ g" n
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    " D7 g% X' N9 Z" B* y3 t/ v
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);: Q$ R9 s" y% Z4 t
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    2 s5 M) }! e' ?7 i( Y* [% |
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);/ w- ~$ |, i8 }6 v9 ^! U9 n
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    . ~: J3 B* F6 O
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    2 r' R& {) ^  F& g
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);2 W# ], |( q( B5 g: h
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);, C  j3 ?* |9 o
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    ( A: J1 ^6 a5 K% p* e+ a9 D
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);( j/ }: a- O' k' d1 }$ c

  99. 9 g. h* V* v+ h
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    % a$ I# V: A6 f4 ?" x
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    1 ]; h7 @! d- W) x  D( R% B
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);6 l7 ?- n' k4 q! W# A1 @, g: a
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);. c, }9 Q+ g- M$ v+ @
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);- H2 A+ n2 V9 M, `8 E
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    0 X, ~# l6 z6 ~. }

  106. ; a; a0 e/ a# X  A
  107. //注册信号函数,calc()4 O3 F0 ~. n% x' ^. }6 B
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);/ t( o8 d) ~: [4 m9 X
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);. j$ o, C9 q7 w, _. \2 d5 p# P5 n
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);2 @# G+ n' A% O0 I: Y+ a$ |
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);% J& ~( ]! K- K
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);1 T$ e8 J) E$ h4 H. |' M
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    3 k6 G5 a# ^7 x/ w4 C
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);# H7 \- _0 x  B- e  o- l0 v& k
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    . v: m6 Y% W2 h' n2 u8 h3 K7 z8 H$ J
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    " {% Y$ I! a4 R9 g  Q
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);: H+ r  p5 \% Z* L  W- M
  118. . d$ e# `' T, w, D4 H+ D; S
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);$ Z1 A4 H3 Z1 }2 i
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);/ ?4 }) V6 Z8 n8 m* ]4 B
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);; o9 t( }3 |% Z) L
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);- v0 O0 f7 c! U* C
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);9 M1 K8 j! Q* }; D
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);, c7 E+ a* T, d5 X+ Q

  125. 8 d9 X# ~4 l1 z, u& Q7 e

  126. % _& d! [8 K* [5 g2 g2 V$ |
  127. gtk_widget_show_all(window);
    + j$ i/ Z$ G# X
  128.   d% K+ a" s$ v; Q& j1 _: i/ w
  129. //主事件循环" F6 x% S4 N' c% Z$ c
  130. gtk_main();
    * j# E+ {$ G, s% R

  131. : a7 }( I3 R7 m( B! i2 h. f
  132. return 0;
    3 u9 B' V% J0 L7 `+ u
  133. }
    8 n% B' S; Y! Z
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
. `- `" m; X& F3 l3 H  |' I9 p; t- p9 a5 L! }. M) c- L
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

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