Как переименовать проект в cube ide
Узнаем, как проект на языке Си, созданный с помощью STM32CubeMX, преобразовать в проект объектно-ориентированного языка C++.
Опять подготовительный урок, опять не пишем программу, опять не про кнопки. Хотел затронуть эту тему мимоходом, затем решил выделить в отдельный урок. Задачу конвертации проекта придется решать всем. А искать тему, как раздел в уроке намного сложнее, чем найти отдельный урок.
Но мы собираемся использовать возможности объектно-ориентированного языка. Конечно, Ардуино несколько злоупотребляет классами, но во многих случаях без них не обойтись.
Надо конвертировать наш проект в проект Си++. Насколько я знаю, не существует программ, способных это сделать автоматически. Но это несложно. Необходимо выполнить несколько формальных действий.
В папке Lesson я создал папку Lesson11 и скопировал туда учебный проект Lesson9_1.
В этом проекте используются функции библиотек HAL и LL. Проверим обе библиотеки.
Переименовываем его в Lesson11_1.
Откроем проект в IDE Atollic TrueStudio. Там он у нас все равно отображается, как Lesson9_1.
Нажмем на имя проекта правой кнопкой мыши, выберем Rename (Переименовать) и зададим новое имя Lesson11_1.
Получится проект C с новым именем Lesson11_1.
Его мы будем преобразовывать в проект C++.
Надо выполнить 3 действия.
- Переименовать файлы с расширением .c в папке Src в файлы с такими же именами, но расширением .cpp.
Сделать это проще всего также, как мы переименовали весь проект. А именно, нажатием на имя файла в проекте правой кнопкой мыши и выбором пункта Rename.
В нашем проекте это 4 файла.
- Любым текстовым редактором открываем в проекте файл .project
и между тегами <nature >добавляем в него строку:
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
Я копировал верхнюю строку и добавил одну букву c.
- Остается копировать настройки C проекта в проект C++.
Выбираем в верхнем меню Project -> Build Settings.
Затем Tool Settings.
Выбираем в левом столбце C Compilier -> Symbols.
Выделяем и копируем настройки в буфер (Ctrl+Insert).
Нажимаем в левом столбце C++ Compilier -> Symbols и копируем настройки в окно для C++ (Shift+Insert).
Тоже самое делаем для C Compilier -> Directories.
Компилируем. Ошибок нет.
Давайте для проверки объявим в программе класс.
Откроем файл main.cpp и добавим в него описание класса tst и создадим экземпляр класса tst1.
/* USER CODE BEGIN PV */
class tst
public:
int x;
private:
int y;
>;
tst tst1; // экземпляр класса tst
Можно в функции main() присвоить значение свойству класса.
/* USER CODE BEGIN 1 */
Компиляция происходит без ошибок. Можно заниматься объектно-ориентированным программированием.
Вот ссылка на полный проект:
Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!
Еще раз последовательность действий:
- Переименовать C-файлы (.c) с исходным текстом в C++ файлы (.cpp).
- Добавить строчку в файл .project.
- Продублировать настройки для C-проекта в настройки проекта C++.
Если компилятор выдаст ошибку о дублировании определения функций (redefinition), то может потребоваться добавить модификатор extern.
Выбираем необходимый микроконтроллер, у меня это всем известный STM32F103C8T6 и жмём Next :
Называем проект и жмём Finish
Включаю последовательную отладку (по SWD - Serial Wire Debug), чтоб использовать ST-LINK
SYS -> Debug -> Serial Wire
Тактирование от внешнего кварцевого резонатора
RCC -> HSE (High Speed Clock) -> Crystal/Ceramic Resonator
Во вкладке настройки тактовой системы вводим 72 МГц и жмём ввод, подтверждаем предложенное решение
Настраиваем вывод PC13 (к нему подключен зеленый светодиод) как двухтактный выход ПКМ на выводе -> GPIO_Output
Далее слева в дереве проекта в папке Src двойной щелчок по главному файлу main.c
Написан простейший код мигания светодиодом (он подключен в выводу PC13 ).
Значение в регистре ODR (Output Data Register) меняется каждый раз благодаря логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ.
Ну, а со стандартной функцией задержки всё и так понятно.
GPIOC->ODR ^= GPIO_ODR_ODR13; // same: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); // delay 0.5s
Собираем проект (Ctrl + B) либо щелчок по молоточку. Ошибок и предупреждений нет.
Запускаем отладку ( F11 либо Run -> Debug ). Переключаемся в пространство отладки.
Возможно придется обновить прошивку программатора-отладчика ST-LINK (делается это в два клика) и далее в настройках можно будет его лицезреть.
Прошивка успешно загружается в память микроконтроллера.
Теперь нажимая на кнопки продолжения/паузы смотрим за значениями в нужных регистрах.
В этой программе это регистр выходных данных ODR, бит ODR13, когда там нуль, то СИД светится, когда единица, то нет (т.к. светодиод подключен к плюсу на отладочной плате).
Ну а в железе это вот этот изменяющийся бит выглядит как мигание светодиода:
Здесь я расскажу как создать минимальный проект на CMSIS с использованием «родной» IDE для микроконтроллеров STM – STM32CubeIDE.
Возможно STM32CubeIDE и обладает рядом недостатков, но у нее, на мой взгляд, есть несколько преимуществ – таких как проприетарность и бесплатность, ради которых, как минимум, стоит обратить внимание на эту среду разработки, если вы не сделали этого раньше.
Объектом прошивки выбран не очень распространенный микроконтроллер STM32F072 с ядром ARM Cortex-M0, для более привычных STM32F103 на ARM Cortex-M3, с поправкой на ядро, процесс идентичен.
-
, я использую Windows версию, но также доступны версии под Mac и Linux
Создание нового проекта — File/New/STM32Project. После некоторого раздумия появляется окно выбора микроконтроллера, в моем случае это STM32F072RB в корпусе LQFP64, выбираю нужную строку, жму далее. Далее предлагается выбрать имя проекта, расположение, язык программирования C/C++, исполняемый файл/статическая библиотека и будет-ли проект сгенерирован с помощью CubeMX или сами с усами. Генерация кубом, в данном случае не нужна, поэтому тип проекта Empty — финиш.
Слева, в окне Project Explorer, появилось дерево проекта, правда он не совсем Empty, как заказывали. Впринципе, если устраивает сгенерированная структура папок, можно добавить туда файлы из библиотеки CMSIS и работать дальше, но здесь я покажу как можно привести структуру проекта в гармонию со своим чувством прекрасного, поэтому удаляется всё, кроме скрипта линкера т.е. файла c расширением .ld — он еще пригодится.
Все манипуляции с папками и файлами можно проводить как в проводнике так и внутри IDE, нажав правой кнопкой на название проекта, к примеру: правая кнопка –> new –> Folder. Если структура проекта изменялась вне IDE, то нужно просто обновить проект: правая кнопка –> Refresh.
Мой вариант структуры проекта выглядит так:
- Startup – здесь будет храниться скрипт линкера, тот самый, оставшийся от сгенерированного проекта, а также startup файл взятый из CMSIS
- CMSIS\src и CMSIS\inc – здесь будут лежать исходники, файлы с расширением .c в папке scr и заголовочные файлы с расширением .h в папке inc соответственно, относящиеся к библиотеке CMSIS
- Core\src и Core\inc – здесь будет расположен собственно сам проект, для начала стоит положить туда main.c и main.h
Теперь нужно перенести файлы библиотеки CMSIS в проект. Библиотека состоит из файлов ядра и файлов периферии. Файлы ядра начинаются с core_ или cmsis_ они общие для всех микроконтроллеров, использующих данное ядро. Файлы периферии содержат в названии наименование микроконтроллера stm32 и специфичны для конкретного производителя, в данном случае, компании STM.
В распакованном виде архив содержит папку STM32Cube_FW_F0_V1.11.0, все пути указаны относительно этой папки. Итого, нужно скопировать:
- Drivers\CMSIS\Include\cmsis_compiler.h
- Drivers\CMSIS\Include\cmsis_gcc.h
- Drivers\CMSIS\Include\cmsis_version.h
- Drivers\CMSIS\Include\core_cm0.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stmf0xx.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f072xb.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\system_stm32f0xx.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\gcc\startup_stm32f072xb.s
Так как были проведены некоторые манипуляции с папками проекта, нужно отобразить это в настройках.
Правая кнопка по названию проекта -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU GCC Linker -> General – здесь нужно указать новое расположение скрипта линкера с помощью кнопки Browse…
Также нужно указать пути к файлам проекта
Properties -> C/C++ General -> Includes
Properties -> C/C++General -> Source Location
В Includes пути к папкам inc, а в Source Location логично было-бы к папкам src, но если так сделать, то в дереве проекта будут отдельно добавлены эти папки. Чтобы не загромождать визуально дерево, в Source Location можно указать корневые папки Core, CMSIS и Startup.
Для того чтобы проект скомпилировался нужно раскомментировать в файле stm32f0xx.h строку с названием микроконтроллера ну и конечно же в main.c добавить функцию main.
Собственно всё. Безошибочная компиляция и сразу же куда-то подевалось целых полтора килобайта памяти ОЗУ она же RAM, и сразу же вспоминается стек и куча, в процессе создания проекта они нигде не упоминались. Величина стека и кучи указана в файле скрипта линкера, тот что с расширением .ld, их можно и нужно изменять в соответствии с требованиями проекта. Эти значения находятся в начале файла в виде меток _Min_Heap_Size/_Min_Stack_Size с указанием размера в шестнадцатеричном виде.
В качестве примера, приведу небольшой проект традиционного мигания светодиодом.
Светодиод будет мигать на отладочной плате STM32F072B-DISCO, тактирование осуществляться от внутреннего генератора HSI48 частотой 48 МГц, а в качестве источника задержки использоваться таймер SysTick, генерирующий прерывания с периодом в 1 мс, при помощи которых отсчитывается точное время задержки. Светодиод подключен к выводу 6 порта С, настроенного на выход push-pull.
Надеюсь, данная информация кому-то пригодится, т.к. в свое время, несмотря на обилие материалов по программированию STM32, мне пришлось перелопатить достаточно много мануалов, чтобы осознать вещи, кажущиеся сейчас очевидными.
Здесь я расскажу как создать минимальный проект на CMSIS с использованием «родной» IDE для микроконтроллеров STM – STM32CubeIDE.
Возможно STM32CubeIDE и обладает рядом недостатков, но у нее, на мой взгляд, есть несколько преимуществ – таких как проприетарность и бесплатность, ради которых, как минимум, стоит обратить внимание на эту среду разработки, если вы не сделали этого раньше.
Объектом прошивки выбран не очень распространенный микроконтроллер STM32F072 с ядром ARM Cortex-M0, для более привычных STM32F103 на ARM Cortex-M3, с поправкой на ядро, процесс идентичен.
-
Сама IDE, я использую Windows версию, но также доступны версии под Mac и Linux
Создание нового проекта — File/New/STM32Project. После некоторого раздумия появляется окно выбора микроконтроллера, в моем случае это STM32F072RB в корпусе LQFP64, выбираю нужную строку, жму далее. Далее предлагается выбрать имя проекта, расположение, язык программирования C/C++, исполняемый файл/статическая библиотека и будет-ли проект сгенерирован с помощью CubeMX или сами с усами. Генерация кубом, в данном случае не нужна, поэтому тип проекта Empty — финиш.
Слева, в окне Project Explorer, появилось дерево проекта, правда он не совсем Empty, как заказывали. Впринципе, если устраивает сгенерированная структура папок, можно добавить туда файлы из библиотеки CMSIS и работать дальше, но здесь я покажу как можно привести структуру проекта в гармонию со своим чувством прекрасного, поэтому удаляется всё, кроме скрипта линкера т.е. файла c расширением .ld — он еще пригодится.
Все манипуляции с папками и файлами можно проводить как в проводнике так и внутри IDE, нажав правой кнопкой на название проекта, к примеру: правая кнопка –> new –> Folder. Если структура проекта изменялась вне IDE, то нужно просто обновить проект: правая кнопка –> Refresh.
Мой вариант структуры проекта выглядит так:
- Startup – здесь будет храниться скрипт линкера, тот самый, оставшийся от сгенерированного проекта, а также startup файл взятый из CMSIS
- CMSIS\src и CMSIS\inc – здесь будут лежать исходники, файлы с расширением .c в папке scr и заголовочные файлы с расширением .h в папке inc соответственно, относящиеся к библиотеке CMSIS
- Core\src и Core\inc – здесь будет расположен собственно сам проект, для начала стоит положить туда main.c и main.h
Теперь нужно перенести файлы библиотеки CMSIS в проект. Библиотека состоит из файлов ядра и файлов периферии. Файлы ядра начинаются с core_ или cmsis_ они общие для всех микроконтроллеров, использующих данное ядро. Файлы периферии содержат в названии наименование микроконтроллера stm32 и специфичны для конкретного производителя, в данном случае, компании STM.
В распакованном виде архив содержит папку STM32Cube_FW_F0_V1.11.0, все пути указаны относительно этой папки. Итого, нужно скопировать:
- Drivers\CMSIS\Include\cmsis_compiler.h
- Drivers\CMSIS\Include\cmsis_gcc.h
- Drivers\CMSIS\Include\cmsis_version.h
- Drivers\CMSIS\Include\core_cm0.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stmf0xx.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f072xb.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\system_stm32f0xx.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\gcc\startup_stm32f072xb.s
Так как были проведены некоторые манипуляции с папками проекта, нужно отобразить это в настройках.
Правая кнопка по названию проекта -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU GCC Linker -> General – здесь нужно указать новое расположение скрипта линкера с помощью кнопки Browse…
Также нужно указать пути к файлам проекта
Properties -> C/C++ General -> Includes
Properties -> C/C++General -> Source Location
В Includes пути к папкам inc, а в Source Location логично было-бы к папкам src, но если так сделать, то в дереве проекта будут отдельно добавлены эти папки. Чтобы не загромождать визуально дерево, в Source Location можно указать корневые папки Core, CMSIS и Startup.
Для того чтобы проект скомпилировался нужно раскомментировать в файле stm32f0xx.h строку с названием микроконтроллера ну и конечно же в main.c добавить функцию main.
Собственно всё. Безошибочная компиляция и сразу же куда-то подевалось целых полтора килобайта памяти ОЗУ она же RAM, и сразу же вспоминается стек и куча, в процессе создания проекта они нигде не упоминались. Величина стека и кучи указана в файле скрипта линкера, тот что с расширением .ld, их можно и нужно изменять в соответствии с требованиями проекта. Эти значения находятся в начале файла в виде меток _Min_Heap_Size/_Min_Stack_Size с указанием размера в шестнадцатеричном виде.
В качестве примера, приведу небольшой проект традиционного мигания светодиодом.
Светодиод будет мигать на отладочной плате STM32F072B-DISCO, тактирование осуществляться от внутреннего генератора HSI48 частотой 48 МГц, а в качестве источника задержки использоваться таймер SysTick, генерирующий прерывания с периодом в 1 мс, при помощи которых отсчитывается точное время задержки. Светодиод подключен к выводу 6 порта С, настроенного на выход push-pull.
Надеюсь, данная информация кому-то пригодится, т.к. в свое время, несмотря на обилие материалов по программированию STM32, мне пришлось перелопатить достаточно много мануалов, чтобы осознать вещи, кажущиеся сейчас очевидными.
Читайте также: