Среда разработки для stm32 какую выбрать
Перейти к содержимому

Среда разработки для stm32 какую выбрать

  • автор:

STM32 IDE

STm32 IDE

Программирование stm32 стоит начать с изучения программного обеспечения для написания программ под данный микроконтроллер. На сегодняшний день разработано достаточно большое количество программ для написания программного кода под микроконтроллер Stm32 ( STM32 IDE ) и связанно это с большой популярностью данных микроконтроллеров.

В данной статье мы поговорим о наиболее популярных STM32 IDE, что бы вы смогли выбрать ту среду, которая больше всего подходит для вас.

  1. STM32CUBEMX;
  2. STM32CUBEIDE;
  3. KEIL;
  4. IAR Embedded Workbench for ARM;
  5. CodeGrip.

STM32CUBEMX

CubeMx не случайно попал в нашу подборку. Данный программный продукт не позволяет разрабатывать приложения под контроллеры STM32. Но он является отличным генератором кода под все микроконтроллеры STM32.

С помощью CubeMX пользователю предоставляется возможность настроить и сгенерировать библиотеку для работы с периферией STM32. Т.е. нет необходимости писать с нуля код для работы с UART или SPI, не нужно писать функцию чтения ADC или функции работы PWM. За вас все это сделает CubeMX. Нужно только правильно настроить необходимые блоки в визуальном редакторе.

Большим плюсом является то, что эта программа абсолютно бесплатная и разрабатывается производителем STM32 – STMicroelectronics. Это означает, что обновление будет выходит на постоянной основе, а так же при появлении новых микроконтроллеров, в этой среде они будут появляется раньше остальных. Сгенерировать библиотеки можно под разработку в таких STM32 IDE, как STM32CUBEIDE и KEIL.

STM32CUBEIDE

CUBEIDE STM32, среда разработки под контроллеры STM32 от компании производителя чипов STMicroelectronics. Данный программный продукт поставляется совершенно бесплатно. Что является большим плюсом.

На время написания статьи программу можно скачать, зарегистрировав аккаунт и указав европейскую страну. Так же необходимо использовать ВПН. Интерфейс CUBEIDE интуитивно понятен и содержит всё, что нужно для комфортной разработки (дебагер с отладкой в real time, просмотр переменных и т.д.).

Так же стоит отметить, что CUBEIDE все время развивается и поддерживается разработчиком. К минусам отнесем отсутствие документации на русском языке.

KEIL

Keil — одна из самых мощных IDE для разработки программ под микроконтроллеры STM32. Keil имеет свой собственный компилятор, позволяющий комфортно отлаживать программный код. В IDE используется язык программирования С\С++. Так же Keil имеет в своем распоряжение симулятор, который позволяет эмулировать некоторое железо, например UART.

Минусом данной IDE является платная лицензия. А так же то, что программа работает только в ОС Windows. На просторах интернета можно скачать активатор для Keil, но в таком случае у пользователей наблюдаются вылеты и подвисания программы.

IAR Embedded Workbench for ARM (IAR-EWARM)

Еще один хороший редактор кода с компилятором C\C++ для микроконтроллеров STM32. Этот редактор кода имеет в своем распоряжении более 4000 примеров по работе с периферией STM32. Так же IDE IAR в автоматическом режиме проверяет ваш код на правила MISRA C (MISRA C: 2004). Это правила написания отказа устойчивого программного кода.

Редактор поддерживает все контроллеры STM32, библиотеки для работы с периферией, а так же плагин для работы с RTOC (операционная система реального времени).

Минусом использования IDE IAR это то, что она является платной.

CodeGrip

Еще один редактор кода для микроконтроллеров STM32 от компании MICROE. Одним из отличий данного редактора является то, что редактор имеет такие компиляторы как: microC, microPascal, microBasic. Компиляторы разработаны под экосистему Microe, оптимизированы под отладочные комплекты компании. Большим минусом является платная лицензия на компилятор.

Какую выбрать среду разработки для STM32?

В заключение необходимо сказать о выборе STM32 IDE. Каждый из редакторов имеет и плюсы и минусы, в частности я выбрал для себя CUBEIDE в связке с CUBEMX. Данная среда разработки удовлетворяет всем моим запросам, а так же что немало важно она является бесплатной.

STM32. Подготавливаем среду разработки в Linux

В недавнем времени получилось так, что у меня появилась пара интересных проектов, где одна из составных частей — микроконтроллер STM32. И каждый раз при смене ноутбука или ОС на домашнем компе приходится настраивать окружение для разработки как в первый раз. Плюсом, последние проекты, которые я делал для STM32 — выполнял в Windows, в демо-версии Keil uVision. Но поскольку я давно переехал в Linux — возникла необходимость основательно разобраться и изложить процесс настройки окружения для будущих применений.

Всем, кому интересно — добро пожаловать под кат.

Дисклеймер. Во избежание срача, который может возникнуть на фоне различных воззрений на лучший вариант реализации среды разработки в Linux — я поспешу уточнить, что данная статья является отражением моих вкусов, воззрений и предпочтений, без претензий на объективность и истину в последней инстанции.

❯ Что необходимо настроить?

Итак. Нам необходимо получить рабочую, юзабельную среду для разработки под STM32. В первую очередь определим скоп задач, которые нужно решить:

  • Необходимые зависимости для начала работы;
  • Набор инструментов: компилятор, линковщик, ассемблер, отладчик и т.п.
  • Собрать все необходимое для работы с ST-Link;
  • Установка и проверка GDB;
  • Установить STM32CubeMX для удобного конфигурирования проекта;
  • Выбрать и установить IDE и подключить к ним компилятор и отладчик;
  • Сделать простой шаблон проекта для будущего использования;
  • Проверить компиляцию и механизм отладки проекта.

❯ Необходимые зависимости для начала работы

В первую очередь нужно установить весь минимально необходимый набор зависимостей и программ для начала работы. Итого, сделайте следующее:

sudo wget -qO /etc/apt/trusted.gpg.d/kitware-key.asc https://apt.kitware.com/keys/kitware-archive-latest.asc echo "deb https://apt.kitware.com/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/kitware.list sudo add-apt-repository -y ppa:git-core/ppa sudo apt update sudo apt upgrade sudo apt install -y build-essential make libtool pkg-config cmake curl automake autoconf gcc git texinfo python3-dev libpython3-dev liblzma5 libncurses5 libncurses5-dev libusb-1.0-0-dev libgtk-3-dev libstlink-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev xz-utils tk-dev

❯ Набор инструментов: компилятор, линковщик, ассемблер, отладчик и т.п.

Итак. Для начала разберемся с набором инструментов. Давайте я коротко расскажу о том, что это такое. Набор инструментов нужен для того, чтобы компилировать исходных код в исполняемый файл, который можно будет исполнить на микроконтроллере.

Набор инструментов включает в себя:

  • Компилятор;
  • Компоновщик;
  • Библиотеки времени выполнения.
  • GNU Binutils, который включает в себя линкер ld, ассемблер as и прочее (подробнее);
  • Набор компиляторов GNU GCC, которые используя кодогенератор порождающий ассемблерный код передают его на вход ассемблера GNU (подробнее);
  • Набор библиотек.

Получаем значение последней версии тулчейна:

