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

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/,,这个路径就可以,直接继续安装。
% w1 w$ B2 |! L% t0 @! M% q5 I 1.png
5 s6 l$ u  |: A   然后就学着官方文档的样子去验证下SDK是否安装成功
8 Z4 Q% H& H3 `$ e1 Y1 w( i    2.png . R2 G; G" I. m) U7 h! E" W
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>
    ( E7 t! y( }$ Y1 k
  2. ) a+ m( `3 R2 ]6 C, w+ L
  3. static void, C! l) r  C4 ^
  4. print_hello (GtkWidget *widget,, N% P) A2 Q7 h7 M9 p
  5. gpointer data)
    4 M/ G3 {/ \( h7 f; ?
  6. {/ r5 I, u0 h$ c; T4 f
  7. g_print ("Hello World\n");8 @9 S0 F! x) I
  8. }
    - m! F& M2 j- i- H8 v
  9. . m) f8 H) C* [: j& n" y( M
  10. static void
    * e+ v; B9 L( h! U! h( i
  11. activate (GtkApplication *app,2 _: [7 V# r- v' }
  12. gpointer user_data): u; y( w' I+ w. l: I# W5 j. h* X# m
  13. {  P0 u0 ^, t6 R( w  H! K
  14. GtkWidget *window;
    9 r3 J: Y- s. ~& B- y
  15. GtkWidget *button;# C) P) ^# J" o( _  O; Z
  16. GtkWidget *button_box;$ B7 H5 k/ A& S0 d! ?0 ?8 j, q

  17. / R9 f9 a& H$ h% P- ], F
  18. window = gtk_application_window_new (app);' r0 U' l; Y) ?/ G
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    7 v* t4 E0 [+ Z6 y5 w. c
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    3 W/ Y, q* B9 h6 L

  21. 4 A4 o/ u/ P$ i  i
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    3 J) d) |' S0 }( d, z
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    " H3 C# L7 w% P2 i2 E4 B" H
  24. 4 L: X3 c0 y5 S8 G
  25. button = gtk_button_new_with_label ("Hello World");- k( M' B, k+ Z) ?  D  Y: Z2 g
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);4 U8 f  B3 K, d$ ^$ J$ R: p
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);, B6 B& ~: j0 M& u5 h; ]
  28. gtk_container_add (GTK_CONTAINER (button_box), button);1 T+ u5 \5 n) |: a

  29. 9 n0 t9 Y8 ~+ Q; }5 {
  30. gtk_widget_show_all (window);
    3 l9 M# M* R3 E; K8 O9 S$ n5 ?( Z
  31. }2 F. G3 a0 a5 }+ G7 E

  32. 7 s0 P$ I2 X4 f( K- v5 b2 ~% o
  33. int
    * K' K: t0 X6 O: u
  34. main (int argc,& L/ p: Z* l4 Z5 C5 Z6 q
  35. char **argv)" a7 j4 T& ?2 Z& N
  36. {8 P5 u0 d. g3 _
  37. GtkApplication *app;
    8 [2 L1 I$ C5 D: H8 S8 G$ [
  38. int status;
    8 V) Y- I; N) G+ G0 H$ x
  39. ' ^$ {" ?! J; e; P; C/ E
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    3 a6 ?" X# Y0 f3 f$ S9 d$ u8 A
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);% W6 S4 g* h2 t
  42. status = g_application_run (G_APPLICATION (app), argc, argv);2 U0 V/ c# T/ p; u) h9 C
  43. g_object_unref (app);
    / A3 W. l' u9 l) R( k! w

  44. 0 J! d( N+ l. a& _5 T
  45. return status;
    " }5 Y0 X" J) [" B
  46. }2 t0 d/ o% c# u6 d. T: P$ `5 M
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  4 N) }' |7 B# L! d! b% }
  1. PROG = gtk_hello_world8 P  L5 w" V. \6 A! n
  2. SRCS = gtk_hello_world.c; j2 p+ ~3 j8 E/ [; ]

  3. 5 \3 n4 ^+ b: Q5 J% P) X, u; i, @
  4. CLEANFILES = $(PROG)
    3 f9 ^) c$ H' {

  5. 9 D* p: |: q3 \* ?8 \
  6. # Add / change option in CFLAGS and LDFLAGS4 P+ f4 L2 h, U( m4 S
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0); V/ B0 F" M9 S. F5 h9 B
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)/ K) A# {  y2 T" P
  9. + I5 W! X. A  p0 ^3 ^/ q
  10. all: $(PROG)3 A/ [, |4 @" q' n+ i1 X) \* t6 Q
  11. 8 X* X4 `: H' v( d, v# m+ {% \. E
  12. $(PROG): $(SRCS)8 u, h: ]4 d( |+ G* f) z& P* p
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    # j  ?; x( H( y

  14. - H- M) Z) E3 W: i
  15. clean:
    . e& |; P- P) t
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))* O& ^9 u4 A2 X$ I* B: v
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
3 N3 I2 @9 p3 a/ j( N
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。6 ^0 c' ?5 s5 _* G3 Z: s- t
. V# h0 X! k8 e7 V, b5 V

. F: D) I8 }  e4 ]9 a9 y
  1. #include <gtk/gtk.h>0 r! s& @& H% [) ^& ^
  2. #include <stdio.h>0 o) ^' }4 s. j: r% M
  3. #include <string.h>- L* X& v) P8 x- j& ~( [
  4.   k9 E% a1 Q+ F  Y: x( Y& j
  5. char buf[50] = "";
    3 {/ E+ h0 j0 t: f

  6. 1 J+ }4 M9 X6 P  w
  7. void calc(GtkButton *button, gpointer data)
    2 A0 d3 r8 j! i% S
  8. {6 \# K8 A6 t4 |2 T8 B9 h
  9. const char *text = gtk_button_get_label(button);
    + ?8 C8 K( B+ U( R
  10. . a8 w; P. w* A; z& ~
  11. //退个操作; i9 j! R6 D/ [2 s* ]# _2 q
  12. if (0 == strcmp(text, "c"))/ ~2 i: o' H8 Q0 v
  13. {, g, g  ^" l# B7 `' e+ s
  14. buf[strlen(buf) - 1] = 0;
    4 @, J6 x  E7 G7 g, i- Z2 R1 \
  15. }else{
    # X1 b3 {& B- _+ ]  k

  16. 2 o- W$ }$ c) J0 N+ o. K; z8 X$ O7 R
  17. int a = 0, b = 0;
    7 K/ H( O( P6 j
  18. char c;  w* V9 [, s: Q
  19. strcat(buf,text);
    % a4 ~: W1 |' Q/ C& d( O) }

  20. : A, P( j( B  W. V  X% g
  21. if (0 == strcmp("=", text)) {* n4 U/ K, O% }+ G

  22. " s0 L$ q. T& f: v  h
  23. sscanf(buf, "%d%c%d", &a, &c, &b);" X6 G4 |# x$ l; [; H: H- Y

  24. . O! z* c1 Q( D  s; w
  25. if ('+' == c) {
    * U3 b5 ?& ]. q3 _" H' @/ g/ F% s
  26. sprintf(buf,"%d", a+b);! ]" {7 \- M$ O1 o6 v
  27. }, i2 K: H( q" p  F; x( v* H
  28. else if ('-' == c) {
    ) I% n1 `+ R0 d' V6 d; ?
  29. sprintf(buf, "%d", a-b);
    ) D5 ~/ t. q+ l0 d# s8 I) `) f
  30. }
    ; ~. \9 C" \4 _- J9 B7 c4 {
  31. else if ('*' == c) {
    4 |3 s2 I- N/ |( Q/ G$ T
  32. sprintf(buf, "%d", a*b);
    9 T2 w! }4 K! p! [) n
  33. }) w6 ]$ e5 V" e6 X  G2 P
  34. else if ('/' == c) {. w" m- g8 ]6 P$ s) O2 X, w0 d
  35. sprintf(buf, "%d", a/b);+ A6 _9 [1 J; |) L
  36. }
    * N9 |% N, U0 T* `/ |

  37. # I' K. t8 P- _( Q, ~4 c9 L7 U
  38. }
    ' i% Q$ }( n9 @% b
  39. }
    0 Q  v/ F$ T; n1 p$ Z1 b6 ?

  40. 4 F; T: m( d  G% ~! ]. Z
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    - o1 ^$ A* L$ r1 q2 {$ r5 Z% p# a
  42. 3 Q4 b! Y: j. P' N6 S
  43. return;; N( F) a1 F3 b1 U) d; W" u7 Q
  44. }
    * w* K5 m2 U9 c0 H$ R/ [

  45. % Q7 P1 J8 _8 f
  46. int main(int argc,char *argv[])
    + ]4 ^5 g" k/ M
  47. {
    : C9 h0 G) g  J5 X1 @% ]/ P+ i! Q. g! Q
  48. 7 {; b2 y0 R6 G9 z6 w
  49. gtk_init(&argc, &argv);
    ( r8 D' `# A6 ^7 P$ |8 E# O! R5 T% u
  50. ' K3 W4 q0 l! N' L
  51. $ ?  Y/ y) l. D; p6 v  F
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      N0 d# S. Z. ]( C3 Q$ n
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");. Z2 S# E; k' ?% F0 x

  54. + |2 U# \$ F( l, f$ x, K& ^
  55. //创建一个表格容器5行4列/ f8 [  a& X9 M( x3 E  ^
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    , k6 t# H) f. b. ~! }  B1 L: j

  57. 0 x, g/ p* z+ W' n) u, l2 f
  58. gtk_container_add(GTK_CONTAINER(window), table);
      O- A9 o8 j2 ?+ v* ~

  59. / [5 k  F6 ^- B. r5 a. T
  60. //创建一个行编辑) \$ M+ a' o/ q+ ?( J
  61. GtkWidget *entry = gtk_entry_new();
    4 P, l7 [9 k1 P' |, @, o
  62. # C9 B1 F. W1 l* Q# L
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");2 }5 c1 R; D: B7 w- H

  64. + q% r0 H6 z, d- Q
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    + T/ ~5 M3 F3 O6 L7 p+ l
  66. 2 S9 L6 E0 F9 z
  67. //创建多个按钮
    " K3 p) _( u, ?$ _- M* \8 b
  68. GtkWidget *button0 = gtk_button_new_with_label("0");' T$ j/ B# D. G8 c8 L
  69. GtkWidget *button1 = gtk_button_new_with_label("1");0 X+ k2 Q, o5 ^- M3 x, R
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    % g( Y3 c* p" |* X, A2 w
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    / P/ T5 V8 h! I
  72. GtkWidget *button4 = gtk_button_new_with_label("4");, I  c! H# v! `0 O( m# y. }
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    # p% s* G# ~( g+ u
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    ! k1 G9 @. j' v9 ?8 g" F
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
    / o2 |9 A' I" ~$ |# ^/ x
  76. GtkWidget *button8 = gtk_button_new_with_label("8");1 {: g: J( s! r
  77. GtkWidget *button9 = gtk_button_new_with_label("9");
    2 s, r9 C4 M, x* Z
  78. . X6 i- g- j( w- v+ ]: ]5 P
  79. GtkWidget *button_add = gtk_button_new_with_label("+");2 I& m8 T: u7 J' d
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");
    8 f. K4 q8 E% N$ y/ I
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");5 @+ n3 T2 S( C$ r1 @4 O
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    ) M1 g" N, M0 s; X/ u/ m5 W" J2 s
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
    4 m! x( p) v* V( l
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    8 T- l6 F  \! C* c% z1 E: \

  85. : K$ ~# `& U8 t* \

  86. : t9 r7 X/ a) o* P
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    ( S0 [" W; C) _

  88. & n  e" E$ C) P; A  U
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);4 ]6 f( s; H; N! J+ T! G+ b
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    " ?  ~( }; i# L
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);, f2 Y' a1 ?8 r( ]5 X( }7 |5 c
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    % x3 ~! x. m, y- `' A( p0 w, m1 N
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);; ^2 H8 w' Y6 V; a/ W' W
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    1 h$ t) w6 y* h* j: r. K& F
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);; {: n3 o! u4 o; v6 I/ ?
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);, x5 s0 z* e  }- |& _
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    ; ^+ j: A# w" c3 x( {/ z4 i
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
    1 K: Y, j0 Y& Y
  99. 2 F: x7 ]+ C4 f/ ~) O
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    : q, }! I$ [( V' W! {
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    * Q) {) ~- y, g1 \4 Q5 t7 }
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    4 v  P" `% A( O/ o
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);# f! A" }, P" F* e) V
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);: g( W/ Q, @8 D+ H3 N
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);6 N9 I) _/ i" M/ P5 J1 F
  106. 7 R* y8 L9 G/ V0 H0 C
  107. //注册信号函数,calc()* x5 C7 F* y) x; L3 V
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);' J  a, N) q; t2 o4 @6 t$ C
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    & a/ N6 s& T& c
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);8 P( E3 P4 m6 b& A1 J0 M
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);0 j, N0 d! v9 T, G; A
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);& q' o) r7 V4 U( Y& Q- ?
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);7 H9 A/ o% F. e- F/ \9 _
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);, v+ m: P# r& \& S
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);1 K: `" y4 a9 Z0 h$ q; s8 B
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);/ S' Y! X5 I( b: I# b
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);! Y% Y$ y. x0 t5 D& g' n

  118. ; ^; \/ n4 w. q  a1 f+ k
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);1 `" K' j( J0 v  ?# d9 K
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    5 \  E! x8 B* A% J+ m5 n
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);% c( Z; N$ @/ U0 |: ^
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);* j, |1 ~. ?* y6 x
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);# G* H. j2 X. f& _- t  I
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);) x/ I! n- P  x  s
  125. 5 C4 ~9 e6 W, C0 P. r
  126. 5 ?9 V/ R+ c, @& a
  127. gtk_widget_show_all(window);" H9 Z' @( p9 R, O( v: W+ l5 s, r! u  s
  128. ' x9 c" W) ^/ b
  129. //主事件循环( A6 X5 T% \4 F* I: Q; {6 C
  130. gtk_main();8 ]7 e* }1 _& h9 J/ Z" b
  131. : e3 D7 Q& J2 A+ e2 D8 E
  132. return 0;- G! a) e% ?' a' C! z: L
  133. }
    6 h. P4 \. v# p0 g, U, ^+ ?2 v
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
' j: n7 g# H/ y" t4 Z5 ?9 D7 Y2 D" f8 e! X8 V; h0 Y- B! J4 l, t
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

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