Top.Mail.Ru

Часть 2. STM32 и С++. Как избавиться от HAL и перейти на С++.

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

Среда разработки: CubeMX, CubeIDE. Всегда последней версии.

Микроконтроллеры: серия STM32.

В прошлой статье я показал файловую структуру проекта. Чтобы не возникало вопросов, объясню почему я пришёл именно к такой структуре:

  • Все проекты хранятся в одном каталоге.
  • В каждом каталоге содержится всё, что относится к нему: схемы, платы, техническое задание, код, исходные и справочные материалы.
  • Библиотеки для МК.

Сначала, когда я только начинал, я копировал библиотеки в каталог с кодом. Но, когда количество проектов и МК сильно увеличилось, я начал путаться в библиотеках. Часть из них усовершенствовал, часть изменил, а растолкать по проектам забывал. Из-за этого происходила огромная путаница и потеря наработок. Поэтому я и выделил библиотеки в отдельный каталог, а если собираюсь писать новую или модернизировать старую, то текущий каталог с библиотеками я архивирую и обязательно оставляю комментарий, что в нём собираюсь менять.

Так как библиотеки и проекты хранятся в одном каталоге, их удобно переносить с компьютера на компьютер. Позже будет показана маленькая хитрость, позволяющая копировать данный каталог с проектами на любой диск, с любой буквой, и ничего не будет теряться и будет работать дальше. Только одно условие. Данные каталоги должны быть относительно друг друга именно в таком порядке. А теперь продолжим...

У нас есть два пути:

  1. Сделать так, чтобы каталог проектов MTWorkDevel можно было перемещать на любой диск целиком и свободно работать над проектом;
  2. Каталог проектов привязать к определённому диску, но каталог конкретного проекта можно записывать куда угодно.

Перед тем, как рассмотрим варианты, давайте ещё немного позанимаемся удалением. Удаляем каталог Drivers:

И ещё один лишний файл:

Переходим в настройки проекта, и в указанных пунктах, при указанных опциях, удаляем ссылки на каталоги, отмеченные синим (обратите внимание на выделенные позиции):

Вариант №1.

Переходим в Source Location и нажимаем кнопку "Link Folder". Если данной закладки нет, нужно нажать "Apply and Close" и открыть настройки заново (этот глюк ещё не устранили):

Ставим галочку, нажимаем кнопку "Browse" и выбираем папку с каталогом с ядра:

Начинаем прописывать пути (обратите внимание на выделенные позиции):

Если посмотреть внимательно, то путь прописан не так "C:/WorkDevel/STM32Lib/Device/Stm32F4xx", а "../../../../STM32Lib/Device/Stm32F4xx". Что это даёт? В первом случае вы путь библиотек жёстко привяжете к месту на определённом диске и при переносе проекта на другой компьютер будете получать сообщения, что каталоги не найдены. Во втором случае "/.." означают перейти на каталог выше. Таким образом мы задаём относительный путь для наших библиотек. Как вычислить этот путь?

Наш код находится в Src. Чтобы попасть в каталог Developer, нужно перейти на 4 шага выше. Отсюда у нас идёт цепочка из 4 шагов "../../../../". Далее уже название самого каталога. Результирующая цепочка - "../../../../STM32Lib/Device/Stm32F4xx". То же самое и для файлов библиотек, независящих от ядра МК.

Указывать нужно именно каталог, где находятся библиотеки. Файлы с кодом компилятор ищет сам, если я не путаю - в каталогах Src и Source (кому интересно, может проверить сам).

Переключаем конфигурацию на Release и нажимаем кнопку "Add Folder":

Добавляем указанные каталоги, это позволит компилировать нам и в конфигурации Release:

Теперь можно нажимать кнопку "Apply" и "Apply and Close". Почему именно так? В ранних версиях CubeIDE был глюк. Не нажмёшь "Apply", изменения не сохранятся. В начале я предупреждал, что всегда пользуюсь самыми свежими версиями программного обеспечения, но, если кто-то пользуется старой версией, может наступить на эти грабли.

У нас появятся линки на эти каталоги:

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

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

Следующим шагом нам нужно указать все каталоги, где находятся файлы заголовков:

Жамкаем на них правой кнопкой и выбираем "Add/remove include path":

В появившемся окне ставим обе галочки и жмём "OK". И так нужно сделать для всех отмеченных ранее каталогов:

Переименовываем main.c в main.cpp и вставляем в него #include "STM32.h". Компилируем, получаем ошибки:

Эти ошибки возникают из-за библиотек, которые не дописаны или не подходят для данного ядра. Также ошибка возникает для SPI и SPI_Soft, необходимо исключить из компиляции эти файлы. Для этого нужно перейти в проекты и на отмечаемых файлах нажать правой кнопкой. Следует учесть, что иногда отмечается не файл исходника, а его заголовок, но исключать нужно именно файл *.cpp:

Тут аналогично:

Так как компилятор не показывает все ошибки сразу, приходится компилить и последовательно исключать их из проекта. Если все пути указаны правильно, то ошибок быть не должно.

Вариант №2.

Итак мы имеем следующий каталог:

Тыкаем правой кнопкой на проекте и выбираем "Import":

Выбираем импорт файловой системы:

Выбираем каталог с ядром:

Расставляем галочки, где нужно:

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

И раз пошла такая пьянка, есть ещё вишенка на торт. Если вы создали проект, и всё получилось, скопируйте его куда-нибудь и держите за образец. Если с таким МК ещё будете работать, он вам пригодится. НО! Как всегда есть нюанс. Копируем каталог с другим именем, у меня F407VExx, и открываем:

Кроме того, если попытаетесь открыть предыдущий проект, он не откроется или откроется с глюками. Чтобы такого не было, делаем следующее. Идём в каталог, где находится проект и правим 3 файла:

  • .cproject
  • .project
  • Delete_Hal.io

В первых двух файлах текстовым редактором нужно поменять "Delete_Hal" на новое имя каталога "F407VExx". Причём в одном файле он встречается 4 раза, в другом 1. А файл "Delete_Hal.ioc" переименовать в "F407VExx.ioc". Теперь после открытия проекта у нас будет всё в порядке:

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

Тема на форуме - перейти.

Подписаться
Уведомить о
guest

16 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Константин
Константин
2 лет назад

"Для проверки можно в main.cpp вставить в начале строку #include "STM32.h" и вновь откомпилировать проект. Если все пути указаны правильно, то ошибок быть не должно."

Делаю это действие и при компиляции выскакивает ошибка: нет файла или каталога. Пути прописаны в соответствии со статьёй. Прошу указать, если не сложно, в каком направлении копать.)))

Геннадий
Геннадий
1 год назад

День добрый! Вопрос: какие библиотеки нужно подключать? По приведенным снимкам непонятно. У меня STM32F405RG...

Геннадий
Геннадий
1 год назад

Так, какие же библиотеки нужно устанавливать?
Какие нужны именно для С++?
Будут ли работать те, что есть для простого С?
Откуда брать библиотеки?
Вы используете SPL?
Нужно ли подключить что-либо из "грохнутого" CubeMX HAL?

Alex
Alex
7 месяцев назад

Ну и когда-же будет продолжение ?

Alex
Alex
Ответ на комментарий  Эдуард
7 месяцев назад

Я бы с удовольствием их прочитал, но тут как-то не очень понятно где их искать.
Вот нашёл только Часть 1 и Часть 2
Ну и соответственно, забрал с Вашего файлообменника библиотеку.

Если не затруднит, можете приложить ссылки на остальные статьи?
Давно мечтаю перейти на С++ при разработке под STM32F4

Alex
Alex
Ответ на комментарий  Эдуард
7 месяцев назад

О, кажется понял как их искать.
Нужно отбросить "хвост" в адресе и использовать только часть адреса до номера статьи (включительно).
т.е. вот так: https://microtechnics.ru/profilegrid_blogs/chast-03
и тогда ссылка находится.
...всё, пошёл читать дальше.
Спасибо за реально полезный материал и за проделанную работу.

Alex
Alex
Ответ на комментарий  Alex
7 месяцев назад

Хотя нет. Видимо всё-же нужны ссылки.
Т.к. статью с номером 4, по ссылке: https://microtechnics.ru/profilegrid_blogs/chast-04
уже не находит.

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

Aveal
Администратор
Ответ на комментарий  Alex
6 месяцев назад

Пути, по которым можно открыть статьи:

  1. Справа панели > "Сообщество" > Категория "C++" или "Микроконтроллеры" > На второй странице все статьи.
  2. Под названием статьи также указаны рубрики > Левой кнопкой на название любой > Пролистать/прокрутить > Найти статьи.
  3. Под названием статьи имя автора > Левой кнопкой по имени автора > В профиле автора вторая слева вкладка "Блог" > Список всех статей.
  4. Поиск > "Часть 3" > Читаем статью.

Вариант можно выбирать, какой по вкусу, на мой взгляд путь #3 является самым верным.
P. S. Ссылки трогать незачем в целом. Содержание/оглавление добавить возможно имеет смысл.

Aveal
Администратор
Ответ на комментарий  Эдуард
6 месяцев назад

Не очень удобно после каждой новой статьи во все предыдущие добавлять пункт, в этом и смысл, что у каждого пользователя есть личная вкладка "Блог", где все отображается (ну это вообще классический механизм, ничего новаторского, везде так в принципе и сделано).

Это касаемо оглавления внутри статей в шапке.

Aveal
Администратор
Ответ на комментарий  Эдуард
6 месяцев назад

Когда мы переходим в сообщество, мы видим, на данный момент, четырёх авторов.

Допустим мы имеем там или сортировку по авторам, или выбор автора.

Мереходим к автору и видим закреплённый список статей данного автора.

Ну верно, так и есть ) Нажимаешь на ник автора, переходишь к автору, видишь список его статей.

16
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x