Top.Mail.Ru

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

Мне тут сказали, что я неправильно назвал тему. И ввожу в заблуждение, тогда немного объясню, в чём дело.

Я не хочу постоянно втыкать кучу функций в свои проекты. Я просто хочу воспользоваться готовыми заготовками. После долгой возни с различными методиками, я остановился на классах. Мне гораздо удобнее будет написать:

IO_Digital Led_01(GPIOA, GPIO_PIN_6, Output, No_Pull);
IO_Digital Led_02(GPIOA, GPIO_PIN_7, Output, No_Pull);

// А уже в теле программы
Led_01.digitalTogglePin();
Led_02.digitalTogglePin();

Вот к этому я стараюсь вас подвести. А теперь продолжим.

Подключение библиотек.

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

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

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

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

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

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

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

В прошлый раз мы довели до конца все операции и получили готовый проект. Можно продолжать с этого места. Но я предлагаю вернуться до фразы "Нажимаем правой кнопкой на проекте и выбираем конвертацию в С++" и приостановить свои действия. И продолжить с этой точки. Мы не будем сразу конвертировать проект, сначала добавим библиотеки.

Заходим в Project>Properties и далее как на картинке. И начинаем прописывать пути (обратить внимание на выделенные позиции):

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

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

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

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

Теперь можно конвертировать проект в С++ и открывать настройки:

Если посмотреть Include Path и для комилятора С, и для С++, у нас каталоги будут прописаны одинаково. Все каталоги можно было прописать и после конвертации проекта в С++. Но я человек ленивый. Делать два раза одно и то же не люблю.

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

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

По мере заполнения будет выводится информация о пути и ошибки. Продолжим далее:

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

У нас должно получится две вещи:

Появляются ссылки на каталоги.

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

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

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

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

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

  • .cproject
  • .project
  • Delete_Hal.ioc

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

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

Все материалы будут лежать по этой ссылке: ссылка. По мере накопления материала данные по этой ссылке будут обновляться. И вот еще один вариант на всякий случай: дополнительная ссылка.

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

5 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Константин
Константин
7 месяцев назад

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

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

Геннадий
Геннадий
2 месяцев назад

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

Геннадий
Геннадий
2 месяцев назад

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

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