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

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/,,这个路径就可以,直接继续安装。/ F2 P% G0 _3 M5 P1 l
1.png 7 I- c+ p! d: x+ Y. d* S
   然后就学着官方文档的样子去验证下SDK是否安装成功* N* b2 a+ u2 {5 l1 B+ e3 A+ O: n7 p
    2.png
0 b  D  F/ P5 b# p3 D
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>
    # J9 T# I& t0 m) l  E$ W

  2. 1 F* V4 z1 t/ ^* _. X
  3. static void1 J6 G$ f6 m* d% d
  4. print_hello (GtkWidget *widget,
    , C: @% N" Z/ Y7 L6 G
  5. gpointer data)
    2 V: I$ e( f- J0 U! }" o( o
  6. {* n: I0 j3 R) x- H4 C8 |
  7. g_print ("Hello World\n");9 N" `# @# r4 d, ]
  8. }
    " b! ?: r7 ^7 X3 V- t, n7 Y
  9. . G8 E3 t' c) G3 k( ~! W8 h
  10. static void
    ) {! f/ c# C) ?1 C2 U
  11. activate (GtkApplication *app,
    / R' ?5 z/ }: A4 M
  12. gpointer user_data)
    0 c; a# l6 u8 G* b
  13. {5 }' t' `3 A: B1 R
  14. GtkWidget *window;
    ; m6 v$ D3 S1 i& X3 p
  15. GtkWidget *button;7 i5 y, z9 w2 X; T
  16. GtkWidget *button_box;
    " I5 d7 ?, K' x3 y" A3 c
  17. 4 d( B# @, X6 X: i, i) G) p6 Y( `) e; _
  18. window = gtk_application_window_new (app);" F% @6 q! x) k3 v8 D" Q* \
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");3 N: r! a* T/ J3 W
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);: A% `& H8 R7 {4 M1 a2 }
  21. & S% l# W' C6 y1 @
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    2 O  G+ `6 v- D- e) Y  S
  23. gtk_container_add (GTK_CONTAINER (window), button_box);- F# f+ j! N4 Q3 I! |1 H5 ^

  24. $ h5 L+ e) l  Q5 f8 }) l! R
  25. button = gtk_button_new_with_label ("Hello World");
      ~! p! V0 k1 Y# @7 n# @7 H# `9 l6 r
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    $ R" E5 \) |' p% t' n. z
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    1 Y* o: w0 ~5 w" L9 O) K
  28. gtk_container_add (GTK_CONTAINER (button_box), button);4 B6 @9 V# y* p5 h

  29. , Z* A$ y5 o& J" G* V* t
  30. gtk_widget_show_all (window);
    ; i; L6 k6 d/ G/ `7 i  y$ K# Z' G! D
  31. }$ S' B/ H: N: \

  32. ) o- C/ \( @% X, v
  33. int
    ( U8 s7 T$ L4 }7 V/ Q! D
  34. main (int argc,
    ( k. Q! q4 |! {$ A  L( J
  35. char **argv); G! \6 Y1 p3 \. X5 z
  36. {
    1 O5 C% J% o$ a( y4 T: L  E
  37. GtkApplication *app;
    # s0 B$ g; @, |; y) S. J$ s% w
  38. int status;" ~! [; m9 i& B) o% d5 C
  39. . i/ G! a0 D. f; E/ M( r. }
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);0 d% q$ o: J1 f& a: u
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    " a9 Y- @) S( H( S3 O
  42. status = g_application_run (G_APPLICATION (app), argc, argv);3 }+ y9 b5 m% ]4 o
  43. g_object_unref (app);
    , k% u1 G4 f. V- [8 [! E- v# w2 I

  44. 3 ~3 P4 }0 A. B0 ?" A0 K
  45. return status;
    : q4 C; c8 ]( _# R/ Q
  46. }7 y, R7 {: G# A# V$ N  _( X( K8 B
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
/ ?5 r, i! r' I
  1. PROG = gtk_hello_world/ e/ K! P; U0 _/ C  x$ Z
  2. SRCS = gtk_hello_world.c" \7 a$ V: B' N
  3. - A+ j$ }. C3 A  P
  4. CLEANFILES = $(PROG)
    / _' v6 e. e% ~& Y" v
  5. . y. B% _6 z4 ~5 o6 h! L* ^) `
  6. # Add / change option in CFLAGS and LDFLAGS
    & {2 O; P1 \5 @! f) t4 {& B: f
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    ' o6 r- v' v; W/ l: P( r( p2 n+ |( g) V
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)5 J9 q. S8 o+ {6 `+ r" c2 w6 w- G

  9. - h- `9 B9 T, m$ N& j9 t
  10. all: $(PROG)
    % f' {; E, O( Q4 H) Y

  11. 1 W' a8 @6 d9 n8 O% T" H
  12. $(PROG): $(SRCS)6 u3 J: D% [! b. \2 i+ G* u! m
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)) @2 S6 Z3 O2 ~- z% n) C" s
  14. ( ^/ z- c! z" {- ~; r
  15. clean:
    : c8 |" S$ @( t7 ^# Y; c& g
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
    ; h! C, m3 S9 V( q3 z
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
: G/ [9 `1 o' M# o
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。$ e; q0 v# F8 R0 F
. a0 R* @, d/ H! \1 t  f
/ O& C7 }# E% d. K* t2 `1 V" }  z8 Q" N
  1. #include <gtk/gtk.h>
    8 Z* v0 [" s# S' @
  2. #include <stdio.h>8 \( B9 ~" I& h: Q# [2 {- ~8 D: i
  3. #include <string.h>
    ) `: g, l8 i& t% Z( F
  4. . h( g* ]- M* Y) M& s+ j1 M
  5. char buf[50] = "";% ?1 Z0 P: n! X. a' ^& M( Q
  6. 0 _. U. t5 E& F- Q% x! V
  7. void calc(GtkButton *button, gpointer data)( i$ a8 P6 [" X) x6 p" ]
  8. {) Q) Z  H0 M4 n& m# P) l
  9. const char *text = gtk_button_get_label(button);9 [4 Q, [/ v6 k
  10. 8 b2 M) g. T1 c- e/ o* d
  11. //退个操作
    & E- x9 f$ o) J* H$ \" x
  12. if (0 == strcmp(text, "c")): g. ?" A" V: ?) }
  13. {
    7 g: N; f! N# o- ^9 s
  14. buf[strlen(buf) - 1] = 0;& C5 t' b) u5 B- q5 Q
  15. }else{
    3 H5 O. R8 V8 P9 M) n% f1 [

  16. % h9 ]/ j2 c9 k2 ]. g
  17. int a = 0, b = 0;; L# q( a4 Y2 r/ b! q
  18. char c;9 L! E, m# a: n% t8 [; A9 v
  19. strcat(buf,text);: q) _& i. `+ S" O
  20. " O0 S9 |' r3 V* ~. [. S2 t
  21. if (0 == strcmp("=", text)) {1 D4 w2 r1 ]. v% D* L: I. r

  22. 1 [4 O, U" \* _8 u; }" z5 c2 }' C
  23. sscanf(buf, "%d%c%d", &a, &c, &b);
    : `* A9 D. M) y' ?- Q; n
  24. # l$ e$ G4 V; L, t! Z, b
  25. if ('+' == c) {7 `- t/ j5 J& {& h! x* Y* v
  26. sprintf(buf,"%d", a+b);7 ~* X" Q7 w* X4 H7 P
  27. }
    + e; M2 t# R* B5 v
  28. else if ('-' == c) {
    . r: C" h( P* b9 o, H6 D) L9 k
  29. sprintf(buf, "%d", a-b);( |- p  n; i! _+ V6 r
  30. }
    : Y6 ^& b, K* D3 q6 O% M+ e
  31. else if ('*' == c) {* b4 F+ d& ^8 L" Q
  32. sprintf(buf, "%d", a*b);1 j) M, R7 @$ S/ @9 l2 z! t
  33. }6 L. E$ t3 G7 q& d) @: ?0 U) }. A
  34. else if ('/' == c) {
    , O5 P7 j( q9 j8 ?
  35. sprintf(buf, "%d", a/b);( n8 H- f+ W: B
  36. }+ O) a- K0 A# X/ A
  37. 2 o9 W& {! @8 k' z0 P* M  j
  38. }
    6 w0 U/ Y! k- [  G/ {( d
  39. }
    ) \. b; e# x+ f. H! j3 m
  40.   |* z0 [( s, {
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);) X: u! m7 ?- E+ |  P# ~0 z

  42. 5 i6 ]) b: G$ p- Q6 o$ Z$ @  w% n
  43. return;" M: H: ]. ?+ y) @3 @5 j/ \
  44. }) k; S. A  U8 P
  45. 0 K7 U! Z5 T; S. N2 R; Q
  46. int main(int argc,char *argv[])
    6 {9 \7 w0 `- l
  47. {8 ^  p. T; f# i. I: E* n. z% x

  48. $ c, R7 {/ O4 M. V9 z/ R3 l
  49. gtk_init(&argc, &argv);3 v2 l5 a. |1 ]! i* R  e
  50. ! E; c6 {2 [- z. Y' u* e

  51. 1 V; \& I% A" V
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    * W! F, i5 k8 X7 m( y
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");; \: \3 Q: w* v0 K* s/ b6 B
  54. # t: m# D6 Q: ?8 z; ?* h
  55. //创建一个表格容器5行4列1 |  r+ i+ Z5 _1 f
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);- m/ \' C: P4 M5 N9 [' M- g/ g/ U* u5 e

  57. 7 x5 a  N$ D1 {/ Z: p
  58. gtk_container_add(GTK_CONTAINER(window), table);4 H# ]8 v6 ]& h, j, g7 x- k

  59. ) w6 y/ }0 z5 X" |5 M0 f- r
  60. //创建一个行编辑, U+ x8 \4 X( z- @9 d3 K1 D0 w
  61. GtkWidget *entry = gtk_entry_new();
    . n' Q4 R+ y9 v8 @, L
  62. * |  L$ c; V: B( ]9 \
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    % O% D/ ~! n" n
  64. ! M9 B* S, S9 t2 [0 n
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);5 L8 J. O1 E6 J! b0 ~

  66. : e+ \% e, @5 m0 V; n% C9 d/ U
  67. //创建多个按钮
    1 R0 e+ S' `% T$ [3 |
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    8 m/ D9 _% n! G* T6 S
  69. GtkWidget *button1 = gtk_button_new_with_label("1");# k/ F5 e8 R" n5 q( h  c+ L
  70. GtkWidget *button2 = gtk_button_new_with_label("2");2 T8 M  E8 M4 q5 A
  71. GtkWidget *button3 = gtk_button_new_with_label("3");, a1 d9 s- {  s: v, h7 {
  72. GtkWidget *button4 = gtk_button_new_with_label("4");  y6 W- X# b% u, i  y) V
  73. GtkWidget *button5 = gtk_button_new_with_label("5");3 r1 u3 f5 E+ D# a0 V+ P3 Q
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    ) h+ L# G' j' @% B& W
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    4 Y7 K' o0 x' R. k. z
  76. GtkWidget *button8 = gtk_button_new_with_label("8");
    0 A, G$ [; B: g  h
  77. GtkWidget *button9 = gtk_button_new_with_label("9");' Z1 o- G8 c- I
  78. 0 s) g0 n( ^; L& Q0 ?7 d
  79. GtkWidget *button_add = gtk_button_new_with_label("+");9 g6 L* ^! u5 ]0 B1 @; p
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");6 X. I! q: C, b2 K! C" }
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    5 S% J+ `3 {0 V0 t
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    7 |! ]9 @! M4 ~
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");9 z7 N8 [1 j9 o% R6 l
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    * w8 J" ]# z% n# j" N+ ^! ]6 j
  85. / n# W* v# _" H* ?5 ?8 F9 m$ Y

  86. . v; X! z' v4 Q1 Y) `; {: t
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);3 G0 a( `# R$ C& f  G+ G
  88. 2 c* ^. O1 E, R
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    % R" u7 w$ p1 r) m
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);; I% K$ G$ @4 z+ K5 D0 n, |
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);6 A: P" e- z- j
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);8 I0 d3 D) M9 W% U' {! |
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    * _6 j3 C% K3 N
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);( Y9 D8 E5 a! j+ P
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);& V, l: n1 \* q! Q1 R
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);' W% S3 B6 F$ t  ~0 |* W* Y" [
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);! r; v- m3 F4 m5 Z/ i+ k
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);& N8 ]: z/ l+ K

  99. ! O0 W0 h! c! k" r" j
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);& b1 I  k- k; \  ^6 D
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    ' u5 l, t+ t  C
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);9 n6 g* S% j; W9 b% i
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    ' l+ y. y* E4 C: U% P! {
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);: k. P6 v& Q2 [: O
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);; |0 D' G4 G' E( D" E

  106. & @& ]1 A& _$ R1 I# q9 _1 k
  107. //注册信号函数,calc()  o* ]4 |2 @8 B5 s
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);* K5 O9 L$ b; P) {: A* _
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);& F3 {1 N6 h' A2 H
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    % D% ^2 P1 o/ G2 F
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    2 F% w2 }+ u' x: w, h& C' D. t
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    # {% i% J/ Y, h& r+ `. C
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    5 B; f7 m/ L8 c: P+ n: }$ [
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    ' S+ f' j9 V6 ^8 M0 |
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    ! j  H0 h  y9 h) n9 n2 a' ?
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    ! y2 k$ h% e4 R* u* ~
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);$ n( [9 ], o( Y3 S3 _* d, x
  118. 2 b) e. \4 u% l8 O) x9 C4 ]
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);! k$ O1 B! H% s7 e/ C
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);6 y/ U" a1 e7 k' `$ i- W2 G
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);1 B; A: u$ @7 q
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);$ s4 k1 ]+ f$ a: O  `
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);( w& Y4 b5 M, f
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    ; S; v$ S6 t! x0 S1 z1 ~( _
  125. . c+ G! `  w3 _+ O2 x
  126. 5 {8 Y& E6 P+ p) ^  K* [
  127. gtk_widget_show_all(window);. H# g' _: S, f) {' E4 J- D6 \
  128. + t2 [7 i/ V. S: R7 D
  129. //主事件循环
    6 v+ }$ o, j6 D  Z; i
  130. gtk_main();. m' l( p' a) r

  131. , E/ y, v; `; f5 i! @- e
  132. return 0;
    + R5 @4 e0 s& A; ~5 z* D5 H$ r1 A
  133. }
    / p4 @1 t4 R! o( `& c: G2 J" k
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png 8 V4 a2 B1 a' H/ L% P
& q% I* o( j/ \$ P4 z
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
赞 收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频% y7 S' n' c  U1 z

所属标签

相似技术帖

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