НейроАгент

Настройка рабочего пространства VS Code для AVR и STM32

Полное руководство по созданию рабочего пространства в VS Code с глобальными настройками для AVR и STM32 микроконтроллеров и проект-специфическими конфигурациями.

Вопрос

Как создать рабочее пространство в VS Code с глобальными настройками для AVR и STM32 микроконтроллеров и проект-специфичными настройками внутри каждого?

НейроАгент

Настройка рабочего пространства в VS Code для AVR и STM32 микроконтроллеров требует создания иерархической структуры конфигурационных файлов, где глобальные настройки определяют общие параметры, а проект-специфические настройки переопределяют их для конкретных проектов.

Содержание

Понимание структуры рабочих пространств VS Code

VS Code использует гибкую систему конфигурации, которая позволяет разделять глобальные и локальные настройки. Для разработки микроконтроллеров AVR и STM32 эта структура становится особенно важной.

Рабочее пространство в VS Code может состоять из нескольких уровней:

  1. Глобальные настройки (settings.json) - применяются ко всем проектам
  2. Настройки рабочей области (workspace.json) - применяются ко всем проектам в текущей папке
  3. Настройки конкретного проекта (.vscode/settings.json) - применяются только к этому проекту

Для AVR и STM32 разработки рекомендуется создать следующую структуру:

~/.vscode/
├── settings.json (глобальные настройки)

MyProjects/
├── .vscode/
│   ├── settings.json (настройки для всех проектов в папке)
│   └── extensions.json
├── AVR_Projects/
│   ├── Project1/
│   │   ├── .vscode/settings.json
│   │   └── ...
│   └── Project2/
│       ├── .vscode/settings.json
│       └── ...
└── STM32_Projects/
    ├── ProjectA/
    │   ├── .vscode/settings.json
    │   └── ...
    └── ProjectB/
        ├── .vscode/settings.json
        └── ...

Создание глобальных настроек для AVR и STM32

Глобальные настройки определяют общие параметры, которые будут использоваться во всех проектах микроконтроллерной разработки.

Базовая конфигурация глобальных настроек

Создайте файл ~/.vscode/settings.json со следующим содержимым:

json
{
  "files.associations": {
    "*.c": "c",
    "*.h": "c",
    "*.cpp": "cpp",
    "*.hpp": "cpp",
    "*.s": "arm",
    "*.S": "arm",
    "*.asm": "arm"
  },
  
  "C_Cpp.default.configurationProvider": "ms-vscode.cpptools",
  
  "terminal.integrated.defaultProfile.linux": "bash",
  "terminal.integrated.defaultProfile.osx": "bash",
  "terminal.integrated.defaultProfile.windows": "PowerShell",
  
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.organizeImports": true
  },
  
  "cSpell.words": [
    "STM32",
    "HAL",
    "LL",
    "LLD",
    "CMSIS",
    "UART",
    "GPIO",
    "I2C",
    "SPI",
    "ADC",
    "DMA",
    "NVIC",
    "SysTick",
    "USART",
    "TIM",
    "RCC",
    "PWR",
    "FLASH",
    "SRAM",
    "CRC",
    "IWDG",
    "WWDG"
  ],
  
  "git.ignoreLimitWarning": true,
  
  "search.exclude": {
    "**/build": true,
    "**/obj": true,
    "**/.git": true,
    "**/node_modules": true,
    "**/Debug": true,
    "**/Release": true,
    "**/dist": true
  },
  
  "files.exclude": {
    "**/build": true,
    "**/obj": true,
    "**/.git": true,
    "**/node_modules": true,
    "**/Debug": true,
    "**/Release": true,
    "**/dist": true,
    "**/.vscode/settings.json": true
  }
}

Специфичные настройки для разработки микроконтроллеров

Добавьте в глобальные настройки параметры, специфичные для AVR и STM32:

json
{
  "avr-tools.path": "/usr/bin/avr-gcc",
  "avr-tools.makePath": "/usr/bin/make",
  
  "stm32cube.ide.path": "/opt/STM32CubeIDE",
  "stm32cube.ide.toolchain.path": "/opt/st/STM32CubeIDE_1.15.0/STM32CubeIDE",
  
  "platformio-ide-terminal.integrated.env.windows": {
    "PATH": "${env:PATH};C:\\Program Files (x86)\\Atmel Studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\bin"
  },
  
  "platformio-ide-terminal.integrated.env.linux": {
    "PATH": "${env:PATH}:/usr/bin/avr-gcc:/opt/STM32CubeIDE_1.15.0/STM32CubeIDE/plugins/ctools/arm-none-eabi-gcc/bin"
  }
}

Настройка проект-специфических конфигураций

Для каждого проекта AVR или STM32 создайте отдельную конфигурацию в папке .vscode.

Пример настройки для AVR проекта

В корне AVR проекта создайте папку .vscode с файлом settings.json:

json
{
  "cmake.configureOnOpen": true,
  "cmake.generator": "Unix Makefiles",
  
  "tasks": {
    "version": "2.0.0",
    "tasks": [
      {
        "label": "Build AVR Project",
        "type": "shell",
        "command": "make",
        "args": [
          "all"
        ],
        "group": {
          "kind": "build",
          "isDefault": true
        },
        "problemMatcher": "$gcc"
      },
      {
        "label": "Clean AVR Project",
        "type": "shell",
        "command": "make",
        "args": [
          "clean"
        ],
        "group": "build"
      },
      {
        "label": "Flash AVR",
        "type": "shell",
        "command": "avrdude",
        "args": [
          "-p",
          "${input:mcu}",
          "-c",
          "${input:programmer}",
          "-U",
          "flash:w:build/main.hex:i",
          "-P",
          "${input:port}",
          "-b",
          "${input:baudrate}"
        ],
        "group": "build",
        "problemMatcher": []
      }
    ]
  },
  
  "inputs": [
    {
      "id": "mcu",
      "type": "pickString",
      "description": "Выберите микроконтроллер",
      "options": [
        "atmega328p",
        "atmega2560",
        "atmega168",
        "atmega88"
      ],
      "default": "atmega328p"
    },
    {
      "id": "programmer",
      "type": "pickString",
      "description": "Выбмите программатор",
      "options": [
        "arduino",
        "usbasp",
        "avrisp",
        "stk500"
      ],
      "default": "arduino"
    },
    {
      "id": "port",
      "type": "promptString",
      "description": "Порт подключения",
      "default": "/dev/ttyUSB0"
    },
    {
      "id": "baudrate",
      "type": "pickString",
      "description": "Скорость порта",
      "options": [
        "19200",
        "38400",
        "57600",
        "115200"
      ],
      "default": "115200"
    }
  ]
}

Пример настройки для STM32 проекта

Для STM32 проекта настройка будет более сложной из-за необходимости работы с STM32CubeIDE:

json
{
  "cmake.configureOnOpen": true,
  "cmake.generator": "Unix Makefiles",
  
  "tasks": {
    "version": "2.0.0",
    "tasks": [
      {
        "label": "Generate STM32 Project",
        "type": "shell",
        "command": "${workspaceFolder}/scripts/generate_project.sh",
        "args": [
          "${input:mcu}",
          "${input:core}"
        ],
        "group": "build",
        "problemMatcher": []
      },
      {
        "label": "Build STM32 Project",
        "type": "shell",
        "command": "make",
        "args": [
          "-j4"
        ],
        "group": {
          "kind": "build",
          "isDefault": true
        },
        "problemMatcher": "$gcc"
      },
      {
        "label": "Flash STM32",
        "type": "shell",
        "command": "${workspaceFolder}/scripts/flash.sh",
        "args": [
          "${input:interface}",
          "${input:port}"
        ],
        "group": "build",
        "problemMatcher": []
      }
    ]
  },
  
  "inputs": [
    {
      "id": "mcu",
      "type": "pickString",
      "description": "Выберите микроконтроллер STM32",
      "options": [
        "STM32F103C8T6",
        "STM32F103ZET6",
        "STM32F407VGT6",
        "STM32F411CEU6",
        "STM32L476RG"
      ],
      "default": "STM32F103C8T6"
    },
    {
      "id": "core",
      "type": "pickString",
      "description": "Выберите ядро процессора",
      "options": [
        "M0",
        "M3",
        "M4",
        "M7"
      ],
      "default": "M3"
    },
    {
      "id": "interface",
      "type": "pickString",
      "description": "Интерфейс программирования",
      "options": [
        "stlink",
        "jlink",
        "serial"
      ],
      "default": "stlink"
    },
    {
      "id": "port",
      "type": "promptString",
      "description": "Порт программатора",
      "default": "/dev/ttyACM0"
    }
  ]
}

Интеграция с расширениями для микроконтроллеров

Необходимые расширения

Для эффективной работы с AVR и STM32 в VS Code установите следующие расширения:

  1. C/C++ (Microsoft) - расширение для разработки на C/C++
  2. PlatformIO IDE - для управления проектами микроконтроллеров
  3. STM32 for VS Code - специализированное расширение для STM32
  4. Arduino - для Arduino-совместимых проектов
  5. Makefile Tools - для работы с Makefile
  6. CMake Tools - для управления CMake проектами

Конфигурация расширений

Создайте файл ~/.vscode/extensions.json для управления расширениями:

json
{
  "recommendations": [
    "ms-vscode.cpptools",
    "platformio.platformio-ide",
    "stm32-for-vscode.stm32-for-vscode",
    "vsciot-vscode.vscode-arduino",
    "ms-vscode.makefile-tools",
    "ms-vscode.cmake-tools",
    "streetsidesoftware.code-spell-checker",
    "ms-python.python",
    "ms-vscode.vscode-json"
  ]
}

Для автоматической установки расширений используйте файл extensions.json в корне рабочего пространства:

json
{
  "recommendations": [
    "ms-vscode.cpptools",
    "platformio.platformio-ide",
    "stm32-for-vs-code.stm32-for-vscode"
  ]
}

Примеры конфигурационных файлов

Флаги компиляции для AVR

Создайте файл .vscode/c_cpp_properties.json для настройки компилятора:

json
{
  "configurations": [
    {
      "name": "AVR",
      "includePath": [
        "${workspaceFolder}/**",
        "/usr/lib/avr/include",
        "${workspaceFolder}/lib",
        "${workspaceFolder}/src"
      ],
      "defines": [
        "F_CPU=16000000UL",
        "AVR_ATmega328P",
        "__AVR_ATmega328P__"
      ],
      "compilerPath": "/usr/bin/avr-gcc",
      "cStandard": "c11",
      "cppStandard": "c++11",
      "intelliSenseMode": "linux-gcc-x64"
    }
  ],
  "version": 4
}

Флаги компиляции для STM32

json
{
  "configurations": [
    {
      "name": "STM32",
      "includePath": [
        "${workspaceFolder}/**",
        "${workspaceFolder}/Drivers/CMSIS/Include",
        "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F1xx/Include",
        "${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc",
        "${workspaceFolder}/Core/Inc"
      ],
      "defines": [
        "USE_HAL_DRIVER",
        "STM32F103xx",
        "DEBUG"
      ],
      "compilerPath": "/opt/st/STM32CubeIDE_1.15.0/STM32CubeIDE/plugins/ctools/arm-none-eabi-gcc/bin/arm-none-eabi-gcc",
      "cStandard": "c11",
      "cppStandard": "c++14",
      "intelliSenseMode": "linux-gcc-arm"
    }
  ],
  "version": 4
}

Управление несколькими проектами

Для эффективного управления несколькими проектами используйте workspace-файлы.

Создание workspace файла

Создайте файл microcontroller.code-workspace:

json
{
  "folders": [
    {
      "path": "./AVR_Projects"
    },
    {
      "path": "./STM32_Projects"
    },
    {
      "path": "./Shared_Libraries"
    }
  ],
  "settings": {
    "cmake.configureOnOpen": true,
    "files.associations": {
      "*.c": "c",
      "*.h": "c"
    }
  },
  "extensions": {
    "recommendations": [
      "ms-vscode.cpptools",
      "platformio.platformio-ide",
      "stm32-for-vscode.stm32-for-vscode"
    ]
  }
}

Иерархическая система настроек

