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

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/,,这个路径就可以,直接继续安装。
4 n8 {, M- C# \: c" |6 I 1.png
4 e# }3 h( I+ x% I% V6 d5 H9 a2 u   然后就学着官方文档的样子去验证下SDK是否安装成功7 ?- t( j9 [7 q! ]' @
    2.png
. ~$ i0 e* F/ O; r1 X1 g3 X
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>2 R/ z( h2 t/ e2 |8 i7 `
  2.   w- \/ u5 X/ y+ C* Z. ^1 |" I; l
  3. static void
    / @$ A1 J' p; O
  4. print_hello (GtkWidget *widget,
    2 H) P, o4 f- e4 l1 `3 z" j
  5. gpointer data)
      s" U& |" h- L( ]% V
  6. {( f$ ~6 @* {; @9 D' D
  7. g_print ("Hello World\n");
    + Q0 U, n/ s# z7 {
  8. }  c- F+ A3 X; h( F: n
  9. ( b# e& |+ ~2 B5 \
  10. static void
    " X0 B; b( }- B4 E  b% t
  11. activate (GtkApplication *app,
    3 S; H# N& I& \) E( j: G
  12. gpointer user_data)
    1 V: u) A* R- G" Z
  13. {* X) y4 @; G& b6 Z% \; B4 W
  14. GtkWidget *window;
    9 j. w! J7 p# S4 T, y
  15. GtkWidget *button;
    # k+ z* O: W* s4 C0 ]7 ~% x& p( l
  16. GtkWidget *button_box;! {) H) C3 \% [- C
  17. : Q9 A  O( {+ _! X8 \
  18. window = gtk_application_window_new (app);. W& u, K8 K4 q" P
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    $ `8 v+ @& c0 u8 {
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    0 V" x+ r7 H) ~  s0 l

  21. 6 K9 s) ?6 k% G- r5 k
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    ! ~( M: x: Y/ m7 D& u* S% t
  23. gtk_container_add (GTK_CONTAINER (window), button_box);) F% j% T7 _/ D1 B# e
  24. ; k8 L& k/ ]; Y8 x/ Y0 \, Z, q( [* n
  25. button = gtk_button_new_with_label ("Hello World");
    1 W; g* T% f- h3 P* W
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    ( P; C! L* w1 T9 X& f
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);5 p$ z5 Y, p- ~& ?6 F7 ]" W
  28. gtk_container_add (GTK_CONTAINER (button_box), button);+ @' W3 H4 H& e, i, y7 k

  29. ; E! U, R3 [- R' |
  30. gtk_widget_show_all (window);# k8 Q1 u; v) \0 r& y3 d, \
  31. }4 c. W& W3 v/ T* p9 e( z; {

  32. 6 q  o- v+ a: r. A+ a
  33. int
    & {  ]+ F! n- j+ \' i) O
  34. main (int argc,  L6 Q5 e' |6 C3 H+ L
  35. char **argv)
    / Z* K; |6 e; q! u6 A
  36. {& c. J- V& ]8 ?9 O
  37. GtkApplication *app;/ t4 a- t+ h7 N% ^( d
  38. int status;0 l$ X* s6 x: w8 G
  39. $ D* c+ D' y# Z# |3 l' T! W
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);, t/ x& c, }1 a4 y! ?8 S
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    2 f# O& c- I. W4 |" w8 Y
  42. status = g_application_run (G_APPLICATION (app), argc, argv);' Z: w0 Z7 ]1 s7 x# @
  43. g_object_unref (app);0 q, n' v" s! o( P; H7 l2 R

  44. # m& ^: b6 k/ y' J& ?
  45. return status;
    ( r- X/ g  u) T# N  V( @4 e
  46. }) q. A- Z- ]6 n4 A& ^% @: F
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
) R6 S. k+ b4 W0 @  |3 z
  1. PROG = gtk_hello_world
    ) K9 N) r- g& ?$ a+ y( o
  2. SRCS = gtk_hello_world.c' ]+ {; i9 @- w* y9 F! R
  3.   @  c- x6 |2 z
  4. CLEANFILES = $(PROG)' w9 G+ N; v2 X' F2 J

  5. ! u2 `6 M( F, `" k: W  I
  6. # Add / change option in CFLAGS and LDFLAGS2 g. ]" |* ^4 R5 V
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0). S( I! P7 C3 k- N
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)/ P  ?( C; `% x# l0 p6 Z$ J* A
  9. 2 t) x# Y2 s( `3 Z0 x
  10. all: $(PROG); h9 k1 v# U6 E- s- H

  11. 8 Q( q; v$ |( c& X% q
  12. $(PROG): $(SRCS)
    6 r. A' y  q# U: V
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    ) f8 ?6 R  }2 D  l5 R5 m

  14. * Z3 `. w9 ~9 Y' j2 j) ^
  15. clean:6 _( T: l# z& J0 `8 y
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))' m% S, u9 P4 P& z
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
$ V2 c$ f: r  X" g& G! h
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
4 `2 H; j1 w0 w8 o* c2 V8 \- A* X5 F

4 o# l% b& K, k7 ^
  1. #include <gtk/gtk.h>
    ) W2 z5 |7 M$ [0 p# O
  2. #include <stdio.h>
      n, T8 C% ^2 u( v9 z
  3. #include <string.h>
    0 u* I8 i4 X; ~

  4. 9 }5 ^5 b2 e" V$ d
  5. char buf[50] = "";5 y4 I) Y) ?0 V; i' L

  6. 4 n9 g, i4 V0 a. x' M; `
  7. void calc(GtkButton *button, gpointer data)
    6 e' o4 F$ B' ~7 g$ r( O
  8. {
    & @( O+ f6 g7 S+ O( f
  9. const char *text = gtk_button_get_label(button);
    7 ?) ?4 b  v# b; F
  10. , ?* T0 F; k$ n: f& n: A
  11. //退个操作
    3 l" W( C% z1 b/ ~) D( A" P
  12. if (0 == strcmp(text, "c"))
    5 E4 W4 T7 p) l" [
  13. {. a8 w  A8 h4 Y! q6 X/ B4 }
  14. buf[strlen(buf) - 1] = 0;, a  P' e- h: u$ S; X9 ?. D
  15. }else{
    1 G2 w1 G) U# ]  g3 Y! w; h4 y( L
  16. 5 h0 R' ]$ X) K5 y; _+ s
  17. int a = 0, b = 0;0 E4 G5 l6 Y, E' o8 F
  18. char c;; A* o" _' @+ U/ ]: o
  19. strcat(buf,text);
    / v& d9 O% x  s3 z: }
  20. , p7 I/ `0 {. [. S
  21. if (0 == strcmp("=", text)) {# ~5 j: d' ]% W! V$ r/ |) S

  22. 0 T' E9 J$ |5 n" `3 E* |
  23. sscanf(buf, "%d%c%d", &a, &c, &b);5 L5 a4 Q+ ^+ Y" U3 U
  24.   x) v5 d+ [  ^% B( _( T
  25. if ('+' == c) {
    $ d* o3 S2 H' a- P. |. J
  26. sprintf(buf,"%d", a+b);
    , Z. O+ q$ {( t. ~7 f& P  R
  27. }* \$ F5 A7 |' ^3 M
  28. else if ('-' == c) {: r3 u+ |$ T, Q
  29. sprintf(buf, "%d", a-b);$ z+ x1 F/ @- r
  30. }. Y$ M/ d( A" q' o5 h7 t+ C  N
  31. else if ('*' == c) {
    ! u- M  O& b8 x5 T* C0 v
  32. sprintf(buf, "%d", a*b);
    ( k# n* ^- G9 x& f
  33. }8 O9 G; O; P' V+ ]
  34. else if ('/' == c) {
    8 m9 c* ~1 l9 l0 L1 l
  35. sprintf(buf, "%d", a/b);
    + x& M1 @" Q% x) f8 ^9 s& \
  36. }8 M/ ^  L$ Y, w5 r

  37. 9 K( H3 s8 ~- u
  38. }& J' k5 w! c3 g/ ]% a. W
  39. }
    3 H2 h8 K/ y" R0 S  a, B  w4 F9 T( p

  40. $ `& s7 I7 s, x1 q# M# \. O
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);& K1 A$ O% k2 J& S; `+ R

  42. 0 h6 P( c( K5 j
  43. return;
    / G% _) O( w- Q$ E$ ?  x/ }8 b; W1 [
  44. }9 V6 o% H& B" G! o! _2 `: {: A
  45. ' h8 e1 b2 L# ^- O1 n2 Y2 ~
  46. int main(int argc,char *argv[])
    & p  C* g5 n; z! ]9 y
  47. {$ G' d% H8 _# i4 b/ O5 o( H6 R, Z
  48. 5 G7 l( V, G- ?
  49. gtk_init(&argc, &argv);
    9 a  v( c0 g1 Q0 o( O2 b8 m* L# E- E3 t

  50. . ]7 j2 O3 ~4 N2 b$ M& Q

  51. $ m. \% ~/ W0 F& K
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);+ `, f- r$ i# l; _* X; `" C
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");
    ) ~: M) z  r7 z* G2 ~$ t% ]7 p! H

  54. 2 R5 E$ {/ M9 O; f# ~" c& `
  55. //创建一个表格容器5行4列
    ' A/ w. p( N; t4 M) n8 `
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);- R1 I& w# T- ^# y. t- j
  57. , P' m9 g2 t, I' J* A- `3 k- l
  58. gtk_container_add(GTK_CONTAINER(window), table);) N7 L0 B' p- j; I1 a$ \4 U
  59. # I& T2 G. ?. M% {+ T
  60. //创建一个行编辑
    2 H% @/ V$ ?* `' r
  61. GtkWidget *entry = gtk_entry_new();
    ; H( ~* `7 U$ U

  62. ' \& A9 w1 f$ G; ]
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");/ u' r2 ?% p, r5 F
  64. & d& N8 Q" g. v% q0 W4 R
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    - a  h* ^/ T1 j0 {! G
  66. 0 P- n& _( A6 R1 [6 R+ ]5 }" O. z
  67. //创建多个按钮- G3 o% O3 x4 o7 {5 d+ y
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    & V  c4 H' }; R% k
  69. GtkWidget *button1 = gtk_button_new_with_label("1");  s3 H0 z2 [/ B/ B3 s' q: Y$ C1 c
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    , \0 o5 C* m4 l9 E5 \
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    ) R+ q% ]/ }9 U  ]& H+ G9 Q. f
  72. GtkWidget *button4 = gtk_button_new_with_label("4");( Z# i. p; i- ^/ A  ]3 @
  73. GtkWidget *button5 = gtk_button_new_with_label("5");7 X$ Z+ H. X+ V( a8 i# F
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    0 k  H5 {; C) A- v( {
  75. GtkWidget *button7 = gtk_button_new_with_label("7");1 a2 r  \; b! t7 l$ J/ g! }5 K
  76. GtkWidget *button8 = gtk_button_new_with_label("8");
    # `$ J# m5 w; i
  77. GtkWidget *button9 = gtk_button_new_with_label("9");. n% i# d' s4 t. F2 B

  78. 5 a# ?  K' S5 i  y! ^* s
  79. GtkWidget *button_add = gtk_button_new_with_label("+");8 W3 ~$ Q9 t% T0 h3 T+ R
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");0 G: r; Z& H, {. }
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");
    8 [8 v; Z) t$ P# y' `
  82. GtkWidget *button_div = gtk_button_new_with_label("/");" j; c8 p) x( g( R1 T
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");  {1 F$ V& Z+ m7 E3 b7 T5 ]/ ^' S
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");
    4 R) ?% n: w2 l$ j) B

  85. 1 f' {6 I4 G3 j( U# J, `
  86. . f# `' ]. g1 i- D! c
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    ( I+ W+ d. r( r- ~6 C

  88. 6 A  Q! G3 k! t- i$ ~* U5 {
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    % G- t" P6 O  f, ]  @
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);- T6 X. C% }+ F
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    - C% p1 K* o- {: j
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    $ `& Z- q3 k9 y7 Z  z
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);" O+ p: r# U% b1 D1 Y6 Z
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    + G* m* j: X5 D1 w5 e
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);& V. }2 O6 S+ L7 q8 P
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);9 {6 u0 P7 L  G  x
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);, t1 O' I4 L! Y0 B
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
    " n3 i6 R" |( ~' U. B
  99. ! N. J6 p/ x& c1 X
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);. K/ G: n; y9 T
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);) h  J7 n' q0 \; y& {3 z) x, i
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    5 c) k5 {' z; V* Q( M2 H2 {; @  @
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    % C. ?6 \8 G6 O' N. v* h
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);3 z2 O5 {7 C& \
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);) z8 ^/ T! I& v* I! g) p2 T

  106. 0 V: c5 P/ b3 ~* L. u5 ~# _4 C& u
  107. //注册信号函数,calc()( o+ J* ]4 C+ u/ `- t
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    - |" `* M, M% A0 R7 M
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    - T$ e8 h# g$ j8 h5 w
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);3 j9 Q+ X4 h" u
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    ! e' [7 ?" N, ]0 I: P* F1 n4 G
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    1 q; a. B4 r. r1 N! U' w3 W
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);& V7 d2 F) x4 ~4 F
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);: r4 U4 J  `5 k. T5 m/ d
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);9 A  k0 W9 z) c, x' h& Z
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
    ; f4 E% F1 A. s, r
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);2 U* l$ M1 N5 z' M
  118. , X  y  t6 Z3 Y0 B" i
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    * e4 _1 u, ~: ~1 o1 t. K
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);) R7 j8 y+ O3 [2 m$ v
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);: {' h5 a: o8 c( s' K3 l+ i/ M
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    5 _, N7 o" r# p) ^
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
    , f& h4 L* ~0 u
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    " s5 m. u; F, b; R: z* {% T$ ^

  125. 4 i1 F5 k8 \# o2 ~' ]2 @  w. ]

  126. " D& ~, g/ q; O5 X# Z
  127. gtk_widget_show_all(window);" D+ n) o) B* o/ A

  128. - a2 a1 m' v; w* n: c& p
  129. //主事件循环/ P" J0 p1 ]3 W6 z" I
  130. gtk_main();" Z6 x4 _$ R, G, n: E0 k

  131. / C* D, f% A0 ], A& l) j" z5 H
  132. return 0;
    $ {0 U$ X) M- c1 Q
  133. }
    4 ?& l8 d3 ~  D7 I0 X
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
( T" q- ^: B8 h2 I4 C- Q6 p% {
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
赞 收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
: {/ a* K& u' }

所属标签

相似技术帖

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