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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了Linux系统,并且有GUI桌面,虽然不是比较熟悉的Qt环境,但也是可以做个小应用感受下stm32mp135系列产品的特点。     首先要搭建开发环境,毫无疑问安装个SDK就行了,官方WiKi页面啥都有。' _/ y1 B9 ^5 R$ F! w0 Q
     基于Ubuntu18系统,补充安装所需要的库和小工具( L/ d3 M/ F( U
      更新软件列表
  1. sudo apt-get update
复制代码
   安装python3    4 \9 Q( {! B' G
  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
7 U, e' a" c: t2 U    我还是在windows下面下载的,然后拷贝到了虚拟机使用。使用tar xvf 解压该压缩包。chmod +x 赋予可执行权限。然后运行安装就行了,默认的目录是/opt/st/stm32mp1/,,这个路径就可以,直接继续安装。
9 R9 y0 Z6 t0 W8 K    1.png   y0 q6 f: c: v; b; h6 X
  然后就学着官方文档的样子去验证下SDK是否安装成功。
6 O* [5 A( ^9 q  _   2.png
% {( C( f" ?8 c0 w4 o  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
+ K0 y. p" h* J! }  首先拷贝官方给的demo程序,基于GTK得hello world。. s# q1 _/ n* l+ Z0 c0 T

; W/ S% D3 J" t0 o6 X" ?
  1. #include <gtk/gtk.h>! C$ X9 ?% O( x8 O" }
  2. 9 K( y) o% A# v1 M3 u
  3. static void4 d# X  y6 ^" J' T; _" q( D" P2 d
  4. print_hello (GtkWidget *widget,& q2 X( G/ \- q% M5 J
  5.              gpointer   data)
    - s: G! Q/ Z9 I% w& y/ q  E
  6. {2 g! M, S) \  @# O9 B+ P: r
  7.   g_print ("Hello World\n");
    7 Y8 a8 k1 [0 C' F3 K. l# _
  8. }% v+ t* m3 s, v* b; I

  9. 0 x. `: j0 W# l5 e* b6 |6 v4 `' R
  10. static void
    5 w- e0 B3 l! C0 V/ ~1 Z% ^
  11. activate (GtkApplication *app,
    ) p+ S5 J: B  h
  12.           gpointer        user_data)2 C- _- P5 J, Z$ l) h6 A3 M  u
  13. {! B5 b5 |1 o2 f
  14.   GtkWidget *window;
    " b9 H! Y5 D# n0 u
  15.   GtkWidget *button;
      G8 E1 y. |7 G# r' a/ B0 ?7 R) h
  16.   GtkWidget *button_box;. X$ j; i0 F; t  {$ C. N' s2 c' y3 D

  17. / ]4 L+ S2 J6 F! q$ C
  18.   window = gtk_application_window_new (app);/ T5 j7 J1 t( W: A: r
  19.   gtk_window_set_title (GTK_WINDOW (window), "Window");
    % @; T7 d$ b% [
  20.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);  ~: v: Q7 p1 Y& Y0 h9 j$ t/ m* E; x

  21. 0 ]7 d9 e; }' H) U% w; o
  22.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    4 G; v9 B! R9 h% X( D# Q6 ^
  23.   gtk_container_add (GTK_CONTAINER (window), button_box);
    4 O! i/ w7 K: ?

  24. 1 }5 D6 H" y8 V) X4 S7 p
  25.   button = gtk_button_new_with_label ("Hello World");8 w8 l# o( |+ m0 k5 T9 @
  26.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    - B7 q- f( H( U
  27.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    . x9 x7 G+ v2 ~( x
  28.   gtk_container_add (GTK_CONTAINER (button_box), button);
    * p2 P) i5 x) S0 q% a) M0 _, l
  29. 6 e1 ?5 `# ?0 K- ]. B3 ]
  30.   gtk_widget_show_all (window);
    . [! t" j6 U* R4 F$ B5 y- {4 `
  31. }( e- O2 }7 S$ V9 H; a8 g) A, G: l
  32. 2 ?; m1 ~+ l7 t- v! S: V9 K
  33. int, o# p4 _: T7 l
  34. main (int    argc,
    ! a9 E/ B3 Y8 \9 @6 O
  35.       char **argv)* I# s: a# _! [% R
  36. {  u, o& f: K. u5 _2 N2 v1 R& A
  37.   GtkApplication *app;
    , v% b) @( X# h& u, o# M
  38.   int status;
    " E" a! ?9 a/ y" R2 C7 _7 j

  39. 8 v" f6 i& @- F7 L0 x4 W
  40.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);4 K& H7 N4 Z! M' A& [
  41.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    ; B! Z) T! G' i% o- v0 l
  42.   status = g_application_run (G_APPLICATION (app), argc, argv);
    . [' ]2 f) H: |7 g( Q; {+ k
  43.   g_object_unref (app);" u. {* W$ V6 y9 f4 W

  44. $ P- U& T% H$ {$ p: v3 _0 p
  45.   return status;3 u, n" S0 w' b9 L* e2 Q: C
  46. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world! K" r9 k" R, V, S
  2. SRCS = gtk_hello_world.c
    . v# O. w$ ^# K
  3. & p, O/ `2 d5 P
  4. CLEANFILES = $(PROG)4 g- p9 u$ h) \& v3 H8 p$ g+ m* U
  5. - N3 j4 u$ W5 J( p( ?9 M
  6. # Add / change option in CFLAGS and LDFLAGS. k, e& l& _9 x- f+ x/ ~. U; }
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    0 K& U+ _7 j/ T; n: {+ D, q  k3 ^3 a
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)5 ^' w4 U' [# Q( R5 R1 }0 \7 b
  9. ( x6 |, ~; i) c/ }, D/ \' s8 {
  10. all: $(PROG)( J; V3 K. `; }2 ~

  11. ( }2 p- H$ `; Y' j) v9 e. ~: E
  12. $(PROG): $(SRCS)
    ' L  m( P2 V/ k4 w7 v+ ]1 L  F; i0 G
  13.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
      }# k4 A" j& c. n3 L$ i9 b: Z  j

  14. 5 E  @% ~, N: R. p3 B
  15. clean:
    $ b' p5 Y3 H- q" j, z* J  T' Q
  16.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。& Z: b" l7 C' j2 Z$ L
   4.png
: V# w5 P4 C4 b* J  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。. D: @- p3 @* Z. r5 t

, C( \; N7 m* h) Y2 N' ]0 [! D
  1. #include <gtk/gtk.h>) p6 d% f  [5 o3 }7 w
  2. #include <stdio.h>
    ( {4 s4 j2 `( V
  3. #include <string.h>
    . N9 r; U: F0 ~( @. D* J8 A1 l
  4. 0 ^, J3 o( O1 T$ m) U1 H6 O0 {4 \; L
  5. char buf[50] = "";
    ) g0 |0 E/ v2 o& {

  6. 2 }# V/ S/ ^* \. g
  7. void calc(GtkButton *button, gpointer data)8 d9 {. Y! P: R* u0 A' w% b
  8. {
    0 p$ V5 P' k. A  ^0 o/ l8 w
  9.         const char *text = gtk_button_get_label(button);8 j4 H7 o3 N! c7 z

  10. - y! m# d/ G6 F! o2 o4 f4 P# a9 U! l' n
  11.         //退个操作
    - G1 R% o2 J9 T4 Z
  12.         if (0 == strcmp(text, "c")) 5 D6 x' M7 [9 U3 Q1 ?* \: S* K
  13.         {
    ! D9 b- m. j, r' g: B
  14.                         buf[strlen(buf) - 1] = 0;
    " B! `0 g" D( T2 n
  15.         }else{
    + z, e! ~% t! d; V7 c* ^" A  o
  16.                
    2 p: ~: h  ~( L9 I- L. t! u
  17.                 int a = 0, b = 0;
    ; }5 U! D$ ]" e. y& s
  18.                 char c;
    5 P1 O# Z2 f* v$ U& w
  19.                 strcat(buf,text);7 e. W8 ?1 [1 b4 o: `

  20. ) A8 o) `9 P, x7 f
  21.                 if (0 == strcmp("=", text)) {$ F# D4 l9 l) n8 c( z3 O
  22.                         
    : ]6 z* i$ M/ @
  23.                         sscanf(buf, "%d%c%d", &a, &c, &b);0 d+ J! O) P- |6 q+ @4 H+ S7 P

  24. $ o$ _& [: ^0 \  o
  25.                         if ('+' == c) {. ~2 |* b3 m, }+ H
  26.                                         sprintf(buf,"%d", a+b);
    ; _/ H6 P/ h7 o1 x! l
  27.                         }' t$ d& y: @7 e7 D" a( S. ^
  28.                         else if ('-' == c) {7 ~  l9 ?. D0 H& i' a! l: R
  29.                                         sprintf(buf, "%d", a-b);
    ' [; H2 w7 W  ?3 b' O  j
  30.                         }
    : D3 J6 {5 {6 \0 z/ y
  31.                         else if ('*' == c) {/ i! H+ ^6 m6 Y- q' |
  32.                                         sprintf(buf, "%d", a*b);
    3 I" ?( B2 U5 X2 U/ S
  33.                         }
    1 g: ^/ ]$ q* n) }7 T8 \1 z
  34.                         else if ('/' == c) {
    7 s- u' h6 t0 m. ]
  35.                                         sprintf(buf, "%d", a/b);
    / }, D+ d4 F0 C- c9 F9 b* G
  36.                         }& n2 |% ^  e- N& x$ p- A2 J( A

  37.   n  A0 s, s' o& t; x  g! ]% V" E
  38.                 }, b- N2 K8 a; T- E- m' X! E2 g
  39.         }4 ^! p6 U0 Y& [

  40. 6 m( S. g( Q1 ?( J
  41.         gtk_entry_set_text(GTK_ENTRY(data), buf);" e1 [5 r2 O( B4 Z4 l7 y1 K
  42. 3 Y  p5 A/ G6 S! e$ ^% p9 H
  43.         return;) m) I, P* u% l/ M/ K
  44. }: j. b- m; |+ b$ q6 \& V  a

  45. 9 U" V" n$ H5 M3 P) q/ j7 W2 |
  46. int main(int argc,char *argv[])
    ( H2 r( K' U* B7 j! ^: K
  47. {
    ' y2 v7 I0 h+ v0 J! C2 |
  48. 3 r. c* H" _7 T2 r# k- D* p6 g6 V
  49.          gtk_init(&argc, &argv);4 M' @1 o3 S, M5 A

  50. 1 W3 [/ a8 `/ R2 V$ P6 Z3 ]0 U, F
  51. ( }: X; G  W  j) b
  52.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);4 h. _" s: ]* S/ a* e3 C7 {
  53.          gtk_window_set_title (GTK_WINDOW (window), "calc");5 p4 y3 c& f0 i; c
  54.   3 o9 \" q  N/ @7 U9 A0 h! ^7 X
  55.          //创建一个表格容器5行4列1 t3 q) {, [9 }. S7 h
  56.          GtkWidget *table = gtk_table_new(5,4,TRUE);
    " b( K% r; s+ a6 E' y3 ~

  57. % R4 w7 q) K4 k. J) B8 O4 K
  58.          gtk_container_add(GTK_CONTAINER(window), table);  x! w6 K; q2 b( w, [4 A
  59. / Z+ [4 v8 d. d/ M/ o
  60.          //创建一个行编辑. X( V% ^( @: e; {
  61.          GtkWidget *entry = gtk_entry_new();( ?! C7 R- t6 X% L- `* N  T  C
  62.         2 g. ]/ T4 D; b/ A2 G5 ?8 n
  63.          gtk_entry_set_text(GTK_ENTRY(entry), "0");
    5 c5 e$ n. y( Q; T2 J/ O1 B- ^

  64. 5 {. K6 {: H+ A4 R
  65.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);$ x, z7 I) ]+ _# ~' [

  66. 6 Q: ?& ~+ a, v% d8 G1 J8 E
  67.          //创建多个按钮
    * V: z1 J/ W9 R' p- ]
  68.          GtkWidget *button0 = gtk_button_new_with_label("0");5 Y3 T3 J+ Q  M7 m) w+ l) I- I+ P
  69.          GtkWidget *button1 = gtk_button_new_with_label("1");
    * S% d& e+ e& h8 f7 a" l( a
  70.          GtkWidget *button2 = gtk_button_new_with_label("2");4 D/ P+ o8 `2 G' j$ ~
  71.          GtkWidget *button3 = gtk_button_new_with_label("3");$ G* O" f, x0 O, ]/ h
  72.          GtkWidget *button4 = gtk_button_new_with_label("4");
    - H! J: R8 a4 f% P2 N2 ^5 _
  73.          GtkWidget *button5 = gtk_button_new_with_label("5");$ j# O9 y8 ^: I, n, y1 Z  o4 h0 ?2 {3 w. d
  74.          GtkWidget *button6 = gtk_button_new_with_label("6");
    # u5 w6 q" k- }" `1 ~
  75.          GtkWidget *button7 = gtk_button_new_with_label("7");
    6 D. B  b4 @- W+ u- J
  76.          GtkWidget *button8 = gtk_button_new_with_label("8");
    8 f& G7 d6 `+ T3 p: K& e- _. [
  77.          GtkWidget *button9 = gtk_button_new_with_label("9");" X/ \0 M* F9 t# H" b& `6 j

  78. ; v" \8 ~7 A1 X2 Y# w
  79.          GtkWidget *button_add = gtk_button_new_with_label("+");) |5 G* \+ r( w
  80.          GtkWidget *button_minus = gtk_button_new_with_label("-");
    6 H& [9 H. L9 v3 Q1 K
  81.          GtkWidget *button_mul = gtk_button_new_with_label("*");! A' {8 s* ^# h2 o4 E" K) i7 }
  82.          GtkWidget *button_div = gtk_button_new_with_label("/");
    ; x3 a* Z! y. E% B5 i/ C; `
  83.          GtkWidget *button_equal = gtk_button_new_with_label("=");
    6 r" Q. t3 g' K) L" y2 S6 v7 \  v
  84.          GtkWidget *button_delete = gtk_button_new_with_label("c");( d1 p3 G) u" N' ^5 ?1 a8 w6 C1 }6 s
  85. 5 B1 D& X3 w. P: Q

  86. 5 c3 h0 m( [8 u7 b& w
  87.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);8 l' [. x" m- F" `, S

  88. ; T5 G3 x+ r+ N. ~' Y- y
  89.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
    ; t8 L% P# i( S0 Z" F0 T
  90.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);; B$ N& Q, T" b$ R2 g
  91.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
    $ ^8 d& k3 v! }" Z& Q
  92.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);- l+ C# y; z3 y
  93.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);2 m0 B% {* e1 l- y4 e
  94.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);0 C- J9 G, C5 L. ~7 t/ T
  95.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);0 {: C3 t9 ?7 Q& u5 I! m  ?0 |0 Y
  96.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
    4 E+ a4 e& z4 j0 E$ U- x+ a! L
  97.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);& A* ?0 v3 M$ a. v6 o# f0 q
  98.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
      I6 W1 w5 T3 P

  99. + m+ h2 G1 U1 o. [
  100.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    . A" {6 ?& U/ w2 E4 T
  101.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
    ' X' x- y) \3 k. e) }
  102.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    / U6 c( M0 z9 s4 M4 [. T. s$ t
  103.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);0 A! w- N# z) Q2 n" c8 Q5 @
  104.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);# }# Z1 {8 U, i& K8 \$ k
  105.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);* x) V3 j1 @' v
  106. 1 y1 e# n/ Y' s8 ]; w
  107.          //注册信号函数,calc()
    ' a2 S: p9 l- a2 S5 U  _1 C: p0 e
  108.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
    $ |* m2 m+ o) ]
  109.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    - [7 ]$ j7 R/ e$ J" z
  110.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
    6 @4 w3 n! X, o
  111.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    ; M6 g  E( S% _3 ]
  112.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    8 v+ ^1 |) A- p' ?0 f$ r% H8 T# b
  113.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
    / T6 {* P- M2 Z; c: b
  114.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
    $ l: }5 H  {, p' w/ V
  115.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);2 a; s$ P9 E" a) h0 A! d+ z! c5 e
  116.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);6 }) w: D; g3 l' X0 s4 Q
  117.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    6 ]- J: N' r" h# C

  118. + d( k/ n: T: n8 S
  119.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);1 }! L  J9 p& ?4 L. Y' E4 m
  120.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    6 u7 F$ O, q' h7 J8 \
  121.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);$ b1 K5 c# m9 w9 v
  122.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);; Y; E7 V" z- ]
  123.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);: o/ H$ {6 O+ u4 z: ]0 p6 t/ ^
  124.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);) N' Y6 K% T# v, R6 Q/ N$ G

  125. ) o& W/ `- P' Q5 w- T$ k$ P
  126. 1 k) Q$ k0 @" o! P" Z& C: K
  127.          gtk_widget_show_all(window);3 G& q8 S5 u$ B/ z$ l9 Q9 b
  128. 7 y( u, T6 k6 W' ?# l: }
  129.          //主事件循环
    ! h, @3 D6 h9 p3 F
  130.          gtk_main();
      A7 s% s1 K) l2 m' S! L
  131. ' T1 H* W! d% A5 f7 ?  Z- m' }
  132.          return 0;# B& s8 K( O& v7 e, A
  133. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
$ a( p$ v- S, T( l/ _4 j    5.png 8 E  n, K1 _" M7 @* y& k' w9 Q' [
   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。0 H. M* X8 `, `& K3 K
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。+ n8 X9 c/ R$ M
7 ]6 L" }2 T# r% p+ q7 r8 \: m
1 收藏 评论1 发布时间:2023-12-1 14:42

举报

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

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

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版