前言 本文记录STM32命令行开发环境在Ubuntu上的部署,用以替代Windows上的RT-Thread-studio。RT-Thread同样是开源 +
前言 本文记录STM32命令行开发环境在Ubuntu上的部署,用以替代Windows上的RT-Thread-studio。RT-Thread-studio同样是开源 软件,但目前似乎没有Nixos上的打包。
前言 本文记录STM32命令行开发环境在Ubuntu上的部署,用以替代Windows上的RT-Thread-studio。RT-Thread同样是开源 +
前言 本文记录STM32命令行开发环境在Ubuntu上的部署,用以替代Windows上的RT-Thread-studio。RT-Thread-studio同样是开源 软件,但目前似乎没有Nixos上的打包。
前言 本文记录STM32命令行开发环境在Ubuntu上的部署,用以替代Windows上的RT-Thread-studio。RT-Thread同样是开源 +
前言 本文记录STM32命令行开发环境在Ubuntu上的部署,用以替代Windows上的RT-Thread-studio。RT-Thread-studio同样是开源 软件,但目前似乎没有Nixos上的打包。
在ubuntu24.04中安装这些包,包括连接工具,工具链和调试器等等。
-sudo apt update
+
+- Ubuntu
+
+以ubuntu24.04为例,安装这些包,包括连接工具,工具链和调试器等等。
+sudo apt update
sudo apt install -y git python3 scons openocd stlink-tools gcc-arm-none-eabi gdb-multiarch
+
+- Nixos
+
+虽然没有RT-Thread-studio这个包,但是可以用flake.nix很方便的搭建一个开发环境:
+{
+ description = "STM32 && RT-Thread development environment";
+ inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+ outputs = { self, nixpkgs }:
+ let
+ supportedSystems = [ "x86_64-linux" "aarch64-linux" ];
+ forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
+ pkgs = import nixpkgs { inherit self system; };
+ });
+ in
+ {
+ devShells = forEachSupportedSystem ({ pkgs }: {
+ default = pkgs.mkShell {
+ packages = with pkgs; [
+ python312
+ scons
+ openocd
+ stlink
+ stlink-tool
+ gcc-arm-embedded
+ picocom
+ ];
+ };
+ });
+ };
+}
+
源码
使用Git拉取RT-Thread开源项目:
-git clone https://github.com/RT-Thread/rt-thread.git
+git clone https://github.com/RT-Thread/rt-thread.git
+git clone https://github.com/RT-Thread-Studio/sdk-bsp-stm32f407-spark.git
连接
使用USB连接开发板和开发PC,并使用lsusb查看是否连接成功:
-lsusb
+lsusb
Bus 001 Device 004: ID 0483:374b STMicroelectronics ST-LINK/V2.1
如果你和我一样使用 qemu ,需要在libvirt中使用Add_hardware添加usb设备。
添加成功后可以使用这个命令来检测:
-❯ st-info --probe
+❯ st-info --probe
Found 1 stlink programmers
version: V2J35S26
serial: 0671FF373654393143244522
@@ -151,7 +186,7 @@
ENV工具
使用Git拉取RT-Thread配套的linux开发环境,并添加Shell变量。我使用的是fish,你也可以用其他的Shell,命令有所不同。
-git clone https://github.com/RT-Thread/env.git ~/env
+git clone https://github.com/RT-Thread/env.git ~/env
set -x PATH $PATH ~/env
fish_add_path ~/env
echo $PATH
@@ -159,64 +194,128 @@
PKG工具
由于该项目大量使用Python,所以需要PKG包支持。首先我们修改这个文件的交叉工具链部分:
-#修改 rtconfig.py
+#修改 rtconfig.py
-# cross_tool provides the cross compiler
-# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
-import os
+# cross_tool provides the cross compiler
+# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
+import os
-if CROSS_TOOL == 'gcc':
- PLATFORM = 'gcc'
- if os.name == 'nt':
- # Windows 平台
- EXEC_PATH = r'C:\Users\XXYYZZ'
- else:
- # Linux / macOS 平台
- EXEC_PATH = '/usr/bin'
+if CROSS_TOOL == 'gcc':
+ PLATFORM = 'gcc'
+ if os.name == 'nt':
+ # Windows 平台
+ EXEC_PATH = r'C:\Users\XXYYZZ'
+ else:
+ # Linux / macOS 平台
+ EXEC_PATH = '/usr/bin'
-elif CROSS_TOOL == 'keil':
- PLATFORM = 'armclang' # KEIL AC6
- # PLATFORM = 'armcc' # KEIL AC5
- EXEC_PATH = r'C:/Keil_v5'
+elif CROSS_TOOL == 'keil':
+ PLATFORM = 'armclang' # KEIL AC6
+ # PLATFORM = 'armcc' # KEIL AC5
+ EXEC_PATH = r'C:/Keil_v5'
-elif CROSS_TOOL == 'iar':
- PLATFORM = 'iccarm'
- EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3'
+elif CROSS_TOOL == 'iar':
+ PLATFORM = 'iccarm'
+ EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3'
-elif CROSS_TOOL == 'llvm-arm':
- PLATFORM = 'llvm-arm'
- if os.name == 'nt':
- EXEC_PATH = r'D:\Progrem\LLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64\bin'
- else:
- EXEC_PATH = '/usr/bin'
+elif CROSS_TOOL == 'llvm-arm':
+ PLATFORM = 'llvm-arm'
+ if os.name == 'nt':
+ EXEC_PATH = r'D:\Progrem\LLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64\bin'
+ else:
+ EXEC_PATH = '/usr/bin'
随后可以使用PKG初始化并安装两个必要的包:
-pkgs --update
+pkgs --update
pip install kconfiglib
pip install scons
编译
在完成以上设置之后我们可以开始编译。STM32使用scons编译系统,同样是menuconfig命令:
-scons --menuconfig
+scons --menuconfig
修改配置并保存退出后即可开始编译,$(nproc)代表使用全部CPU线程来编译:
-scons -j$(nproc)
+scons -j$(nproc)
烧入
编译成功后你应该会看到有一个rtthread.bin在目录下,这就是我们编译出来的系统!
在烧入之前,我们可以备份一下原来的系统:
-st-flash read firmware_backup.bin 0x08000000 0x100001
+st-flash read firmware_backup.bin 0x08000000 0x100001
随后使用如下命令烧入系统:
-st-flash write rtthread.bin 0x08000000
+st-flash write rtthread.bin 0x08000000
串口
除了USB之外我们还可以使用串口连接:
-sudo apt install picocom
+sudo apt install picocom
picocom -b 115200 /dev/ttyACM0
version
可以使用ctrl + A 然后 ctrl + x退出。
+使用Cmake
+通过官方文档可以得知除了scons外还可以使用Cmake来编译.
+首先找到编译器的路径,并export:
+❯ which arm-none-eabi-gcc
+/nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-gcc
+export RTT_EXEC_PATH=/nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin
+export RTT_CC=gcc
+
+随后使用指令scons --target=cmake:
+❯ scons --target=cmake
+
+scons: Reading SConscript files ...
+Newlib version:4.5.0
+Update setting files for CMakeLists.txt...
+Done!
+scons: done reading SConscript files.
+scons: Building targets ...
+scons: building associated VariantDir targets: build
+CC build/applications/main.o
+LINK rt-thread.elf
+arm-none-eabi-objcopy -O binary rt-thread.elf rtthread.bin
+arm-none-eabi-size rt-thread.elf
+scons: done building targets.
+
+可以看到生成CmakeLists.txt成功,随后开始构建:
+❯ cd ./build
+❯ cmake ..
+CMake Warning (dev) at CMakeLists.txt:43:
+ Syntax Warning in cmake code at column 100
+
+ Argument not separated from preceding token by whitespace.
+This warning is for project developers. Use -Wno-dev to suppress it.
+
+-- The C compiler identification is GNU 14.3.1
+-- The CXX compiler identification is GNU 14.3.1
+-- The ASM compiler identification is GNU
+-- Found assembler: /nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-gcc
+-- Detecting C compiler ABI info
+-- Detecting C compiler ABI info - done
+-- Check for working C compiler: /nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-gcc - skipped
+-- Detecting C compile features
+-- Detecting C compile features - done
+-- Detecting CXX compiler ABI info
+-- Detecting CXX compiler ABI info - done
+-- Check for working CXX compiler: /nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-g++ - skipped
+-- Detecting CXX compile features
+-- Detecting CXX compile features - done
+-- Configuring done (0.4s)
+-- Generating done (0.0s)
+-- Build files have been written to: /home/dich/Git/sdk-bsp-stm32f407-spark/projects/02_basic_ir/build
+
+使用make命令编译:
+❯ make
+[ 1%] Building C object CMakeFiles/rtthread.elf.dir/applications/main.c.obj
+[ 2%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/rt-thread/components/libc/compilers/common/cctype.c.obj
+[ 3%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/rt-thread/components/libc/compilers/common/cstdio.c.obj
+......
+[ 97%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/libraries/STM32F4xx_HAL/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c.obj
+[ 98%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/libraries/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c.obj
+[100%] Linking C executable rtthread.elf
+ text data bss dec hex filename
+ 98516 1468 8400 108384 1a760 rtthread.elf
+[100%] Built target rtthread.elf
+
Done.
diff --git a/public/pagefind/fragment/en_3a86d37.pf_fragment b/public/pagefind/fragment/en_3a86d37.pf_fragment
new file mode 100644
index 0000000..6c0c718
Binary files /dev/null and b/public/pagefind/fragment/en_3a86d37.pf_fragment differ
diff --git a/public/pagefind/fragment/en_a370661.pf_fragment b/public/pagefind/fragment/en_a370661.pf_fragment
deleted file mode 100644
index 4b26511..0000000
Binary files a/public/pagefind/fragment/en_a370661.pf_fragment and /dev/null differ
diff --git a/public/pagefind/index/en_1b429f1.pf_index b/public/pagefind/index/en_1b429f1.pf_index
new file mode 100644
index 0000000..c08f923
Binary files /dev/null and b/public/pagefind/index/en_1b429f1.pf_index differ
diff --git a/public/pagefind/index/en_2bcd86d.pf_index b/public/pagefind/index/en_2bcd86d.pf_index
deleted file mode 100644
index 0cdab52..0000000
Binary files a/public/pagefind/index/en_2bcd86d.pf_index and /dev/null differ
diff --git a/public/pagefind/index/en_3af27a9.pf_index b/public/pagefind/index/en_3af27a9.pf_index
new file mode 100644
index 0000000..ff190ca
Binary files /dev/null and b/public/pagefind/index/en_3af27a9.pf_index differ
diff --git a/public/pagefind/index/en_5aed6aa.pf_index b/public/pagefind/index/en_5aed6aa.pf_index
deleted file mode 100644
index de1762f..0000000
Binary files a/public/pagefind/index/en_5aed6aa.pf_index and /dev/null differ
diff --git a/public/pagefind/index/en_753eeda.pf_index b/public/pagefind/index/en_753eeda.pf_index
deleted file mode 100644
index d1bcffc..0000000
Binary files a/public/pagefind/index/en_753eeda.pf_index and /dev/null differ
diff --git a/public/pagefind/index/en_867953b.pf_index b/public/pagefind/index/en_867953b.pf_index
deleted file mode 100644
index 644b4f4..0000000
Binary files a/public/pagefind/index/en_867953b.pf_index and /dev/null differ
diff --git a/public/pagefind/index/en_ad76273.pf_index b/public/pagefind/index/en_ad76273.pf_index
deleted file mode 100644
index dc85f83..0000000
Binary files a/public/pagefind/index/en_ad76273.pf_index and /dev/null differ
diff --git a/public/pagefind/index/en_c64ced2.pf_index b/public/pagefind/index/en_c64ced2.pf_index
new file mode 100644
index 0000000..967c852
Binary files /dev/null and b/public/pagefind/index/en_c64ced2.pf_index differ
diff --git a/public/pagefind/index/en_ca43cc9.pf_index b/public/pagefind/index/en_ca43cc9.pf_index
new file mode 100644
index 0000000..c0622d9
Binary files /dev/null and b/public/pagefind/index/en_ca43cc9.pf_index differ
diff --git a/public/pagefind/index/en_d56422d.pf_index b/public/pagefind/index/en_d56422d.pf_index
new file mode 100644
index 0000000..cb1558c
Binary files /dev/null and b/public/pagefind/index/en_d56422d.pf_index differ
diff --git a/public/pagefind/pagefind-entry.json b/public/pagefind/pagefind-entry.json
index ca50a3b..5e0ffef 100644
--- a/public/pagefind/pagefind-entry.json
+++ b/public/pagefind/pagefind-entry.json
@@ -1 +1 @@
-{"version":"1.3.0","languages":{"en":{"hash":"en_81338c9b9e","wasm":"en","page_count":77}}}
\ No newline at end of file
+{"version":"1.3.0","languages":{"en":{"hash":"en_ed2b9b5593","wasm":"en","page_count":77}}}
\ No newline at end of file
diff --git a/public/pagefind/pagefind.en_81338c9b9e.pf_meta b/public/pagefind/pagefind.en_81338c9b9e.pf_meta
deleted file mode 100644
index 639e3ca..0000000
Binary files a/public/pagefind/pagefind.en_81338c9b9e.pf_meta and /dev/null differ
diff --git a/public/pagefind/pagefind.en_ed2b9b5593.pf_meta b/public/pagefind/pagefind.en_ed2b9b5593.pf_meta
new file mode 100644
index 0000000..d6af0ec
Binary files /dev/null and b/public/pagefind/pagefind.en_ed2b9b5593.pf_meta differ