ARM_TOOLCHAIN_VERSION=$(curl -s https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads | grep -Po '
Version \K.+(?=
)')

Далее скачиваем сам тулчейн:

curl -Lo gcc-arm-none-eabi.tar.xz "https://developer.arm.com/-/media/Files/downloads/gnu/$/binrel/arm-gnu-toolchain-$-x86_64-arm-none-eabi.tar.xz"

Создаем директорию, где будет находиться тулчейн:

sudo mkdir /opt/gcc-arm-none-eabi

Извлекаем архив в эту директорию:

sudo tar xf gcc-arm-none-eabi.tar.xz --strip-components=1 -C /opt/gcc-arm-none-eabi

Добавляем эту директорию в PATH-переменную:

echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi/bin' | sudo tee -a /home/megalloid/.bashrc

Для того, чтобы применить данные изменения нужно:

source /home/megalloid/.bashrc

Проверим версии компиляторов:

megalloid@megalloid-pc:~$ arm-none-eabi-gcc --version arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. megalloid@megalloid-pc:~$ arm-none-eabi-g++ --version arm-none-eabi-g++ (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Проверим тулчейн в действии:

touch main.c; vim main.c

Вставим в файл следующее содержимое:

#include int main()

Сохраним и проведем компиляцию:

arm-none-eabi-gcc main.c -o test

Результат будет не очень. Будет куча ошибок и не получится никакого результата:

arm-none-eabi-gcc main.c -o test /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-exit.o): in function `exit': exit.c:(.text.exit+0x28): undefined reference to `_exit' /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-writer.o): in function `_write_r': writer.c:(.text._write_r+0x24): undefined reference to `_write' /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-closer.o): in function `_close_r': closer.c:(.text._close_r+0x18): undefined reference to `_close' /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-lseekr.o): in function `_lseek_r': lseekr.c:(.text._lseek_r+0x24): undefined reference to `_lseek' /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-readr.o): in function `_read_r': readr.c:(.text._read_r+0x24): undefined reference to `_read' /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-sbrkr.o): in function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk' collect2: error: ld returned 1 exit status

Но если немного видоизменить команду указав дополнительные флаги — все будет готово:

arm-none-eabi-gcc --specs=rdimon.specs main.c -o test
megalloid@megalloid-pc:~/sources$ file test test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

Отлично. Компилятор работает. Идём дальше.

❯ Утилиты для работы с ST-Link

Теперь необходимо разобраться с тем, каким образом установить и настроить утилиты для работы с ST-Link:

cd ~/sources git clone https://github.com/stlink-org/stlink.git cd stlink make clean make release sudo make install

Далее необходимо установить права доступа к реальному оборудованию через установку правил udev:

sudo cp -a config/udev/rules.d/* /lib/udev/rules.d/ sudo udevadm control --reload-rules && sudo udevadm trigger

Так же на сайте проекта доступны несколько полезных ссылок:

  • Туториал на использование stlink и FAQ по решению разных проблем: ссылка;
  • Мануал по компиляции из сырцов: ссылка;
  • Список поддерживаемых устройств: ссылка.
megalloid@megalloid-pc:~$ lsusb | grep STM Bus 001 Device 011: ID 0483:3748 STMicroelectronics ST-LINK/V2 megalloid@megalloid-pc:~$ st-info --probe Found 1 stlink programmers version: V2J37 serial: XXXXXXXXXXXXXXXXXXXXXXXX flash: 65536 (pagesize: 1024) sram: 8192 chipid: 0x440 dev-type: STM32F05x

Или можно проверить также через GUI тулзу:

megalloid@megalloid-pc:~$ stlink-gui

В итоге вы увидите:

Что ж. Этот этап выполнен. Идём далее.

❯ Установка ST CubeMX

Теперь для получения простейшей заготовки проекта, которую будем использовать, понадобится CubeMX версия для Linux. Последняя версия на момент написания статьи — 6.10.0.

Со времени начала всем понятных событий ST ограничили доступ к скачиванию CubeMX с официального сайта и теперь придётся искать альтернативные пути. Я нашел эту версию тут. Скачиваем версию для Linux:

wget http://www.stm32res.ru/sites/default/files/mi_files/Prog_stm32/en.stm32cubemx-lin-v6-10-0.zip mkdir cubemx; unzip en.stm32cubemx-lin-v6-10-0.zip -d cubemx/ cd cubemx; ./SetupSTM32CubeMX-6.10.0

Устанавливаем через графический интерфейс и запустим генерацию первого проекта:

megalloid@megalloid-pc:~$ ~/STM32CubeMX$ ./STM32CubeMX 

Теперь настроим генерацию проекта:

Выбираем нужный контроллер:

Настроим проект. Сначала настроим тактирование в секции RCC:

Устанавливаем галочку для настройки порта отладочной шины, так как по умолчанию выводы переводятся на вход:

Настроим GPIO-пины к которым подключены светодиоды:

Отметим их на схеме настройки выводов:

И настраиваем тактирование:

После завершаем настройку кодогенераратора и установим IDE в значение Makefile:

После этого придется ввести логин и пароль от учетной записи st.com — но авторизация должна пройти без проблем. После окончания генерации получим следующий набор файлов:

megalloid@megalloid-pc:~/STM32/F051/Blink$ ll total 56 drwxrwxr-x 4 megalloid megalloid 4096 янв 8 22:33 ./ drwxrwxr-x 3 megalloid megalloid 4096 янв 8 22:33 ../ -rw-rw-r-- 1 megalloid megalloid 3380 янв 8 22:33 Blink.ioc drwxrwxr-x 4 megalloid megalloid 4096 янв 8 22:33 Core/ drwxrwxr-x 4 megalloid megalloid 4096 янв 8 22:33 Drivers/ -rw-rw-r-- 1 megalloid megalloid 5492 янв 8 22:33 Makefile -rw-rw-r-- 1 megalloid megalloid 7613 янв 8 22:33 .mxproject -rw-rw-r-- 1 megalloid megalloid 9569 янв 8 22:33 startup_stm32f051x8.s -rw-rw-r-- 1 megalloid megalloid 5900 янв 8 22:33 STM32F051R8Tx_FLASH.ld

Для отладки нам понадобится SVD-файл выбранного контроллера. Для STM32F051R8T6 я взял этот файл тут. Необходим файл STM32F0 System View Description:

В архиве есть файл STM32F0x1.svd, который мы кладем в директорию проекта. Теперь можно перейти к работе с проектом в IDE.

❯ Установка и выбор IDE для

Мы подошли к самому спорному вопросу, который нужно решить: какую IDE использовать. Есть несколько вариантов на выбор:

  • Visual Studio Code;
  • Eclipse IDE;
  • QT Creator.

Тут кому что удобнее и по сути это дело вкуса. Рассмотрим настройку первых двух вариантов.

❯ Настройка Visual Studio Code для работы с STM32

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

sudo apt-get install wget gpg apt-transport-https wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list' rm -f packages.microsoft.gpg sudo apt update sudo apt install code

Открываем VSCode в каталоге со свежесгенерированным проектом из CubeMX:

megalloid@megalloid-pc:~/STM32/F051/Blink$ code .

В работе нам может пригодиться несколько полезных плагинов:

  • C/C++ Extension Pack – для подсветки синтаксиса и поддержки возможностей дебага;
  • Code Spell Checker – для подсветки ошибок и опечаток в коде и комментариях;
  • Makefile Tool — для удобной подсветки синтаксиса и работы с Make-файлами;
  • Cortex-Debug — ARM Cortex-M GDB Debugger для VSCode, может отображать Peripherals, Core registers, Function Disassembly, Memory View и многое другое (правда, может быть использован только если на хостовой ОС установлен arm-none-eabi-gdb);
  • Memory View — обеспечивает возможность отображения памяти при работе в дебаггере;
  • Head-File-Guard — инструмент для работы с конструкциями #ifndef… #define… #endif;
  • Linker Script — инструмент для подсветки и проверки синтаксиса скриптов линковщика;
  • Command Variable — плагин для удобной работы с переменными которые можно будет использовать в настройках проекта
  • Tasks — плагин, который вытаскивает кнопки задач на нижнюю панель окна разработки (чуть дальше вы увидите о чем речь);
  • TODO Highlight — подсветка для комментариев которые содержат конструкции наподобие TODO или FIXME, который может впоследствии генерировать списком все указанные в комментариях указания на доработки.

Теперь перейдем к самому проекту. После запуска VSCode в папке проекта, программа проведет анализ Makefile, который был сгенерирован CubeMX и настроит IntelliSense.

Перейдем к проекту и проверим, все ли работает как нужно. Докинем в main.c код моргания светодиодом:

while (1) < /* USER CODE END WHILE */ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8|GPIO_PIN_9); HAL_Delay(1000); /* USER CODE BEGIN 3 */ >

Теперь, если запустить в Terminal команду make — мы получим бинарный файл, который можно прошить:

Можно прошить отладку в этом же терминале:

st-flash --connect-under-reset write ./Blink.hex 0x08000000 st-flash reset

Произойдет прошивка и светодиоды заморгают:

После того, как мы проверили, что цель билдится, надо автоматизировать этот процесс. Для этого необходимо настроить проект.

Необходимо нажать сочетание клавиш Ctrl+Shift+P и находим пункт Preferences: Open Workspace Settings (JSON). В структуре проекта появится каталог .vscode и откроется файл settings.json. В него вставим следующее содержимое:

Ещё раз нажимаем сочетание клавиш Ctrl+Shift+P и находим пункт Tasks: Configure Task — Create tasks.json file from template — Others. Откроется файл tasks.json на редактирование и вставим в него следующее содержимое:

< "version": "2.0.0", "tasks": [ < "label": "Build", "type": "shell", "group": < "kind": "build", "isDefault": true >, "command": "make", "problemMatcher": [], "detail": "Build project" >, < "label": "Clean", "type": "shell", "group": "build", "command": "make clean", "problemMatcher": [], "detail": "Clean project" >, < "type": "shell", "label": "Flash", "command": "st-flash", "args": [ "--reset", "write", "$/build/$.bin", "0x8000000" ], "options": < "cwd": "$/build" >, "problemMatcher": [], "group": < "kind": "build", "isDefault": true >, "detail": "Builds project and flashes firmware" >, < "type": "shell", "label": "Erase", "command": "st-flash", "args": [ "--connect-under-reset", "erase" ], "detail": "Mass erase of chip" >], "inputs": [ < "id": "workspaceFolderForwardSlash", "type": "command", "command": "extension.commandvariable.transform", "args": < "text": "$", "find": "\\\\", "replace": "/", "flags": "g" > > ] >

Сохраняем. Теперь данные задачи можно запустить из меню внизу рабочего окна IDE:

Попробуем выполнить эти команды. У меня они сработали как нужно и светодиоды радостно заморгали. Значит, все сделано верно.

Но это еще не всё. Необходимо, чтобы отладка запускалась из IDE. Для этого необходимо установить и сконфигурировать отладчик + плагин для IDE. Рассмотрение этого вопроса я вынес в отдельную главу.

❯ Установка отладчика ST-LINK GDB

В составе пакета ST-Link, который мы устанавливали ранее — также имеется GDB-отладчик st-util и трассировщик st-trace. Но при попытке использовать без настройки — он не включится:

megalloid@megalloid-pc:~$ arm-none-eabi-gdb Could not find platform independent libraries Could not find platform dependent libraries Consider setting $PYTHONHOME to [:] Python path configuration: PYTHONHOME = (not set) PYTHONPATH = (not set) program name = '/usr/local/bld-tools/bld-tools-virtual-env/bin/python' isolated = 0 environment = 1 user site = 1 import site = 1 sys._base_executable = '/usr/local/bld-tools/bld-tools-virtual-env/bin/python' sys.base_prefix = '/usr' sys.base_exec_prefix = '/usr' sys.executable = '/usr/local/bld-tools/bld-tools-virtual-env/bin/python' sys.prefix = '/usr' sys.exec_prefix = '/usr' sys.path = [ '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/lib-dynload', ] Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding Python runtime state: core initialized ModuleNotFoundError: No module named 'encodings' Current thread 0x00007f2d42114c00 (most recent call first):

Для этого необходимо в первую очередь установить pyenv и настроить окружение Python версии 3.8, который нужен для работы с GDB:

curl https://pyenv.run | bash

Для того, чтобы использовать pyenv, добавляем необходимые команды в .bashrc:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc source ~/.bashrc

После установим Python версии 3.8 и сделаем настройку:

pyenv install 3.8.18 sudo mkdir -p /usr/local/bld-tools sudo ln -s $PYENV_ROOT/versions/3.8.18 /usr/local/bld-tools/bld-tools-virtual-env

Теперь проверим, что отладчик запускается:

megalloid@megalloid-pc:~$ arm-none-eabi-gdb GNU gdb (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.90.20231008-git Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-none-eabi". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word". (gdb) 

Можно сразу проверить работоспособность отладчика. В одном окне запускаем GDB-сервер:

megalloid@megalloid-pc:~$ st-util st-util 1.7.0-352-g8c581c3 2024-01-08T20:54:20 INFO common.c: STM32F05x: 8 KiB SRAM, 64 KiB flash in at least 1 KiB pages. 2024-01-08T20:54:20 INFO gdb-server.c: Listening at *:4242. 

В другом окне, где запущен GDB-клиент, пишем:

(gdb) target extended localhost:4242 Remote debugging using localhost:4242 warning: No executable has been specified and target does not support determining executable automatically. Try using the "file" command. 0x080006ce in ?? ()

Если имеется какой-нибудь демо-файл прошивки для платы, то можно сделать следующее:

(gdb) exec-file /home/megalloid/STM32/Blink/Objects/fw.axf A program is being debugged already. (gdb) load Loading section RW_IRAM1, size 0x8 lma 0x20000000 Loading section ER_IROM1, size 0xfc0 lma 0x8000000 Start address 0x080000bc, load size 4040 Transfer rate: 7 KB/sec, 2020 bytes/write.

В окне GDB-сервера будут сообщения:

megalloid@megalloid-pc:~$ st-util st-util 1.7.0-352-g8c581c3 2024-01-08T20:54:20 INFO common.c: STM32F05x: 8 KiB SRAM, 64 KiB flash in at least 1 KiB pages. 2024-01-08T20:54:20 INFO gdb-server.c: Listening at *:4242. 2024-01-08T21:10:11 INFO common.c: STM32F05x: 8 KiB SRAM, 64 KiB flash in at least 1 KiB pages. 2024-01-08T21:10:11 INFO gdb-server.c: Found 4 hw breakpoint registers 2024-01-08T21:10:11 INFO gdb-server.c: GDB connected. 2024-01-08T21:17:51 INFO common.c: STM32F05x: 8 KiB SRAM, 64 KiB flash in at least 1 KiB pages. 2024-01-08T21:17:51 INFO gdb-server.c: flash_erase: block 08000000 -> 1000 2024-01-08T21:17:51 INFO gdb-server.c: flash_erase: page 08000000 2024-01-08T21:17:51 INFO gdb-server.c: flash_erase: page 08000400 2024-01-08T21:17:51 INFO gdb-server.c: flash_erase: page 08000800 2024-01-08T21:17:51 INFO gdb-server.c: flash_erase: page 08000c00 2024-01-08T21:17:51 INFO flash_loader.c: Starting Flash write for VL/F0/F3/F1_XL 2024-01-08T21:17:51 INFO flash_loader.c: Successfully loaded flash loader in sram 2024-01-08T21:17:51 INFO flash_loader.c: Clear DFSR 2024-01-08T21:17:51 INFO gdb-server.c: flash_do: block 08000000 -> 1000 2024-01-08T21:17:51 INFO gdb-server.c: flash_do: page 08000000 2024-01-08T21:17:51 INFO gdb-server.c: flash_do: page 08000400 2024-01-08T21:17:51 INFO gdb-server.c: flash_do: page 08000800 2024-01-08T21:17:51 INFO gdb-server.c: flash_do: page 08000c00

Так. Отладчик работает. Все хорошо. Идём дальше.

❯ Установка плагина отладки для VS Code

Теперь, когда отладчик работает, можно настроить его использование в IDE. Немного изучив вопрос, я нашел интересным для себя плагин для отладки (и он, как оказалось, единственный) Cortex-Debug. Прочитав его описание на сайте проекта, нашел его достаточно мощным инструментом для отладки.

Теперь попробуем сконфигурировать этот плагин в VS Code и проверим, какие возможности он предоставляет в решении реальных задач.

Для этого нужно перейти в меню Run And Debug в боковом меню и создать файл launch.json, выбрав пункт Cortex-Debug:

Туда запишем следующее содержимое. Обратите внимание, что должен быть обязательно указан путь до скачанного ранее SVD-файла:

< "version": "0.2.0", "configurations": [ < "name": "Cortex Debug", "cwd": "$", "executable": "$/build/$.elf", "request": "launch", "type": "cortex-debug", "runToEntryPoint": "main", "servertype": "stutil", "preLaunchTask" : "Build", "preRestartCommands" : [ "load", "enable breakpoint", "monitor reset" ], "showDevDebugOutput" : "raw", "svdFile" : "$/STM32F0x1.svd" > ] >

Вот! Теперь можно запустить отладку и мы увидим сразу все доступные нам функции отладчика. Пробежимся по возможностям.

Variables, в котором можно просмотреть все необходимые значения переменных, значения регистров процессора и прочее.

Watch, секция в которой можно выставить наблюдение за конкретно взятой переменной:

Breakpoints — все выставленные прерывания в коде программы (разумеется, с ограничением по количеству), Call Stack с очередью вызова, XPeripherials со значениями регистров периферии:

Дополнительно можно воспользоваться меню Memory и поставив на паузу дебагер или остановив его на точке останова, увидеть значения в указанном адресе:

Отлично. С VSCode разобрались. И кажется, тут все получилось очень даже удобно для работы с МК. Теперь можно перейти к рассмотрению процесса установки и настройки Eclipse IDE, чтобы сравнить насколько он юзабельнее.

❯ Настройка Eclipse IDE для работы с STM32

Перейдем к установке и настройке Eclipse IDE. Для этого необходимо перейти по ссылке и скачать версию IDE for C/C++ developers тут.

После распакуем архив и запускаем инсталлятор:

tar xfzv eclipse-inst-jre-linux64.tar.gz cd eclipse-installer ./eclipse-inst 

Тут я столкнулся с проблемой. Инсталлятор запустился и завершился с ошибкой:

megalloid@megalloid-pc:~/sources/eclipse-installer$ ./eclipse-inst SLF4J: No SLF4J providers were found. SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details. EGLDisplay Initialization failed: EGL_BAD_ACCESS EGLDisplay Initialization failed: EGL_NOT_INITIALIZED Cannot create EGL context: invalid display (last error: EGL_SUCCESS) # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00007fc9f21b63ef, pid=266685, tid=266686 # # JRE version: OpenJDK Runtime Environment Temurin-17.0.9+9 (17.0.9+9) (build 17.0.9+9) # Java VM: OpenJDK 64-Bit Server VM Temurin-17.0.9+9 (17.0.9+9, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64) # Problematic frame: # C [libwebkit2gtk-4.0.so.37+0x29b63ef] # # Core dump will be written. Default location: Core dumps may be processed with "/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E" (or dumping to /home/megalloid/sources/eclipse-installer/core.266685) # # An error report file with more information is saved as: # /tmp/hs_err_pid266685.log # # If you would like to submit a bug report, please visit: # https://github.com/adoptium/adoptium-support/issues # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. #

Вероятно, это связано с устаревшим драйвером видеокарты, который я использовал. Обновил его достаточно просто:

wget https://ru.download.nvidia.com/XFree86/Linux-x86_64/535.146.02/NVIDIA-Linux-x86_64-535.146.02.run chmod +x NVIDIA-Linux-x86_64-535.146.02.run

После скачивания необходимо завершить сессию оконного менеджера X Window и произвести установку из окна терминала. Переключившись туда через сочетание клавиш Ctrl+Alt+F1. Но это оффтоп. Об этом можете потом спросить в комментариях.

После того, как я решил проблему с драйвером — таки запустился инсталлятор:

Выбираем Eclipse IDE for Embedded C/C++ Developers. И нажимаем кнопку установки Install. После установки выбираем Launch.

Выбираем удобное расположение каталога для Workspace Eclipse. Я оставил предложенное значение по умолчанию:

Откроется главное окно IDE. Теперь настроим проект. Закрываем Welcome-страницу и переходим в меню Window — Preferences, где мы настроим тулчейн.

Обычно первым шагом настраивается переменная окружения PATH, которая будет нужна при работе с Makefile-проектом. Это настройка производится в меню C/C++ — Build — Environment и тут добавляется путь до тулчейна. А раз мы это сделали выше, то отдельно добавлять тут ничего не нужно.

Создадим проект. Для этого перейдем в меню File — New — C/C++ Projects и выбираем C Managed Build:

Далее укажем имя проекта, в моем случае это будет STM32F0-Blink. Из предложенного списка выбираем пункт STM32F0xx C/C++ Project:

После нажимаем Next и выбираем семейство микроконтроллеров, которое используется на плате STM32F051x8:

Нажимаем Next, ничего не меняем и идем в следующее меню:

В следующем меню оставляем все как выставлено по умолчанию:

Далее будет предложен выбор тулчейна и пути к нему — оставляем предложенный вариант по умолчанию:

Нажимаем Finish. И будет создан шаблон проекта и запущен установщик различных плагинов и дополнений необходимых в работе. Дожидаемся окончания работы в данном окне:

После этого появится окно IDE и кажется все готово к работе с проектом, но когда я попробовал скомпилировать проект — вышло некоторое количество ошибок:

Не знаю почему так. Но надо найти в древе проекта файл cxx.cpp и добавить в него подключение библиотеки stdlib.h:

#include

Выглядит это следующим образом:

После можно запустить сборку проекта и она должна окончиться успешно. Полученный бинарный файл необходимо прошить в плату. При старте проекта мы создали две конфигурации для сборки: Debug и Release (отмотайте выше). Между этими конфигурациями можно переключаться кликнув правой кнопкой в Project Explorer на заголовке проекта:

Теперь разберемся с каждой из них. Сборка Debug подразумевает компиляцию проекта с отладочной информацией и отладочными функциями, с последующим запуском отладчика. А сборка Release компилируется без отладочного содержимого и сразу загружается в микроконтроллер. Но чтобы все эти операции реализовать, необходимо сконфигурировать проект и внешний отладчик. Поскольку Eclipse плотно интегрирован с отладчиком OpenOCD — необходимо его настроить. Процесс настройки OpenOCD я вынес в отдельную главу.

❯ Установка отладчика OpenOCD

Один из наиболее популярных средств отладки и работы с микроконтроллерами — это OpenOCD. Рассмотрим процесс установки и интеграции в среду разработки Eclipse данного отладчика.

Первым делом необходимо скачать последнюю версию с официального репозитория:

git clone https://github.com/openocd-org/openocd cd openocd/ ./bootstrap ./configure make -j$(nproc) sudo make install

Проверим, что отладчик работает:

megalloid@megalloid-pc:~/sources/openocd$ openocd --version Open On-Chip Debugger 0.12.0+dev-01472-gadcc8ef87 (2024-01-11-22:57) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html

Отлично. Отладчик работает. Теперь можно его проверить в действии. Для этого необходимо ему указать путь до конфигурации ST-Link и файл конфигурации микроконтроллера. Т. к. я использую плату STM32F0-Discovery, команда должна выглядеть следующим образом:

openocd -f /usr/local/share/openocd/scripts/interface/stlink.cfg -f /usr/local/share/openocd/scripts/board/stm32f0discovery.cfg

Никакого специфического содержимого там нет и уверен, что вы сможете сделать аналогичный конфиг и для своей кастомной платы.

После запуска отладчика вы должны увидеть нечто похожее:

Open On-Chip Debugger 0.12.0+dev-01472-gadcc8ef87 (2024-01-11-22:57) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Warn : Interface already configured, ignoring Error: already specified hl_layout stlink Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD srst_only separate srst_nogate srst_open_drain connect_deassert_srst Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections Info : clock speed 1000 kHz Info : STLINK V2J37S0 (API v2) VID:PID 0483:3748 Info : Target voltage: 2.869226 Info : [stm32f0x.cpu] Cortex-M0 r0p0 processor detected Info : [stm32f0x.cpu] target has 4 breakpoints, 2 watchpoints Info : [stm32f0x.cpu] Examination succeed Info : starting gdb server for stm32f0x.cpu on 3333 Info : Listening on port 3333 for gdb connections

Хорошо. Видим, что GDB-сервер ожидает соединения по адресу localhost:3333. Идём дальше. Теперь вернемся в Eclipse IDE и подключим OpenOCD в качестве внешнего отладчика. Для это идем в меню Window — Preferences — MCU — Global OpenOCD Path и указываем следующие значения:

Далее перейдем к настройке Debug Configuration через меню Project Explorer — Debug As — Debug Configuration:

В открывшемся окне двойным кликом нажимаем на пункт GDB OpenOCD Debugging и откроется шаблон конфигурации:

Необходимо перейти на вкладку Debugger и настроить параметры запуска OpenOCD с которыми мы проверяли его работоспособность при установке. В поле Config options пишем:

-f /usr/local/share/openocd/scripts/interface/stlink.cfg -f /usr/local/share/openocd/scripts/board/stm32f0discovery.cfg

После этого можно нажать кнопку Debug и будет запущена отладка проекта. Необходимо чтобы плата была подключена к компьютеру. Будет выдано предупреждение о переходе в отладочный режим. Нажимае галочку помнить наше решение и не выдавать данное предупреждение:

Запустим проект и видно, как зеленый светодиод начал мигать и появился отладочный вывод:

Осмотримся, какие средства отладки представлены в Eclipse IDE. В первую очередь обратим внимание на Disassembly окно, которое включается кнопкой Instruction Stepping Mode:

После поищем, где находятся регистры ядра Cortex:

Долго ковыряясь в интерфейсе я не мог найти регистры периферии. В предназначенном для этого окне было пусто. Разберемся, как это настроить. Перейдем в настройки проекта, кликнув правой кнопкой по заголовку проекта в Project Manager — Preferences — C/C++ Build — Settings. Выберем конфигурацию Debug и перейдем в закладку Devices и увидим, что у нас не установлен ни один CMSIS-пак. Что ж, в любом случае, нам нужен полноценный дебаг.

После этого переходим в меню Window — Perspective — Open Perspective — Other… — CMSIS Packs. Необходимо нажать кнопку Refresh, загрузятся все необходимые описания. Это займет какое-то время, часть паков будет не доступна к загрузке.

После загрузки нужно будет выбрать необходимое семейство контроллеров, у меня это будет STM32F0. Необходимо его установить, нажав правой кнопкой и выбрать пункт Install.

Далее переключаемся в обычный режим и открываем настройки проекта по уже известному нам пути:

Открываем меню C/C++ Build — Settings — Devices и выбираем целевой микроконтроллер:

Все. Теперь вернемся к месту где мы остановились. После запуска отладки — в окне Peripherials появится вся необходимая периферия:

Если пробежаться по интерфейсу окна — судя по всему все опции отладки присутствуют. Супер. Теперь необходимо сконфигурировать Release-конфигурацию и на этом закончим рассмотрение вопроса в и так раздувшейся статье ��.

Откроем настройки проекта, переходим в меню C/C++ Build — Settings — GNU Arm Cross Create Flash Image — General и выбираем Configuration: Release:

После этого необходимо настроить прошивальщик для загрузки получаемого бинаря в микроконтроллер.

Переходим в меню Run — External Tools — External Tools Configuration. Двойным кликом выбираем Program и добавляем конфигурацию.

  • Обзовем ее ST-Link Flash;
  • В поле Location укажем путь до st-flash: /usr/local/bin/st-flash;
  • В поле Arguments укажем write/Release/.bin 0x08000000.

Нажимаем Run и прошивка будет загружена на МК и светодиоды замигают:

Теперь, чтобы прошить прошивку из Release — необходимо нажать эту кнопку из меню:

Кажется, на этом всё.

❯ Заключение

После того, как рассмотрели самые популярные IDE и необходимые средства разработки для STM32 — выбор за вами. Согласен, что настройка и подготовка заготовки проекта весьма объемная, но все же она не лишена гибкости в выборе параметров и опций. Наверняка я многие интересные и полезные опции и плагины пропустил — но если мне будет о чем вам рассказать, то обязательно это сделаю.

До встречи в следующих статьях! ��

Возможно, захочется почитать и это:

  • ➤ Создаем I2C Master Controller на Verilog. Проверим работу на реальном железе
  • ➤ Игровая легенда из нулевых: каким был Nokia N-Gage QD? Обзор, аппаратный ремонт и программирование под Symbian
  • ➤ МС6205. Плазменный дисплей советской эпохи
  • ➤ Обзор одноцелевых дистрибутивов Linux
  • ➤ Полная история игровой вселенной «Гарри Поттера» — «Золотое поколение»

Easyelectronics.ru

В теме не разбираюсь.
В интернетах пишут разное: Keil, STM32 Cube MX и даже Arduino IDE.

Задача: передавать по wi-fi + tcp данные с сенсора.

Решили использовать STM32 + ESP8266.
Скорее всего менять подход не будем, но комментарий — возможно, STM32 слишком сложный для такой задачи — буду рад услышать.

Итак, с чем же лучше всего войти в мир программирования микроконтроллеров, имея Ubuntu и небольшой опыт web программирования?

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 21:41

Attilic (STM32CubeIDE), официальная IDE от производителя + Cube «хватит всем». Она не лучше и не хуже, просто, блудить будите меньше. А как образец, я бы порекомендовал посмотреть на CCS (Texas Instruments). А еще лучше Notepad++ плюс MakeFile. Я как раз озаботился поиском визарда для MakeFile. Notepad++ поддерживает бесчисленное множество кодировок и, можно писать имена переменных (метки, теги) на русском, да хоть китайском, главное препроцессор настроить, и пошли нафиг все IDE.

Последний раз редактировалось AstraHard 15 июн 2020, 00:11, всего редактировалось 2 раз(а).

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 21:48

Какой, нафиг, IDE, когда «в теме не разбираюсь»?
Для начала хотя бы с годик надо повелосипедить хэллоуворлды, чтобы понять, что и как…

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 21:54

Не надо закапывать, надо выкапывать, топикстартер еще не умер. «Нам» нужны не IDE а хорошие визарды, никто об этом ни слова, видимо уровень понимания хромает.

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 22:02

Я уже заметил, что, чем больше человек в теме, тем больше он «хромает», так что лучше говорить с новичками, у них «Глаз не замылен».

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 22:10

Визарды? Ну-ну. Сляпаем НËХ из говна и палок — и в продакшн!
Нет уж, сначала образование нужно получить, а потом уже что-то делать!
А то это напоминает первоклашку: чуваки, подскажите, как мне свернуть тензор Римана по-шустрому!

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 22:12
А каким боком Вам в этом деле помешает хороший визард? Кстати, давайте на русском ВОЛШЕБНИК.
Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 22:13

Бгг.. Я 20 лет назад на эти «визарды» насмотрелся. Тоже был молодым и тупым.
Здесь варианта два: либо мозг, либо «визард». Третьего не дано.
Лишенные мозга калокуб используют или абдурину. Ну, про лифт на абдурине, думаю, все читали ☺

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 22:15

Я об этом речь и веду, ВОЛШЕБНИКИ малек протухли. Видимо АПОЛОГЕТЫ заблудились в своих «3-Х соснах» (проститутках), и чего-то подхватили, отчего мозги плавятся.

Заголовок сообщения: Re: какая IDE для STM32 лучше?
Добавлено: 13 июн 2020, 23:49
AstraHard писал(а):

Я уже заметил, что, чем больше человек в теме, тем больше он «хромает», так что лучше говорить с новичками, у них «Глаз не замылен».

Не всегда. Вон даже Джобс свой рачок в поджелудочной поначалу морковным соком «лечил», сказывают. Но, как говорится, не замылишься сам — намылят тебя, что и произошло. Проблема не в запуске наавтогенерированного кода — проблема в том чёрном дне, который неизбежно наступает, когда карточный домик рушится от сквозняка и непонятно куда бежать за помощью — кроме как к тем, кто «в теме». А они уже, чаще всего, злорадно отправляют пациента читать даташиты. Эдди просто указывает вам более прямолинейный путь через трясину, только и всего. 😉 Другой вопрос, что в личные жизненные планы такая переправа может и не входить, и для того, чтобы нарвать болотных лилий для барышни, скрутив попутно голову зазевавшейся в камышах утке, достаточно будет просто закатать до колен штаны. То бишь на разовый хапо́к и автогенератора хватит. Но в наступающих потом серых буднях инженера конфигуратор будет слабым подспорьем. Так что выбирайте по возможностям работы и навигации по коду. Я бы смотрел что-нибудь происхождением из конюшни эклипса — он много в каких ипостасях нынче встречается.

Развертывание среды разработки для STM32

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

Программы и библиотеки, о которых будет идти речь, уже объединены в готовые бесплатные среды разработки, например CooCox CoIDE или SW4STM32. Первая только для Windows, а вторая для множества операционных систем, но ссылки для скачивания появляются только после регистрации.

Мы соберем свою среду, чтобы лучше ее понимать и контролировать.

Eclipse

Грубо говоря, Eclipse — это продвинутый редактор кода. Eclipse никак не привязан к STM32 и с его помощью можно вести разработку на разных языках программирования и для разных целей.

Перейдем на страницу загрузки пакетов Eclipse и скачаем Eclipse IDE for C/C++ Developers.

Установка заключается в распаковке скаченного архива в удобное место. На Windows я устанавливаю Eclipse в папку Program Files, на Linux — в /opt, то же самое с любыми другими программами и библиотеками у которых нет установочного файла.

Программа запускается с помощью исполняемого файла eclipse, который находится в распакованной папке. При первом запуске надо будет выбрать рабочую папку. В этой папке Eclipse будет по умолчанию создавать проекты. Этот выбор не ограничивает местоположение проектов, их можно размещать в любом другом месте.

При первом запуске будет открыта вкладка Welcome, которую нужно просто закрыть.

GCC ARM

GCC ARM — это набор инструментов для сборки программы, таких как компилятор, линковщик, отладчик и много другое. GCC ARM имеет косвенное отношение к STM32 и позволяет разрабатывать программы под любые ARM-процессоры.

Идем на официальный сайт и выбираем версию для своей операционной системы.

Просто распаковываем архив в удобное место.

GNU ARM Eclipse

GNU ARM Eclipse — это дополнение для Eclipse, которое поможет связать его с GCC ARM.

Для его установки запустим Eclipse и выберем меню Help -> Install New Software:

eclipse-help-install-new-software

В появившемся окне нажмем кнопку Add, чтобы добавить источник дополнения.

В поле Name укажем имя источника «GNU ARM Eclipse Plug-ins», а в поле Location ссылку на источник: http://gnuarmeclipse.sourceforge.net/updates

eclipse-add-repository-gnu-arm-eclipse-plug-ins

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

Ставим галочку напротив GNU ARM C/C++ Cross Development Tools и нажимаем Next.

Затем проходим процедуру установки нажимая Next и соглашаясь с условиями лицензии.

eclipse-security-warning

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

В конце установки будет предложено перезапустить Eclipse. Соглашаемся.

Создание проекта

Теперь есть все необходимое, чтобы создать проект.

Чтобы создать проект на языке C, выберем меню File -> New -> C Project.

eclipse-file-new-c-project

Можно создать проект на языке C++, но возникнет множество нюансов, которые усложнят разработку. О них я расскажу в другой статье.

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

eclipse-c-project

Проект я назову example. Тип — пустой проект (Empty Project). Набор инструментов — Cross ARM GCC, что соответствует ранее установленному GCC ARM.

После нажатия Next будет предложено выбрать конфигурации проекта. Конфигурации позволяют по разному собирать проект, с разными настройками. В дальнейшем можно создать любое количество конфигураций. Но придется возиться с их настройками. Для простоты оставим одну конфигурацию Release.

eclipse-select-configurations

Далее будет предложено уточнить набор инструментов и указать путь к ним. По умолчанию выбран набор GCC ARM: «GNU Tools for ARM Embedded Processors (arm-none-eabi-gcc)«. В качестве пути нужно указать путь к папке GNU ARM.

eclipse-toolchain

После нажатия Finish проект будет создан. Его иерархическая структура отображается во вкладке Project Explorer. В этой же вкладе может отображаться множество проектов.

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

Чтобы собрать проект, необходимо создать хотя бы один файл с исходным кодом. Создадим файл main.c c функцией main().

eclipse-new-source-file

Вызовем контекстное меню на имени проекта и выберем New -> Source File.

eclipse-new-source-file

В поле Source File укажем имя файла main.c и нажмем Finish.

В файл добавим следующий код:

int main()

eclipse-%d0%b8%d0%ba%d0%be%d0%bd%d0%ba%d0%b0-build

Сохраним файл комбинацией Ctrl+S. И соберем проект комбинацией Ctrl+B или нажав на иконку

Eclipse может автоматически сохранять файлы перед сборкой, но для это нужно выбрать меню Windows -> Preferences, перейти в General -> Workspaces и поставить галочку напротив Save automatically before built.

При сборке проекта мы получим ошибку, потому что не хватает двух библиотек (CMSIS и STM32Cube), о которых далее пойдет речь.

CMSIS

CMSIS — это базовая библиотека для ARM-микроконтроллеров.

Ее можно скачать с сайта ARM после регистрации.

CMSIS распространяется в виде архива, который нужно распаковываем в удобное место.

Подключение библиотеки будет разобрано в соответствующем разделе далее.

В CMSIS есть папка

Device/ARM/ARMCMx/Source/GCC/

Есть несколько папок ARMCMx, которые соответствуют разным ядрам микроконтроллеров. Имя папки расшифровывается как ARM Cortex-M. Выбираем папку в соответствии с микроконтроллером.

Из этой папки в папку проекта требуется скопировать пару файлов:

Чтобы файлы появились в Eclipse, нажмите F5 в Project Explorer, либо в контекстном меню проекта выберете Refresh. Это обновит список файлов.

Оба файла придется отредактировать.

gcc_arm.ld

Это скрипт для линковки проекта. Он отвечает за распределение разных областей памяти в микроконтроллере.

В этом файле задается объем постоянной и оперативной памяти микроконтроллера, а также их начальные адреса. Эти параметры нужно отредактировать в соответствии с используемым микроконтроллером.

Параметры задаются в самом начале файла с помощью следующего кода:

/* Linker script to configure memory regions. */ MEMORY < FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000 /* 256k */ RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x08000 /* 32k */ >

В переменной ORIGIN задается начальный адрес области памяти, а в LENGTH — ее объем в байтах. FLASH — это постоянная память, RAM — оперативная.

В STM32 начальный адрес постоянной памяти — 0x08000000, оперативной (как и указано) — 0x20000000.

startup_ARMCMx.c

Это файл с исходным кодом на языке C, который содержит базовый код программы и таблицу прерываний. Кроме того в файле задается объем стека и кучи. Код из этого файла выполняется до вызова функции main() и вызывает функцию main().

Таблица прерываний в этом файле скорее всего не соответствует таблице используемого микроконтроллера. Файл нужно отредактировать в соответствии с таблицей прерываний микроконтроллера. Об этом речь пойдет позже.

Размер кучи и стека должен соответствовать потребностям проекта и объему оперативной памяти микроконтроллера.

Размер кучи и стека задается следующим кодом:

. #define __STACK_SIZE 0x00000400 . #define __HEAP_SIZE 0x00000C00 .

__STACK_SIZE определяет объем стека. __HEAP_SIZE — объем кучи. В сумме оба значения не должны превышать объем оперативной памяти.

STM32Cube

STM32Cube — это библиотека с открытым исходным кодом для микроконтроллеров STM32, которую выпускает производитель микроконтроллеров. Библиотека пришла на смену STM32 Standard Peripheral Libraries (сокращенно SPL).

Для каждого семейства микроконтроллеров своя версия библиотеки STM32Cube, к названию которой прибавляется суффикс Fx или Lx, где x — число 0, 1, 2 и так далее. Например, STM32CubeF4.

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

В этой библиотеке уже содержится библиотека CMSIS в папке Drivers/CMSIS, но ее версия чаще всего не соответствует последней версии, которую предоставляет ARM.

Из STM32Cube нужно скопировать некоторые файла в свой проект:

  • Drivers/STM32xxxx_HAL_Driver/Inc/stm32xxxx_hal_conf_template.h
  • Drivers/CMSIS/Device/ST/STM32xxxx/Source/Templates/system_stm32xxxx.c

STM32xxxx и stm32xxxx разное для разных микроконтроллеров.

Обновим список файлов в Eclipse, как это писалось выше.

stm32xxxx_hal_conf_template.h

Это заголовочный файл, который используется библиотекой STM32Cube для подключения заголовочных файлов периферии микроконтроллера. Кроме того он содержит некоторые настройки.

Файл нужно переименовать в stm32xxxx_hal_conf.h, то есть удалить суффикс template.

Его не требуется нигде подключать, об этом заботится сама библиотека.

Если микроконтроллер тактируется внешним источником (например, кварцевым резонатором или генератором), то нужно указать частоту этого источника в определении HSE_VALUE.

system_stm32xxxx.c

Код в этом файле содержит некоторые настройки и важную функцию SystemInit(), которая вызывается до вызова функции main().

Функция SystemInit() вызывается в файле startup_ARMCMx.c и предназначена для базовой настройки микроконтроллера. Можно изменить код этой функции, например, для настройки тактирования микроконтроллера.

Частоту внешнего тактирования в этом файле лучше не задавать.

Настройка проекта и подключение библиотек

После всего проделанного выше структура проекта должна выглядеть следующим образом:

eclipse-project-ecplorer-example-1

Если сейчас вы попробуете собрать проект (Ctrl+B), то получите сообщение об ошибке.

Откроем настройки проекта с помощью меню Project -> Properties. Появится окно настроек. В дереве слева выберем C/C++ Build -> Settings. В основной части окна нам нужна вкладка Tool Settings, здесь мы будем проводить большую часть времени.

Вкладка содержит дерево настроек, выберем первый пункт Target Processor, чтобы настроить ядро микроконтроллера. В поле ARM family выберем ядро, например cortex-m4 для микроконтроллера STM32F4xx. Остальные поля трогать не нужно.

eclipse-arm-family

Перейдем к пункту Cross ARM C Linker -> Genaral с основными настройками линковщика. В Script files нужно добавить скрипт линковки gcc_arm.ld. Нажмем на иконку на которой нарисован «+» и в диалоговом окне нажмем Workspace, чтобы выбрать файл из рабочей области, и выберем файл gcc_arm.ld.

eclipse-add-gcc_arm-ld

Перейдем к пункту Cross ARM C Compiler — Includes для настройки подключаемых файлов. В Include paths добавим пути для поиска заголовочных файлов. Нужно добавить следующие пути:

eclipse-include-paths

Последняя папка указывает на папку нашего проекта в которой находится файл stm32xxxx_hal_conf.h и могут находится другие подключаемые файлы проекта.

Перейдем к пункту Cross ARM C Compiler — Preprocessor. В Defined symbols добавим определения:

где STM32xxxxxx должен соответствовать используемому микроконтроллеру. Список значений можно посмотреть в файле

Например в файле stm32f4xx.h этот список выглядит так:

/* #define STM32F405xx */ /*!< STM32F405RG, STM32F405VG and STM32F405ZG Devices */ /* #define STM32F415xx */ /*!< STM32F415RG, STM32F415VG and STM32F415ZG Devices */ /* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */ /* #define STM32F417xx */ /*!< STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */ /* #define STM32F427xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG and STM32F427II Devices */ /* #define STM32F437xx */ /*!< STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG and STM32F437II Devices */ /* #define STM32F429xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, STM32F429NG, STM32F439NI, STM32F429IG and STM32F429II Devices */ /* #define STM32F439xx */ /*!< STM32F439VG, STM32F439VI, STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI, STM32F439IG and STM32F439II Devices */ /* #define STM32F401xC */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB and STM32F401VC Devices */ /* #define STM32F401xE */ /*!< STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CE, STM32F401RE and STM32F401VE Devices */ /* #define STM32F411xE */ /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */

Напротив каждого определения представлен список соответствующих ему микроконтроллеров.

В Defined symbols для микроконтроллера STM32F405RG должно быть добавлено определение STM32F405xx.

eclipse-defined-symbols

Работа с этим окном завершена. Нажимаем OK.

Уже сейчас проект может быть успешно собран. Но перестанет собираться если мы начнем вызывать функции STM32Cube, например если мы добавим в main() вызов функции HAL_Init(), самой важной функции библиотеки.

Во первых, в main.c надо подключить основной заголовочный файл библиотеки stm32xxxx.h. Для STM32CubeF4 это файл stm32f4xx.h. Вообще, везде, где предполагается использование библиотеки надо подключать этот файл.

Во вторых, надо добавить в проект файлы исходного кода библиотеки. Для этого в контекстном меню проекта выбираем New -> Folder. В диалоговом окне нажимаем Advanced и выбираем Link to alternate location (Linked Folder) и с помощью Browse указываем папку

В поле Folder name задаем имя папки, например STM32Cube.

eclipse-new-folder-stm32cube

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

Не обязательно, чтобы компилировались все файлы библиотеки. Это может занять много времени, к тому же большинство из них не будут использованы. Поэтому можно исключить некоторые файлы из сборки.

Для исключения файла из сборки вызовем на файле контекстное меню и выберем Recource Configurations -> Exclude from Build.

eclipse-exclude-from-build

В появившемся окне надо выбрать конфигурации из которых требуется исключить файл.

eclipse-exclude-from-build-configurations

Можно массово исключить множество файлов, если выбрать их с зажатыми клавишами Ctrl или Shift.

Обратное включение производится также, но с убиранием галочки напротив имени конфигурации. Советую исключить все файлы и включать их по мере необходимости. Обязательно требуется исключить файл stm32xxxx_hal_msp_template.c, потому что это просто файл-шаблон, который приведен в качестве примера. Обязательно требуется включить файл:

  • stm32f4xx_hal.c, так как это основной файл библиотеки, он содержит функцию HAL_Init().
  • stm32f4xx_hal_cortex.c
  • stm32f4xx_hal_rcc.c

Функции из последних двух вызываются в функции HAL_Init().

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

eclipse-project-explorer-example-2

Проект должен успешно собираться.

На вкладке Console будет следующий текст:

Building target: example.elf Invoking: Cross ARM C Linker arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -g -T "/home/bravikov/workspace2/example/gcc_arm.ld" -Xlinker --gc-sections -Wl,-Map,"example.map" -o "example.elf" ./STM32Cube/stm32f4xx_hal.o ./STM32Cube/stm32f4xx_hal_cortex.o ./STM32Cube/stm32f4xx_hal_rcc.o ./main.o ./startup_ARMCM4.o ./system_stm32f4xx.o Finished building target: example.elf Invoking: Cross ARM GNU Create Flash Image arm-none-eabi-objcopy -O ihex "example.elf" "example.hex" Finished building: example.hex Invoking: Cross ARM GNU Print Size arm-none-eabi-size --format=berkeley "example.elf" text data bss dec hex filename 1752 1088 28 2868 b34 example.elf Finished building: example.siz

Прерывания

SysTick

SysTick — это таймер, встроенный в ядро микроконтроллера. STM32Cube использует его для отсчета времени в миллисекундах. Об этой полезной особенности библиотеки у меня есть статья.

Чтобы отсчет времени работал, в проект надо добавить правильную реализацию функции SysTick_Handler(). Это функция обрабатывает прерывания от SysTick, и должна увеличивать счетчик времени на 1.

Добавим в файл main.c следующий код:

void SysTick_Handler(void)

Таблица прерываний

В файле startup_ARMCMx.c задается таблица прерываний. Изначально она не соответствует реальным микроконтроллерам. Таблицу надо сформировать самостоятельно.

Файл содержит объявление функций-обработчиков прерываний:

/*---------------------------------------------------------------------------- Exception / Interrupt Handler *----------------------------------------------------------------------------*/ /* Cortex-M4 Processor Exceptions */ void NMI_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void HardFault_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void MemManage_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void BusFault_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void UsageFault_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void SVC_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void DebugMon_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void PendSV_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); void SysTick_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); .

За объявлениями следует таблица прерываний:

/*---------------------------------------------------------------------------- Exception / Interrupt Vector table *----------------------------------------------------------------------------*/ const pFunc __Vectors[] __attribute__ ((section(".vectors"))) = < /* Cortex-M4 Exceptions Handler */ (pFunc)&__StackTop, /* Initial Stack Pointer */ Reset_Handler, /* Reset Handler */ NMI_Handler, /* NMI Handler */ HardFault_Handler, /* Hard Fault Handler */ MemManage_Handler, /* MPU Fault Handler */ BusFault_Handler, /* Bus Fault Handler */ UsageFault_Handler, /* Usage Fault Handler */ 0, /* Reserved */ 0, /* Reserved */ 0, /* Reserved */ 0, /* Reserved */ SVC_Handler, /* SVCall Handler */ DebugMon_Handler, /* Debug Monitor Handler */ 0, /* Reserved */ PendSV_Handler, /* PendSV Handler */ SysTick_Handler, /* SysTick Handler */ .

Массив __Vectors[] содержит имена функций-обработчиков прерываний.

Первая часть таблицы (до SysTick_Handler включительно) общая для всех микроконтроллеров. Остальное нужно дописать аналогичным образом на основании документации на микроконтроллер.

Заключение

Я описал только самое необходимое. Не коснулся темы программаторов, отладки и самого процесса разработки. Это необъятные темы, которые я буду раскрывать в будущем.

Ссылки

  1. Видео-скринкаст «Eclipse и GNU Tools для разработки под ARM-микроконтроллеры«.
  2. Eclipse IDE for C/C++ Developers.
  3. GNU Tools for ARM Embedded Processors.
  4. GNU ARM Eclipse Plug-ins.
  5. CMSIS.
  6. STM32Cube.
  7. Статья «Начало работы с STM32 в Keil MDK-ARM«.
  8. Статья «Приоритеты прерываний в Cortex-M и их настройка в STM32Cube«.
  9. Статья «Отсчет времени в STM32Cube«.
  10. Статья «ST-Link + MDK-ARM + Linux«.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *