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

Обновлено: 04.07.2024

ARM ( Advanced RISC Machine — усовершенствованная RISC-машина) архитектура, разработанная компанией ARM Limited, лежит в основе множества 32-х и 64-х битных микропроцессорных ядер. В свою очередь одним из таких ядер, а именно ARM Cortex-M оснащены микроконтроллеры STM32 от компании STMicroelectronics.

В семействе Cortex-M присутствуют: Cortex-M3 (выпущен в 2004 году), Cortex-M1 (2007 год), Cortex-M0 (2009 год), Cortex-M4F (2010 год),

Cortex-M0+ (2012 год), Cortex-M7F (2014 год), Cortex-M23 (2016), Cortex-M33F(2016).

В данной статье мы рассмотрим подготовку программного обеспечения и создание первого проекта в среде Keil uVision, для микроконтроллера STM32F303RBT6. В основе этого контроллера лежит ядро Cortex-M4.

Keil uVision дает возможность создавать проекты любой степени сложности. В этой среде пишется и редактируется исходный код программы, производится внутрисхемная отладка и прошивка ПЗУ микроконтроллера. Под управлением единой оболочки собран стек различных модулей которые используются по мере необходимости и возрастании сложности реализуемых задач.

Для того что бы приступить к созданию проекта необходимо скачать архив KEIL uVision and other, в архиве находятся 9 файлов (рисунок 1):

1) mdk511.exe (установочный файл Keil uVision 5)

2) Keil.STM32F3xx_DFP.1.4.0.pack (пакет для работы с микроконтроллером STM32F303RBT6)

3) STM32F30x_Clock_Configuration_V1.0.0.xls (Визард для настройки тактирования микроконтроллера STM32F303RBT6)

4,5,6) StdPeriph, StartUP, CMSIS (необходимые файлы для работы с ядром Cortex-M)

7,8) USBSource, USBLib (Необходимые файлы для работы c USB)

9) Папка VCP_V1.5.0 с драйверами последовательного COM порта для микроконтроллера STM32F303RBT6


Далее устанавливаем Keil uVision 5 (проблем с установкой быть не должно, следуем инструкциям установщика) и переходим к настройкам среды.

Нажимаем на кнопку Pack Installer (рисунок 2).


Откроется диалоговое окно Pack Installer, жмем на File->Import (рисунок 3) и выбираем файл Keil.STM32F3xx_DFP.1.4.0.pack (рисунок 4).



Рисунок 3

Теперь создаем новый проект Project->New uVision Project. (рисунок 5).


Теперь нужно выбрать папку где будет расположен наш проект и присвоить ему имя. У меня это папка Keil_EX_1 и название проекта EX_1 (рисунок 6). Давайте сразу скопируем в эту папку файлы: StdPeriph, StartUP, CMSIS из скаченного архива KEIL_uVision_and_other


После нажатия на кнопку сохранить появится диалоговое окно Select Device for Target 'Target 1'. в котором нам предложат выбрать микроконтроллер с которым мы будем работать. Нажимаем на вкладку STM32F303 (рисунок 7) после чего в раскрывшемся списке выбираем наш микроконтроллер STM32F303RB как показано на (рисунке 8).



Рисунок 7

Нажимаем на кнопку ОК и автоматически появится диалоговое окно Manage Run-Time Environment (рисунок 9), просто жмем Cancel и идем дальше.


Теперь в появившемся окне Project (рисунок 10) необходимо подготовить структуру папок для удобства работы.


Правой кнопкой мыши жмем на папку Target 1 и выбираем Manage Project items. как на (рисунке 11).


Появится диалоговое окно Manage Project items в котором теперь необходимо добавить с помощью кнопок New/Delet (1) следующие папки: StartUP, USER, CMSIS, StdPeriph (2), после жмем ОК (3) (рисунок 12).


Следующим шагом нужно добавить в созданные нами папки: StartUP, CMSIS, StdPeriph необходимые файлы с помощью команды Add Exsisting Files to Group 'Название папки'. (рисунок 13).


В составе папки StartUP должны быть следующие файлы: startup_stm32f30x.s, core_cm4.h.

