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

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/,,这个路径就可以,直接继续安装。
: E, t" p' _3 L' \2 P6 ] 1.png
7 ?* b) Q( X: U: Q& T1 d   然后就学着官方文档的样子去验证下SDK是否安装成功
$ i6 ^' ]( q! _" m. I! Z0 ]* W    2.png
2 o; q" f  W' Q" p! J" `
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。
  
  1. #include <gtk/gtk.h>$ I- l9 i! u$ L, S. K
  2. ' M8 |  z, k. \  k1 b9 Q- O
  3. static void
    0 k# l: {: W5 y3 z
  4. print_hello (GtkWidget *widget,. k  K/ q8 W% u/ y) ?
  5. gpointer data)4 |0 `8 d, ^2 l: ?' o# t
  6. {
    3 Z, k2 F  P" O4 K
  7. g_print ("Hello World\n");; r  v6 x% C( Q! ~5 e; D( f: |
  8. }0 ]9 u3 c8 k5 K

  9. * j, q* j! _( d3 w
  10. static void  W" G) {& O' G4 X# z* R" ?! j! j
  11. activate (GtkApplication *app,. e6 {, q% O9 h  I4 U' q
  12. gpointer user_data)" t2 H: ~( i9 @/ x
  13. {
    0 a: a* l  d) _% d
  14. GtkWidget *window;2 R2 l8 L/ |  e0 R4 w+ G- r
  15. GtkWidget *button;
    5 {! Y5 h% _5 ?, C! P
  16. GtkWidget *button_box;+ R& M3 P) s; A1 Y& y% k# R8 V

  17. 0 M3 p0 L# z+ a: A# q
  18. window = gtk_application_window_new (app);
    % k8 \" X1 N1 \7 u& s
  19. gtk_window_set_title (GTK_WINDOW (window), "Window");
    3 q/ o9 \3 u  S
  20. gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);* R3 j$ P5 Z8 l$ |
  21. " W6 H8 @+ v1 E. C5 {( O
  22. button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);% o% z0 Z, i* ^2 g4 k4 H
  23. gtk_container_add (GTK_CONTAINER (window), button_box);# m  @; m" a9 @, u, c7 |2 ?1 B
  24. ; Y6 g) U1 F' X# E+ u% x6 ~
  25. button = gtk_button_new_with_label ("Hello World");  e2 R+ o. s' C/ n
  26. g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);: t" ~# a* \' I. @
  27. g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    ' h  m( I0 f2 e) ]3 ]$ A+ }
  28. gtk_container_add (GTK_CONTAINER (button_box), button);) k! O* d7 n7 f6 {
  29. 0 C2 Z7 z, z' `6 U% M% D. _% d8 T
  30. gtk_widget_show_all (window);  U5 n$ d! d7 B. `2 v
  31. }5 O( B  O: X$ t, v: D
  32. $ W0 b+ h- v1 X- m* S! B
  33. int
    . \5 ^7 J  D- [
  34. main (int argc,& j- {- S# S' U2 _
  35. char **argv)0 d) k( H. W3 r" l6 h
  36. {) q. \9 Y/ G& e4 ?, Z
  37. GtkApplication *app;
    ! L! n& K" T' y+ i; _- M7 N" h
  38. int status;
    " C' ?6 \. C8 J. X: p% Y
  39.   U5 [! j0 A  i
  40. app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);9 g8 E* Y! P8 N. w
  41. g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);! ?% k* L, a0 r" F
  42. status = g_application_run (G_APPLICATION (app), argc, argv);! c3 I: k# F5 n% n) k
  43. g_object_unref (app);$ [" s7 B; `# o* e1 d% n
  44. + w( u9 a& a8 Y$ u
  45. return status;
    % C2 u9 l+ A  k4 \: n$ Q6 C
  46. }: K8 c. L" |! J4 T( }- P# p
复制代码
    然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。  ; d6 H. I% O7 b. l7 }" S
  1. PROG = gtk_hello_world
    # n2 x: [/ h! q  H9 d9 X
  2. SRCS = gtk_hello_world.c
    2 o* @* U/ K6 |8 H8 a& V
  3. / N2 Q& s7 j% l) y) }( V
  4. CLEANFILES = $(PROG)4 s0 P$ c. u$ r2 Q" F
  5. ) B9 N9 C+ ]& U( z, r' t
  6. # Add / change option in CFLAGS and LDFLAGS
    : Q7 P2 K; L6 A1 r$ [3 |* |
  7. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
    * C) o/ D" N" S- v! s
  8. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)$ u8 ?# |, g7 ?- w9 I0 N* u

  9. / M9 d# E# \8 r. ?8 U6 l& y1 R( C
  10. all: $(PROG)6 z+ V5 T  k: [* {' j

  11. / H* C5 v/ l" G: A: O0 _
  12. $(PROG): $(SRCS)# ]6 H/ O) D1 R+ b7 e; f  I+ I
  13. $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
    * ?2 E( e$ E8 K  M4 F

  14. / {# j; ?! t1 n; z7 x. p: F% o* `
  15. clean:
    ! s5 }0 g0 Q- J0 j1 Y' M
  16. rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
    1 h( w' T: F7 Q* Y( i
复制代码
  然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。 3.png
) u3 ?( @, w( D7 Z" s% Z
接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。6 e7 l) M" f5 ~' Y' s1 n% ?6 U* \

% h) A/ G7 @7 I5 V. E5 P: U) V
4 W& I& r2 P4 Q. `) q5 B, p
  1. #include <gtk/gtk.h>
    3 A& V9 T3 u' r# s% Q7 k
  2. #include <stdio.h># {/ z+ `% X/ [5 ^+ @
  3. #include <string.h>3 x9 M- o: @5 B$ x
  4. $ W' _8 J* g4 ^/ a
  5. char buf[50] = "";
    : O7 P( a: i4 B* b9 |, k1 R

  6. : E5 c1 n# ~7 E# L
  7. void calc(GtkButton *button, gpointer data)  G$ h! w8 E* q' d! f8 G- C
  8. {
    9 a1 E3 H4 ?, }3 T
  9. const char *text = gtk_button_get_label(button);3 y) e' l& c3 E& X) [5 L( Z
  10. " f+ e, V; o, G$ _5 ]
  11. //退个操作9 y! V  E4 U5 y, G$ j6 S
  12. if (0 == strcmp(text, "c")), y- o' _$ `% Z0 l" D5 ]. B
  13. {
    ' Z1 r3 \3 R' \; i! ]! i
  14. buf[strlen(buf) - 1] = 0;$ t7 o2 n5 s! s: v; w$ `: i
  15. }else{) j- Y/ v! C" k0 ]4 X! `
  16. $ b! n) g, T" p4 Z* Z% E' z
  17. int a = 0, b = 0;
    / l) U  G" s! P8 _" p/ N
  18. char c;
    4 [8 [8 q! C3 f; _/ E
  19. strcat(buf,text);
    0 ]% A7 ?* Z6 i  ]

  20. 2 {( C" ^8 f/ W0 e* S: b) W
  21. if (0 == strcmp("=", text)) {
    # I7 I7 Q) [6 M9 O. o7 U7 w7 Q

  22. & }- {' m+ g! z- v
  23. sscanf(buf, "%d%c%d", &a, &c, &b);3 E& v, X" @( y# `0 v
  24. / _' ^8 w7 \1 n- w: S9 \% W
  25. if ('+' == c) {
    , Q9 T  Y" u9 U( Y* a
  26. sprintf(buf,"%d", a+b);$ h. S6 j+ R7 ]
  27. }
    8 f9 ?9 Y1 Q# ]
  28. else if ('-' == c) {. w1 C0 |- X; f8 b& p% T* U7 @
  29. sprintf(buf, "%d", a-b);
    6 y( h' `( @" O/ v# s5 J: Z
  30. }
    7 S$ J; b! A( Z7 U$ d3 C* `
  31. else if ('*' == c) {
    2 U0 H0 g4 o! L% L3 t* g" U3 _/ Z
  32. sprintf(buf, "%d", a*b);
    0 h# U# E' H7 w( ?* u# r1 d- a
  33. }7 @% T7 W. l4 A" J* @5 h5 O; Y; D) u0 ]
  34. else if ('/' == c) {
    # l' o; p! }: N6 D
  35. sprintf(buf, "%d", a/b);
    . S: n8 f$ u" d- z) P+ _. }0 T
  36. }
    5 A! Q$ ^: Z9 R0 l  @& R  L
  37. ; Z. b2 f) Y2 W" i
  38. }: Z! b; h+ R8 U! O
  39. }
    - [8 M0 r" E( p& X4 ~
  40. , r: S  B3 t' _( m% f) V
  41. gtk_entry_set_text(GTK_ENTRY(data), buf);
    8 Q$ x" w" F. ?9 o/ M- @

  42. ; A8 `& ~& {/ [9 {( F  o$ e6 b
  43. return;5 W3 J/ {' u7 c7 L& T
  44. }
    / F" o4 M) F& H- M1 Z  M: m
  45. ( b- t2 B; B9 Q1 Y1 M# ]0 |
  46. int main(int argc,char *argv[])
    4 s( K9 u# B9 o+ N
  47. {
    " e" }6 i' V& D' S" `

  48. 1 z/ q9 q" ~8 }3 M( F! f: Z
  49. gtk_init(&argc, &argv);" [6 p$ r; A, ^
  50. 3 O# E( K5 o- x
  51. 7 U, N& S3 y% Z5 v8 L( I
  52. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    # a9 f1 [( p  Q
  53. gtk_window_set_title (GTK_WINDOW (window), "calc");' z4 A, \: X. C7 z: E2 X
  54. 3 c2 i8 Y0 J$ T7 N8 k
  55. //创建一个表格容器5行4列% Z6 [: ?3 u% q
  56. GtkWidget *table = gtk_table_new(5,4,TRUE);
    2 F( p- D% c& }

  57. " T& A$ V, h* O; H
  58. gtk_container_add(GTK_CONTAINER(window), table);
    1 p' K  y& w1 V( Y
  59. 1 t0 \- ^) \( d. b6 I
  60. //创建一个行编辑+ C' t0 J) J2 X# n/ H
  61. GtkWidget *entry = gtk_entry_new();+ h1 G# l' S1 _1 ?+ e

  62. 8 c: W5 @/ n9 @& @7 @
  63. gtk_entry_set_text(GTK_ENTRY(entry), "0");
    5 v' d. q; U5 p9 k

  64. - \4 y/ D. Z6 A& i* \, v
  65. gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);9 n7 U! ]6 \5 D: r7 r% T8 D' V$ O

  66. , @0 j' h7 k, |+ i7 v# T! O
  67. //创建多个按钮& p+ c2 D+ B+ `! X) q4 F# E
  68. GtkWidget *button0 = gtk_button_new_with_label("0");4 L; i: F& ?" {- [
  69. GtkWidget *button1 = gtk_button_new_with_label("1");" O3 u. H5 }) o+ A. C; Q$ h5 y7 h
  70. GtkWidget *button2 = gtk_button_new_with_label("2");# B- f. T+ R8 z
  71. GtkWidget *button3 = gtk_button_new_with_label("3");0 w* H( _' F' t; I
  72. GtkWidget *button4 = gtk_button_new_with_label("4");
    " j+ }0 {9 `$ n" t
  73. GtkWidget *button5 = gtk_button_new_with_label("5");
      g9 a' E( D5 J  T
  74. GtkWidget *button6 = gtk_button_new_with_label("6");
    " a5 `1 Y6 N/ I, r2 s. [' R
  75. GtkWidget *button7 = gtk_button_new_with_label("7");% b* b1 W6 Q7 k# D1 ~
  76. GtkWidget *button8 = gtk_button_new_with_label("8");/ _; d3 F- J# J! t
  77. GtkWidget *button9 = gtk_button_new_with_label("9");
    1 |, V3 A6 _; B: c

  78. % G! w4 J1 {+ X% h) F
  79. GtkWidget *button_add = gtk_button_new_with_label("+");
    . @9 s8 A, H- f( I
  80. GtkWidget *button_minus = gtk_button_new_with_label("-");! h6 E0 n2 N6 G9 T! r
  81. GtkWidget *button_mul = gtk_button_new_with_label("*");) d2 }1 e9 J2 M! |
  82. GtkWidget *button_div = gtk_button_new_with_label("/");
    6 {. e  c; T" P
  83. GtkWidget *button_equal = gtk_button_new_with_label("=");
    9 p& {8 O/ q, |& O* j
  84. GtkWidget *button_delete = gtk_button_new_with_label("c");  m9 ~( Q9 v* [

  85. ! f3 E( K' R8 @7 K, H

  86. ! n6 r9 W0 j, q. ~7 a2 |
  87. gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);! B3 H3 d6 w& H; ^
  88. & e$ U* k; X# @  W
  89. gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);4 n1 `7 h# G1 ]6 y5 c' q) N
  90. gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
      q/ i- ]9 M6 U  j5 f( p# }# Z6 {
  91. gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);5 O  W4 \' c% P) `9 `1 _
  92. gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
    8 m) q- M! u3 l; X
  93. gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
    ) u% f7 U7 X, a' [* p1 q8 a+ t
  94. gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);# i1 s7 ?# J2 x$ Y1 f
  95. gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);; Y7 x, J0 Z+ y3 m' u
  96. gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);' n4 U9 Y; \$ E* V
  97. gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
    # j! J5 f5 E0 j* N! L( ^
  98. gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);" f6 d  _  r# V$ _& z" M, I

  99. / r, I/ f! v- S) I
  100. gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
    ! l0 S1 J/ B8 j3 Z$ M( {  J# `
  101. gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);7 a0 p5 F( f. d& X/ l3 |
  102. gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
    ( Q7 i) E% a. D: r) D
  103. gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);6 p. V0 _+ M6 R* a. }
  104. gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);' Y: v0 r+ _2 ~' M5 }
  105. gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);
    ( B+ ~$ {( H# b  t0 @5 R
  106. ; G& G/ e$ Y9 m8 f9 o8 p
  107. //注册信号函数,calc()
    ' H) [, p. K+ v2 W
  108. g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);8 F; Q" v$ w5 g4 Y3 g# L, O9 {; p
  109. g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
    ' m0 I1 W. U* P  X9 ]% v
  110. g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);$ N" M! ~7 t4 Z5 T+ b# ]
  111. g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
    * V1 U+ i! {% [! _6 _$ [" n, P6 h
  112. g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
    ! F$ ]# S3 r/ P- S* k, z8 F
  113. g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);% K) i- s' u' @+ R; A8 r% H! [  w
  114. g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);- y/ `. [& b& [5 G  ~! R
  115. g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
    1 L* U4 h) l( N2 O' F: H
  116. g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);0 V& d- _  S! V5 Y- T% V
  117. g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);
    6 `* B3 X( b6 `$ v6 [0 [
  118. : v) a& {) D, x! r
  119. g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
    1 ?  k8 J& N8 [; r+ O5 |( o
  120. g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
    1 b6 r* l+ P% x
  121. g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
    ; T2 ~$ h0 O, A, b. L1 Q, _
  122. g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
    ) ~5 V$ s6 c- f
  123. g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);) R* f6 |& W- B6 h5 G; W& ?0 r
  124. g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);
    . g7 V4 i4 G2 k4 M9 D
  125. % X) U. o3 r; ~3 j: l9 u# T

  126. ! y* f8 ~3 Y# e* d7 j
  127. gtk_widget_show_all(window);
    - ]" }+ s8 u: L- `8 }: n9 j
  128. & y0 K! w& D* d: N; F2 l: ^
  129. //主事件循环5 A4 G  @' F4 Z
  130. gtk_main();+ |. f. b$ ~( z

  131. ! }2 [3 o% S; {/ l
  132. return 0;& E" s* I8 F2 ^) ?; y/ H$ [
  133. }
    & U1 {" e9 ~  `9 z$ _- W  O9 \
复制代码
    以上程序,编译运行后,就可以有以下得效果   5.png
( B* K5 s$ x( q2 V/ t* Z( _) H9 d4 d/ r# a% R
  操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。
收藏 评论1 发布时间:2023-12-4 09:53

举报

1个回答
STMCU-管管 回答时间:2024-2-4 10:25:22
可以搞个演示视频
4 c* R- i" ~; {3 ?# d8 Q

所属标签

相似技术帖

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