複禮.87 2025-10-09 23:22 采纳率: 0%
浏览 4

vscode&cmake

我现在要在vscode上跑一个stm32的代码,但是我平常是用keil的,对vscode不太熟悉,但是该有的工具链和插件都有,我把代码移植完之后,应该先把json文件的路径改了,然后该怎么做?
我跑代码的时候应该接上单片机吗?
运行的时候直接右键runcode会出现“code language not supported or defined”,但是我点左下角的小三角的时候就直接输出了,这两个运行有什么区别吗?
求指导

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-10-09 23:23
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    在VSCode上运行STM32代码,尤其是从Keil迁移过来的项目,确实需要一些配置调整。下面我将详细说明你的问题,并提供清晰的步骤和解决方案,帮助你顺利地在VSCode中构建、调试STM32项目。


    一、基本流程概述

    在VSCode中使用CMake来管理STM32项目,通常需要以下步骤:

    1. 安装必要的工具链(如GCC ARM嵌入式编译器)
    2. 安装VSCode插件(如C/C++、CMake、PlatformIO等)
    3. 配置CMakeLists.txt文件
    4. 配置tasks.jsonlaunch.json
    5. 连接开发板并进行调试/烧录

    二、你当前的问题解答与操作建议

    1. “把json文件的路径改了”指的是什么?

    • 这里的“json文件”可能是指:
      • tasks.json:用于定义构建任务
      • launch.json:用于调试配置
      • .vscode/settings.json:用于全局设置
    • 如果你已经修改了这些文件中的路径(例如编译器路径、源文件路径等),请确保它们是正确的绝对路径或相对路径

    重要提示:如果路径错误,CMake或编译器会报错,甚至无法识别项目结构。


    2. 是否应该接上单片机?

    • 是的,如果你要运行程序调试,必须将STM32开发板通过USB连接到电脑。
    • 构建项目不需要连接开发板,只需要编译即可。

    3. “右键 Run Code”出现“code language not supported or defined”的原因

    • 原因:VSCode默认没有为C语言设置“Run”命令,除非你安装了特定的扩展(如 PlatformIO、C/C++ 扩展等)。
    • 解决方法:使用 VSCode 的 终端(Terminal)任务(Tasks) 来执行编译和烧录。

    4. “左下角的小三角”和“右键 Run Code”的区别

    | 功能 | 描述 | 是否推荐 | |------|------|----------| | 左下角小三角(Debug) | 启动调试模式,适用于调试(如GDB调试) | ✅ 推荐用于调试 | | 右键 Run Code | 启动运行(仅支持某些语言,如Python、JavaScript等) | ❌ 不适用于C/C++ |

    总结:对于STM32项目,不推荐使用“右键 Run Code”,而是使用 Debug 模式自定义任务


    三、VSCode + CMake + STM32的完整配置步骤

    1. 确保已安装的工具链

    • ARM GCC 编译器(如 arm-none-eabi-gcc
    • OpenOCD(用于调试和烧录)
    • ST-Link Utility(可选,用于图形化烧录)

    推荐安装方式:使用 ARM GNU Toolchain for Embedded 或通过 MSYS2 安装。


    2. 配置 CMakeLists.txt

    这是一个典型的STM32项目 CMakeLists 文件示例:

    cmake_minimum_required(VERSION 3.10)
    project(stm32_project)
    
    set(CMAKE_C_COMPILER arm-none-eabi-gcc)
    set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
    set(CMAKE_ASM_COMPILER arm-none-eabi-as)
    
    # 设置目标平台
    set(TARGET "stm32f103c8t6") # 根据你的芯片型号修改
    
    # 添加源文件
    file(GLOB SOURCES "src/*.c" "src/*.cpp")
    
    # 添加头文件目录
    include_directories("inc")
    
    # 设置链接脚本
    set(LINKER_SCRIPT "linker_script.ld")
    
    # 构建可执行文件
    add_executable(${PROJECT_NAME} ${SOURCES})
    
    # 设置链接器选项
    target_link_options(${PROJECT_NAME} PRIVATE -T${LINKER_SCRIPT})
    
    # 设置调试信息
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
    

    注意:你需要根据你的STM32型号和开发板定制此文件。


    3. 创建 tasks.json

    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "Build",
          "type": "shell",
          "command": "cmake --build . --target all",
          "group": {
            "kind": "build",
            "isDefault": true
          },
          "problemMatcher": ["$gcc"]
        },
        {
          "label": "Flash",
          "type": "shell",
          "command": "st-flash --reset write build/${PROJECT_NAME}.bin 0x08000000",
          "dependsOn": ["Build"],
          "group": "build"
        }
      ]
    }
    

    说明

    • Build:编译项目
    • Flash:使用 st-flash 将编译好的 .bin 文件写入MCU
    • 你需要根据你的烧录工具(如 OpenOCD、ST-Link)修改命令

    4. 创建 launch.json

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "GDB Debug",
          "type": "cppdbg",
          "request": "launch",
          "program": "${workspaceFolder}/build/${PROJECT_NAME}.elf",
          "args": [],
          "stopAtEntry": false,
          "cwd": "${workspaceFolder}",
          "environment": [],
          "externalConsole": false,
          "MIMode": "gdb",
          "setupCommands": [
            {
              "description": "Enable pretty-printing for gdb",
              "text": "-enable-pretty-printing",
              "ignoreFailures": true
            }
          ],
          "preLaunchTask": "Build",
          "miDebuggerPath": "arm-none-eabi-gdb"
        }
      ]
    }
    

    说明

    • 使用 GDB 调试器
    • 需要确保 arm-none-eabi-gdb 在系统 PATH 中

    5. 安装必要扩展

    • C/C++:提供智能感知和语法高亮
    • CMake:自动加载 CMakeLists.txt
    • PlatformIO(可选):简化嵌入式开发流程
    • OpenOCD(可选):用于调试和烧录

    四、运行流程总结(有序列表)

    1. 打开项目文件夹,确保包含 CMakeLists.txt 和源文件。
    2. 生成 CMake 构建目录(如 build/):
      mkdir build && cd build
      cmake ..
      
    3. 使用终端执行构建任务
      cmake --build .
      
    4. 连接 STM32 开发板,确保 USB 正确识别。
    5. 使用 tasks.json 中的 Flash 命令.bin 写入 MCU:
      st-flash write build/${PROJECT_NAME}.bin 0x08000000
      
    6. 使用 launch.json 启动调试
      • 点击左下角的 运行和调试(或按 F5
      • 确保 preLaunchTaskBuild

    五、常见问题排查

    | 问题 | 解决方案 | |------|----------| | “code language not supported or defined” | 使用 tasks.jsonlaunch.json 而非右键 Run Code | | 编译失败 | 检查 CMakeLists.txt 和路径配置 | | 无法调试 | 确保 launch.json 中的 miDebuggerPath 正确 | | 烧录失败 | 检查 ST-Link 驱动和 st-flash 命令 |


    六、推荐工具链配置(修改后的代码示例)

    示例:tasks.json

    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "Build Project",
          "type": "shell",
          "command": "cmake --build . --target all",
          "group": {
            "kind": "build",
            "isDefault": true
          },
          "problemMatcher": ["$gcc"]
        },
        {
          "label": "Flash to MCU",
          "type": "shell",
          "command": "st-flash --reset write build/${PROJECT_NAME}.bin 0x08000000",
          "dependsOn": ["Build"],
          "group": "build"
        }
      ]
    }
    

    七、总结

    重点总结:

    • 不要依赖“右键 Run Code”,它不适用于C/C++项目。
    • 使用 CMake + tasks.json + launch.json 来构建、烧录和调试 STM32 项目。
    • 连接开发板后才能运行和调试,但构建时不需要。
    • 配置好 CMakeLists.txt 和 JSON 文件 是关键。

    如有更多关于具体芯片型号、调试器类型等问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 10月9日