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

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/,,这个路径就可以,直接继续安装。
9 h$ A9 G' Z& A, x: c; x6 J9 P 1.png 6 d( G& u5 b% V' E5 l
   然后就学着官方文档的样子去验证下SDK是否安装成功
+ ~+ p0 |0 a& l  t    2.png
( W. W$ x8 m) u
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>2 Y) [: e: p0 i( D+ e* e

  2. ; E! h6 G2 {: E. f4 ~1 L
  3. static void  O6 c( V. L" B
  4. print_hello (GtkWidget *widget,
    - T& X5 H* n, P
  5. gpointer data)
    - ~0 }7 J% ]+ G- T' `- ?- q
  6. {6 Q/ A' J: Q7 `' o& Y
  7. g_print ("Hello World\n");
    2 c. X; o. C' d5 q& B" z/ ~
  8. }
    & b5 m1 {! ?" e/ y) C+ x; c
  9. 3 C7 z3 ?8 g8 a# R; k  \9 _6 x
  10. static void/ R2 d' I" u% ^) @7 @! E
  11. activate (GtkApplication *app,& |" y; [( q7 V) b0 H4 a
  12. gpointer user_data)
    . c. B& m! b# o1 B! N; V
  13. {
    , v7 g' f+ V" e% S% b
  14. GtkWidget *window;
    1 K- z( i+ m+ j  X+ J# U+ V
  15. GtkWidget *button;  A; z& _1 c3 Z3 n
  16. GtkWidget *button_box;
    : t! {* P; l0 o! P( C: N* m& r7 X
  17. - v, A5 C3 X: ?* F) `- t9 E
  18. window = gtk_application_window_new (app);# X3 H1 C8 r: b. |  v4 O
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");% u5 e3 n! d- c$ m
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    0 [2 J0 u3 w  f) E5 c

  21. ( @, E% a7 x& g+ N; O0 w( R
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    ( Y6 s' W/ o8 K) ?
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
      k/ j' ~8 R2 _2 }, x  u6 X: n

  24. / B+ X( c5 m" I5 o; e! b  @
  25. button = gtk_button_new_with_label ("Hello World");$ J4 f# ]$ {% C+ U: `- H
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    1 @, J) P& o+ B9 G8 i/ Y
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    3 e' S, Q$ d  \/ l3 t4 N
  28. gtk_container_add (GTK_CONTAINER (button_box), button);( x1 [0 C, _0 [) L

  29. ( S. m- n( g4 q6 T" y( T
  30. gtk_widget_show_all (window);* g8 S0 |7 T" i/ F0 a
  31. }$ v0 y0 c) }) A$ v$ |$ O# z
  32. ) ~2 H* W1 ]) I% [; h& s
  33. int9 C8 w& H& C+ e' p/ B
  34. main (int argc,% i  S+ U* }" O% u' X
  35. char **argv)! c( X4 B" m$ m! y8 k: R
  36. {% d: e* u! V/ K" P' {
  37. GtkApplication *app;3 ], q6 u# u8 `/ k9 \
  38. int status;) d* ~# L# _$ T' K% R* }

  39. 2 C; v2 M; `/ V
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);0 A: C8 z5 Z# B# L- g
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
      T" N) d! E6 V3 h' ]8 \
  42. status = g_application_run (G_APPLICATION (app), argc, argv);7 l6 N- {- Y5 J, n$ n: t# K5 y/ D
  43. g_object_unref (app);8 B( E. J$ }/ x0 b! T# d
  44. : Z: |, X) e/ A7 s4 u3 s
  45. return status;. p% }5 G: M3 z, U7 o! f
  46. }
    / H8 Z4 r# j' a& l( |( T
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
4 S' B& T, D7 z& h/ P; g! A
  1. PROG = gtk_hello_world% y: B+ V  U1 h9 _/ X
  2. SRCS = gtk_hello_world.c) `8 |9 S* {4 j+ c/ G; P
  3. 7 A$ B" }0 r3 \1 \- \6 ?4 R( L
  4. CLEANFILES = $(PROG)& Y& t) q1 N) B; H

  5. + t7 R9 y; U5 L1 X$ z( r
  6. # Add / change option in CFLAGS and LDFLAGS
    # a* ^* n5 Z( R0 o0 S$ h
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)' z7 }( E8 ^$ d9 T6 l2 `
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
    % T( _9 n' g0 z1 G  \3 G9 Z2 a

  9. % B4 _0 \) u% F. [9 E6 A
  10. all: $(PROG)4 I- x6 i- d: R* L) u' E! r

  11. * N/ b% d7 ]: L
  12. $(PROG): $(SRCS)
    ' }  h% q; Q# Q! J( T/ m
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    4 [: t  d, D* g0 w9 T/ n" D
  14. , \! J3 s4 h- U! Q
  15. clean:
    2 a8 l( A  R, F2 V' N; H
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
    ) g% Y# m) n: p( f: r
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png , m! U" ^! e) i; c. n- N
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。7 p, }% N# U0 Z$ B9 ]
. F* X4 m  y& e4 r1 q) q

4 d6 ]* n; ]7 X% N5 u# c
  1. #include <gtk/gtk.h>
    % ?  [! ^1 ?  E' x2 i: ?7 A5 M
  2. #include <stdio.h>: n7 a& c7 x& j# D
  3. #include <string.h>+ M3 C9 [6 A! M) ^
  4. 3 O* S% h: M% s4 X! G
  5. char buf[50] = "";
    ( ^/ C, a2 a" e$ u! N
  6. 8 R( v2 W- w( ^
  7. void calc(GtkButton *button, gpointer data)
    4 }+ _$ Q7 J0 |( I
  8. {: L8 ~/ v+ Y. h9 |0 e3 \/ l
  9. const char *text = gtk_button_get_label(button);  l* Y' F- R7 A4 }2 V
  10. ( V- s! s5 |) S4 O
  11. //退个操作
    0 X+ B$ S. @+ V7 n  F, g3 S8 I
  12. if (0 == strcmp(text, "c"))
    ) s3 y0 P$ L. B
  13. {+ m8 X* E# k9 H" ~0 w! q
  14. buf[strlen(buf) - 1] = 0;% f* G4 j, I3 E& |9 b  r& |2 M
  15. }else{. J: m( x/ a3 E' R/ u& r' [6 P
  16. + ]1 }! A8 ]0 B' g- S$ [* r
  17. int a = 0, b = 0;
    ! W- f; z! [4 f" J
  18. char c;% e! e. b+ K: q/ ?+ H6 I& D
  19. strcat(buf,text);: R! ]# N  s- G9 `  E! B
  20. # `& m/ c0 z6 Q$ V
  21. if (0 == strcmp("=", text)) {0 P! ~* T( l7 Q2 p% A+ D% u
  22. + P2 O  q9 T  \# D
  23. sscanf(buf, "%d%c%d", &a, &c, &b);
    - k+ L8 E7 p; x0 L1 P8 Y
  24. . y3 o& u5 y' M6 m- b. i
  25. if ('+' == c) {( G: j% X6 u: k$ P
  26. sprintf(buf,"%d", a+b);
    6 g9 n& G3 q# g/ K2 Q: T
  27. }- P& \, R9 {' V8 o6 o/ L( l
  28. else if ('-' == c) {
    ( @8 L+ K$ j' }0 s
  29. sprintf(buf, "%d", a-b);
    / r/ w) t6 x0 `& o3 {
  30. }
    2 Y" D" O! m3 P" N& J
  31. else if ('*' == c) {- I" Y  z% w; A9 f. C7 y
  32. sprintf(buf, "%d", a*b);
    9 w. |( H5 _  r+ b+ \+ k  p
  33. }
    4 ^  N. p. y0 |6 v
  34. else if ('/' == c) {) f/ e% q5 \2 s( c0 i9 N
  35. sprintf(buf, "%d", a/b);
    ) t; O. h% x- T4 }
  36. }2 O7 T3 c. S' v) z) ?( A4 X
  37. 4 \! J- _4 u& X: J3 x$ b  x( w7 e
  38. }( R! U5 u7 {2 O2 v& R( ]" x
  39. }
    - K$ ~+ _* t: V9 K" q
  40. * H( D) O! a8 x4 W1 @
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);  `' g! k0 f$ I! E0 N2 b
  42. , C% A$ m2 T. Z. t6 v1 r9 l, p* H
  43. return;! A* v. ]' N+ M& [* M
  44. }
    $ r7 r8 B2 c/ F4 [. E: H- L

  45. . b: C5 u  _, c2 B% R* p
  46. int main(int argc,char *argv[])! P8 J7 }$ X0 H, q0 F
  47. {8 g8 O2 e& q$ h+ P/ C

  48. ' B; T+ D) D5 A% h9 [" X0 M1 l6 Z
  49. gtk_init(&argc, &argv);
    * ^1 z" @. z! b5 @1 X
  50. 7 d& _. B! m7 t, t; m! }7 g7 ?
  51. # ]. S2 T$ X, }+ U7 y6 d
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);# a3 y4 J! X6 t6 v& w
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    3 S( t" y+ X) P1 n5 A5 {
  54. 2 |* h! @/ R* f3 S+ |8 }" v$ }3 X
  55. //创建一个表格容器5行4列  R' O$ B. i0 ]) ~& L5 B, i6 e
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    - B5 ~% J# q5 t& j
  57. ( n; W7 z' x+ U( t' g: r( Z0 c# S
  58. gtk_container_add(GTK_CONTAINER(window), table);2 |& ~. F( \3 c8 p
  59. % a1 w! T7 M' h* Z- R- }/ ]
  60. //创建一个行编辑% I: Y  J. o5 V
  61. GtkWidget *entry = gtk_entry_new();
    4 W( ~( s" G( f, K" D8 t

  62.   Z+ z% J+ `% b  }$ W% z
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    / b6 ^6 g4 H8 P2 b4 [

  64. & ~5 Z2 t$ h7 l3 Q8 T
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);7 {% W2 ?% ?7 U: c
  66. 5 C8 v$ R! v, K( l3 d; Y
  67. //创建多个按钮
    / f) R4 m3 \: Z" X4 b5 |0 b& Q
  68. GtkWidget *button0 = gtk_button_new_with_label("0");' N7 D$ ~! d9 J. }+ I/ _4 |: j
  69. GtkWidget *button1 = gtk_button_new_with_label("1");
    ; b2 z; Z& Z/ u' M. L4 ?+ S
  70. GtkWidget *button2 = gtk_button_new_with_label("2");$ C- c6 z, {+ W0 b0 v. b% j
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    3 {" |. r4 h, X' I! t6 @& w
  72. GtkWidget *button4 = gtk_button_new_with_label("4");
    / t; O; O; C/ o; _
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
    + i5 k$ b) s( C& J0 f
  74. GtkWidget *button6 = gtk_button_new_with_label("6");% a0 h  d+ I* @4 ~) h- g
  75. GtkWidget *button7 = gtk_button_new_with_label("7");
      p0 n7 I3 y5 s7 I
  76. GtkWidget *button8 = gtk_button_new_with_label("8");
    $ l# o. b9 ]8 P8 ~
  77. GtkWidget *button9 = gtk_button_new_with_label("9");
    4 _' m3 }% U0 M% a& H; k  n( d3 x

  78. : M. {3 P5 ?/ A% e
  79. GtkWidget *button_add = gtk_button_new_with_label("+");5 u1 w/ ~: J$ f/ }7 W8 ^% R+ j9 H
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");" |$ W! x, v& r
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");! K6 ]4 O3 M2 M4 W$ O5 c
  82. GtkWidget *button_div = gtk_button_new_with_label("/");6 ~/ f4 |: a% F4 i3 U2 j5 ^
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
    1 {6 s$ @+ k9 v% K% t8 B
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");% b# j! A/ U& c1 J; u7 G9 N8 l$ v

  85. . z- n  h' G8 e$ d
  86. 2 M1 ]5 ~5 @% U8 `, G) j
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);9 b$ Q3 W) C$ w7 h5 ?7 ?
  88. " \  ]; v5 v" x1 W
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    ) g5 N. B' ]" p6 G; Z: m8 H
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    1 l( B4 D7 d2 l& x2 G$ D, e" Z# P
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    # P; b  N0 r, e
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);* d$ D' p4 C! |# G) m& A. ?
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    $ ?5 L" t3 e+ m
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);" c7 V" t! e: ?
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    # G+ E- u+ N/ g' ]
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);3 y6 C% C5 U+ l' ]5 v
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);; C" [3 M& ?# B
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);' m3 Q; ?' O/ w/ x
  99. 3 m( A3 ?: q' M% a! e# }
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    2 }( G; {: [4 X$ b8 u
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);5 k/ v6 u7 g% [/ n7 F' Q
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);: g  U) w8 t5 o6 H- Q, L
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);) i9 I! k4 c4 f8 U! r
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    , W. C1 m% S$ |. u- i+ }- ?
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);5 i) g0 R; Q1 @5 @: u9 g5 r3 K

  106. 7 Q- t( e6 J! j  K1 u
  107. //注册信号函数,calc()6 [5 {/ G8 P/ f6 {& U; S
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    3 q' P2 O; P) u8 D3 `. K+ n
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);$ m/ T& O/ Q3 Q5 t9 i/ w% I; x( z  e
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    ' M& B$ O4 z! H0 m" P
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    ) {0 N% R. I+ G" H6 f3 ~
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    ( B/ X( d% y5 i. g
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    ) u% W- G% l% Q- t9 O* ]
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    ! @# s1 k1 \$ P0 o4 s  s
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    7 ?2 Y2 C' K1 f' J, i6 Z
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);! ]8 d) P+ \7 \, K! ]
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    6 \+ ^& o$ {  M1 y
  118. ( F% K4 w, ~' w, S
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);$ ~# g1 D* V2 W# H- g+ {( ^
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    4 l" L3 w% o" _  B2 s9 L
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);% g/ Q9 O1 Z" M# R/ u
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);7 L, p# A# {$ _5 j
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);9 m0 o$ ]# g, f# Q! t% h2 E" d, P
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);. D. X/ w, U2 h2 ~

  125. 2 t  ~% L! a& L  O" f: t& r
  126. 8 B7 x  u" J* V$ O
  127. gtk_widget_show_all(window);
    & K3 |$ Y# F$ t+ U; @- k9 G: V3 g
  128. - _6 M7 {6 N/ W8 y9 q
  129. //主事件循环
    " |7 N* V$ {; K/ H8 T2 p
  130. gtk_main();
    4 a) M! G* D' b; r- Z

  131. ( v, f* Q$ x* [# a# Q0 }( k' r
  132. return 0;1 c1 A7 K4 `' P$ P
  133. }
    # b, U( }( k. G% Y+ `7 w
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
' [" {9 z$ ]: c1 E# X. \
( g+ f$ Q7 y# O. T: {7 ~
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
赞 收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
" {- \* K) G2 \/ h: x/ a+ y

所属标签

相似技术帖

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