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

STM32MP135F-DK开发板评测-Linux系统下的GTK计算器

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。& a* ?' |7 Y2 w# @, E  x
     基于Ubuntu18系统,补充安装所需要的库和小工具
7 o+ _. R) j9 X, k( L      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3    # T* U8 }% v3 p0 i2 p- B: H8 p
  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
3 z; u& M" Q( d* L    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
7 I3 T, p7 e1 Z$ V, t    1.png
# R. ?8 R" g* G4 W7 A  然后就学着官方文档的样子去验证下SDK是否安装成功。
6 B- z2 \. H; f. J   2.png # T. _  K( p( O. a8 a6 o2 e: }
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。2 A- D5 @, x' e# f& F7 i
  首先拷贝官方给的demo程序,基于GTK得hello world。3 B: o$ N9 H0 \9 F9 q

) O! R$ U+ x: z' Z% B5 d
  1. #include <gtk/gtk.h>
    ) C' }3 P. x9 R1 r6 G4 d$ n
  2. 8 l, r$ X/ L: T- [6 B* g
  3. static void
    & z  @- Z% n3 B. G8 Q5 i1 E
  4. print_hello (GtkWidget *widget,9 B  r* C8 L* M* @; g4 f, O
  5.              gpointer   data)/ R4 i( O+ E  v5 {, H- p
  6. {
    - q; H( W0 D$ F( l7 n$ B  T
  7.   g_print ("Hello World\n");5 S5 B( Y# b: t4 i1 i
  8. }
    9 K' Z7 |7 K0 c( A( q

  9. . C+ |: K3 f) ]" f6 f
  10. static void
    ) Y4 O1 g2 G* s
  11. activate (GtkApplication *app,2 {1 x1 ~7 [4 ~
  12.           gpointer        user_data)* N, O/ x. r/ I
  13. {
      w/ U4 Q- k; ^. d) V/ t
  14.   GtkWidget *window;
    . h4 A$ \/ j- j: o  V2 V8 O
  15.   GtkWidget *button;* j2 g6 L, x! S4 R( A3 q7 C
  16.   GtkWidget *button_box;3 ]  B  [9 V% h* S% \
  17. 6 \1 I/ I. |1 Y$ o8 o+ I
  18.   window = gtk_application_window_new (app);' r+ L/ c8 N+ \8 t
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    7 o8 t, x& s, c, a; U, f
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    2 V- [* H3 {1 f3 }1 ]
  21. / u4 H. Z( ^! Y* F! G, I0 r- s
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);% [+ L6 |2 E" S7 _$ T7 H6 G
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);; |  `& p& i' ~- E' j; ~  s) Q

  24. 0 ]* Z8 D: [8 c1 o6 j
  25.   button = gtk_button_new_with_label ("Hello World");
    6 |& Q9 n1 S1 B! }
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    ! i/ K, G+ v, D: v3 z
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);8 v$ r. K: a# |6 ~4 o8 |
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);* m8 n" k" S1 y/ X0 G" Y& G# x% C

  29. . Z" [4 n  Y: D
  30.   gtk_widget_show_all (window);* P0 Y, u* F& E8 r2 w
  31. }
    * Z) T7 X3 ^7 y5 T6 I9 J/ C

  32. ! n7 i  f: N$ {5 Q9 R
  33. int
    - |) ~- \. L& h  o- J3 ~3 m. w: ~5 a
  34. main (int    argc,, T- ^' s" @1 m9 H5 n+ R
  35.       char **argv)
    # `4 l9 G% m  h! G
  36. {
    4 ^; I& I- @9 g8 n/ f7 m" f
  37.   GtkApplication *app;
    $ X4 [: j) S1 y2 ^! }8 |, x
  38.   int status;
    , L+ g' i9 A* S' L/ Y' v" n
  39. ) V, U0 \( m( }0 W' T& c
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);' @. Z/ [, @& O! T) H
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    ) y+ _! K* f, r( V
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);
    ; ^( G7 T" o. @1 ~# Y
  43.   g_object_unref (app);* X5 z4 D- I) p  p. D! W4 A

  44. - _4 Z  v+ j" |( E
  45.   return status;
    8 u" i3 g1 ]/ ~6 b* E# M
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world
    6 Y8 c( c* y" w+ }6 R
  2. SRCS = gtk_hello_world.c. ]1 J: Z6 W' {6 n
  3. 9 `; {( g- I' Y; V0 F% [; ]4 o* D
  4. CLEANFILES = $(PROG)7 K- g% y: o. X/ X& R( U5 s
  5. 7 G, {  L' r6 ]( @
  6. # Add / change option in CFLAGS and LDFLAGS
    3 O+ i* V0 c8 h) d
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)9 D) [6 k& q2 D! L' G3 F
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0); ]( _) h+ G/ A9 @6 G8 c8 b
  9. 7 S/ v/ S; F5 \3 f3 u' Y. Y
  10. all: $(PROG)
    ' C" k/ Y. t- t; b7 s: g
  11. & S" M0 `- F: M2 m) Y+ _. a
  12. $(PROG): $(SRCS): R- C0 @- R5 l
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    3 p2 @. P2 Z5 W3 r( \' G
  14. 1 Z! `# t8 e2 k3 u- S
  15. clean:
    ' e* m# z% w9 a. T$ A
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。& N, X9 U0 D7 s! X6 R% v+ v
   4.png " h0 [' p4 a9 x4 X" A* i6 X/ O5 g" y
  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。9 B8 K- p9 t. Z& m5 e0 }2 C
7 B7 p+ R" P# X+ T# i* P2 k# k
  1. #include <gtk/gtk.h>
    1 W9 @% E6 u- `, n1 s) G1 l
  2. #include <stdio.h>
    ' b* w# F" H+ G0 `
  3. #include <string.h>( I$ |& ~7 _2 [$ E

  4. : C$ y5 x7 q2 u1 H/ a
  5. char buf[50] = "";
    4 C% ?7 Z' {) w9 ^. c( @0 s+ l9 z
  6. 9 ?4 l* b6 Y/ R. L2 k7 m
  7. void calc(GtkButton *button, gpointer data)# M7 F5 [7 E# Z2 d0 g
  8. {
    4 q& X' f4 l/ w
  9.         const char *text = gtk_button_get_label(button);
    : A, |+ m0 m" q7 ?* z' [8 m$ D
  10. 2 t4 [3 F+ ]7 ?3 L# Z4 P+ Y+ V4 |
  11.         //退个操作& T( \0 ~, A$ D9 `& l6 c
  12.         if (0 == strcmp(text, "c"))
    , _* Q" j6 ]3 d$ u. N. q; I
  13.         {
    . _4 f2 G: D, L( g
  14.                         buf[strlen(buf) - 1] = 0;
    & U2 a/ t6 I: ^5 P# O" |( e
  15.         }else{
    4 ]# O0 |( x( ^7 V* f; @9 W
  16.                 6 L' K! F  ^: b  k
  17.                 int a = 0, b = 0;
    ' Q. f" z- e1 u& ?
  18.                 char c;
    - {' Q4 a/ x7 D+ d1 f! |. o
  19.                 strcat(buf,text);
    , k8 e( T% `8 u

  20. 4 B3 Y3 Y# Z$ T( J3 J% |
  21.                 if (0 == strcmp("=", text)) {
    # a2 q% N  @+ ^
  22.                         
    6 G% s$ H6 M) |
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);6 M% x  D3 C: B% o
  24. 0 d+ j, u: q' @
  25.                         if ('+' == c) {
    + ~" [3 W) j9 A- e2 `; n- h4 A! g
  26.                                         sprintf(buf,"%d", a+b);
    : Q5 z% D$ L/ ]
  27.                         }5 `8 h: y( n3 M3 u( m
  28.                         else if ('-' == c) {7 p! i  q! j; l' G( R' d. F
  29.                                         sprintf(buf, "%d", a-b);
    . _6 s$ L+ u* \+ Y; Z7 F" j
  30.                         }$ t( f- Z, L% _& i* a. g
  31.                         else if ('*' == c) {
    - P  Y) L2 N, V6 H7 V, v1 R
  32.                                         sprintf(buf, "%d", a*b);7 i) C" B% s+ q8 w, y8 [
  33.                         }7 s% A8 K* {# k
  34.                         else if ('/' == c) {1 z; q* G0 \, V4 U, _. A
  35.                                         sprintf(buf, "%d", a/b);
    ; L. E8 t5 _! T7 x
  36.                         }
    # v; _6 C% Y: h9 d
  37.   X+ s  D) i: |- @8 W
  38.                 }/ @" B! c+ w, M) G; r
  39.         }0 e) C0 Z, P/ {  Z- e

  40. ( e3 z& j! Z9 @' q5 q# m) T$ N& C# x
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);: Y: U; R0 u; \1 p$ x3 l5 i

  42. 5 q3 _9 K; f: [* m' J) {
  43.         return;5 {2 W. h7 D2 j+ a: e0 j
  44. }7 b% ]+ ~# u6 j* |& A  Z% [

  45. ! F. t: g% C- X5 l( B
  46. int main(int argc,char *argv[]), O) w& u: r: M/ d7 D
  47. {
    ' [# Q- u# X+ d& {9 ?) o
  48. 2 n8 x8 V; o: i- t& G
  49.          gtk_init(&argc, &argv);1 ~) M- t- ]1 {8 H% b

  50. 9 x7 k) F4 ?' b

  51. 6 s+ L, p7 p2 Q7 J$ n8 l& d
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    ! ~4 _9 Y  b# v- w
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");" k3 N& k1 V0 d: _) C/ j
  54.   
    ) q  M- p1 e6 D4 u9 x* U
  55.          //创建一个表格容器5行4列
    & x$ Q" V. K6 i8 H
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);
    , g% T0 }& U; G/ E2 T

  57. " P& d+ o6 Q# _
  58.          gtk_container_add(GTK_CONTAINER(window), table);
    ! w6 g  w8 f% h4 W! l3 n8 T
  59.   G) s' r8 s. {
  60.          //创建一个行编辑
      B% r% Z8 `$ T: o, h. n8 K" u
  61.          GtkWidget *entry = gtk_entry_new();7 i  b2 v1 v& h' S
  62.         4 V$ y1 |- z! U! Z) z5 ]
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");  B9 ?3 ?+ q5 x+ H

  64.   O  E+ f- f# s. g! x: z
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
    + i  {( [" s# h+ O7 H0 R+ A# {! O

  66. 0 V/ ^9 H% W$ Y8 f, _2 |* y( u  h- h
  67.          //创建多个按钮
    . ?. f1 A0 d) n
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");
    / ?/ l( v8 ]" U9 ^
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    $ j: V* u4 q5 R
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");! r4 |2 v! d: [% t" x0 K; I1 E3 u3 {
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");9 x2 H9 ^! K$ W* d
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");
    8 ~9 p) I" v0 R
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");8 `% B! d* t4 k' l1 ~. ~( ]
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");
    & A: M" |$ V0 r0 k, l% b" E7 O
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");
    ) W6 M- e  a- C# @! p0 ?& A# ~
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");0 l  b' `5 \- {1 U" l( e  ~
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");5 x9 \& B3 R, w4 M% h& n+ ^# J

  78. ' X# y+ v0 }; }- ^; C
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");
    $ I" C& A7 V1 J- {7 N' Q# S
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");
    - X; c" H: C# {, f* u% p
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");
      }* J3 M( f  \1 H8 i9 R9 }- z# p
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    5 x2 ]7 w' M2 U& E3 _
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");
    7 W$ A- _3 Z7 Y7 T5 c  D7 V, T
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");
    5 T3 S" Z; B+ u* M

  85. # p9 ^, _; S/ J$ q

  86. & r6 E; ?3 d& f' Z: z
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);9 y. Y6 b$ w/ y. L6 v. Z

  88. 6 c$ }3 p" w: _/ p
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    2 L0 d+ O: U5 C: g5 \
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
    ' l" \) O" f# m% k& V
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    & X% A+ |# K. _- H
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    ; u1 K3 w+ c, }7 h; S" E
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    / g: }4 M( l# i$ d( v
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
    " C8 |$ R6 y: R2 n- d
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
    $ I# _$ M. u5 K2 i& B/ l% H
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    8 e/ F( c$ e- t3 N5 ?  z  t
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    # @% r6 t3 S& ?" l8 B
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
      J8 v! k1 y$ \8 i: }# ^
  99. 3 [- P6 o7 x8 A9 p, U
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    " h- x  @' H% `
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    1 u$ u+ i% P0 [* o6 ~: e0 R" |
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);! v! p9 u2 T% \- ]
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
    " z% ~# `: w* j- `+ [& W% s# q! J
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);6 G$ f9 X: K2 `5 f# C+ w4 q
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    0 k( l5 j& C: e/ `
  106. 5 E2 |% W$ X' B7 D% Z6 x, i
  107.          //注册信号函数,calc()
    4 _% \- X. [$ j
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);% b8 [; i+ D) o) p# p
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    3 O+ O+ v. y6 n
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    " [8 v. o5 w1 g& ?6 n1 t& i
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);8 b2 O6 l) W/ c/ {; n9 T
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);) K# j0 ^1 X. b% ?: `8 `! _  }
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    ! V" e6 e& d5 U3 ^2 T2 V
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    5 V2 G! z- p' E% k
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    6 T  X1 l& \, |- A8 g8 y: u1 H
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);9 K3 U+ |' x3 ~5 ?- a9 S
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);$ f( N) R" j# l1 w
  118. 6 M) E  o6 A+ K* i
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);0 g, @9 z6 C, H. d& x) a1 F: C( P5 b
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    ' d0 k( V7 U8 u) V
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    5 |8 n) a, q( n' t% l
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);; ~( G5 b& G* `! O" x
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
    # Q( |7 }1 c$ Q' X
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);4 i6 L4 t+ s! @, K% W6 ]! W
  125. + Y( O1 _+ O2 E9 H/ J
  126. + `' c# i/ w+ B: l- S' }+ ]0 [
  127.          gtk_widget_show_all(window);) j/ O/ Y% n. m8 e1 i/ j4 s
  128. 7 e6 K6 z0 s, j7 _
  129.          //主事件循环
    4 O/ j$ [! _1 I9 A, N
  130.          gtk_main();
    % v, [  A: a5 T/ o1 n
  131. 4 `  K/ U; N( \* P& |6 Y5 P% v: D
  132.          return 0;' a# R7 @8 D7 D! U- v  t7 I4 [
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
3 P  D8 ]1 {" P+ C- b- C    5.png
9 j3 w+ {* a& \+ d2 ]5 N- K   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
# }2 x$ y8 R* T* {   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。4 }* X/ s8 i  d0 v5 p
% `+ n7 W  [5 n3 ~7 c4 w. D1 v
赞 1 收藏 评论1 发布时间:2023-12-1 14:42

举报

1个回答
watershade 回答时间:2023-12-5 18:53:40

官方板子不错,这么快就上手了。我的是odydess资料太少了。正在学习

所属标签

相似技术帖

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