В составе папки CMSIS должен быть файл: system_stm32f30x.c.

В составе папки StdPeriph в первую очередь должен быть конфигурационный файл: stm32f30x_conf.h. Остальные в зависимости от используемой периферии. Я сразу добавил в эту папку все файлы для работы с периферией.

Перейдем к папке USER, в ней будет лежать файл исходного кода main и прочие на ваше усмотрение. Для добавления нового файла воспользуемся командой Add New item to Group 'USER'. (рисунок 14).


Выбираем тип добавляемого файла CFile(.c) (1), присваиваем файлу имя main (2), нажимаем на кнопку добавить Add(3) (рисунок 15).


После всех манипуляций ваш проект должен выглядеть так же как на (рисунке 16), за исключением нескольких строчек кода которые я написал в main для демонстрации ошибки. Здесь нет ни чего страшного просто нужно произвести окончательные настройки проекта (рисунок 17):

(1) Нажимаем на кнопку Options for Target.

(2) Заходим во вкладку С/С++

(3) В поле Define вводим USE_STDPERIPH_DRIVER

(4) Жмем на кнопку добавить путь (1) и прописываем пути ко всем файлам проекта (2) (рисунок 18)




Заходим во вкладку Output выставляем галочку Create HEX File (рисунок 19), этот файл будет использоваться нами для прошивки микроконтроллера. Жмем ОК.


Все готово, теперь осталось только собрать проект. Жмем на кнопку Build (рисунок 20). Ошибок быть не должно.

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

Для облегчения процесса разработки программы часто используются интегрированная среда программирования, в состав которой включается определенный набор программных средств: редактор исходного текста, трансляторы с выбранного языка программирования, редакторы связей, загрузчики и так далее. Текстовый редактор (обычно это первая программа, с которой сталкивается разработчик) позволяет набирать исходные тексты программ на ассемблере (или на каком-нибудь языке высокого уровня) и сохранять их на жёстком диске.

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

Запустим интегрированную среду проектирования Keil-C, если Keil-C еще не установлен, то можно воспользоваться рекомендациями по установке. Как я уже отмечал раньше, в своих примерах я буду использовать Keil uVision3 v8.12. Запустите среду проектирования Keil. Если запуск произведен в первый раз, то откроется проект со стандартным примером программы, в противном случае откроется проект, с которым вы работали в последний раз. На рисунке ниже показано окно программной среды при первом запуске.


Рисунок 1 - Вид среды Keil при первом запуске

Теперь создадим и настроим проект. Но для начала создайте папку, в которой будут располагаться все файлы нашего проекта. Папку можно расположить на рабочем столе. И так, создаем новый проект, для это в меню "Project" выбираем "New uVision Project … ".

Рисунок 2 - Создание нового проекта

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

Рисунок 3 - Сохранение проекта

После создания программного проекта, интегрированная среда программирования предлагает выбрать конкретную микросхему из семейства MCS-51, как это показано на рисунке. Следует выбрать микроконтроллер ADuC842 фирмы Analog Devices.

Рисунок 4 - Выбор типа микроконтроллера

После нажатия кнопки "OK", будет предложено добавить в рабочую папку и включить в проект файл начальной инициализации микроконтроллера (Copy Analog Devices Startup Code to Project Folder and Add File to Project?). Следует выбрать вариант ответа "Нет".


Рисунок 5 - Предложение добавить начальную инициализацию

Далее настраиваем проект на генерацию hex-файла. Для этого в меню "Project" выбираем "Options for Target" или нажимаем пиктограмму, как это показано на рисунке 6. В настройках выбираем вкладку "Output", ставим галочку "Create HEX File".

Рисунок 6 - Запуск настройки свойств проекта

Рисунок 7 - Настройка проекта

Создаем новый текстовый файл, для этого нажимаем соответствующую пиктограмму, или комбинацию клавиш "Contrl + N".

Рисунок 8 - Создание нового файла

Сохраняем созданный файл. Можно нажать пиктограмму, а можно - комбинацию клавиш "Control + S". Вводим название файла, желательно английскими буквами, обязательно файлу следует указать расширение ".c", например, "program.c". Добавляем сохраненный файл с программой в проект, для этого в менеджере проекта в контекстном меню "Source Group" выбираем "Add Files to Group". Указываем путь к файлу.

Рисунок 9 - Добавление файла в проект

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


Рисунок 10 - Файл добавлен

Теперь проект настроен должным образом и готов к работе: можно вводить текст программы, отлаживать ее и компилировать. Для того, что бы скомпилировать написанную программу и получить загрузочный hex-файл следует нажать пиктограмму "Build target", как показано на рисунке ниже.

Рисунок 11 - Компиляция проекта

Готовую программу надо каким-либо образом запихать в контроллер. Для этого существует множество способов.


И прошиваешь либо из среды Keil.



Выбираем тип контроллера, размер памяти.


А дальше надо только указать бинарный или Hex файл и нажать прошивку.

Чтобы Keil сгенерировал hex файл нужно выставить галочку в опциях проекта.


А чтобы получить bin файл прогнать выходной axf файл через специальную утилитку fromelf входящую в состав Keil. Проще всего вписать это сразу в постобработку:


Формат там такой:

fromelf --bin --output .\имя_будущего_файла.bin .\имя_создаваемого_файла.axf

Ну или, если выходные файлы создаются в какой-либо подпапке, то путь будет включать и эту подпапку



Настраиваем порт, жмем Next


Она сразу показывает, что есть контроллер.


Тут можно посмотреть какие страницы флеша нам доступны на запись. Жмем Next


Выбираем какую операцию будем делать. Для прошивки надо выбрать Download и не забыть галочку Стереть чип.

Жмем Next и пошел процесс прошивки-проверки


Mass Storage USB Bootloader
Кроме того, у LPC1343 (у других LPC не встречал) есть одна прикольня фича. Там встроенный загрузчик может работать и по USB. Для этого надо собрать следующую схему:



Вторичный бутлоадер
Поскольку я решил зарыться в STM32, то мне тоже захотелось такую вкусняшку как USB boot в режиме mass storage. Забросил идею Владимиру aka RtxOnAir и в результате он, за пару дней, выдал аналогичное решение для STM32F103.

Для загрузки с USB нужна следующая схема:


Транзистор подтягивает линию D+ к питанию и это означает, что на шине кто то появился, заставляя OС компа произвести определение устройства. Можно сделать и по колхозному. Подтянуть D+ через резистор напрямую. Но в этом случае для входа в бут придется передергивать шнур USB, иначе винда не захочет находить устройство. А так контроллер сам дернет вожжу.

Вообще, инструкция явно говорит, что USB может работать только от внешнего кварцевого резонатора, т.к. частота внутреннего нестабильная и вообще кака. Не будем спорить с создателями камня, но у нас наш бутлоадер отлично завелся на HSI и при комнатной температуре отлично работал. Впрочем, стабильность тут явно не на высоте и надо быть осторожным.

Конфигурация бутлоадера
Для конфигурации нашего бута RtxOnAir написал небольшую утилитку:




Ну и прописать строку для формирования бинарика из axf файла.


После чего файлы прошивки можно банальным копированием загонять в STM32 и никакой программатор или адаптер больше не нужны совсем. Красота же!

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

129 thoughts on “Прошивка ARM Cortex M3 на примере STM32 и LPC1300”

А зачем из hex делать bin? В чем разница?

Заливка через USB, я так понимаю, работает только для 103 серии, где он есть?

Ну логично, чтобы шить через USB необходимо наличие его в МК. :-)

Ещё у STM32 есть фирменная система DFU (Device Firmware Upgrade) используя которую тоже можно шить по USB, предварительно прошив контроллер спец прошивкой от них. Там все довольно запутанно, но промучавшись пол дня все получилось.

И работает это не только для 105 или 107 (в этих USB загрузчик с завода), но и для всех контроллеров серии с USB. Лично я прошил так 103 проц.

Конечно, чем больше вариантов тем лучше! Спасибо вам за труд. Скоро опробую ваш способ.

А не могли бы подсказать где эту прошивку саму взять и как ее сгенерировать?
Я нашел только ту чем прошивать. boot от rtxonair так нормально и не заработал..

Там дельфийская прога. В ней выбираешь проц, ноги и жмешь сгенерить. На выходе будет бинарь

А можно этот генератор перевести на английский. А то у иеня винда не русская и показывает знаки вопроса.. Ну или хотябы сделать её в уникоде?? А то неудобно.. а попробовать хочется..

Это да.. Только после этого начинают не так работать и показывать буквы остальные програмы :) Вобщем подожду на английскую версию..

> А как быть с бин файлом? Может кто то подскажет?
> LPC flash utility с бин файлами не может работать.
Ну во первых, если уж использовать LPC flash utility, то зачем генерить именно bin файлы?
А во вторых, очевидно, нужно читать даташит в котором сказано где должна распологаться контрольная сумма и как ее считать. Я с LPC баловался совсем не много, но по моему и EWARM и Keil могут считать контрольную сумму и записывать ее куда надо.

Прошивка в формате бин нужна для того чтоб залить её через ЮЗБ. Где должна распологаться контрольная сумма я знаю, а вот как заставить чтоб ИДЕ её генерировала и записывало в нужное место я так до сих пор и не нашёл. и посему использую LPC flash utility для правки контрольной суммы.

rtxonair не могли бы вы вспомнить что надо делать чтоб иде генерировала и писала контрольную сумму куда надо? был бы очень благодарен

Пользуюсь я IAR 5.2. Я ещё пока ЮЗБ загрузчик не прошил и пока ставлю чтоб ИДЕ генерировала файлы в хекс формате. И оно контрольную сумму не вставляет. Программа не работае ни в железе ни в протеусе. Хотя я выставляю тип мк в свойствах проекта LPC2142. После того как исправлю контрольную сумму LPC flash utility работает и в железе и в протеусе.

rtxonair покажите пожалуйста где на их сайте рассказывается в какие выходные форматы оно вставляет контрольную сумму.

>А почему бы не перейти на EWARM 5.4?
Да я бы с радостью но пока я этой идеей в серйоз не задавалдся.
Но я думаю и версия 5.2 тоже это должна делать испавлять вектора.
За ссылку спасибо щас буду внимательно изучать.

rtxonair а можно с вами как то по мылу/асаьке/скайпу связаться?
В коментах тяжело общаться.

rtxonair да вы правы. версия 5.4 сама правит контрольную сумму в зависчимости какой девайс выбран. Вот оно: This Tech Note does not apply to recent versions. There is no need for the label __vector_0x14 (or __vector_table_0x1c) as the EWARM get the information based on the slected chip in the General Options. Эта техническая нотация не применяется к недавним версиям. Нет нужды для метки __vector_0x14 (or __vector_table_0x1c) так как EWARM получает информацию по выбраному чипу в главных настройках.

Только я вот не совсем разобрался с этой строкой: IElfToolPostProcess=–checksum __vector_table+0×1c:4,sum32:2;__vector_table-__vector_table+0×1B
Я так понял эту строку нужно указавать линковщику.
настройки, категория линкер, вкладка экстра опшонс, ставим галочку использовать опции командной строки и туда эту строку писать?
Я правильно понял?

Скачал я ИАР 5.4. Написал простенькую программу мигания светодиодом. Запускаю в протеус и результата 0. Программа не работает. Может я проект неправильно создаю, может я ещё что то не так делаю я не пойму.
Кто знает помогите пожалуйста.

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


Итак, компилятор установлен, пришло время создания первого проекта. Сразу думаю надо обсудить библиотеки, которые мы будем использовать в нашей работе с STM32.

Во-первых, CMSIS. Это замечательная библиотека, единый стандарт для всех Cortex. CMSIS позволяет легко переносить код с одного контроллера с ядром ARM Cortex на любой другой. Короче, в CMSIS стандартизирован доступ к разной периферии разных микроконтроллеров STM. Библиотека состоит из нескольких файлов, которые нам надо будет добавить в проект, но об этом немного позднее.

