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

Программирование STM32 / Создание проекта

 

На этом уроке мы создадим первый проект для STM32.
 









 
Запускаем STM32CubeMX и выбираем New Project.
В появившемся окне мы можем выбрать тип микроконтроллера… или отладочную плату.
Первый проект создадим для отладочной платы.
В дальнейшем я покажу, как работать непосредственно с микроконтроллером, установленным на ней.
Выбираем Board Selector ST Microelectronics, тип платы – Discovery. Серию микроконтроллера можно выбрать по типу микроконтроллера. Выбираем STM32F3Discovery и нажимаем OK.
Создание проекта для STM32F3Discovery
Открывается окно проекта, где в правой части мы видим микроконтроллер со всеми его выводами. В левой части перечислены все периферийные модули, которые можно использовать в этом микроконтроллере. Для выбранной платы STM32F3Discovery у нас уже обозначены линии ввода-вывода, используемые для светодиодов, для кнопки и для других периферийных модулей, которые разведены на плате.
Окно проекта STM32CubeMX
Питание микроконтроллера подается на выводы VDD (верхний уровень) и VSS (нижний уровень) и составляет стандартно от 2 до 3.6 В. Для отладочной платы это 3.3В.

Оставим для первого проекта все по умолчанию и перейдем в следующую вкладку – Clock Configuration – конфигурация тактирования.
STM32CubeMX Clock Configuration
Система тактирования поддерживает 4 типа тактового генератора.
Внешний низкочастотный генератор, который на отладочной плате, к сожалению, не запаян, внутренний низкочастотный генератор 40кГц, внутренний высокочастотный генератор 8МГц и внешний высокочастотный генератор. Давайте для этого проекта выберем внутренний высокочастотный генератор в качестве опорного сигнала и оставим все остальное по умолчанию.

Следующая вкладка – Configuration – это конфигурация тех периферийных модулей, которые мы выбрали в начале. Поскольку этот проект у нас будет пустым, то и настраивать мы здесь ничего не будем.
STM32CubeMX Configuration
В последней вкладке можно посчитать потребление микроконтроллера в зависимости от используемой периферии и системы тактирования.
STM32CubeMX Power Consumption Calculator
Это может оказаться актуальным при проектировании устройств с батарейным питанием. Здесь даже можно указать тип батареи, задать режим работы, тактовую частоту и подключенную периферию и увидеть потребление микроконтроллера в этом режиме. Но пока тоже на этом подробно останавливаться не будем.

Дальше выбираем меню Project -> Generate Code. В появившемся окне мы выбираем, куда будет сохранен проект, задаем имя проекта и выбираем ту среду разработки, для которой будет сгенерирован файл проекта. В данном случае мы будем использовать Embedded Workbench for ARM – IAR. Все остальное оставляем по умолчанию и нажимаем OK.
Generate Code
Выдается сообщение, что код успешно сгенерирован, и мы можем открыть проект в IAR.

Работа с проектом в IAR

В левой части окна отображаются 3 папки.
Окно проекта IAR
Первая папка – Application – состоит из двух подпапок. Первая подпапка включает файл startup_*.s, написанный на языке ассемблера, который предназначен для начальной конфигурации микроконтроллера, а также содержит таблицу векторов прерываний. Вторая подпапка – User – содержит файлы пользователя.
Основной текст программы будет размещаться в файле main.c. Здесь подключается библиотечный файл *_hal.h. Для тех, кто не знаком с языком Си, скажу, что директива include используется для подключения библиотечных файлов, которые, как правило, имеют расширение .h.
И далее идет описание конфигурационных функций, которые предоставляет нам Cube.

В языке Си главная исполняемая функция имеет имя main(). Именно здесь и расположено само тело программы.
Как правило, любая программа для микроконтроллера состоит из двух частей:

  • инициализации
  • бесконечного цикла.

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

В части инициализации в данном случае вызываются функции инициализации HAL-драйверов, системного тактирования и портов ввода-вывода.
Ниже функции main() идут сами функции конфигурации, которые сгенерировал конфигуратор Cube.

