Top.Mail.Ru

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

В интернете очень много информации, но по теме ООП + STM32 я её встречал мало. В серии статей я попытаюсь рассказать, как я пришёл к ООП ни как к таковому, а именно на микроконтроллерах от фирмы ST. Это не моё НоуХау. Это то, что я сумел собрать для себя и то, чем я пользуюсь для облегчения программирования в своих разработках.

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

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

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

Для начала я покажу, как у меня организовано дисковое пространство. Это не догма. Просто мне так удобнее. Каждый сам для себя должен решить, как ему удобнее. Но последующие статьи я буду писать со ссылкой именно на такую организацию:

Все свои проекты я храню в каталоге WorkDevel. Он содержит подкаталоги:

  • AltiumLib - библиотеки Altium Designer;
  • Datasheet - даташиты на электронные компоненты;
  • Developer - каталог, хранящий все проекты;
    • Project_Lesson_01 - это тот каталог, в котором мы с вами будем работать;
      • Code_CPP - здесь будут подкаталоги с нашим кодом. На больших проектах там может быть не один каталог.
      • Output - сюда я вывожу Gerber файлы для заказа их в Китае;
      • Pcad - здесь хранятся проекты схем и плат. Так же как и в Code_CPP, на больших проектах может содержать несколько подкаталогов;
      • Source - сюда складываю первичную информацию. Техзадания, даташиты на элементы, участвующие именно в этом проекте. И так далее;
  • STM32Lib - каталог, где хранятся библиотеки и программные ядра на каждый тип микроконтроллера.
    • Device - библиотеки, зависимые от типа ядра МикроКонтроллера (МК);
    • Library - библиотеки, независимые от типа MK.

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

Вот теперь можно приступить.

Примечание: То, что я буду давать, будет применимо к любому ядру МК. В случае, если есть какие-то отличия между ядрами в инициализации периферии, я постараюсь на этом заострять внимание.

Вы можете проделать показанные мною операции для любого ядра МК. Я же покажу всю цепочку на STM32F407VET6. Так как для него у меня более полные библиотеки. Но никто не мешает вам, взяв его библиотеки за пример, дописать свои.

Создание проекта.

Загружаем CubeMX и выбираем нужный нам МК:

Никакую периферию мы не инициализируем, а сразу идём на закладку Project Manager:

Здесь нас интересуют только три поля:

  1. Project Name - имя проекта. Вводим имя, по которому будем идентифицировать проект.
  2. Project Location - выбираем каталог, в котором будет храниться наш проект. В данном случае С:\WorkDevel\Developer\Project_Lesson_01\Code_CPP
  3. Toolchain\IDE - выбираем STM32CubeIDE.

Затем слева выбираем Code Generator и ставим галку напротив первого пункта в разделе Generated files:

В данном проекте нам она погоды не сделает, но привычка позволит в более сложных проектах разбивать функции инициализации периферии по отдельным файлам. Что весьма удобно. Почему-то не все это любят. Есть такие, что пишут портянки по 5000 строк в одном файле. А можно было разбить код на отдельные логически блоки и раскидать их по файлам.

Подготовка закончена, генерируем код (кнопка справа вверху Generate Code):

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

Пробуем компилить, никаких ошибок быть не должно:

Теперь начинаем методично уничтожать HAL. В каталоге Inc удаляем все файлы, в каталоге Src оставляем только те файлы, которые на картинке, в каталоге Drivers удаляем весь подкаталог STM32F4xx_HAL_Driver:

В main.c удаляем всё, кроме указанного на картинке:

Идём в меню Project>Properties>C/C++ Build>Settings, закладка Tool Settings, MCU GCC Compiler>PreprocessorВверху выбираем All Configurations и грохаем USE_HAL_DRIVER:

Нажимаем Apply. Идём в Include Paths, там удаляем всё упоминание о HAL:

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

Нажимаем правой кнопкой на проекте и выбираем конвертацию в С++:

Вроде визуально ничего не изменилось. Но если посмотреть здесь:

У нас появился новый пункт: MCU G++ Compiler. Переименовываем main.c в main.cpp и пробуем компилить:

Выдаётся такая ошибка:

Ничего страшного. Идём сюда и выбираем Clean Project:

Компилируем снова и получаем 0 ошибок:

На этом пока всё. Позже покажу как подключать библиотеки находящиеся в STM32Lib.

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

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

Спасибо, интересно, буду ждать следующие части.

Диман
Диман
7 месяцев назад

Да, да, да, как раз это я и искал в такой доступной форме. Жду продолжения

Константин
Константин
7 месяцев назад

Спасибо за раскрытие этой темы! Очень интересно! Тоже жду следующие части.)

Igor_u
Igor_u
5 месяцев назад

Где сейчас можно скачать cube ide или mx, свежие версии?
st.com сейчас совсем не дают скачивать.

snowcumbia
5 месяцев назад

Доброго времени ) Подскажите пожалуйста, только заинтересовался темой . С чего начать, чтобы было понятнее содержание статей по STM & с++. Если у меня никакого HAL не было то я могу начать с этой статьи, пренебрегая действиями с HAL? спасибо.

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