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

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

[复制链接]
BinWin 发布时间:2023-12-1 14:42
     上次已经开启了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/,,这个路径就可以,直接继续安装。
    1.png
  然后就学着官方文档的样子去验证下SDK是否安装成功。
   2.png
  以上就完成了编译环境,至于说开发环境,一般还得有个IDE或者其他编辑器加调试工具。这里打算做的小程序使用gedit就行。
  首先拷贝官方给的demo程序,基于GTK得hello world。

  1. #include <gtk/gtk.h>

  2. static void
  3. print_hello (GtkWidget *widget,
  4.              gpointer   data)
  5. {
  6.   g_print ("Hello World\n");
  7. }

  8. static void
  9. activate (GtkApplication *app,
  10.           gpointer        user_data)
  11. {
  12.   GtkWidget *window;
  13.   GtkWidget *button;
  14.   GtkWidget *button_box;

  15.   window = gtk_application_window_new (app);
  16.   gtk_window_set_title (GTK_WINDOW (window), "Window");
  17.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  18.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  19.   gtk_container_add (GTK_CONTAINER (window), button_box);

  20.   button = gtk_button_new_with_label ("Hello World");
  21.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
  22.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  23.   gtk_container_add (GTK_CONTAINER (button_box), button);

  24.   gtk_widget_show_all (window);
  25. }

  26. int
  27. main (int    argc,
  28.       char **argv)
  29. {
  30.   GtkApplication *app;
  31.   int status;

  32.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
  33.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  34.   status = g_application_run (G_APPLICATION (app), argc, argv);
  35.   g_object_unref (app);

  36.   return status;
  37. }
复制代码
   然后也复制一个makefile文件,其实单个文件,直接使用gcc命令也可以得。   
  1. PROG = gtk_hello_world
  2. SRCS = gtk_hello_world.c

  3. CLEANFILES = $(PROG)

  4. # Add / change option in CFLAGS and LDFLAGS
  5. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
  6. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)

  7. all: $(PROG)

  8. $(PROG): $(SRCS)
  9.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)

  10. clean:
  11.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