Во-вторых, библиотека Standard Peripheral Library. В SPL очень удобно, в виде структур, реализована настройка всевозможной периферии, а также есть множество функций для работы с ней. Эту библиотеку достаточно подробно будем изучать при обсуждении какой-либо конкретной периферии в будущих статьях. А сейчас кратенько рассмотрим ее структуру в общих чертах. Для любого модуля микроконтроллера есть 2 файла: заголовочный файл и, собственно, файл с исходным кодом. В первом содержатся структуры для настройки периферии, во втором функции для обращения к ней. Так что, создавая проект для работы, например, с АЦП, мы будем включать в проект два файла из Standard Peripheral Library.

Возможно, кто-то сомневается, стоит ли использовать эту библиотеку. Речь, конечно о SPL (по поводу CMSIS думаю ни у кого не может быть сомнений 🙂 ). Так вот, я для себя однозначно решил, что стоит. Ну на самом деле, к чему изобретать велосипед, библиотека написана и очень удобна, гораздо удобнее, чем напрямую ковыряться в многочисленных регистрах. НО! При всем этом, надо все-таки иметь представление какой регистр за что отвечает, и как с ними работать. Для этого не лишним будет просматривать раздел даташита на конкретную периферию при работе с ней.

Итак, скачиваем CMSIS и Standard Peripheral Library (SPL) и шагаем дальше:

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

Идем в Project -> New uVision Project. Появляется окошко для выбора папки, в которой будет создан проект. Также надо дать нашему проекту имя. Пусть будет, например, test, это ведь просто тестовый проект. Скриншот приводить не буду, тут все и так понятно. Теперь нам надо выбрать микроконтроллер. Я остановил свой выбор на STM32F103CB:

В левой части видим окошко Project. Там будут отображаться все файлы, добавленные в наш проект. Я обычно переименовываю группы, которые по умолчанию называются Target 1 и Source Group 1 в STM32 и StartUp соответственно. Сразу же добавим еще пару групп – для библиотек, а также для наших файлов, в которых будет собственно сам код. У меня после модификации все выглядит вот так:

Теперь аналогично добавим файлы библиотеки SPL. Пока они нам не понадобятся, но пусть будут. Добавим, например stm32f10x_rcc.c и подхватим includ’ом stm32f10x_rcc.h (файлы, содержащие все связанное с тактированием различной периферии). И наконец добавим наш созданный файл test.c в папку Source Files в дереве проекта.

И вот тут еще одни грабли. Все папки, которые добавляем в Include Paths не должны содержать пробелов. Так что мои Header Files, Source Files и Project Files плавно превращаются в Header_Files, Source_Files и Project_Files.

Еще один шаг к созданию проекта сделан, в принципе, осталось совсем чуть-чуть. В файл test.c закинем следующий тестовый код, который абсолютно ничего не делает 🙂

Чтобы это не вылетало, открываем stm32f10x_conf.h, ищем:

то надо всего лишь сделать так, чтобы файл test.c не заканчивался строкой кода. Проще говоря, ставим курсор после последней скобки в этом файле и жмем Enter. Warning сразу же пропадает.

Ну вот, первые шаги сделаны. Мы создали пустой проект, который абсолютно ничего не делает полезного (бесполезного впрочем тоже 🙂 ). Но для начала уже неплохо, в следующих статьях будем заполнять проект кодом. Кстати, если у кого-нибудь возникли какие-либо трудности при создании проекта, пишите в комментарии, не стесняйтесь! И не пропустите статью нашего курса по STM32CubeMx, описывающую аналогичный процесс создания базового проекта.

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

Проверь все пути ко всем файлам на наличие пробелов

А в дефайнах проекта там не надо писать что-то типа USE_STDPERIPH_LIBRARY?

А можно ещё узнать где брать эти библиотеки, например на F4

Добавлю вечером ссылку на библиотеку для F4, а так в интернете все что угодно можно найти)

можно и удалить)

Теоретически да, поэтому и не удаляем

Наверняка где-то в пути к файлу пробелы или русские буквы

Разобрался. Файл был для асемблера, в настройках переделал на С

Камрады, напишите, по возможности, статью про задание частоты тактового генератора, после PIC совсем не понимаю как выставлять частоты в STM32 и как использовать wizard в Keil, уверен, что у кого то есть уже такой опыта. Спасибо!

Постараюсь написать, но не уверен, что в ближайшее время получится..

В наборе МК при создании проекта у меня нет тулсета ARM, только C51. При этом в File->Device Database все присутствует. Есть ли советы как починить?

Подскажите пожалуйста, как настроить комбинации горячих клавиш Ctrl+C, Ctrl+V.

Правой кнопкой в окне Project (там где все файлы) и потом в меню Add group

Точно для ARM Keil?

точно для ARM, такой же как на рисунке на этой страничке

Файл startup.s включен в проект?

блин..), спасибо, извините

Помогите плиз.
Всё ругается

А что за контроллер? Кидай проект, я посмотрю )

Здравствуйте 🙂
Делал по аналогии с вашим мануалом под контроллер stm32f30 .

uVision 5 под arm

Аа.. тогда даже не знаю, что сказать, сам пятым не пользуюсь, и вообще постоянно люди жалуются, что в пятом что-то не работает. Ставь uVision 4))

Я скачал новую версию Keil с офф. сайта и там в списке нет stm32. Что я не очень понял как тогда начать?

Это точно Кейл для ARM процессоров?

Спасибо. Да вроде уже разобрался. Теперь качнул MDK-ARM v4.73. До этого был С51 v9.52. Но об этом в статья явно не писано :)) Я как новичек не знал, что все так разделено.

Почему-то в скаченной с офф.сайта MDK-ARM v4.73 теперь вообще ни чего нет в списке.

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

А можно как-то обойтись без библиотек и насколько это будет сложно?
А то не хочется разбираться в чужих библиотеках.

Спасибо. Всё с первого раза получилось))

.\Example.axf: Error: L6200E: Symbol SystemInit multiply defined (by system_stm32f4xx_1.o and system_stm32f4xx.o).

Подскажите, пожалуйста, в чем причина этой ошибки? У меня 7 их вылазит при построении.

мда. Стартую не с нуля и стартануть не могу. Хоть бы написали, как установить IDE, как добавить в неё библиотеки микроконтроллеров и т.д. Бьюсь об неё уже час, первый проект создать не могу. В кокосе уже бы давным давно программу писал.

Я даже растерялся поначалу, прочитав.

Вообще 90 процентов статьи посвящено именно тому как добавить файлы библиотек в новый проект, как прописать к ним пути и т. д.

А уж писать про установку IDE на сайте, ориентированном все-таки на программистов или людей, которые хотят ими стать, по меньшей мере странно.

Немного не так поняли. Например, в окне select device for target у меня была всего одна строка с одним устройством. Микроконтроллеров stm32 там не было. Чтобы они там появились, надо зайти в прилагающуюся к IDE утилиту и там установить библиотеки. Вроде всё просто, а провозился с этим с полчаса. Вот первые грабли, дальше не получилось что- то ещё и ещё. Как итог- старт не состоялся, я остаюсь на CooCox. Как говорится, хорошая попытка, keil.

Вполне вероятно, что Кейл не тот, у них же есть IDE под разные архитектуры.

STM32 — это семейство 32-разрядных микроконтроллеров фирмы STMicroelectronics.

Микроконтроллеры содержат микропроцессорное ядро ARM, точнее ARM Cortex-M. Это ядро присуще не только микроконтроллерам STM32, оно существует само по себе, и на его основе выпускается множество микроконтроллеров от разных производителей.

Среда продается за большие деньги, но существует бесплатная ограниченная версия, которую можно скачать с официального сайта.

Существует множество других сред разработки. Например, последнее время автор пользуется средой, которую описал в другой статье. Но в этой пойдет речь о Keil MDK-ARM, потому что она имеет большую популярность и достаточно проста.

Первым делом качаем последнюю версию Keil MDK-ARM с официального сайта. Она имеет ряд ограничений, которые не влияют на большинство задач. Самое существенное ограничение состоит в том, что среда не сгенерирует программу объемом больше 32 КБ, но такую программу надо постараться написать. Хотя микроконтроллеры STM32 часто имеют намного больший объем, вплоть до 2 МБ.

На момент написания статьи последняя версия Keil MDK-ARM — 5.18 (от 5 февраля 2016).

Чтобы скачать среду, надо заполнить форму на сайте Keil:

Форма для скачивания MDK-ARM

Следует ввести настоящий адрес электронной почты, иначе сайт будет ругаться. После заполнения и нажатия Submit, дается ссылка для скачивания:

Сcылка для скачивания MDK-ARM

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

Качаем и устанавливаем. Установленная среда занимает на диске около 1,3 ГБ. После установки автоматически запускается менеджер пакетов:

Менеджер пакетов

Он нужен, чтобы качать, устанавливать и обновлять различные дополнения (пакеты).

Менеджер пакетов появился в MDK-ARM версии 5, что уменьшило объем установочного файла почти в два раза (версия 4.71 была объемом 550 МВ, а версия 5.00 — 300 МБ).

В левой части менеджера мы выбираем устройства (микроконтроллеры), а в правой соответствующие им пакеты.

Допустим, нам надо вести разработку под микроконтроллер STM32F407VG, который установлен на отладочной плате STM32F4-Discovery.

Тогда находим этот микроконтроллер в списке слева и устанавливаем соответствующий пакет DFP:

Установка DFP

Можно заметить, что среди установленных пакетов есть CMSIS. CMSIS — это библиотека для ядра Cortex-M, общая для всех микроконтроллеров. Библиотека разрабатывается фирмой ARM и доступна для скачивания с официального сайта после регистрации. Можно было бы не устанавливать этот пакет, а пользоваться официальным выпуском библиотеки, но это дополнительные сложности.

Закрываем менеджер пакетов и запускаем Keil uVision5 (произносится мю-вижен):

Значек Keil uVision5

Keil uVision5 — это часть MDK-ARM, графический интерфейс среды, который включает редактор кода:

Keil uVision5

Настройка Keil uVision5

  1. Кодировка UTF-8.
  2. Правая граница кода в 80 символов. по 4 пробела.

Эти настройки довольно спорные. У каждого разработчика свои предпочтения.

Выбор микроконтроллера

Изначальная структура проекта

После создания проекта описанным способом, в окне справа вы увидите следующую структуру проекта:

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

Группы файлов нужны, чтобы красиво группировать файлы исходного кода. Группы помогают легко ориентироваться в файлах в большом проекте. Например, у вас может быть группа файлов, отвечающих за светодиоды, и отдельная группа с файлами для взаимодействия с USB.

Создание файла main.c

В созданный файл добавим код:

Сейчас программа не делает ничего, и прошивать ее бессмысленно. Давайте напишем программу, которая управляет состоянием ножки микроконтроллера.

  • Device:STM32Cube Hal:Common
  • Device:STM32Cube Hal:RCC
  • Device:STM32Cube Hal:PWR
  • Device:STM32Cube Hal:Cortex
  • Device:STM32Cube Framework:Classic

STM32Cube — это библиотека, которую предоставляет STMicroelectronics.

При выборе компонентов мы выбираем какие возможности этой библиотеки использовать.

Микроконтроллер, кроме ядра, содержит большое количество периферийных устройств: АЦП, ЦАП, таймеры, различные интерфейсы и многое другое. Каждое периферийное устройство имеет свое название. Например, устройство для работы с портами микроконтроллера называется GPIO, об этом можно узнать из документации на микроконтроллер.

Библиотека STM32Cube многоуровневая, то есть включает в себя множество промежуточных библиотек. Одна из промежуточных библиотек называется STM32Cube HAL, или просто HAL. Она поделена на модули и каждый модуль соответствует какому-нибудь периферийному устройству. Название модуля совпадает с названием устройства, например, имеется модуль GPIO.

Существует большое количество документации по STM32Cube. Но основное описание по работе с периферийными устройствами содержится в руководстве по HAL. Это руководство разработчик использует большую часть времени. Обратимся к нему, чтобы заставить шевелиться ножки микроконтроллера.

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

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

В статье я хотел еще привести конечный код и объяснить, как он работает. Могу лишь поделиться непроверенной программой:

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