Настройка VSCODE под разработку для ARM на примере отладочной платы stm32f429i-disco

  • Tutorial


Всем привет!


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


Все шаги проверены на виртуальной машине со свежеустановленной Ubuntu 16.04 xenial desktop x64.


Подразумевается, что у Вас уже есть исходники какого-либо проекта.


Все настройки, касающиеся конкретного железа (в моём случае это контроллер STM32F429 и девборда STM32F429DISCO), нужно подменить на свои. То же самое касается и путей.


Если готовы, то поехали


Установка curl


sudo apt-get install curl

Установка vscode


curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install code # or code-insiders

Установка arm-none-eabi тулчейна


sudo apt-get install gcc-arm-none-eabi
sudo apt-get install gdb-arm-none-eabi

Установка openocd


sudo apt-get install openocd

Запуск и настройка vscode


Для запуска vscode вызвать в терминале команду code.
Заходим в раздел Extensions (Ctrl+Shift+X).
Ищем и устанавливаем следующие плагины:


  1. Cortex-Debug от автора marus25.
  2. С/С++ от Microsoft.

Открываем папку с проектом через меню File/Open Folder.
Заходим в раздел Debug (Ctrl+Shift+D).


Вверху в выпадающей строке видим текст No configurations.


Нажимаем на шестерёнку рядом с ней, выпадает меню с предложением создать конфигурацию для дебага, выбираем Cortex-Debug.


В каталоге проекта создаётся скрытая папка .vscode, в которой создаётся файл с конфигурациями дебага launch.json.


Если этот файл не открылся сам, открываем его руками: переходим в раздел Explorer (Ctrl+Shift+E) и в дереве выбираем этот файл.


Настраиваем конфигурацию для openocd:


"configurations": [
    {
        "name": "openocd",
        "request": "launch",
        "type": "cortex-debug",
        "cwd": "${workspaceRoot}",
        "servertype": "openocd",
        "executable": "build/lol.elf",
        "svdFile": "STM32F429.svd",
        "configFiles": [
            "/usr/share/openocd/scripts/board/stm32f429discovery.cfg"
        ]
    }
]

Последние три свойства: расположение elf-файла, расположение svd-файла, путь к конфигу для openocd, — настраиваем под себя.


Сохраняем файл launch.json и снова идём в раздел Debug, там убеждаемся, что в выпадающем меню появилась наша конфигурация.


Далее возвращаемся в раздел Explorer и в каталог .vscode добавляем новый файл с именем settings.json, открываем его, пишем там следующее:


{
    "cortex-debug.armToolchainPath": "/usr/bin",
    "cortex-debug.openocdPath": "/usr/bin/openocd"
}

Далее добавляем в .vscode ещё один файл c_cpp_properties.json, открываем его и пишем там следующее:


