Как создать hex файл в stm32cubeide

Обновлено: 02.07.2024


Запускаем STM32CubeMX и выбираем New Project.
В появившемся окне мы можем выбрать тип микроконтроллера… или отладочную плату.
Первый проект создадим для отладочной платы.
В дальнейшем я покажу, как работать непосредственно с микроконтроллером, установленным на ней.
Выбираем Board Selector ST Microelectronics, тип платы – Discovery. Серию микроконтроллера можно выбрать по типу микроконтроллера. Выбираем STM32F3Discovery и нажимаем OK.

Открывается окно проекта, где в правой части мы видим микроконтроллер со всеми его выводами. В левой части перечислены все периферийные модули, которые можно использовать в этом микроконтроллере. Для выбранной платы STM32F3Discovery у нас уже обозначены линии ввода-вывода, используемые для светодиодов, для кнопки и для других периферийных модулей, которые разведены на плате.

Питание микроконтроллера подается на выводы VDD (верхний уровень) и VSS (нижний уровень) и составляет стандартно от 2 до 3.6 В. Для отладочной платы это 3.3В.

STM32CubeMX Clock Configuration

Оставим для первого проекта все по умолчанию и перейдем в следующую вкладку – Clock Configuration – конфигурация тактирования.

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

Следующая вкладка – Configuration – это конфигурация тех периферийных модулей, которые мы выбрали в начале. Поскольку этот проект у нас будет пустым, то и настраивать мы здесь ничего не будем.

В последней вкладке можно посчитать потребление микроконтроллера в зависимости от используемой периферии и системы тактирования.

Это может оказаться актуальным при проектировании устройств с батарейным питанием. Здесь даже можно указать тип батареи, задать режим работы, тактовую частоту и подключенную периферию и увидеть потребление микроконтроллера в этом режиме. Но пока тоже на этом подробно останавливаться не будем.

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

Окно проекта IAR

В левой части окна отображаются 3 папки.

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

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

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

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

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

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

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

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

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

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

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

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

Всем привет, подскажите, как настроить STM32CubeIDE для генерации hex файла?

Привет, в настройках проекта:

Project -> Properties -> C/C++ Build -> Settings -> Tools Settings -> MCU Post build outputs -> Convert to Intel Hex file (-O ihex)

Доберусь до компьютера, добавлю скриншот.

hex

В данный момент смотрят эту тему 1 гость.

Иконки тем : Не отвечен Отвеченный Активный Актуально Закреплено Неодобренно Решено Приватный Закрыто

Vkontakte

Twitter

SignIn

SignUp

Язык сайта

Рубрики

Свежие записи

Свежие комментарии

  • Петя к записи STM32 и Ethernet. Часть 4. Сетевой уровень. Протоколы IP и ICMP.
  • Эндрю к записи Микроконтроллер AVR и GPIO. Порты ввода-вывода.
  • Сергей к записи Последовательное и параллельное соединение резисторов.
  • Aveal к записи Фильтр Калмана. Алгоритм фильтрации данных.
  • Владимир к записи Фильтр Калмана. Алгоритм фильтрации данных.

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

Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.

Здесь я расскажу как создать минимальный проект на 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, мне пришлось перелопатить достаточно много мануалов, чтобы осознать вещи, кажущиеся сейчас очевидными.

Плата Blue Pill STM32F103C8T6 ARM®32-bit Cortex®-M3 CPU Core Плата Blue Pill STM32F103C8T6 ARM®32-bit Cortex®-M3 CPU Core

По факту получается, что базовая плата Blue Pill с чипом STM32F103C8T6 может быть приобретена менее чем за 2$ у друзей из поднебесной . К этому комплекту еще необходим программатор ST-Link V2, и как и для всего остального на него существует максимально дешевая китайская копия . Программатор понадобиться в первую очередь для записи программ и внутрисхемной отладки по интерфейсу JTAG с поддержкой, разработанного ARM протокола SWD (Serial Wire Debug).

Кроме использования ST-Link существует возможность записывать программы через выводы A9, A10 платы (ножки 30, 31 USART1 микроконтроллера), для этого понадобиться преобразователь USB-UART типа FTDI FT232RL или подобный.

Но, так как этот способ не полнофункциональный с точки зрения внутрисхемной отладки, в дальнейшем речь пойдет о прошивке именно через программатор ST-Link. Это развяжет нам руки в использовании всего функционала среды разработки. Подключение показано ниже, тут все просто — надо соединить соответствующие выводы: GND→GND; CLK→SWCLK; DIO→SWDIO; 3.3→3.3V

Подсоединение платы Blue Pill к программатору ST-Link Подсоединение платы Blue Pill к программатору ST-Link

Прежде чем начать предметно разбирать Cube IDE я приведу составленную мной таблицу сравнения характеристик микроконтроллеров от различных базовых плат Arduino c STM32F103C8.

Таблица сравнения некоторых базовых МК AVR с STM32F103 Таблица сравнения некоторых базовых МК AVR с STM32F103

Во многом именно эти числа и побудили меня на изучение гораздо более производительной и функциональной платформы.

Итак, для успешного начала работы нам необходимо скачать установочный файл с официальной страницы CubeIDE на сайте ST. Для скачивания доступно несколько вариантов под Linux, macOS и Windows. Конкретно я загружал и устанавливал под форточку, но полагаю интерфейсы программы аналогичны для всех операционных систем.

На момент написания статьи доступна версия программы 1.3.0, что может нам говорить о том, что некоторые детские болезни ПО уже удалось преодолеть. Это к тому, что CubeIDE сравнительно новая программа, анонсированная в 2019 г., и поэтому у сообщества STM-щиков, естественно, есть настороженность по поводу наличия в ней багов и недоработок.

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

Итак, для создания нового проекта нам потребуется пройти по основному меню: File→New→STM32 Project

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

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

Далее IDE может спросить нас об открытии кодогенератора STM32CubeMX, возражать не имеет смысла, он в последствии будет нашим лучшим помощником.

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

Первым делом, нам нужно объяснить МК откуда им будет получено тактирование во время работы. На платах Blue Pill установлен кварцевый резонатор с частотой 8 MHz, он уже подключен к выводам PD0, PD1. Чтобы обозначить это для IDE, в разделе System Core заходим в RCC (Reset and clock conrol) выбираем высокоскоростное тактирование (HSE) и далее кварцевый резонатор. После этого соответствующие ноги МК будут подсвечены зеленым с указанием их назначения.

Настройка регистра RCC на внешний кварцевый резонатор. Настройка регистра RCC на внешний кварцевый резонатор.

В микроконтроллере STM32F103 есть блок фазовой автоподстройки частоты (PLL) он служит для создания основной частоты работы микропроцессора путем умножения частоты внешнего или внутреннего источника тактирования на программно определяемый множитель.

Для завершения настройки нам необходимо проверить во вкладке Clock Configuration, что частота HSE установлена в 8 MHz, а частота работы МК составляет 72 MHz.

Для первого нашего проекта мы по классике помигаем установленным на плате светодиодом. Он подключен к выводу PC13. Для его настройки правой кнопкой по выводу выберем GPIO_Output (вывод общего назначения_выход). В разделе настройки GPIO присвоим пользовательское название вывода (User Label) как LED13. В таблице конфигурации GPIO проверяем внесенные изменения.

Теперь дадим команду кодогенератору сформировать файлы проекта на основании тех настроек, что мы сделали.

После этого мы уже можем писать свою программу в файле main.c. Там будут вставлены функции для настройки выводов и тактирования:

Теперь в файле main.c находим функцию main(void) и бесконечный цикл в ней while (1). Это и есть место для нашей первой программы.


Выбираем необходимый микроконтроллер, у меня это всем известный 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, когда там нуль, то СИД светится, когда единица, то нет (т.к. светодиод подключен к плюсу на отладочной плате).


Ну а в железе это вот этот изменяющийся бит выглядит как мигание светодиода:

Читайте также: