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。

相关推荐
2501_915921432 小时前
VSCode 写 Swift 运行到 iPhone?快蝎 IDE 开发实战体验
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
集智飞行2 小时前
禁用Ubuntu网卡的电源管理(Power Management)
linux·运维·ubuntu
BestOrNothing_20152 小时前
Ubuntu 22.04 下使用 VS Code 搭建 ROS 2 Humble 集成开发环境
c++·vscode·python·ros2·ubuntu22.04
Irissgwe2 小时前
Linux进程信号
linux·服务器·开发语言·c++·linux进程信号
水木兰亭2 小时前
多进程编程总结
linux·运维·服务器
MIXLLRED2 小时前
创建 GitHub 私人仓库并上传本地项目的完整步骤
ubuntu·github
梦想是造卫星2 小时前
如何从零开始构建一个ros开发项目?
linux·ros开发
艾莉丝努力练剑2 小时前
【Linux:文件 + 进程】理解IPC通信
linux·运维·服务器·开发语言·网络·c++·ide
开开心心就好2 小时前
安卓免费证件照制作软件,无广告弹窗
linux·运维·安全·pdf·迭代器模式·依赖倒置原则·1024程序员节