
1. 更新系统并安装基础依赖打开终端依次执行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 -y2. 配置 USB 调试器权限必须做创建规则文件sudo vim /etc/udev/rules.d/99-mcu-debug.rules2.把下面所有内容复制进去# CMSIS-DAP/DAP-Link v1/v2 SUBSYSTEMusb, ATTRS{idVendor}0d28, ATTRS{idProduct}0204, MODE0666, GROUPplugdev, TAGuaccess KERNELhidraw*, ATTRS{idVendor}0d28, ATTRS{idProduct}0204, MODE0666, TAGuaccess # 通用CMSIS-DAP设备 SUBSYSTEMusb, ATTRS{idVendor}c251, ATTRS{idProduct}f001, MODE0666, GROUPplugdev, TAGuaccess SUBSYSTEMusb, ATTRS{idVendor}c251, ATTRS{idProduct}f002, MODE0666, GROUPplugdev, TAGuaccess # ST-Link V2/V3 SUBSYSTEMusb, ATTRS{idVendor}0483, ATTRS{idProduct}3748, MODE0666, GROUPplugdev, TAGuaccess SUBSYSTEMusb, ATTRS{idVendor}0483, ATTRS{idProduct}374b, MODE0666, GROUPplugdev, TAGuaccess SUBSYSTEMusb, ATTRS{idVendor}0483, ATTRS{idProduct}3752, MODE0666, GROUPplugdev, TAGuaccess # J-Link SUBSYSTEMusb, ATTRS{idVendor}1366, ATTRS{idProduct}0101, MODE0666, GROUPplugdev, TAGuaccess3.重载规则并配置权限sudo udevadm control --reload-rules sudo udevadm trigger sudo usermod -aG plugdev $USER关键必须注销当前用户并重新登录或重启系统二、安装 ARM 交叉编译工具链用最新版避开旧库问题1. 卸载系统可能自带的旧版sudo apt remove --purge gcc-arm-none-eabi gdb-arm-none-eabi -y sudo apt autoremove -y2. 下载并安装最新版 ARM 工具链# 下载 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/3. 配置环境变量# 清理旧路径 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 ~/.bashrc4. 验证安装无报错且版本正确即可arm-none-eabi-gcc --version arm-none-eabi-gdb --version三、安装 pyocd确保是新版1. 彻底清理旧版 pyocdpython3 -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”2. 重新安装最新版 pyocdpython3 -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/Download2. 打开 VSCode安装两个必装插件按CtrlShiftX打开扩展市场搜索并安装C/C Extension Pack微软官方Cortex-DebugARM 调试核心六、配置你的 AT32 工程假设你已经有一个能通过 Makefile 编译的 AT32 工程编译时加了-g -O0参数在工程根目录下创建使用以下脚本生成配置文件把这个脚本保存为json vscode_config.json{ 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# -*- 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, encodingutf-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_okTrue) for filename, data in TEMPLATES.items(): file_path os.path.join(VSCODE_DIR, filename) with open(file_path, w, encodingutf-8) as f: json.dump(data, f, indent4, ensure_asciiFalse) 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的配置文件python3 gen_vscode_config.pygen_vscode_config.py 会读取 vscode_config.json文件会在当前目录生成.vscode目录里面包含配置文件如图所示测试工程位置https://download.csdn.net/download/klp1358484518/92755720注意测试工程是使用雅特力的 WorkBench 工具生成选择的makefile。