开发需要Linux环境,在上一篇帖子里已经在虚拟机中安装了Ubuntu24.04
先安装必要的工具包,在linux终端中执行下面的命令
- sudo apt-get update
- sudo apt-get install gawk wget git git-lfs diffstat unzip texinfo gcc-multilib chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libsdl1.2-dev pylint xterm bsdmainutils libusb-1.0-0
- sudo apt-get install libssl-dev libgmp-dev libmpc-dev lz4 zstd
- sudo apt-get install build-essential libncurses-dev libyaml-dev libssl-dev
- 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,地址https://www.st.com.cn/zh/embedded-software/stm32mp2dev.html,这里有适用于不同架构类型的SDK,根据自己的开发环境选择,注意需要保持SDK版本和烧录的Starter Package版本一致
解压后打开SDK文件夹,这里有个.sh的文件
执行下面的命令开始安装SDK,可以将-d后面的路径替换为你想安装SDK的位置,必须是绝对路径
- ./st-image-weston-openstlinux-weston-stm32mp2.rootfs-x86_64-toolchain-5.0.8-openstlinux-6.6-yocto-scarthgap-mpu-v25.06.11.sh -d /home/yuyy/Workspace/STM32/STM32MP257/SDK
当显示这个表示安装成功
打开SDK目录,执行命令
- source environment-setup-cortexa35-ostl-linux
这条命令每次打开终端都要执行一次才能让开发环境生效
正确执行后在终端内依次执行下面的命令可以看到如图的结果
- echo $ARCH
- echo $CROSS_COMPILE
- $CC --version
- echo $OECORE_SDK_VERSION
如果你和我一样使用VSCode进行开发,为了避免每次打开终端都要手动输入建立开发环境的命令,可以按照下面的方法操作
用VSCode打开工程文件夹,按快捷键Ctrl+Shift+P,找到工作区设置
添加下面的代码后保存
- {
- "terminal.integrated.profiles.linux": {
- "BashSTM32A35ENV": {
- "path": "bash",
- "args": [
- "--init-file",
- "/home/yuyy/Workspace/STM32/STM32MP257/SDK/environment-setup-cortexa35-ostl-linux"
- ]
- }
- },
- "terminal.integrated.defaultProfile.linux": "BashSTM32A35ENV"
- }
现在在VSCode中打开这个文件夹后打开终端会自动执行建立开发环境的命令
接下来写个简单地Hello World程序,新建helloworld.c,输入以下代码
- #include <stdio.h>
- int main(int argc,char **argv)
- {
- printf("STM32MP257 Hello World");
- if(argc == 2)
- {
- printf(" %s",argv[1]);
- }
- printf("\n");
- return 0;
- }
在VSCode中打开终端,执行下面的命令
- $CC -o helloworld helloworld.c
将生成的helloworld文件上传到开发板,可以用NFS文件共享或SCP命令,我这里用FileZilla通过SFTP上传
如果不方便连接网线,板子上USB右侧的Type-C接口会虚拟成为一个USB网卡,连接电脑后在串口终端里执行下面的命令来查看IP地址
刚上传上去的文件是不可执行的
用下面的命令增加可执行权限
再次查看
这时就能执行命令了
接下来给HelloWorld做个窗口UI,将代码改为(这段代码来自https://wiki.stmicroelectronics.cn/stm32mpu/wiki/Getting_started/STM32MP2_boards/STM32MP257x-DK/Develop_on_Arm_Cortex-A35/Create_a_simple_hello-world_application)
- #include <gtk/gtk.h>
- static void print_hello(GtkWidget *widget,gpointer data)
- {
- g_print ("Hello World\n");
- }
- static void activate (GtkApplication *app,gpointer user_data)
- {
- GtkWidget *window;
- GtkWidget *button;
- GtkWidget *button_box;
- window = gtk_application_window_new (app);
- gtk_window_set_title (GTK_WINDOW (window), "Window");
- gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
- button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_container_add (GTK_CONTAINER (window), button_box);
- button = gtk_button_new_with_label ("Hello World");
- g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
- g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
- gtk_container_add (GTK_CONTAINER (button_box), button);
- gtk_widget_show_all (window);
- }
- int main (int argc, char **argv)
- {
- GtkApplication *app;
- int status;
- app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
- status = g_application_run (G_APPLICATION (app), argc, argv);
- g_object_unref (app);
- return status;
- }
新建makefile,添加下面的代码后保存
- PROG = helloworld
- SRCS = helloworld.c
- CLEANFILES = $(PROG)
- # Add / change option in CFLAGS and LDFLAGS
- CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
- LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
- all: $(PROG)
- $(PROG): $(SRCS)
- $(CC) -o $[url=/u/]@[/url] $^ $(CFLAGS) $(LDFLAGS)
- clean:
- rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
在VSCode中打开终端,执行make
将生成的helloworld文件上传到开发板并执行,屏幕上会打开这样一个窗口
点击Hello World按钮后窗口关闭,同时串口终端中有输出
|