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

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/,,这个路径就可以,直接继续安装。0 S1 g0 s( M- Y* J5 U% b" C/ a
1.png
; c' j+ S$ ~9 _$ P# m- Z% |- P# O5 U4 o/ @   然后就学着官方文档的样子去验证下SDK是否安装成功
2 P0 B! h! h: k! T8 K1 m* G6 {; L    2.png
, }! q5 O# R) [4 S3 d) o/ v5 m! z2 V
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>) n( b- N( H, y
  2. 6 G! E0 l7 |& V& B6 C- e3 \
  3. static void
    ( {! [: l* ?* m; l" y; i2 z- E
  4. print_hello (GtkWidget *widget,1 E' x# h, R4 u9 j+ g
  5. gpointer data)# U) R: x+ V+ \# M; U
  6. {* `& a$ ]4 y2 ^
  7. g_print ("Hello World\n");1 _  ]$ a% _4 r
  8. }$ X1 P1 D3 A) {* F, ^
  9. 0 l0 M: S  K5 R0 H* W9 ?9 p% T
  10. static void
    ) p( p' N* u7 `+ G6 A+ O1 o( q
  11. activate (GtkApplication *app,& q0 D4 n+ }. Z
  12. gpointer user_data)$ L5 |/ A$ Q  Q) _9 c9 i7 E
  13. {$ ]* ]3 e- Q: ], b( e
  14. GtkWidget *window;
    * e# S( Q  Q5 @  j; U" Z" H# S
  15. GtkWidget *button;. F4 E9 |# I' N* r1 H7 {
  16. GtkWidget *button_box;/ @0 t6 t: ^+ m* B' |# `0 d, ~
  17. 8 f& [# L8 R6 m' I2 t
  18. window = gtk_application_window_new (app);
    7 i+ J, e+ E  [8 D' R5 @( |9 e
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    ' T1 G% d, u  S9 Z# G
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);6 v. U  @; r  e) D6 x! G0 _
  21. 8 ?& F( A" k- u, w) I: y- ^
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);$ q- U% Y4 u& p
  23. gtk_container_add (GTK_CONTAINER (window), button_box);
    & G8 x$ \" ^9 c

  24. / S. r3 d9 {' {" G  F8 V3 ^
  25. button = gtk_button_new_with_label ("Hello World");
      X2 g" U. u+ `& C+ c- {
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);% E, l; b7 s7 m' }, x( \/ ^# V: F0 g
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    ( ]/ G# F- Y3 _
  28. gtk_container_add (GTK_CONTAINER (button_box), button);
    ) G) U5 m( d9 q( E; p
  29. + X. v. [/ n6 w! H& J
  30. gtk_widget_show_all (window);
    0 w$ C2 q$ \; O; C
  31. }
    $ z! w' M, p8 @+ w, M1 K! Q0 ?5 I! Q

  32. ; T  Z0 m( `- ?3 X! @+ y
  33. int! e9 E$ i0 G* i- I
  34. main (int argc,# A5 {( Z6 o9 d5 w; T. n5 ]
  35. char **argv)* {) |6 ?! ]* A! q9 ^2 M  s
  36. {
    . h1 b/ ], w2 g) J  F1 E( h
  37. GtkApplication *app;- I! J! M* Y3 r+ I
  38. int status;
    1 S, n6 H1 m" N5 H

  39. ; a0 e+ K! a* s4 P- [9 C, c
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    2 k1 A$ M! O% {9 ^
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);# W9 r  p3 J* C6 J# Q
  42. status = g_application_run (G_APPLICATION (app), argc, argv);0 ~* _0 g- I$ [5 U$ H2 X
  43. g_object_unref (app);$ `& m, _3 V* V; v7 n3 c
  44. + W4 p4 O! h; s
  45. return status;
    ) _5 W2 E- t( S
  46. }
    $ @2 ?9 ~1 R6 l/ J$ u/ Z
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  
  }8 @7 j/ K/ Z* B1 f4 a6 s
  1. PROG = gtk_hello_world
    ; L$ C8 {2 h+ E7 \2 h, r/ p
  2. SRCS = gtk_hello_world.c
    ' ~+ @. \5 w1 q2 F

  3. 1 x' h9 L1 S- V: P( R  n! `
  4. CLEANFILES = $(PROG)
    2 x* V0 n2 K  B, S7 z% {

  5. . k- ?+ I6 Y7 u' i5 ^
  6. # Add / change option in CFLAGS and LDFLAGS
    & O/ \" Z" \; p3 _
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    ; I3 t( q, B) T* @
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0); A+ x. D& l; E, U" S1 s) x  O# l
  9. 3 Z4 C# s& a7 O) ^
  10. all: $(PROG)7 ^3 n. J- X! ?" c# y
  11. % U! T7 w0 ^4 K
  12. $(PROG): $(SRCS)
    * E* I# h# Z1 u9 h
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    5 K, M  o5 _  J; J9 ^; o

  14.   F' F4 N- N  @4 n# \  z
  15. clean:" n2 u6 l7 K1 N- K) h+ `, `
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))! h' I. i  W, n" Q. {% p
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
& J  `& ^8 k& l
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。
8 f( ]# p' X( g, `) y1 V$ }: K; J) @0 V0 \7 N6 S
' G% J2 Z# d% n, v
  1. #include <gtk/gtk.h>
    # X: w- m/ C8 ], I( `' a) @
  2. #include <stdio.h>
      D% e& u2 H, Y$ _+ {) }9 u( c7 L
  3. #include <string.h>7 T2 y& D- @/ c& ]) z+ L/ B" a& w
  4. : U; [* o, j* O
  5. char buf[50] = "";" Z$ ~2 U1 Z7 d: o2 M+ e) Z
  6. 9 a0 H" H8 O' T2 B7 v8 ^
  7. void calc(GtkButton *button, gpointer data)- {' Q, I% h! t# J
  8. {
    * {) q" s" v5 R- b! E
  9. const char *text = gtk_button_get_label(button);$ h1 |, T2 I0 k3 F& D  o

  10. 5 A1 J' v8 V/ t  I
  11. //退个操作! z  P+ R8 f0 M+ X
  12. if (0 == strcmp(text, "c"))
    # n% f1 {7 z! l2 c0 K% e6 S  F
  13. {
    & ]7 ^+ p* b4 P" c) r+ C6 v8 ?
  14. buf[strlen(buf) - 1] = 0;
    + u+ ^2 I0 B8 n% \0 D
  15. }else{5 v; E& M4 z" c
  16. ' A/ N! R" D% U  ?
  17. int a = 0, b = 0;
    & L2 C2 a/ i  ?# N  c% C
  18. char c;
    0 }4 B% ~1 C  X' }$ ^6 P; e9 [! O0 o% [
  19. strcat(buf,text);
    / F( o9 Y6 H/ a; B

  20. 8 n7 J6 l: D0 V/ X8 v% @
  21. if (0 == strcmp("=", text)) {6 V/ N5 J1 ^, b" g7 j

  22. 1 k: I3 x# R5 G+ e' d, I
  23. sscanf(buf, "%d%c%d", &a, &c, &b);
    * l3 L, w# q$ E/ \
  24. 3 E/ |2 w# b. J7 c, C+ }
  25. if ('+' == c) {+ D6 L0 L2 Y. v; f4 f0 r
  26. sprintf(buf,"%d", a+b);8 O" Q+ l8 S' r& X; z( p3 k
  27. }$ c* y( _3 v( d& ^. n/ e* D
  28. else if ('-' == c) {, J0 o, O+ d2 H- h: D3 _8 ^
  29. sprintf(buf, "%d", a-b);. ?% c+ ^  f/ D( Q0 `
  30. }
    7 s9 P5 }& K: A6 [5 ^
  31. else if ('*' == c) {1 s: H+ k: T7 P4 g/ y
  32. sprintf(buf, "%d", a*b);+ {0 G' G6 O% ^) u
  33. }& L3 W! \4 U5 ^+ S4 m
  34. else if ('/' == c) {
    6 N: D' Q5 L; H! @
  35. sprintf(buf, "%d", a/b);& {9 L6 K% U- {1 H! F; a- X
  36. }
    0 V' Y! a/ f4 r4 `. v

  37. 2 a: h: H; f2 e1 j) _
  38. }" \& g$ f) y, g4 o
  39. }
    " x8 f5 ~" ~3 L
  40. ; v, V8 A9 o8 A
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);% s& ^* L2 S8 G8 k' z4 a& w

  42. 9 P" C1 W! r  [
  43. return;5 L: t/ N% U( d" t$ u- O
  44. }
    4 T) k0 C% U4 |6 m( D
  45.   _) E/ q5 S9 o1 L6 @' C
  46. int main(int argc,char *argv[])7 R1 e0 M8 O4 O  T! t9 k. B
  47. {
    5 U* `& ?4 @# Z9 r& q
  48. $ y7 B  B. d  C; {8 S9 K
  49. gtk_init(&argc, &argv);' R9 s9 q' P; Q' n! j" W
  50. 8 h& O# T( ?6 ~. W" T
  51. 5 B6 A: C6 ^3 [/ C8 v0 z% Q" O5 N
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);7 J) v- V3 e: F
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");+ K; c9 [2 P! n% k3 N

  54. % S+ h0 P$ S$ `! A1 P
  55. //创建一个表格容器5行4列
    ) o+ |3 F/ D- f4 K8 n( o3 w
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);4 {7 c9 m0 i) V) X
  57. / r& d0 M# }) O/ k# }' H
  58. gtk_container_add(GTK_CONTAINER(window), table);
    8 H0 a* d. r- i0 Q
  59. 8 C8 x6 ]$ D8 p- p- T, |# V
  60. //创建一个行编辑& r7 l4 I- ^! k$ w
  61. GtkWidget *entry = gtk_entry_new();# @+ z9 a9 c+ t* x9 q' Y; ?
  62. 8 l! Q2 U! ~4 {% O' B: ^
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");% c% v; v0 n8 i0 `

  64. / p6 T) N7 a# m+ l. D: R
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);* z1 I5 l5 F1 {1 q9 j/ i' \

  66. + j% t/ W& o7 U; @0 I8 c4 J
  67. //创建多个按钮/ F6 N3 }, ~1 n. o* i$ y
  68. GtkWidget *button0 = gtk_button_new_with_label("0");
    7 }  C+ D3 M! F6 t* d
  69. GtkWidget *button1 = gtk_button_new_with_label("1");% G4 {, P% t& D, l
  70. GtkWidget *button2 = gtk_button_new_with_label("2");
    , g# w, j9 B1 e. Q
  71. GtkWidget *button3 = gtk_button_new_with_label("3");
    , a+ R2 _+ t% U4 \% q$ t
  72. GtkWidget *button4 = gtk_button_new_with_label("4");! h( H+ u7 a) j& W
  73. GtkWidget *button5 = gtk_button_new_with_label("5");+ r4 L- ~. e1 I
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    8 i, s" ?/ B7 _$ L
  75. GtkWidget *button7 = gtk_button_new_with_label("7");- B4 }+ [+ H4 A: S& N4 c
  76. GtkWidget *button8 = gtk_button_new_with_label("8");
    0 K. @0 F3 P9 t, l1 f0 U% J* l
  77. GtkWidget *button9 = gtk_button_new_with_label("9");% A' B0 Q9 Y  G/ j. F- u$ R

  78. ; I& B0 g4 i+ M$ v& l! S" }4 \  B# F
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    " \4 F5 t' Q$ i
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");
    , f) e8 r' H2 V$ o" v
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");# B! D6 e4 a0 u2 _/ T
  82. GtkWidget *button_div = gtk_button_new_with_label("/");0 E7 m" E- O/ A: E& ~
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");0 \, a2 ?" V0 Z/ l
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");$ _6 p& y# L: o; j

  85. 4 N$ H1 a5 o; k$ R* C

  86. 7 _! a4 h( K$ G8 v  v$ Q
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
    & w" F1 x; M  b4 A. v. l' L
  88. - Y% x7 X. f6 V
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);6 `/ ^' p* M6 C" {6 y/ J7 ~
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);# m1 y: V( M7 w+ y
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    8 _) s& h4 d" V7 f- v
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    ' ?7 r$ |( b, @$ A
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    / g" B4 B6 S& I! C" M' V7 B$ j
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);0 W4 `. O' X3 T
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    ! j4 T9 b2 Y# E  y# |+ a
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    3 t2 u7 V; j: a. M/ K
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    1 }0 n9 J2 u0 y" S5 J
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);  N. \# |* S) G  N2 j
  99. 8 \7 `' t2 E3 {9 }8 O0 Y) a! k3 `
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);8 k' l/ u! W4 a- H4 W- Y, \
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    / j2 L- }# A- [
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    7 H2 @" D9 b$ Z5 A% l5 z8 c5 Y
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);- Y4 P% l0 Q- F) M/ t0 v( b
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
    + j; Y. G# |" z) p7 x9 b
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    0 H/ u" C. @" i  x3 w! h  {

  106. ; u" S8 v" Q- h0 ]) n) X8 P
  107. //注册信号函数,calc()# @  w4 X: L7 t
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);+ x- @- Z. B+ N+ d+ c+ k0 T
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);* \( a1 Y( H; b) ^4 i% Y
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    0 J0 F$ V& g/ u! N" ~( j: A# p7 }* E
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    8 a5 \* J8 Z, [$ X) r; ?0 l
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    3 O" r+ w- B, i
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    * s% Q1 [" w" G) H. }4 k, t/ ]
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    9 k! z7 h2 O* Q; J1 B( Z
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);5 s( G" e7 t( t% D! O" g
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);/ q* A9 o; ^; W- B9 K5 e
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);  a  _* v% G) C+ N
  118. " L8 N3 x( O5 w& V) Q
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    9 J% b/ m  q6 ~# j$ M0 L3 {
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    & |1 Q: K  I# ^9 q( S1 w* L
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);5 n6 o2 T- ~8 Q1 T# j8 A
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);& G) ?# z5 V% r6 i/ h, d
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);$ r2 S8 m4 r: V
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    # x  P7 v7 S6 q0 B$ l7 B
  125. 3 \5 G6 V+ L0 }- }; y0 \( [$ R

  126. 2 h5 g5 O' y1 V  k" d. u5 \
  127. gtk_widget_show_all(window);5 W- R+ J3 r3 x0 s' V  V; W# I2 `4 s0 L* a

  128. ! @# O( b( m9 Q' z5 n5 G0 m4 n  u
  129. //主事件循环5 ^3 L, E3 }. }4 ?# o
  130. gtk_main();
    # r; u( o/ H+ m* J

  131. / C5 ]7 ~4 d# m0 |
  132. return 0;- W/ F/ T8 W5 f
  133. }
    % D$ n% A! b( Z
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png + ~* N0 _: E8 X1 i" @' D. Y

- \9 v2 [2 Z! d3 `
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
$ x' \6 |( t+ V5 o  |
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版