{
    "configurations": [
        {
            "name": "vscode_stm32_c_cpp_properties",
            "compilerPath": "/usr/bin/arm-none-eabi-gcc",
            "includePath": [
                "${workspaceRoot}/Inc/",
                "${workspaceRoot}/Drivers/CMSIS/Include/",
                "${workspaceRoot}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/"
            ],
            "defines": [
                "STM32F429xx"
            ],
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

По нажатию F5 можно запускать отладку (не забудьте перед этим собрать проект, чтобы elf-файл был на нужном месте).


Поделиться публикацией

Комментарии 52

    +1
    Немного скринов бы процесса отладки в деле, это самое важное. Как выглядит просмотр регистров переферии? Просмотр памяти возможен?
      0

      Да, согласен, добавлю как время будет)

        –1
        Эклипс пробовали?
        Чем студия из статьи лучше?
          +3
          Ну хотя бы тем, что не требует java. А вообще, это не сравнительная статья, а гайд по настройке vscode.
            –1
            Ну хотя бы тем, что не требует java.
            В смысле «требует»? Электрон — совсем нетребовательная штука, ага. Как vim, только требует иксы, 300 Мб места, 2Гб оперативы и толстенный канал если вдруг задумаешь работать на тонком клиенте.
              +2

              Ок, а сколько ресурсов нужно еклипсу?

      0
      А вы не пробовали PlatformIO? Вполне годная штука ставиться как дополнение к VScode.
        0
        Не пробовал, но встречал упоминания про неё. Если не трудно, расскажите вкратце, что даёт этот плагин?
          0
          Насколько помню он позиционирует себя как IDE для разработки IOT. Я программировал esp8266. Можно выбрать фреймворк если поддерживается несколько. Я выбирал Ардуино. Но с убогой Arduino IDE это не связано.
          +3
          Это лютый кусок гуано для ардуинщиков, даже смысла нет сравнивать с обычным cmsis.
            0

            Какое отношение имеет PlatformIO к Arduino? => https://platformio.org/frameworks

              0
              Идеологическое
                0

                Можно поподробнее?

            +1
            К сожалению дебаг там платный.
              +1
              ч.т.д.) хорошо, что я не повёлся
                –1

                Это временная бизнес модель которая позволяет поддерживать open source PlatformIO.Org и быть полностью независимым от hardware vendors.


                Напишите, пожалуйста, на contact@pioplus.com со ссылкой на этот пост и получите бесплатную лицензию.

              –3
              Еще очень хорошая IDE для разработки под микроконтроллеры Atmel Studio
                +1
                Расскажите, в чём её достоинства? Какие контроллеры в ней поддерживаются?
                  –3
                  По сути это разработка компании под 8 и 32 битные микроконтроллеры семейства ARM от компании Atmel. Поддерживает языки c/c++ и асемблер. Впринципе краткое описание описывающее достоинства и недостатки, можно посмотреть в интернете — все описывать не вижу смысла, информация вся в свободном доступе
                  Опять же, первый раз познакомился с ней в студенческие годы, когда интересовался микротехникой, а конкретно «препарировал» микропроцессор Atmega128
                    0
                    А к чему Вы тогда написали вообще про атмел студию? Судя по Вашему сообщению, она поддерживает только МК производства Microchip (теперь уже), работает, вероятно, только под Windows, весит пару гигов.
                    При том что в своей статье я написал как настроить универсальное окружение для любых арм контроллеров (STM32 там лишь для примера), которое не будет отъедать место на диске и требовать какую-то определённую операционную систему/виртуальную машину типа .net или java
                      –1
                      Не нашел в вашей статье кроме фразы
                      Все настройки, касающиеся конкретного железа (в моём случае это контроллер STM32F429 и девборда STM32F429DISCO), нужно подменить на свои. То же самое касается и путей.
                      что это универсальное решение для любых семейств контроллеров…
                      Не всегда универсальной инструмент удобен в работе под что-то определенное, поэтому в качестве доп. информации привел Atmel Studio под семейство ARM…
                        0
                        Я и не спорю с тем, что если есть хорошее решение для конкретных МК, то можно его использовать. Тем более если там из коробки по хоткеям можно найти описание регистров и периферии, открыть дш или рм или другие доки, есть шаблоны проектов и т.д.
                        Но, во-первых, ещё раз повторюсь: атмел студия — это продукт, рассчитанный на разработку под Windows. Во-вторых, я не поленился и посмотрел, в системных требованиях указано 6 ГБ свободного места на диске, 6 ГБ КАРЛ. Это просто недопустимо.
                        +1
                        Она ещё и с Visual Studio конфликтует, квест «поставь и заставь работать студии от Атмел и Микрософт (2017 & 2013)» меня в своё время затянул почти на 3 дня. Но симулятор для 8битных МК в Atmel Studio очень удобный, и ASF штука для быстрой разработки полезная.
                          +1
                          У нас на работе нет доступа к Инету, так эта студия регулярно отказывается видеть свои же отладочные инструменты (Atmel-ICE). В системе они видны, драйвера стоят, но студия их в упор не видит, причину выяснить так и не удалось. Сначала не хватало каких-то сертификатов, потом, после апдейта, снова ослепла, и привести ее в чувство уже не удалось. Зачем мне инструмент, который постоянно пытается что-то подкачать? А уж переход на ASF4 — это вообще песня, снова только в инете, половина функционала там не реализована, а код из него выходит такой, что плюнул, переписал все сам и сократил объем прощивки в три раза.
                  0
                  Собираюсь освоить STM32, как раз выбирают инструментарий. Что нового и уникального даст использование VSCode? В чем это круче или удобнее остальных инструментов? Какие плюшки в отладке появляются?
                    +1
                    Лично для меня, плюсы vscode — это привычный интерфейс после Visual Studio, легковесность самого редактора по сравнению с большими IDE, отсутствие привязки к java или .net инфраструктуре, обилие плагинов, которые легко устанавливать и конфигурировать.
                    По поводу плюшек — а какие плюшки Вас интересуют? Можно посмотреть стек вызовов, а также просматривать и модифицировать регистры и память, ставить и удалять брейкпойнты, вычислять выражения и всё то же самое, что обычно при отладке можно. Что ещё нужно?)
                      0
                      Хотел бы поинтересоваться, вопрос «что нового и уникального» по сравнению с чем подразумевался?
                        0
                        Да пока ни с чем конкретным, только читаю и выбираю. Вот и хотел узнать, что уникального дает VSCode+STM32? Характерного и неповторимого ни в одной другой среде. Может быть только «вкусовщина» или действительно уникальные особенности.
                        Я не ругаю, просто для себя пытаюсь разобраться и ставлю «плюсы-минусы» за тот или иной инструмент.
                      0
                      А где брать svd файл? У меня всё работает, но в зоне cortex peripherial написано no svd file loaded. Списка поддерживаемых контроллеров тоже не нашел.
                        0
                        svd файлы нужно искать на сайте производителя. Список контроллеров — тот же самый, что и у openocd.
                        0
                        Полезная статья.
                        Когда начинал работать с stm32 использовал Eclipse. Потом пересел на IntelliJ IDEA.
                        А так наверное писать можно хоть в vim или notepad
                          0
                          Эклипс жручая по памяти, если под виндой, то можно кейл пользовать, у него 32кб ограничение для личных целей.
                          IntelliJ IDEA — Это для мк? или имелось в виду Clion? Или просто пересели на Java?
                            0
                            Не только жручая, но и глючная. Еще неудобный поиск, неудобная организация проекта, неудобное автодополнение.
                              0
                              Добро пожаловать в embedded.
                                0
                                Я работал только с Keil и Eclipse. И второе как IDE получше будет. Есть шансы, что JetBrains в этом году выкатит что-то для Embedded.
                                0
                                IntelliJ IDEA — Это для мк? или имелось в виду Clion? Или просто пересели на Java?

                                именно Clion имелось виду.
                                для CLion есть плагин OpenOCD + STM32CubeMX support for ARM embedded development
                                Для меня такой вариант самый удобный.

                              +1
                              Может быть кому поможет мой конфигурационный файл для Jlink и FreeRTOS.
                              {
                                  "version": "0.2.0",
                                  "configurations": [
                                      {
                                          "name": "test debug",
                                          "request": "launch",
                                          "type": "cortex-debug",
                                          "executable": "${workspaceRoot}/_debug/test_d.elf",
                                          "cwd": "${workspaceRoot}",
                                          "servertype": "jlink",
                                          "device": "STM32F446RE",
                                          "svdFile": "/Users/user/workspace/Devices/cmsis-svd/data/STMicro/STM32F446x.svd",
                                          "rtos": "FreeRTOS",
                                          "interface": "swd",
                                          "swoConfig": {
                                              "cpuFrequency": 128000,
                                              "swoFrequency": 8000,
                                          }
                                      }
                                  ]
                              }

                              К недостаткам плаигна на данный момент отнесу только то, что он переменные показывает только в десятичной форме.
                              Выглядет это странным и неудобным. Эмбед с десятичными значениями :).
                                0
                                Пробую сделать под ubuntu 18.10 и не очень выходит.
                                В репах нет gdb-arm-none-eabi. Странно, есть пакеты gdb-avr, gdb-msp430, а под arm нет.
                                VSCode уже стоял, с Platformio для разработки под ESP32.
                                Добавил новый workspace, папку .vscode с вашими примерами. .svd взял из TrueStudio. А где настройки как собирать проект? У меня кнопки «Build» просто нет. Должны же быть где-то настройки как вызывать компилятор, путь к скрипту линкера и прочее.
                                Я понимаю, что у автора ubuntu 16.04, вопрос к тем, кто, возможно, настроил сборку и отладку в 18.10 или просто хорошо разбирается в настройках VSCode.
                                  +1
                                  Пример для винды, но в убунте должно быть почти так же в этом плане. Необходимо в папке .vscode создать tasks.json и там прописать таски для сборки, прошивки и прочего чего угодно. У меня все это через make, соответственно, таски выглядят так:
                                  tasks.json
                                  {
                                      "version": "2.0.0",
                                      "tasks":
                                      [
                                          {
                                              "label": "Build",
                                              "type": "shell",
                                              "group": "build",
                                              "command": "make build",
                                              "problemMatcher": [
                                                  "$gcc"
                                              ]
                                          }
                                      ]
                                  }
                                  


                                  Для убунты скорее всего надо только command подправить. Ну и соответственно в корне папки должен лежать мэйкфайл для сборки.
                                    0
                                    На новой Ubuntu нужно ставить другой gdb: gdb-multiarch или как-то так. Я не обновляю пока что ОС, поэтому не могу ничего сказать больше.
                                    По поводу сборки — в начале я сказал, что у вас подразумевается наличие готового к сборке проекта. А в конце упомянул, что нужно не забыть его собрать. Цель статьи — показать связку именно для дебага.
                                      +1
                                      На Ubuntu 18.04 ставил gcc-arm-none-eabi так:
                                      $ sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
                                      $ sudo apt-get update
                                      $ sudo apt-get install gcc-arm-embedded
                                      Проверка версии:
                                      $ arm-none-eabi-gcc --version
                                        0
                                        Спасибо, я разобрался уже. Я не стал добавлять сторонние репы, я просто взял с developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
                                        Там ничего собирать не надо, просто разархивировать куда удобно и в makefile путь до gcc указать.
                                        А gdb, как подсказали выше, в пакете gdb-multiarch в репах есть.
                                      0

                                      Имеется следующий вопрос, как с отладкой в VisualCode+CortexDebug? Имеется ли возможность видеть участки памяти контроллера(как например в VisualGDB)?

                                        0

                                        Можно посмотреть регистры переферии, ядра и значения переменных, естественно. Про участки памяти упоминаний в доках к этому расширению не видел, но их легко можно посмотреть через командную строку не выходя из VS Code, если используете J-Link. Скорее всего в других дебаггерах тоже можно так.

                                        0
                                        А просмотров регистров работает? Ибо в J-Link их не обновляет: github.com/Marus/cortex-debug/issues/70#issuecomment-455786964
                                          0

                                          Интересно, а кто-нибудь настраивал Visual Studio в качестве IDE под stm32? Я сейчас не про существующий платный плагин, а про конфиг json, как в статье. Я пробовал, но вышел какой-то затык на этапе конфигураций, а разбираться не было времени. Если кто напишет гайд, буду очень благодарен.

                                            +1
                                            Гайд на что? Подключение gcc и установка openOCD? Если у разработчика это вызывает проблемы, то ему или на кейл, или плагин за 60 евро, или в домохозяйки.
                                              0
                                              А что не так с платным плагином (мы про VisualGDB говорим?). Он не такие большие деньги стоит (в районе $100), но реально качественно сделан, ставишь и работаешь, в отличае от плясок с бубном при настройке бесплатных IDE. Вам своего времени не жалко?
                                              Всеравно для самоделок — детали платные денег стоят, процевворы тоже, изготовление плат в резоните тоже не бесплатно, корпус — тоже деньги.
                                                0
                                                Вот именно, мало того, что тратишь деньги на покупку железа, так за эти деньги нет нормального сервиса для разработки, плати ещё бабки за плагины или убогие IDE.
                                                  +1

                                                  К сожалению, для хобби $100 за плагин дороговато.

                                                    0
                                                    Если быть точным 60 евро и 30, если ты студент или есть открытый проект на гитхабе. По моему даже для хобби очень адекватный вариант, хотя к сожалению плагины отбивают у разработчика желание разбираться с процессом сборки и компиляции, что считаю не есть хорошо.
                                                  0
                                                  Хотел бы добавить про вывод отладки через SWO.
                                                  Чтобы работал вывод printf в vscode, надо в .vscode/launch.json конфигурацию сделать примерно так:
                                                  launch.json
                                                   "version": "0.2.0",
                                                      "configurations": [
                                                          {
                                                              "name": "Cortex Debug",
                                                              "cwd": "${workspaceRoot}",
                                                              "executable": "./build/dash.elf",
                                                              "request": "launch",
                                                              "type": "cortex-debug",
                                                              "servertype": "openocd",
                                                              "gdbpath" : "/usr/bin/gdb-multiarch",
                                                              "svdFile": "STM32F429.svd",
                                                              "configFiles": [
                                                                  "./stm32f4discovery.cfg"
                                                              ],
                                                              "swoConfig": {
                                                                  "source": "probe",
                                                                  "enabled": true,
                                                                  "swoFrequency": 2000000,
                                                                  "cpuFrequency": 180000000,
                                                                  "decoders": [
                                                                          {
                                                                                  "port": 0,
                                                                                  "label": "Output",
                                                                                  "type": "console",
                                                                                  "encoding":"ascii"                                                                                              
                                                                          }
                                                                  ]
                                                                  
                                                          }
                                                          }
                                                      ]
                                                  }
                                                  


                                                  В cpuFrequency надо указать частоту на которой контроллер работает, у меня это 180Mhz.

                                                  В коде надо переопределить функцию _write. В простом случае это примерно так:
                                                  write
                                                  int _write(int file, char *ptr, int len){
                                                  	while(len--) ITM_SendChar(*ptr++);	
                                                  	return 0;
                                                  }
                                                  


                                                  ITM_SendChar в CMSIS есть.

                                                  После этого можно в коде сделать printf(«Hello\n»);
                                                  В vscode, в режиме отладки, в окне терминала закладка Output, и там в выпадающем меню выбрать SWO Output.

                                                  Небольшой нюанс — вывод printf работает в буфер, и передается в функцию write по символу \n, или какому-то большому размеру. Поэтому, что бы вывод происходил сразу после вызова printf, надо или \n добавлять, или принудительно после printf сбрасывать буфер.

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                  Самое читаемое