然后make,scp到开发板执行程序,就可以看到一个hello world窗口出现在之前得桌面上了。
   4.png
  接下来改程序,说实话没用过gtk,不过看了下helloworld得程序可以看懂,所以也百度了一下,就基本做出来了。

  1. #include <gtk/gtk.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. char buf[50] = "";

  5. void calc(GtkButton *button, gpointer data)
  6. {
  7.         const char *text = gtk_button_get_label(button);

  8.         //退个操作
  9.         if (0 == strcmp(text, "c"))
  10.         {
  11.                         buf[strlen(buf) - 1] = 0;
  12.         }else{
  13.                
  14.                 int a = 0, b = 0;
  15.                 char c;
  16.                 strcat(buf,text);

  17.                 if (0 == strcmp("=", text)) {
  18.                         
  19.                         sscanf(buf, "%d%c%d", &a, &c, &b);

  20.                         if ('+' == c) {
  21.                                         sprintf(buf,"%d", a+b);
  22.                         }
  23.                         else if ('-' == c) {
  24.                                         sprintf(buf, "%d", a-b);
  25.                         }
  26.                         else if ('*' == c) {
  27.                                         sprintf(buf, "%d", a*b);
  28.                         }
  29.                         else if ('/' == c) {
  30.                                         sprintf(buf, "%d", a/b);
  31.                         }

  32.                 }
  33.         }

  34.         gtk_entry_set_text(GTK_ENTRY(data), buf);

  35.         return;
  36. }

  37. int main(int argc,char *argv[])
  38. {

  39.          gtk_init(&argc, &argv);


  40.          GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  41.          gtk_window_set_title (GTK_WINDOW (window), "calc");
  42.   
  43.          //创建一个表格容器5行4列
  44.          GtkWidget *table = gtk_table_new(5,4,TRUE);

  45.          gtk_container_add(GTK_CONTAINER(window), table);

  46.          //创建一个行编辑
  47.          GtkWidget *entry = gtk_entry_new();
  48.         
  49.          gtk_entry_set_text(GTK_ENTRY(entry), "0");

  50.          gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);

  51.          //创建多个按钮
  52.          GtkWidget *button0 = gtk_button_new_with_label("0");
  53.          GtkWidget *button1 = gtk_button_new_with_label("1");
  54.          GtkWidget *button2 = gtk_button_new_with_label("2");
  55.          GtkWidget *button3 = gtk_button_new_with_label("3");
  56.          GtkWidget *button4 = gtk_button_new_with_label("4");
  57.          GtkWidget *button5 = gtk_button_new_with_label("5");
  58.          GtkWidget *button6 = gtk_button_new_with_label("6");
  59.          GtkWidget *button7 = gtk_button_new_with_label("7");
  60.          GtkWidget *button8 = gtk_button_new_with_label("8");
  61.          GtkWidget *button9 = gtk_button_new_with_label("9");

  62.          GtkWidget *button_add = gtk_button_new_with_label("+");
  63.          GtkWidget *button_minus = gtk_button_new_with_label("-");
  64.          GtkWidget *button_mul = gtk_button_new_with_label("*");
  65.          GtkWidget *button_div = gtk_button_new_with_label("/");
  66.          GtkWidget *button_equal = gtk_button_new_with_label("=");
  67.          GtkWidget *button_delete = gtk_button_new_with_label("c");


  68.          gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);

  69.          gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
  70.          gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
  71.          gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
  72.          gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
  73.          gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
  74.          gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
  75.          gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
  76.          gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
  77.          gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
  78.          gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);

  79.          gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
  80.          gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
  81.          gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
  82.          gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
  83.          gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
  84.          gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);

  85.          //注册信号函数,calc()
  86.          g_signal_connect(button0, "pressed", G_CALLBACK(calc), entry);
  87.          g_signal_connect(button1, "pressed", G_CALLBACK(calc), entry);
  88.          g_signal_connect(button2, "pressed", G_CALLBACK(calc), entry);
  89.          g_signal_connect(button3, "pressed", G_CALLBACK(calc), entry);
  90.          g_signal_connect(button4, "pressed", G_CALLBACK(calc), entry);
  91.          g_signal_connect(button5, "pressed", G_CALLBACK(calc), entry);
  92.          g_signal_connect(button6, "pressed", G_CALLBACK(calc), entry);
  93.          g_signal_connect(button7, "pressed", G_CALLBACK(calc), entry);
  94.          g_signal_connect(button8, "pressed", G_CALLBACK(calc), entry);
  95.          g_signal_connect(button9, "pressed", G_CALLBACK(calc), entry);

  96.          g_signal_connect(button_add, "pressed", G_CALLBACK(calc), entry);
  97.          g_signal_connect(button_mul, "pressed", G_CALLBACK(calc), entry);
  98.          g_signal_connect(button_div, "pressed", G_CALLBACK(calc), entry);
  99.          g_signal_connect(button_minus, "pressed", G_CALLBACK(calc), entry);
  100.          g_signal_connect(button_equal, "pressed", G_CALLBACK(calc), entry);
  101.          g_signal_connect(button_delete, "pressed", G_CALLBACK(calc), entry);


  102.          gtk_widget_show_all(window);

  103.          //主事件循环
  104.          gtk_main();

  105.          return 0;
  106. }
复制代码
  以上程序,编译运行后,就可以有以下得效果。  
    5.png
   操作和UI都是比较简单得,就不演示过程了,系统得触摸驱动也是做好的,gtk只管做应用就好了。操作也算流畅,毕竟也没涉及到复杂的图表渲染。
   搞到这里,发现其实不复杂得GUI程序用这套现成的框架倒也是挺方便。Linux系统下其实资源很丰富,软件开发方式也很多选择,所以不多做逗留了。这款开发板还有一大特点就是可以按照以往STM32单片机得方式进行使用,所以后面感受下1GHz的单片机开发方式。

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 手机版