В файле main.c есть комментарии, обозначающие начало и конец пользовательского кода:

  • USER CODE BEGIN
  • USER CODE END

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

Второй файл, который содержит подпапка User – это *_hal_msp.c – предназначен для низкоуровневой инициализации, и, в частности, конфигурации векторов прерываний. Пока мы на нем подробно останавливаться не будем.
И третий файл – это файл с аббревиатурой *_it.c в конце – это файл, который будет содержать обработчики прерываний. В данном случае у нас никаких прерываний кроме системного таймера нет, поэтому здесь – всего одна функция. И тоже выделены участки, куда можно вставлять пользовательский код.

Вторая папка – это папка драйверов. Она содержит в себе две подпапки – это

  • драйвера ядра CMSIS
  • HAL-драйвера

Последние будут отвечать за работу отдельных модулей микроконтроллера. Количество подключаемых HAL-драйверов будет зависеть от выбранных периферийных модулей для работы. Каждый из файлов HAL-драйверов содержит набор функций, предназначенных для конфигурирования и работы соответствующего модуля.

Если мы посмотрим на список заголовочных файлов любого Си-файла проекта, то увидим довольно внушительный перечень. Сейчас остановимся более подробно на файле stdint.h.
Это файл переопределения типов. Конечно, компилятор IAR будет поддерживать стандартные типы языка Си, такие как char, int, long, но рекомендуется во избежание путаницы придерживаться переопределенных типов. Тем более, что стандартный тип int в этом компиляторе занимает 16 бит, long – 32 бита, а для 64-битных данных вообще нет стандартного типа.

Согласно переопределению типов, представленному в файле stdint.h, число типа int может быть четырех размерностей – 8, 16, 32 и 64 бита и соответственно может быть представлено в знаковой или беззнаковой форме. Так вот, чтобы не путаться с размерностью типов рекомендуется все-таки придерживаться переопределенной типизации.

Теперь зайдем в настройки проекта Правая кнопка-> Options. Здесь уже выбран тип микроконтроллера и его ядро.

Во вкладке Си/С++ компиляторы ->Оптимизация кода установлена по умолчанию высокая степень оптимизации. Я рекомендую для учебных задач поставить или низкую оптимизацию кода, или вообще убрать ее, потому что в случае высокой оптимизации кода выполнение проекта по шагам будет затруднительно.
Оптимизация кода в IAR
Ну и еще войдем во вкладку Output Converter и выберем здесь Generate Additional Output, Intel-Extended, Overwrite Default. В результате при компиляции проекта мы получим hex-файл, который можно загрузить во Flash-память микроконтроллера, не используя отладчик.
Генерирование hex-файла в IAR
Попробуем скомпилировать проект. Выбираем меню Project->Rebuild All. Мы видим, как проект постепенно подгружает все hal-драйвера. И в итоге выдает нам сообщение, что нет ни ошибок, ни предупреждений.
Компиляция проекта в IAR
Компиляция прошла успешно, проект готов к использованию.


Назад: Программирование STM32

Комментариев к записи: 3

  • Спасибо помогло, тип МК изначально вообще не был установлен(

    Заработало на версиях EWARM 6.3 и EWARM 7.5


  • Почему то пустой проект созданный  в STM32CubeMX для платы STM32L1Discovery, не хочет компилироваться EWARM, выдает огромное количество ошибок типа этой:

    Error[Ta041]: Cannot call intrinsic function «__DSB» from Thumb mode in this architecture.

    C:\Documents and Settings\ispit-andry\STM32Cube\Repository\STM32Cube_FW_L1_V1.6.0\Drivers\CMSIS\Include\core_cm3.h

     


    • Елена Вставская

      Да, встречалась с подобной проблемой — когда Cube перестал корректно передавать проект в IAR.
      Попробуйте посмотреть тип микроконтроллера, для которого компилируется проект.

      Я у себя решила эту проблему переустановкой IAR версии 8


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *