1. 更新系统并安装基础依赖
打开终端,依次执行:
bash
sudo apt update && sudo apt upgrade -y
sudo apt install build-essential git python3 python3-pip libusb-1.0-0-dev libhidapi-dev wget unzip -y
2. 配置 USB 调试器权限(必须做)
- 创建规则文件:
bash
sudo vim /etc/udev/rules.d/99-mcu-debug.rules
2.把下面所有内容复制进去:
bash
# CMSIS-DAP/DAP-Link v1/v2
SUBSYSTEM=="usb", ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0204", MODE="0666", GROUP="plugdev", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0204", MODE="0666", TAG+="uaccess"
# 通用CMSIS-DAP设备
SUBSYSTEM=="usb", ATTRS{idVendor}=="c251", ATTRS{idProduct}=="f001", MODE="0666", GROUP="plugdev", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="c251", ATTRS{idProduct}=="f002", MODE="0666", GROUP="plugdev", TAG+="uaccess"
# ST-Link V2/V3
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666", GROUP="plugdev", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="0666", GROUP="plugdev", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3752", MODE="0666", GROUP="plugdev", TAG+="uaccess"
# J-Link
SUBSYSTEM=="usb", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="0666", GROUP="plugdev", TAG+="uaccess"
3.重载规则并配置权限:
bash
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -aG plugdev $USER
关键:必须注销当前用户并重新登录(或重启系统)!
二、安装 ARM 交叉编译工具链(用最新版,避开旧库问题)
- 卸载系统可能自带的旧版
bash
sudo apt remove --purge gcc-arm-none-eabi gdb-arm-none-eabi -y
sudo apt autoremove -y
- 下载并安装最新版 ARM 工具链
bash
# 下载
wget https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz
# 解压
sudo tar -xf arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz -C /opt/
- 配置环境变量
bash
# 清理旧路径
sed -i '/arm-gnu-toolchain/d' ~/.bashrc
# 添加新路径
echo 'export PATH=/opt/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi/bin:$PATH' >> ~/.bashrc
# 生效
source ~/.bashrc
- 验证安装(无报错且版本正确即可)
bash
arm-none-eabi-gcc --version
arm-none-eabi-gdb --version
三、安装 pyocd(确保是新版)
- 彻底清理旧版 pyocd
bash
python3 -m pip uninstall pyocd -y
pip3 uninstall pyocd -y
sudo rm -f /usr/bin/pyocd /usr/local/bin/pyocd ~/.local/bin/pyocd
(验证:执行 pyocd --version 应该提示 "command not found")
- 重新安装最新版 pyocd
bash
python3 -m pip install pyocd --user
# 刷新环境变量
source ~/.bashrc
# 验证版本(必须是v0.34.0以上)
pyocd --version
四、准备 AT32 的 pack 文件(不用安装,直接用)
- 找到你的
ArteryTek.AT32F435_437_DFP.2.2.4.pack文件,确认它的位置。 - 在该文件所在的目录下执行
pwd,记下输出的绝对路径,比如:/home/lubancat/test/Keil5_AT32MCU_AddOn_V2.4.8 - 那么 pack 文件的完整绝对路径就是:
/home/lubancat/test/Keil5_AT32MCU_AddOn_V2.4.8/ArteryTek.AT32F435_437_DFP.2.2.4.pack(后面配置要用这个路径)
五、安装 VSCode 和插件
1. 安装 VSCode
直接去官方下载安装最新版本:
https://code.visualstudio.com/Download
2. 打开 VSCode,安装两个必装插件
按 Ctrl+Shift+X 打开扩展市场,搜索并安装:
- C/C++ Extension Pack(微软官方)
- Cortex-Debug(ARM 调试核心)
六、配置你的 AT32 工程
假设你已经有一个能通过 Makefile 编译的 AT32 工程 (编译时加了 -g -O0 参数),在工程根目录下创建使用以下脚本生成配置文件:
把这个脚本保存为json: vscode_config.json
bash
{
"PROJECT": {
"ELF_NAME": "AT32F435VMT7_WorkBench.elf",
"BUILD_DIR": "build",
"DEFINES": ["USE_STDPERIPH_DRIVER"],
"INCLUDE_PATHS": [
"${workspaceFolder}/project/inc",
"${workspaceFolder}/libraries/drivers/inc",
"${workspaceFolder}/libraries/cmsis/cm4/core_support",
"${workspaceFolder}/libraries/cmsis/cm4/device_support"
],
"BUILD_TOOL": "make"
},
"CHIP": {
"MACRO": "AT32F435VMT7",
"PYOCD_TARGET": "_at32f435vmt7",
"PACK_PATH": "/home/lubancat/test/ArteryTek.AT32F435_437_DFP.2.2.4.pack"
},
"DEBUG": {
"GDB_PORT": "localhost:3333",
"ENTRY_FUNC": "main",
"LOG_LEVEL": "verbose",
"HARDWARE_BREAK": true
},
"CPP": {
"C_STANDARD": "c11",
"CPP_STANDARD": "c17"
}
}
把这个脚本保存为py文件: gen_vscode_config.py
python
# -*- coding: utf-8 -*-
import os
import json
import sys
# 配置文件路径
CONFIG_FILE = "vscode_config.json"
# 读取配置(做容错)
def load_config():
if not os.path.exists(CONFIG_FILE):
print(f"❌ 配置文件 {CONFIG_FILE} 不存在!")
sys.exit(1)
try:
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except:
print(f"❌ {CONFIG_FILE} 格式错误!用这个链接校验:https://jsonlint.com/")
sys.exit(1)
CFG = load_config()
VSCODE_DIR = ".vscode"
# 生成任务(直接拼接make命令,100%执行)
def get_build_tasks():
build_tool = CFG["PROJECT"]["BUILD_TOOL"].lower()
tasks = []
# Make模式(核心:GDB Server任务里直接先执行make)
if build_tool == "make":
# 1. 单独的Build任务(方便手动执行)
build_task = {
"label": "Build",
"type": "shell",
"command": "make",
"args": ["-j$(nproc)"],
"group": {"kind": "build", "isDefault": True},
"problemMatcher": ["$gcc"],
"presentation": {"reveal": "always", "panel": "new"}
}
# 2. Clean任务
clean_task = {
"label": "Clean",
"type": "shell",
"command": "make",
"args": ["clean"],
"problemMatcher": []
}
# 3. GDB Server任务(核心修改:先执行make,再启动pyocd)
gdb_task = {
"label": "GDB Server",
"type": "shell",
# 关键:make -j$(nproc) 执行成功后,再启动pyocd
"command": "make -j$(nproc) && pyocd gdbserver --pack {} -t {} -v".format(
CFG["CHIP"]["PACK_PATH"], CFG["CHIP"]["PYOCD_TARGET"]
),
"isBackground": True,
"problemMatcher": [
{
"owner": "pyocd",
"fileLocation": "absolute",
"pattern": {"regexp": "^(.*)$", "message": 1},
"background": {"activeOnStart": True, "beginsPattern": "^.*pyocd.*$", "endsPattern": "^.*listening on port.*$"}
}
],
"presentation": {"reveal": "always", "panel": "new"} # 强制显示终端日志
}
tasks = [build_task, clean_task, gdb_task]
# CMake模式(保留)
elif build_tool == "cmake":
configure_task = {
"label": "CMake: Configure",
"type": "shell",
"command": "cmake",
"args": ["-S", ".", "-B", CFG["PROJECT"]["BUILD_DIR"]],
"problemMatcher": ["$gcc"]
}
build_task = {
"label": "Build",
"type": "shell",
"command": "cmake",
"args": ["--build", CFG["PROJECT"]["BUILD_DIR"], "-j$(nproc)"],
"group": {"kind": "build", "isDefault": True},
"dependsOn": ["CMake: Configure"],
"problemMatcher": ["$gcc"],
"presentation": {"reveal": "always", "panel": "new"}
}
clean_task = {
"label": "Clean",
"type": "shell",
"command": "cmake",
"args": ["--build", CFG["PROJECT"]["BUILD_DIR"], "--target", "clean"],
"problemMatcher": []
}
gdb_task = {
"label": "GDB Server",
"type": "shell",
# CMake模式:先配置+编译,再启动pyocd
"command": "cmake -S . -B {} && cmake --build {} -j$(nproc) && pyocd gdbserver --pack {} -t {} -v".format(
CFG["PROJECT"]["BUILD_DIR"], CFG["PROJECT"]["BUILD_DIR"],
CFG["CHIP"]["PACK_PATH"], CFG["CHIP"]["PYOCD_TARGET"]
),
"isBackground": True,
"problemMatcher": [
{
"owner": "pyocd",
"fileLocation": "absolute",
"pattern": {"regexp": "^(.*)$", "message": 1},
"background": {"activeOnStart": True, "beginsPattern": "^.*pyocd.*$", "endsPattern": "^.*listening on port.*$"}
}
],
"presentation": {"reveal": "always", "panel": "new"}
}
tasks = [configure_task, build_task, clean_task, gdb_task]
else:
print(f"❌ 仅支持make/cmake,当前是:{build_tool}")
sys.exit(1)
return tasks
# 生成VSCode配置文件
TEMPLATES = {
"c_cpp_properties.json": {
"configurations": [{
"name": "ARM",
"includePath": ["${workspaceFolder}/**", *CFG["PROJECT"]["INCLUDE_PATHS"]],
"defines": [*CFG["PROJECT"]["DEFINES"], CFG["CHIP"]["MACRO"]],
"cStandard": CFG["CPP"]["C_STANDARD"],
"cppStandard": CFG["CPP"]["CPP_STANDARD"],
"intelliSenseMode": "gcc-arm"
}],
"version": 4
},
"tasks.json": {
"version": "2.0.0",
"tasks": get_build_tasks()
},
"launch.json": {
"version": "0.2.0",
"configurations": [{
"name": "ARM Debug",
"type": "cortex-debug",
"request": "launch",
"cwd": "${workspaceFolder}",
"executable": f"${{workspaceFolder}}/{CFG['PROJECT']['BUILD_DIR']}/{CFG['PROJECT']['ELF_NAME']}",
"servertype": "external",
"gdbTarget": CFG["DEBUG"]["GDB_PORT"],
"device": CFG["CHIP"]["PYOCD_TARGET"],
"interface": "swd",
"runToEntryPoint": CFG["DEBUG"]["ENTRY_FUNC"],
"showDevDebugOutput": CFG["DEBUG"]["LOG_LEVEL"],
"preLaunchTask": "GDB Server",
"hardwareBreakpoint": CFG["DEBUG"]["HARDWARE_BREAK"],
"ignoreMissingBinary": True # 忽略首次ELF不存在的提示
}]
}
}
# 写入文件
def generate_config():
os.makedirs(VSCODE_DIR, exist_ok=True)
for filename, data in TEMPLATES.items():
file_path = os.path.join(VSCODE_DIR, filename)
with open(file_path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
print(f"✅ 生成: {file_path}")
if __name__ == "__main__":
print("="*60)
print(" VSCode ARM 配置 🚀 强制编译版")
print(f"🔧 构建工具:{CFG['PROJECT']['BUILD_TOOL'].upper()}")
print("="*60)
generate_config()
print(f"\n🎉 配置生成完成!按F5会先执行make,再启动调试")
执行命令生成vscode的配置文件:
bash
python3 gen_vscode_config.py
gen_vscode_config.py 会读取 vscode_config.json文件,会在当前目录生成.vscode目录,里面包含配置文件,如图所示:

测试工程位置:https://download.csdn.net/download/klp1358484518/92755720
注意:测试工程是使用雅特力的 WorkBench 工具生成,选择的makefile。