129 lines
7.4 KiB
Markdown
129 lines
7.4 KiB
Markdown
---
|
||
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)
|