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)
|