Реализуйте систему наследования настроек:

  1. Глобальные настройки (~/.vscode/settings.json) - базовые параметры
  2. Настройки рабочего пространства - общие параметры для всех проектов в папке
  3. Настройки конкретного проекта - уникальные параметры для каждого проекта

Пример структуры наследования:

~/.vscode/settings.json (глобальные)
├── MyProjects/.vscode/settings.json (общие для всех проектов)
    ├── AVR_Projects/Project1/.vscode/settings.json
    ├── AVR_Projects/Project2/.vscode/settings.json
    ├── STM32_Projects/ProjectA/.vscode/settings.json
    └── STM32_Projects/ProjectB/.vscode/settings.json

Оптимизация рабочего процесса

Автоматизация сборки и прошивки

Создайте скрипты для автоматизации рутинных операций:

Сборка AVR проекта:

bash
#!/bin/bash
# scripts/build_avr.sh

MCU=${1:-atmega328p}
F_CPU=${2:-16000000}

make MCU=$MCU F_CPU=$F_CPU clean
make MCU=$MCU F_CPU=$F_CPU all

Прошивка STM32:

bash
#!/bin/bash
# scripts/flash_stm32.sh

INTERFACE=${1:-stlink}
PORT=${2:-/dev/ttyACM0}

if [ "$INTERFACE" = "stlink" ]; then
    openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program build/main.elf verify reset exit"
elif [ "$INTERFACE" = "jlink" ]; then
    JLinkExe -if SWD -device STM32F103C8 -autoconnect 1 -speed 4000 -CommanderScript flash.jlink
fi

Интеграция с системой контроля версий

Настройте .gitignore для проектов микроконтроллеров:

# AVR проекты
*.hex
*.elf
*.o
*.d
build/
obj/

# STM32 проекты
*.elf
*.bin
*.hex
*.map
*.d
Debug/
Release/
build/

# Сгенерированные файлы
*.dep
*.i
*.s

# IDE файлы
.project
.cproject
.settings/
.vscode/*
!.vscode/extensions.json
!.vscode/settings.json

Профили разработки

Создайте профили для разных сценариев разработки:

Профиль отладки:

json
{
  "configurations": [
    {
      "name": "AVR Debug",
      "includePath": [
        "${workspaceFolder}/**",
        "/usr/lib/avr/include"
      ],
      "defines": [
        "F_CPU=16000000UL",
        "DEBUG",
        "AVR_ATmega328P"
      ],
      "compilerPath": "/usr/bin/avr-gcc",
      "cStandard": "c11",
      "cppStandard": "c++11",
      "intelliSenseMode": "linux-gcc-x64"
    }
  ]
}

Профиль релиза:

json
{
  "configurations": [
    {
      "name": "STM32 Release",
      "includePath": [
        "${workspaceFolder}/**",
        "${workspaceFolder}/Drivers/CMSIS/Include"
      ],
      "defines": [
        "NDEBUG",
        "USE_HAL_DRIVER",
        "STM32F103xx"
      ],
      "compilerPath": "/opt/st/STM32CubeIDE_1.15.0/STM32CubeIDE/plugins/ctools/arm-none-eabi-gcc/bin/arm-none-eabi-gcc",
      "cStandard": "c11",
      "cppStandard": "c++14",
      "intelliSenseMode": "linux-gcc-arm"
    }
  ]
}

Источники

  1. Официальная документация VS Code - Рабочие пространства и папки
  2. Руководство по настройке C/C++ расширения
  3. Документация PlatformIO IDE
  4. STM32 для VS Code - официальное расширение
  5. Настройка Makefile в VS Code

Заключение

  • Создайте иерархическую структуру настроек с глобальными и проект-специфическими конфигурациями
  • Используйте workspace-файлы для управления несколькими проектами одновременно
  • Настройте специализированные расширения для AVR и STM32 разработки
  • Реализуйте автоматизацию для сборки и прошивки микроконтроллеров
  • Используйте систему наследования настроек для переиспобщения общих параметров
  • Создайте профили разработки для разных сценариев (отладка, релиз, тестирование)
  • Интегрируйте систему контроля версий с правильным игнорированием сгенерированных файлов

Эта конфигурация позволит вам эффективно работать с проектами AVR и STM32, сохраняя при этом гибкость и переиспользование общих настроек.