В интернете очень много информации, но по теме ООП + 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:
Здесь нас интересуют только три поля:
- Project Name - имя проекта. Вводим имя, по которому будем идентифицировать проект.
- Project Location - выбираем каталог, в котором будет храниться наш проект. В данном случае С:\WorkDevel\Developer\Project_Lesson_01\Code_CPP
- 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.
Тема на форуме - перейти.