Top.Mail.Ru

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

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

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

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

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

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

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

  • AltiumLib - библиотеки Altium Designer;
  • Datasheet - даташиты на электронные компоненты;
  • Developer - каталог, хранящий все проекты;
    • Examples - примеры не привязанные к МК. Могу наполнять этот каталог без описания в статьях. Будет время заглядывайте, может найдёте что то интересное; 
    • Project_Lesson_01 - это тот первый каталог, в котором мы с вами будем работать;
      • Code_CPP - здесь будут подкаталоги с нашим кодом. На больших проектах там может быть не один каталог.
      • Output - сюда я вывожу Gerber файлы для заказа их в Китае;
      • Pcad - здесь хранятся проекты схем и плат. Так же как и в Code_CPP, на больших проектах может содержать несколько подкаталогов;
      • Source - сюда складываю первичную информацию. Техзадания, даташиты на элементы, участвующие именно в этом проекте. И так далее;
  • Tests MK - здесь храним примеры для разных МК, которые будут описаны в последующих статьях;
  • 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: