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

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/,,这个路径就可以,直接继续安装。
; f! X( {6 s3 T4 G+ d3 S3 |5 l) ] 1.png
1 a8 j% O7 j6 n! T   然后就学着官方文档的样子去验证下SDK是否安装成功
3 p4 f% e1 Z/ g1 r    2.png
7 C! h! Y9 a9 D& S8 t. n
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>
    ! Z; `  d' Y7 Q- P9 }

  2. , J) k5 ^; {7 W* ?, H6 c' Q+ v
  3. static void6 m4 U6 g3 E6 H( H
  4. print_hello (GtkWidget *widget,
    ' k; H2 n: ]0 K1 i& M
  5. gpointer data)# V% j6 a: i$ [
  6. {
    6 A% |4 ]* M# T- Z
  7. g_print ("Hello World\n");
    * ?, m2 M  Z& o% S& @; h1 V
  8. }
    ! M: d! i' Q0 u4 }

  9. # }4 I. K7 w- n( ^
  10. static void
    " \' S/ P; x( c3 f) m& B6 e, U1 `8 u
  11. activate (GtkApplication *app,# L- Y7 S( O7 M* S$ F
  12. gpointer user_data)
    # h% _: U7 I4 k
  13. {, k- f- `) j! v1 Y2 V' [
  14. GtkWidget *window;4 F- ~- q4 L$ N5 g  S" j  P
  15. GtkWidget *button;
    1 `1 s! ^6 }. U2 Q# N, t
  16. GtkWidget *button_box;) {5 [- J$ e( G, ~( s$ p+ Z3 y
  17. 4 x4 s- D" q# t/ n9 W) u! Y
  18. window = gtk_application_window_new (app);5 q" Y! P7 [. ?+ `
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    * t9 v1 ^& o. K; n. {) f# W0 b
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);, x. u) X2 k6 Y, j+ r

  21. 4 W+ x9 Q2 [1 U$ n4 }
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    - \# Z! B; p0 {
  23. gtk_container_add (GTK_CONTAINER (window), button_box);; m% a+ _6 U$ u: j: m

  24. / F( y3 Z& h, S, }0 a
  25. button = gtk_button_new_with_label ("Hello World");6 D( Q$ L. D- A
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);: D- [- h4 v! x3 @4 M) M
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);0 c1 `' C" R: N) J
  28. gtk_container_add (GTK_CONTAINER (button_box), button);
    4 \" F1 y2 M- B% s

  29. 1 X) b0 y0 |8 G1 y$ ]6 ?; ]
  30. gtk_widget_show_all (window);: J) E6 t) Y' X/ o$ Z
  31. }
    # d2 @5 X$ A# o6 n
  32. # Z0 A9 j+ ?$ [! x4 A; u* W* L
  33. int
    $ u! j) V7 a( ?0 R% O  u) o
  34. main (int argc,2 v3 E) ?( O( g4 Y+ M7 N9 J6 p- P
  35. char **argv)5 u- i" K, R% I: j% G
  36. {
    / C2 D; w+ e3 W' r/ F
  37. GtkApplication *app;
    ' q  W2 a9 t8 \; Q5 K" n/ c& P
  38. int status;
    & D: S* S; r9 f9 ?! n
  39. : x$ y& n' e2 l5 N: \1 ^: H9 C
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    , z  s" f4 a6 y7 C- W3 e4 b
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);( ~( c0 V: S) u7 k  T2 y8 z
  42. status = g_application_run (G_APPLICATION (app), argc, argv);5 n( O! r5 U6 d! z. J" _
  43. g_object_unref (app);
    ' G+ Z# ^& C9 u' s! W& i3 V3 H
  44. 3 W# Z0 }! ~4 l4 O
  45. return status;+ X1 T, A7 Z, l" q. Y
  46. }! J$ }% r. [1 ]0 P' R% O3 U% T& ]
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
4 R: V- M3 m6 A: z0 k8 E
  1. PROG = gtk_hello_world3 d9 G2 q" A7 \2 s2 W& T; s% q
  2. SRCS = gtk_hello_world.c8 Q8 g; x  `# t6 Y% ?: F9 r0 ]
  3. , T" h" q, ?: W& x" a; O# |& u/ k
  4. CLEANFILES = $(PROG), D& O8 o% |, T! x
  5. * N. r: c( N) C9 B+ b
  6. # Add / change option in CFLAGS and LDFLAGS2 E% k0 W" Y* F' D
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)+ L* R. Q3 C' A( k
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)2 r1 Q/ w- p, h3 a8 I1 a( m

  9. + n3 }, `- H8 O
  10. all: $(PROG)
    ) F( T- i) ~6 r, O' v
  11. 3 \5 p' c8 l& Z
  12. $(PROG): $(SRCS)
    . w3 r! r& d- q) }# T6 j- x, p
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)" t* d5 N$ W/ i) D
  14. " [! b3 e# @, A' b4 E2 R
  15. clean:
    ! ~. K! o8 \2 h4 t# ^/ {" @! k
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
    - P) ]. v9 q  p8 `" j# N& {5 |' g
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png ( l9 w, |6 i2 U
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。9 f1 N1 S' p4 L6 L

$ q1 |9 M2 o% @" P2 Y
6 i2 u) `, I3 H* g7 v
  1. #include <gtk/gtk.h>
    + k5 g% _# ~7 B4 b8 k
  2. #include <stdio.h>
    7 a0 q. @/ E. L1 Y2 a7 j
  3. #include <string.h>
    9 C* D" i: m0 Q6 Q' S

  4. 2 y9 W# n  R: o" ?! @: u
  5. char buf[50] = "";
    ; p5 l; Y* i3 z; S

  6. 2 T. f. U/ r8 L, _3 v) P
  7. void calc(GtkButton *button, gpointer data)" R, a9 j: ?4 v7 _3 `; _' O" p8 P+ v
  8. {
    8 v& z  Y3 C6 f9 w) e
  9. const char *text = gtk_button_get_label(button);
    6 u/ O8 ]. b+ E! f# P) Y5 [

  10. . t0 H/ v3 r" E, k" f
  11. //退个操作
    4 }. e/ P% C( ]
  12. if (0 == strcmp(text, "c"))
    6 k. _+ ~- p4 a( R8 O8 E
  13. {* w. ^: T/ Y/ Z( z# b) F
  14. buf[strlen(buf) - 1] = 0;. D( J$ z# f0 T
  15. }else{6 t( G. k# A) }. J7 A5 s# E  `

  16. + G. v( o3 S' s" q/ N
  17. int a = 0, b = 0;
    : k  G: b: y: v  _
  18. char c;
    / y" [) @8 J' `; j. v$ k- y: J
  19. strcat(buf,text);0 f/ Q/ t' Y$ R6 g

  20. ) X% ^2 s5 q  o  Y+ m( f1 ]/ o# r
  21. if (0 == strcmp("=", text)) {
    / e1 E% @1 L6 d- u& g# h! H: v

  22. 0 A2 a. M  f& \4 L2 Z
  23. sscanf(buf, "%d%c%d", &a, &c, &b);5 f3 V# h; U' l1 I) g
  24. / x9 L/ ^, \* P: U- {6 u
  25. if ('+' == c) {
    " u. i4 Y5 V/ h5 _/ ^
  26. sprintf(buf,"%d", a+b);
    ' G! a9 o* G  x% D
  27. }
    ( b3 l- o7 i) b* a$ F
  28. else if ('-' == c) {* j+ D' U& Z8 W9 o
  29. sprintf(buf, "%d", a-b);$ K' z( I- a1 K; g9 h, l0 [
  30. }
    8 a" N0 Z' o' I. T8 r8 A4 d1 G
  31. else if ('*' == c) {2 \( X. J! [/ Q* ?: P9 X* S. Q
  32. sprintf(buf, "%d", a*b);
    ! v) [; E" `; c& i9 ]& b( V2 j
  33. }
    : l( \* {9 u2 _; ]: v' L
  34. else if ('/' == c) {
    : F  `5 P# e( ]4 M9 G, A
  35. sprintf(buf, "%d", a/b);
    * ]5 q$ p2 M6 F. X; R$ S0 q+ |* j
  36. }+ ^9 G: w" n* M" \: O- c

  37. 9 b2 M  L" U" J7 z4 U/ _/ |4 j# F
  38. }
    7 p6 ^! D. p: n4 Q0 J* _6 `1 r4 }! S/ t
  39. }3 b" Y* H/ `8 T; W

  40. : S/ ]4 Z/ B% J- g- Z
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    ) c* t7 W! [1 B5 @* |6 H8 |% p" H, `

  42. 6 `, n; m4 b, M% {0 q5 e
  43. return;
    ; u$ w" C" @) |5 }9 |" U, s& T
  44. }! ^3 p( `- D' d( H# t! G9 o

  45. ! G: L% c1 c+ a! z* s' i+ Y
  46. int main(int argc,char *argv[])
    # B2 S$ ?% U6 d+ |
  47. {
    8 L" ~3 Q# j! e8 q# Y

  48. 4 P/ B/ L& W! g8 i& M* p/ L
  49. gtk_init(&argc, &argv);
    . s* i6 |8 F" V  V# F9 L1 ^; a  i
  50. ; h% k: e! T5 v7 M/ v# G

  51. / ^3 l% R; K- N! y) ?3 |
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    3 I$ c. p/ L7 ^' X
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");6 j5 @4 O" Z) S7 ^2 X* e
  54.   `; h  r6 b' Z! I
  55. //创建一个表格容器5行4列  B  z: b4 c- i; ]9 u) r% J) D4 V2 t
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);) Q. O& J& n& u( x, a. h! N

  57. ( u  _+ p' t5 ?: ]1 \0 Z
  58. gtk_container_add(GTK_CONTAINER(window), table);
    : S+ @+ j; c4 J3 _
  59. 9 {) b0 V2 A6 Z. V
  60. //创建一个行编辑
    9 ]* }- A* }2 X/ f) ^; _
  61. GtkWidget *entry = gtk_entry_new();
    / r) n9 y/ N% Z9 }
  62.   W2 U. O7 H" \! x0 o, l! @+ g( O
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");+ \% h* B& Y! q) I- F1 h: }
  64. , q; _* ~) ?% ?, g  c
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);6 K8 p; n; O" E! N% T- C0 Q7 i

  66. 2 G9 I8 I, L( o4 A9 b9 J3 Q6 h' M, p
  67. //创建多个按钮& V5 h6 e, {" v# a/ V3 }7 Q
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    0 J' g1 d* ]5 K. x2 e
  69. GtkWidget *button1 = gtk_button_new_with_label("1");8 p8 I5 i9 f# \0 T$ i; f% W. D! J
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    9 }  D* v; \5 f* f' I% p
  71. GtkWidget *button3 = gtk_button_new_with_label("3");5 b/ f) r8 F1 X* Q/ f7 G" V- G
  72. GtkWidget *button4 = gtk_button_new_with_label("4");5 A- M7 ?& r* e, d/ B: y
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    + L$ @( P$ o: ]1 e
  74. GtkWidget *button6 = gtk_button_new_with_label("6");6 A( X$ m4 c1 n1 W! r5 q9 @
  75. GtkWidget *button7 = gtk_button_new_with_label("7");6 x; y# J6 _, V1 U4 u
  76. GtkWidget *button8 = gtk_button_new_with_label("8");# P. R8 T, ^* H
  77. GtkWidget *button9 = gtk_button_new_with_label("9");
    8 _7 F2 h3 s) L. T2 t% o& N

  78. $ X/ F& y& A# l: l  H, V8 p; l3 @
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    ' Q1 H3 y, M7 E! V3 I+ z* e
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");( D; A+ x. p# V9 w+ s1 |3 _
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    1 m4 `4 S- H! ]' S4 p" A( O  M
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    . n! @6 }4 |. l2 E$ v4 z( I
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
    9 }8 D* W# F4 ~
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");! U/ R' ~; s4 s: S
  85. * s. H; |* g/ l: V/ a  J+ y/ P
  86. - u: Q1 ]: m1 J( t/ [. G, I5 t
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);0 ~+ d1 Q5 d% ^, ^

  88. & {2 ^. z& B5 H! ^+ n5 l
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);. K2 y' q# [9 @$ o
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    7 r' N* K( c% i4 }
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);* E' ~0 @" }* n# R% a6 w& M
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    . R' G# Y0 e7 `+ m: `1 T
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);. I  W* w* C. a; w2 p
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);: z& H' [9 t8 G% E
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);& L4 ~0 O+ y; l8 B
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    6 p- o9 s! H: ]/ N
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    1 }  V) N, U5 ~# a+ Q0 c
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);' n3 P1 u! W- Q$ Y5 s& X( E" {4 g
  99. & @3 V* g: S; N$ K( y# x
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);7 r( e, W0 V; i
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);& O3 }' Z& c5 s' b( C& u: ^: s
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);+ S+ U6 {; x3 B' U" J
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    / G  }2 p" ]; t1 b% Z- s
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);4 h/ s! l: M. L* q7 O& o$ X% g
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    6 c. e: e: z% o4 X; h4 f

  106. - }1 J! f) j- S6 I, L, [
  107. //注册信号函数,calc()! W" C) ~1 y* K; _
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    ' Q  i, U" i# M7 y) S
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);; ]# o' k1 X0 A* c) l( T
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    7 I1 r& C) d( I$ v  U: m  M& h
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    , S9 s/ a1 M. {7 t' C0 h
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);# X7 |( ~# q8 @! D1 e0 a, x
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);! ^: l! \4 c% y1 o+ C" E4 Z- B
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    * D* `0 M$ Z# U  i
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    " Y) n- N7 D- ?0 A7 p' q: \2 k
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);2 O: k: C9 T  z) m  r: p* V
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);* r# V# b- O: P( K! w1 ~4 @
  118. / Z6 p( o0 x& n5 t: q
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);( O7 |: L: w. i1 A
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
      E6 c5 ?& i) G7 G
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    ' ]; J) P9 J# U+ E! u& T! r
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);6 K8 G. J7 @  [7 w/ n
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);  |6 E6 e5 a2 c2 Y3 a; c) G
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);" P5 D2 ]+ v+ b& }+ K5 H/ }
  125. 3 P) t2 [  |- E& I  J: y' ^
  126.   D+ y3 l9 T. G
  127. gtk_widget_show_all(window);
    6 L. ^; y* N- A9 f0 D
  128. . B% P1 a7 y, Q6 C' u, u
  129. //主事件循环, g5 f. @0 X2 b. T$ \3 t$ K3 j
  130. gtk_main();& b' v& G% g& }& R2 h8 U

  131. * b7 p$ z6 H1 C# \" `
  132. return 0;
    & U  E9 W8 x  D
  133. }3 W" Y4 A0 w6 ]8 h" J* A0 {
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
1 \% C4 r7 w8 _0 D& a, O" s. i9 g  o, S  H5 d
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
" p# g! t( W3 K0 b+ _2 H* u& s+ E9 g
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版