mmote.ru/content/posts/qtcreator-stm32/index.md

129 lines
7.4 KiB
Markdown
Raw Normal View History

2023-01-01 18:21:01 +03:00
---
title: "Программируем и отлаживаем STM32 в QtCreator"
categories: ["mcu", "archive"]
date: 2017-02-27T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Однажды понадобилось написать программку с использованием Qt. Как выяснилось, лучше всего это делать в специализированной для этого дела среде разработки - QtCreator. Поработав в ней некоторое время я понял, что это весьма неплохая IDE. И решил попробовать использовать её не совсем по назначению - программировать STM32.
<!--more-->
Итак, что нам понадобится (далее рассматривается windows, но для остальных ОС мало что изменится):
1. QtCreator, вестимо
2. [Python 2.7](https://www.python.org/downloads/) (нужен для отладчика)
3. [MinGW](https://sourceforge.net/projects/mingw/files/)
4. [ARM Embedded Toolchain](https://launchpad.net/gcc-arm-embedded/+download)
5. [OpenOCD](http://openocd.org/getting-openocd/)
6. [Проект с makefile для stm32](../stm32f1x-makefile) (можно и другие системы сборки, которые поддерживает QtCreator).
Установку QtCreator рассматривать не буду, про MinGW знает, наверное, каждый, кто пишет на Qt по Windows. Из этого пакета нам понадобится только утилита make. Папку с исполняемыми файлами MinGW я добавил в системную переменную PATH. Python также устанавливаем в PATH.
![|310](pypath.png)
Далее устанавливаем ARM тулчейн. Ну как устанавливаем - скачиваем zip версию и распаковываем в удобное место.
После распаковки:
![|](armgccfiles.png)
Папку bin также добавляем в PATH.
С OpenOCD те же манипуляции - распаковываем, добавляем bin (или bin-x64 для 64-разрядных систем) в PATH.
![|](openocdfiles.png)
Открываем консоль и проверяем наличие всех программ (просто ввводим make, arm-none-eabi-gcc, openocd). Картина должна быть такой:
![|](vseok.png)
Теперь начинаются пляски с QtCreator. Первым делом нужно включить плагин для "голого железа" - **BareMetal**. Для этого заходим в **Справка** -> **О Модулях...**
![|](aboutmodules.png)
И включаем там **BareMetal**. Перезапускаем QtCreator.
![|](baremetal.png)
Далее добавляем наш компилятор. Заходим в **Инструменты** -> **Параметры**.
Находим там категорию **Сборка и запуск**. Открываем вкладку **Компилятор**, нажимаем **Добавить** -> **GCC** -> **C**. Прописываем полный путь к **arm-none-eabi-gcc.exe** или просто пишем **arm-none-eabi-gcc**. Обзываем как угодно, я назвал ARM-GCC.
![|545](armgccadd.png)
При надобности те же манипуляции проводим с **arm-none-eabi-g++**, выбрав** C++**.
Тыкаем применить.
Теперь неплохо бы добавить устройство. Сначала выбираем сервер отладки. Открываем категорию **Устройства**, потом вкладку **Голое железо**. Жмём **Добавить** - **OpenOCD**. Ничего не меняем, жмём применить. Да, QtCreator может запускать openocd автоматически, но моя сборка не может. Как я организовал автоматический запуск будет написано в конце. Тыкаем **Применить**.
![|517](ocdcfg.png)
Добавляем само устройство. Открываем вкладку **Устройства**, жмём **Добавить** -> **Голое железо**. Обзываем как-то (я обозвал stm32). Выбираем **OpenOCD**.
![|353](adddev.png)
Ну и **Завершить**, **Применить**, естетственно.
Теперь добавляем отладчик. Снова открываем категорию **Сборка и запуск**, выбираем вкладку **Отладчики** , добавляем новый и прописываем туда **arm-none-eabi-gdb-py** (именно с суффиксом **py**, так как QtCreator'у нужна версия отладчика с поддержкой питона). Обзываем arm-gdb или как-то ещё. **Применить**.
![|354](armgdb.png)
Добавляем тулчейн. Выбираем вкладку **Комплекты** и добавляем новый. Обзываем и выбираем компиляторы, отладчик, устройство.
![|638](armtoolchain.png)
И последнее - категория **Отладчик**, вкладка **GDB, расширенные** и включаем там **Использовать асинхронный режим**... Без этого QtCreator при отладке будет падать.
![|](gdbasync.png)
Жмём **OK**. Всё.
Добавляем наш [проект](../stm32f1x-makefile):
![|](impormake.png)
![|](prjfiles.png)
![|667](prjwnd.png)
Открываем вкладку проекты, слева отключаем Qt, выбираем наш тулчейн, добавляем/настраиваем команды сборки:
![|625](debugcfg.png)
Пробуем собрать:
![|621](buildsuccess.png)
Снова открываем проекты, настраиваем запуск. Конфигурация запуска -** через сервер GDB**. В качестве программы нужно выбрать скомпилированный **elf** файл:
![|470](execcfg.png)
Теперь пора проверять что получилось. Запускаем OpenOCD вручную через cmd (для моей stm32f103c8t6):
```cmd
openocd -f /interface/stlink-v2.cfg -f target/stm32f1x.cfg
```
![|](ocdlog.png)
В QtCreator куда-то ставим брэйкпоинт и наконец-то запускаем отладку:
![|](wtf.png)
Почему Command aborted? Да потому что я не применил изменения и у меня запускался обычный GDB от MinGW.
Исправляю, запускаю:
![647](yay.png)
Бинго!
Да, про автоматический запуск. Прошу простить, инструкции не будет, так как это был костыль с правкой плагина HEX редактором. Если в новых версиях QtCreator это не исправят, то напишу тут.
[Makefile для STM32F103](../stm32f1x-makefile)