ubuntu vscode 调试 at32f435vmt7

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 调试器权限(必须做)

  1. 创建规则文件:
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 交叉编译工具链(用最新版,避开旧库问题)

  1. 卸载系统可能自带的旧版
bash 复制代码
sudo apt remove --purge gcc-arm-none-eabi gdb-arm-none-eabi -y
sudo apt autoremove -y
  1. 下载并安装最新版 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/
  1. 配置环境变量
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
  1. 验证安装(无报错且版本正确即可)
bash 复制代码
arm-none-eabi-gcc --version
arm-none-eabi-gdb --version

三、安装 pyocd(确保是新版)

  1. 彻底清理旧版 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")

  1. 重新安装最新版 pyocd
bash 复制代码
python3 -m pip install pyocd --user
# 刷新环境变量
source ~/.bashrc
# 验证版本(必须是v0.34.0以上)
pyocd --version

四、准备 AT32 的 pack 文件(不用安装,直接用)

  1. 找到你的 ArteryTek.AT32F435_437_DFP.2.2.4.pack 文件,确认它的位置。
  2. 在该文件所在的目录下执行 pwd,记下输出的绝对路径,比如:/home/lubancat/test/Keil5_AT32MCU_AddOn_V2.4.8
  3. 那么 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 打开扩展市场,搜索并安装:

  1. C/C++ Extension Pack(微软官方)
  2. 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。

相关推荐
彭泽布衣18 分钟前
Linux异常文件名文件如何删除
linux·运维·服务器
优泽云安全19 分钟前
如何选择IRCS云信息安全管理系统 IRCS云资源评测
linux·服务器·安全·安全架构
ShineWinsu19 分钟前
对于Linux:Ext系列文件系统的解析—下
linux·面试·笔试·文件系统··ext2·挂载分区
小夏子_riotous20 分钟前
Docker学习路径——2、安装
linux·运维·分布式·学习·docker·容器·云计算
添砖java‘’36 分钟前
NAT代理、内网打洞和内网穿透
linux·服务器·网络
SilentSamsara38 分钟前
Linux 文件系统入门:目录结构不是随便画的
linux·运维·服务器
0vvv01 小时前
linux-操作系统(基础
linux
陳10301 小时前
Linux:进程状态和优先级
linux·运维·服务器
网络小白不怕黑1 小时前
二、初识rocky linux
linux·运维
monana61 小时前
Linux离线安装nvm 和 node
linux·运维·服务器