- 嵌入式
- 硬件开发
- 开发工具
- 调试器
【免费下载链接】stlink
Open source STM32 MCU programming toolset
本文是 stlink(Open source STM32 MCU programming toolset,开源 STM32 编程/烧录工具集)的源码编译实战指南,覆盖 Windows(MSVC)、Linux 两大平台的标准构建流程、Windows 交叉编译、udev 设备权限配置与构建选项调优。读完本文,你将能够在 Windows 与 Linux 上独立完成st-flash、st-info、st-util、st-trace、st-server等工具的编译、安装、打包与卸载,并理解其 CMake 构建系统的内部工作原理。
一、编译前概览:工具链与依赖
stlink 采用 CMake 作为底层构建系统,并在项目根目录提供了一层 Makefile 封装来驱动常见构建目标。无论哪个平台,核心依赖都是libusb-1.0(USB 通信层)与C 编译器。顶层 CMakeLists.txt 中可以看到:
- 项目要求
cmake_minimum_required(VERSION 3.20),采用 C17 标准(set(CMAKE_C_STANDARD 17)); - 通过
find_package(libusb REQUIRED)强制要求 libusb 存在,找不到会直接报错; - 构建产物统一输出到
build/bin(可执行文件)与build/lib(库文件); - 会同时构建共享库
stlink-shared(libstlink.so/stlink.dll)与静态库stlink-static(CMakeLists.txt)。
二、Microsoft Windows - MSVC 编译
2.1 环境要求
在 Windows 上,官方文档要求预先安装以下软件:
| 软件 | 说明 |
|---|---|
git | 用于在缺失时构建 LibUSB |
cmake | 构建系统,官方建议使用 Windows x64 Installer 二进制发行版,并务必把 cmake 加入系统PATH |
MSVC编译器 | 官方在 Visual Studio 2022 与 Build Tools for Visual Studio 2022 上验证通过 |
2.2 安装步骤
安装Build Tools for Visual Studio(包含 MSVC 编译器)。
安装CMake Windows x64 Installer,安装向导中勾选"将 cmake 加入系统 PATH"。
获取源码:在
cmd.exe/powershell.exe中执行git clone https://gitcode.com/gh_mirrors/st/stlink或者从 Release 页面下载最新
.zip源码包并用 7-Zip 解压。
2.3 构建步骤
在管理员权限的命令行中依次执行:
cd C:\$Path-to-your-stlink-folder$ cd .\build cmake -G "Visual Studio 17 2022" .. -DCMAKE_BUILD_TYPE="Release" cmake --build . --target ALL_BUILD cmake --build . --target INSTALLcmake -G "Visual Studio 17 2022"指定生成器为 Visual Studio 2022 解决方案;ALL_BUILD是 VS 生成器下的总构建目标;INSTALL目标会把产物安装到默认前缀C:\Program Files (x86)\stlink。
安装完成后,需要把C:\Program Files (x86)\stlink\bin加入PATH:
- 运行
SystemPropertiesAdvanced.exe; - 点击Environment Variables按钮;
- 在System Variables列表中找到并选中
Path变量; - 点击Edit..按钮;
- 在新窗口点击New;
- 输入安装路径的
bin目录:C:\Program Files (x86)\stlink\bin; - 依次点击三个窗口的OK保存修改。
注意事项:
- 使用 ST-LINK 编程器前,需要安装 ST-LINK 驱动(STSW-LINK009),否则 Windows 无法正确枚举 USB 设备;
- MSVC 下的包生成(CPack 打包)尚未实现/测试——即
make package类的打包流程在 MSVC 平台暂不可用。
2.4 MSVC 构建的源码细节
从源码结构看,MSVC 构建做了若干针对性适配(CMakeLists.txt):
- 覆盖 MSVC 的 C 编译标志为
/MT系列(/MTd、/MT),并定义了_CRT_SECURE_NO_WARNINGS、_CRT_NONSTDC_NO_WARNINGS等宏以关闭烦人的 CRT 警告; - 强制
-D_WIN32_WINNT=0x0A00,即最低支持Windows 10; - 链接
ws2_32(Windows Socket 库),并引入 src/win32 目录下的平台替代实现:win32_socket.c、mmap.c、sys_time.c、unistd.h以及getopt.c(st-util/st-trace/st-server 在 Windows 下需要自行提供 getopt); - 由于不使用
__declspec(dllexport),共享库显式开启了WINDOWS_EXPORT_ALL_SYMBOLS以保证 MSVC 下导出全部符号(CMakeLists.txt)。
三、Linux 编译
3.1 依赖包
从软件源安装以下软件包:
gitgcc与g++,或clang(C 编译器)make(构建工具)build-essential(推荐,Debian 系发行版,内含gcc、g++、libc6-dev、make)cmakelibusb-1.0-0与libusb-1.0-0-dev(libusb 及开发头文件,必装)libgtk-3-dev(可选,构建stlink-gui图形界面需要)rpm(Debian 系发行版上,make package同时生成 RPM 包时需要)pandoc(可选,从 Markdown 生成 man 手册页需要)
其中 GUI 的可选性在源码中得到了印证:src/stlink-gui/CMakeLists.txt通过pkg_check_modules(GTK3 QUIET gtk+-3.0)检测 GTK3,若未找到则打印GTK3 not found! GUI build will be skipped.并直接跳过 GUI 构建(src/stlink-gui/CMakeLists.txt)。
3.2 获取源码
mkdir $HOME/git cd ~/git git clone https://gitcode.com/gh_mirrors/st/stlink3.3 编译、安装与打包
进入源码目录后,通过顶层 Makefile 提供的目标进行构建:
cd stlink make clean # 部分 Linux 发行版需要先清理 make release # 创建 Release 目标 sudo make install # 完整安装并做系统级集成(可能需要 sudo) make debug # (可选)创建 Debug 目标,用于修改源码后在调试器下运行 make package # 构建 Debian 包,产物位于 ./build/Release/dist安装完成后,如果执行的是系统级安装(sudo make install),需要更新动态库缓存:
sudo ldconfig可选:安装到自定义目录
make install DESTDIR=$HOME可将安装重定向到用户自定义目录(如$HOME)。
卸载与清理:
make uninstall # 干净地卸载已安装的包 make clean # 清理项目源码中的 build 目录,删除所有编译/链接产物3.4 Makefile 目标的源码级解读
顶层 Makefile 实际是 CMake 目标的驱动封装(MAKEFLAGS += -s静默模式),关键映射如下:
| Make 目标 | 实际执行 | 说明 |
|---|---|---|
make release | 在build/Release中执行cmake -DCMAKE_BUILD_TYPE=Release后make | 对应build/Release目录(Makefile) |
make debug | 在build/Debug中执行cmake -DCMAKE_BUILD_TYPE=Debug后make | 对应build/Debug目录(Makefile) |
make install | 对build/Release执行make install | 安装 Release 产物 |
make uninstall | 对build/Release执行make uninstall | 卸载 |
make package | 对build/Release执行make package | 走 CPack 生成发行包 |
make test | 先构建 Debug 再执行 CTest | 仅在 Debug 构建中通过include(CTest)启用测试(CMakeLists.txt) |
make clean | 删除整个build目录 |
如需向 CMake 追加参数(如自定义安装前缀),可修改 Makefile 顶部的CMAKEFLAGS变量,例如CMAKEFLAGS += -DCMAKE_INSTALL_PREFIX=$(HOME)/.local。
3.5 打包流程说明
make package依赖 CPack 配置 cmake/modules/cpack_config.cmake,其行为按平台分支:
- Debian/Ubuntu 上:同时生成
DEB与RPM两种包(RPM 需要系统装有rpm命令),DEB 包的额外控制文件(changelog、copyright、rules、postinst)取自 cmake/packaging/deb,RPM 的 changelog 取自 cmake/packaging/rpm/changelog,DEB 依赖声明为libusb-1.0-0-dev (>= 1.0.24)、cmake (>= 3.19)等; - Windows 原生:生成 ZIP 包,包名形如
stlink-<版本>-win32; - 其他平台:不生成包。
四、交叉构建 Windows 版本(Linux 主机)
在 Linux 上可以用 MinGW 交叉编译出 Windows 二进制,官方提供了自动化脚本 gen_binaries_win.sh。
首先安装交叉工具链:
mingw-w64autotools-devlibtool
按前述步骤完成源码获取后,在项目根目录执行:
sudo sh ./gen_binaries_win.sh生成的 zip 包位于./build/dist(即build/Release/dist)。
脚本内部会做两轮构建(gen_binaries_win.sh):
- x86_64:在
build-mingw-64目录中,以-DTOOLCHAIN_PREFIX=x86_64-w64-mingw32调用工具链文件cmake/modules/set_toolchain.cmake,并追加-DCMAKE_C_FLAGS="-D_WIN32 -D_AMD64_"、关闭 GUI(-DSTLINK_GENERATE_GUI=OFF),执行make package后将 zip 复制到build/Release/dist; - i686(32 位):同样的流程,前缀换为
i686-w64-mingw32。
工具链文件 cmake/modules/set_toolchain.cmake 的核心内容:
- 指定交叉编译器:
${TOOLCHAIN_PREFIX}-gcc、-g++、-windres; - 设置
CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX},且CMAKE_FIND_ROOT_PATH_MODE_LIBRARY/INCLUDE ONLY(只在目标环境中找库和头文件),PROGRAM NEVER(程序仍在主机环境找); - 声明
CMAKE_SYSTEM_NAME Windows,并添加-DWIN32_LEAN_AND_MEAN、-D_WIN32_WINNT=0x0A00(Windows 10+)编译选项。
五、设备访问权限与 udev 规则
Linux 发行版默认不允许普通用户直接访问 USB 设备。stlink 通过udev 规则创建设备节点,使工具无需 root 权限即可运行。
5.1 前提条件
需要保证系统存在plugdev组,且访问设备的用户是该组成员。
5.2 规则文件位置与自动安装
规则文件位于源码目录 config/udev/rules.d,包括:
- 49-stlinkv1.rules:ST-LINK/V1(STM32VL 板载,USB ID
0483:3744); - 49-stlinkv2.rules:ST-LINK/V2(USB ID
0483:3748,如 STM32L、STM32F4 开发板); - 49-stlinkv2-1.rules:ST-LINK/V2.1;
- 49-stlinkv3.rules:ST-LINK/V3 全系列(V3SET 多种模式、V3PWR 等)。
执行sudo make install时,这些规则会由 CMake 自动安装到/lib/udev/rules.d/(见 CMakeLists.txt,安装路径硬编码为/lib/udev/rules.d,modprobe 配置则安装到/etc/modprobe.d)。
以 49-stlinkv2.rules 为例,规则内容为:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", \ MODE:="0666", \ SYMLINK+="stlinkv2_%n"即:匹配 USB 子系统下厂商 ID0483(STMicroelectronics)、产品 ID3748的设备,赋予读写权限0666,并创建符号链接stlinkv2_%n。
5.3 手动安装与重载
如果跳过make install,可手动复制并重载规则:
sudo cp -a config/udev/rules.d/* /lib/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger之后 udev 会创建设备节点文件,例如/dev/stlinkv3_XX、/dev/stlinkv2_XX、/dev/stlinkv1_XX(XX为内核分配的设备序号)。
六、ST-LINK/V1 编程器(legacy)特殊说明
ST-LINK/V1 的 SCSI 模拟存在缺陷,官方建议让操作系统完全忽略其 USB 存储功能。请在连接设备之前从以下方案中选择一种:
方案一(临时禁用):
modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i方案二(持久化,写入 modprobe 配置):
echo "options usb-storage quirks=483:3744:i" >> /etc/modprobe.conf modprobe -r usb-storage && modprobe usb-storage方案三(使用仓库提供的配置文件):
cp stlink_v1.modprobe.conf /etc/modprobe.d modprobe -r usb-storage && modprobe usb-storage仓库中对应的现成配置文件是 config/modprobe.d/stlink_v1.conf,其内容正是:
options usb-storage quirks=483:3744:i其中483是 STMicroelectronics 的 USB 厂商 ID,3744是 ST-LINK/V1 的产品 ID,i表示对该设备忽略(ignore)SCSI 相关处理。该文件在 Linux 构建安装时会被一并复制到/etc/modprobe.d/(CMakeLists.txt)。
七、构建选项(Build Options)
7.1 自定义共享库安装目录
若想把编译好的共享库安装到非默认目录,可指定 CMake 选项:
cmake -DLIB_INSTALL_DIR:PATH="/usr/lib64" ..7.2 标准安装目录
构建系统引入了GNUInstallDirs(include(GNUInstallDirs),见 CMakeLists.txt),遵循 GNU 编码标准定义的标准安装目录变量。默认情况下(未重定义时)生效的预设选项为:
-DCMAKE_INSTALL_SYSCONFDIR=/etc-DCMAKE_INSTALL_PREFIX=/usr/local
GNUInstallDirs提供的目录变量与内置默认值对应关系如下(取自 CMakeLists.txt 的注释说明):
| 安装类型 | 变量 | 内置默认值 |
|---|---|---|
| 可执行文件(RUNTIME) | ${CMAKE_INSTALL_BINDIR} | bin |
| 共享库(LIBRARY) | ${CMAKE_INSTALL_LIBDIR} | lib |
| 静态库(ARCHIVE) | ${CMAKE_INSTALL_LIBDIR} | lib |
| 头文件(PRIVATE/PUBLIC_HEADER、HEADERS) | ${CMAKE_INSTALL_INCLUDEDIR} | include |
| 系统配置(SYSCONF) | ${CMAKE_INSTALL_SYSCONFDIR} | etc |
| 本地状态(LOCALSTATE) | ${CMAKE_INSTALL_LOCALSTATEDIR} | var |
| 数据(DATA) | ${CMAKE_INSTALL_DATADIR} | <DATAROOT dir> |
| 手册(MAN) | ${CMAKE_INSTALL_MANDIR} | <DATAROOT dir>/man |
| 文档(DOC) | ${CMAKE_INSTALL_DOCDIR} | <DATAROOT dir>/doc |
实践中,stlink会安装:
- 5 个 CLI 工具(
st-flash、st-info、st-util、st-trace、st-server)到bin(CMakeLists.txt); - 共享库/静态库到
lib; - 头文件到
include/stlink(非 Windows 平台,见 CMakeLists.txt); - MCU 芯片配置文件(config/chips 下的
.chip文件)到${CMAKE_INSTALL_FULL_DATADIR}/stlink/config/chips,编译期通过-DSTLINK_CHIPS_DIR=...注入(CMakeLists.txt); - udev 规则与 modprobe 配置到系统目录(Linux 限定);
- man 手册页(
st-info、st-flash、st-util、st-server的.1页,源文件在 doc/man)到${CMAKE_INSTALL_FULL_DATADIR}/man/man1。
八、构建系统的内部机制速览
8.1 版本号的自动检测
版本号由 cmake/modules/get_version.cmake 自动确定:
- 若在 Git 仓库中(存在
.git),执行git describe --always --tag获取版本;本地有未提交修改时追加-dirty后缀;并自动剥离版本号前的v前缀; - 若 Git 不可用或版本解析失败(例如从源码包构建),则回退读取源码根目录的
.version文件,找不到时直接FATAL_ERROR终止; - 解析出的
PROJECT_VERSION_MAJOR/MINOR/PATCH会通过模板 inc/version.h.in 生成inc/version.h(定义STLINK_VERSION等宏),编译时以${PROJECT_BINARY_DIR}/inc加入头文件搜索路径。
8.2 编译告警与安全标志
非 MSVC 平台通过 cmake/modules/c_flags.cmake 按"编译器是否支持"逐项追加标志,包括-Wall、-Wextra、-Wshadow、-Wformat、-Wformat-security、-D_FORTIFY_SOURCE=2、-fstrict-aliasing等;Debug 构建追加-ggdb,Release 构建追加-Werror(把警告升级为错误);OpenBSD 因系统头文件问题跳过-Wredundant-decls。此外还检测sys/mman.h、sys/time.h、unistd.h、dirent.h的存在性并定义相应宏,Stack Smashing Protection(SSP)库若存在也会自动链接(CMakeLists.txt)。
8.3 测试目标
Debug 构建会通过include(CTest)启用测试(CMakeLists.txt),测试源码位于 tests 目录(如flash.c、sg_legacy.c、usb.c等),可通过make test运行。
九、常见问题速查
| 现象 | 排查方向 |
|---|---|
CMake 报find_package(libusb REQUIRED)失败 | 确认已安装libusb-1.0-0-dev(Linux)或对应 Windows 依赖 |
| Linux 下工具提示无法打开 USB 设备 | 确认用户属于plugdev组、udev 规则已安装并重载(见第五节) |
| ST-LINK/V1 设备被识别为 U 盘 | 按第六节配置usb-storage的quirks=483:3744:i |
make package缺少 RPM 包 | Debian 系发行版需先安装rpm软件包 |
| MSVC 下无法生成安装包 | 官方说明 MSVC 的包生成尚未实现/测试,请改用ALL_BUILD/INSTALL目标 |
版本号异常(带-dirty) | 源码目录存在未提交的 Git 改动,属get_version.cmake的正常行为 |
说明:本文所有命令与配置均以当前仓库实际内容为准。若需了解各 CLI 工具的具体用法,可参阅 doc/man 下的 man 手册源文件(st-flash、st-info、st-util、st-server),或阅读 README.md 与 doc 目录下的其他文档。
- 嵌入式
- 硬件开发
- 开发工具
- 调试器
【免费下载链接】stlink
Open source STM32 MCU programming toolset
相关推荐
douyin-downloader 实战指南:抖音无水印批量下载完整教程
douyin downloader 实战指南:抖音无水印批量下载完整教程 douyin downloader 是一套面向抖音无水印下载的开源免费命令行工具:粘一
网页爬虫CLIUnicorn 引擎从源码构建完全指南:CMake 原生编译与 Linux/Windows/Android 交叉编译实战
Unicorn 引擎从源码构建完全指南:CMake 原生编译与 Linux/Windows/Android 交叉编译实战 Unicorn 是一个基于 QEMU
虚拟化逆向工程stlink 交叉编译指南:在 Linux 上构建 Windows 版本的终极教程
stlink 交叉编译指南:在 Linux 上构建 Windows 版本的终极教程 stlink 是 STMicroelectronics 官方推出的调试和编程
嵌入式硬件开发开发工具调试器
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考