======Создаем проект в среде IAR======
До того, как ARM купила компанию [[http://www.keil.com/|Keil]], лучшими практически по всем показателям были компиляторы от [[https://www.iar.com/|IAR Systems]]. Сейчас ситуация выровнялась и по некоторым тестам компилятор от Keil даже превосходит компилятор от IAR. Но тем, кто привык работать в IAR нет большого смысла осваивать новую среду.
Миландр предоставляет файлы поддержки своих микроконтроллеров для среды IAR, но подключение этих библиотек не так очевидно, как в случае PACK для Keil. Эта статья будет посвящена тому, как начать работать с микроконтроллерами Миландр в среде IAR. Напишем обычный "HelloWorld", то есть помигаем светодиодами.
//В разделе [[#Резюме - Quick Start]] представлен краткий перечень необходимых действий для начала работы в IAR Workbench. Следование предложенному там варианту сэкономит время на чтение всей статьи.//
=====Установка IAR Embeded Workbench=====
Скачать архив среды можно с сайта [[https://www.iar.com/iar-embedded-workbench/?focus=wbselector#!?architecture=ARM|IAR for ARM]]. На главной странице надо выбрать "... tool for ARM", тогда появится пункт "ARM. Download a free trial" и кнопка "Download Software, Version 8.11". На момент написания статьи актуальной была версия 8.11.2.
После скачивания архива запускаем инсталлятор, соглашаемся с лицензией и выбираем поддержку внутрисхемных отладчиков из списка. Я поставил по умолчанию все, что предлагалось при инсталляции.
{{doc:iar:iar_setup.png}}
При первом запуске среды IAR открывается приветственное окно с выбором лицензии. Лицензионного ключа я нас нет, поэтому выбираем пункт с ознакомительной лицензией.
{{doc:iar:iar_setup_welcome.png}}
В следующем окне необходимо нажать Register, после чего откроется окно браузера, где необходимо выбрать лицензию. Доступно два варианта - полная версия на 30 дней, или ограниченная по размеру кода, но бессрочная лицензия. Для демо примеров достаточно урезанной по коду версии. Далее необходимо заполнить регистрационные данные, в том числе Email, на который будет выслана ссылка для подтверждения регистрации.
{{doc:iar:iar_setup_reg.png}}
Заполняем регистрационную форму с присущей нам фантазией, нажимаем Ок и дожидаемся письма. В письме кликаем на ссылку для подтверждения и в браузере открывается окно с кодом лицензии для продолжения инсталляции. Вбиваем код в окно инсталлятора и далее все по умолчанию.
=====Установка SPL (Standard Peripherial Library) от Миландр=====
Теперь необходимо скачать файлы поддержки от производителя. Заходим [[http://ic.milandr.ru/soft/|сюда]], открываем плюсом раздел //"IAR installer"// и скачиваем //MDR_for_IAR_vX.Y//.
Внутри архива находится инсталлятор Setup_MDR_to_IAR_v1.2.exe, которые произведет копирование необходимых файлов в директорию установки IAR. При запуске требуется указать лишь путь где лежит IAR. Если IAR установлен по умолчанию, то путь указывать не надо, он уже будет выбран - //C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0//.
Так же внутри архива расположена папка SPL_CODE. В ней содержится файлы библиотеки SPL и простейшие проекты мигания светодиодом для некоторых микроконтроллеров.
Теперь среда готова для создания первого проекта.
=====Настройка проекта, на примере 1986ВЕ92У=====
Создаем новый проект, выбираем язык Си.
{{doc:iar:iar_newproj.png}}
Проект я сохраняю в созданную мной директорию //C:\CODE\IAR_CODE\1986BE9x\HelloWorld//, название проекта указываю такое-же "HelloWorld". Про организацию папок будет рассказано ниже - [[#Организация папок проекта и SPL|"Организация папок проекта и SPL"]].
Создастся проект с пустой реализацией функции main. Откроем опции проекта и настроим его под конкретный микроконтроллер, выбираем пункт меню или жмем Alt+F7. Далее приведу только те опции, которые необходимо поменять, все остальное остается по умолчанию. По вкладкам:
====General Options====
Выбираем наш микроконтроллер, 1986ВЕ92У относится к группе 1986ВЕ9х.
{{doc:iar:iar_projopt.png}}
====Output Converter====
Если будет необходим hex файл прошивки, то включить его создание можно в этой вкладке.
{{doc:iar:iar_output.png}}
====Linker====
Здесь необходимо выбрать файл задающий раскладку памяти для МК. Этот файл //MDR32F1.icf// мы копировали ранее при установке SPL. Определение $TOOLKIT_DIR$ как раз содержит путь к директории установки, в которую мы копировали папки Milandr.
{{doc:iar:iar_linker.png}}
//C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\Milandr\MDR1986VE9х\MDR32F1.icf//
Области памяти можно скорректировать, нажав Edit, но тогда лучше сохранить измененную версию под новым именем, чтобы оставить рабочим исходный вариант.
====Debugger====
В закладке Setup необходимо выбрать наш отладчик, J-link уже присутствует в списке, выбираем его. Отладчика Ulink2 нет в списке, видимо необходимо ставить дополнительно. Кроме этого необходимо выбрать приведенные на картинке ниже файлы //FlashMDR32F1x.mac// и //jbr_1986BE9x.ddf//, которые мы так же копировали при установке SPL.
{{doc:iar:iar_debugger.png}}
//C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\Milandr\MDR1986VE9х\FlashMDR32F1x.mac// \\
//C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\debugger\Milandr\MDR1986VE9х\jbr_1986BE9x.ddf//
В следующей закладке Download выставляем опции //"Verify download"// и выбираем файл загрузчика //FlashMDR32F1x.board//, который загружает нашу программу в микроконтроллер. Это аналог flm файла в среде Keil.
{{doc:iar:iar_debugdownload.png}}
//C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\Milandr\MDR1986VE9x\FlashMDR32F1x.board//
===J-Link/J-Trace===
В данном окне выставим опции аналогичные тем, что мы выставляем для данного отладчика в среде Keil. Укажем стартовую частоту микроконтроллера 8МГц и выставим Reset Pin. Далее можно выбрать использование Jtag или SWD, а так же увеличить скорость подключения, но мне сейчас это не критично, поэтому оставил по умолчанию.
{{doc:iar:iar_jlink_setup.png}}
После внесения изменений, да и вообще периодически, полезно нажимать кнопку Save All. При первом сохранении IAR предложит сохранить Workspace текущего проекта, сохраняем под таким же "HelloWord"-ом. При следующих запусках среды выбираем //File - Recent Workspaces// и IDE открывается в состоянии в котором мы ее оставили.
=====Организация папок проекта и SPL=====
При организации проекта я руководствовался данной статьей [[http://easyelectronics.ru/arm-uchebnyj-kurs-iar-ewarm-sozdanie-proekta-chast-2-cmsis-i-standard-peripherals-library.html|IAR EWARM. Создание проекта часть 2. CMSIS и Standard Peripherals Library.]]
Полагаясь на рекомендации статьи раскладывать исходники по папочкам, я завел группы аналогично тем, что создает Keil по умолчанию - Startup и Driver. Приведу сразу конечный вид дерева проекта и выпадающее меню, показывающее как создавать группу.
{{doc:iar:iar_projtree.png}}
Согласно статье, я так же создал отдельную папку src и положил туда файл main.c. Для такого маленького и простого примера это не столь важно, но будем вырабатывать правильный стиль.
Теперь необходимо подключить сами библиотеки SPL позволяющие работать с периферией микроконтроллера. Во многих статьях в интернет необходимые файлы библиотек копируются в папку проекта на диске и затем подключаются в IAR. Мне такое решение не показалось удобным, поэтому я решил разместить библиотеку по стационарному адресу и подключать во всех проектах файлы из единого источника. Плюс данного решения в том, что при исправлении ошибки в общих исходниках, изменение проявится во всех связанных с библиотекой проектах. Потребуется только перекомпиляция. Если же в каждый проект копировать подборку необходимых исходников, то придется в каждый проект вносить исправления. Но тут каждый решает для себя как ему удобнее организовывать код. Зачастую изменение в общем коде, может затронуть уже старый, готовый и работающий проект. В таком случае, проект "ушедший в продакшн" лучше "заморозить" в текущем состоянии, собрав для него все исходники отдельно.
В итоге директории на диске я организовал следующим образом, есть одна общая папка IAR_CODE в которой лежит папка SPL и по папке для каждого микроконтроллера, внутри которых создаются отдельные проекты. Проекты используют исходники SPL, которые подключаются относительными путями от папки проекта. Использование абсолютных путей сделает проект непереносимым в другое место, поэтому пути лучше использовать относительные. При переносе или копировании проекта куда-то, необходимо будет скопировать проект и папку SPL, сохраняя их относительное расположение. Тогда проект будет успешно собираться из другого места.
Здесь приведены директории и файлы которые будут использоваться в нашем проекте.
IAR_CODE\ - Общая папка с проектами в IAR
1986VE9x\ - папка проектов под 1986VE9x
MDR32F9Qx_board.h - файл выбора МК и ревизии
HelloWorld - папка проекта
SPL\ - папка SPL
MDR32F9Qx_config.h - файл прочих настроек
CMSIS\
CM3\
CoreSupport - поддержка ядра
DeviceSupport\MDR32F9Qx\ - startup файлы
inc
startup\iar
MDR32F9Qx_StdPeriph_Driver\ - driver файлы
inc
src
Чтобы получилась такая раскладка, вот что нужно скопировать из архива SPL:
в папку IAR_CODE\SPL:
Исходные файлы SPL
lib\MDR32F9_1986ВЕ4_2015\Libraries\все содержимое
Файлы с настройкой SPL под конкретный микроконтроллер
lib\MDR32F9_1986ВЕ4_2015\Config\MDR32F9Qx_config.h
в папку IAR_CODE\1986BE9x:
lib\MDR32F9_1986ВЕ4_2015\Examples\MDR1986VE9x\MDR32F9Q3_EVAL\MDR32F9Qx_board.h
В файле MDR32F9Qx_board.h осуществляется выбор микроконтроллера с помощью макроопределений, поэтому он лежит в папке с проектами под конкретный МК.
Файл MDR32F9Qx_config.h в архиве настроен для микроконтроллера 1986ВЕ4, необходимо открыть этот файл в Notepad и внести небольшую правку. Должно получиться так:
// !!! Раскомментировать блок:
/* Seleсt the header file for target microcontroller */
#if defined ( USE_MDR1986VE9x )
#include "MDR32Fx.h"
#elif defined (USE_MDR1986VE1T)
#include "MDR1986VE1T.h"
#elif defined ( USE_MDR1986VE3 )
#include "MDR1986VE3.h"
#elif defined (USE_MDR1986BE4)
#include "MDR1986BE4.h"
#endif
//#include "MDR1986BE4.h" - ! Закомментировать строку, либо удалить.
Теперь чтобы среда IAR могла находить файлы SPL в нашей раскладке необходимо указать ей пути для поиска при сборке. В дереве проекта выбираем самый верхний пункт "HelloWorld - Debug" - просто кликаем на нем левой мышкой, чтобы он был активен и открываем опции проекта (Alt+F7). Если не выбрать верхний пункт проекта, а будет активен какой-то файл из групп в дереве проекта, то при нажатии Alt+F7 откроются опции для этой группы. Нам же необходимо указать пути для всех групп в проекте, поэтому выбираем самый верхний узел в дереве.
Заходим в категорию "//С/С++ Compiler//", выбираем закладку //Preprocessor//. Здесь в поле "Additional include directories" необходимо добавить пути которые мы сформировали. Вот эти пути, добавляем их по одному c помощью диалога, вызываемого кнопкой с многоточием, либо можно скопировать пути прямо отсюда:
$PROJ_DIR$\..\..\SPL\CMSIS\CM3\CoreSupport
$PROJ_DIR$\..\..\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\inc
$PROJ_DIR$\..\..\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar
$PROJ_DIR$\..\..\SPL\MDR32F9Qx_StdPeriph_Driver\inc
$PROJ_DIR$\..\..\SPL\MDR32F9Qx_StdPeriph_Driver\src
$PROJ_DIR$\..
$PROJ_DIR$\..\..\SPL
Это и есть наши пути относительно папки проекта. При расположении прочих проектов по данной раскладке, эти пути останутся валидны.
При добавлении путей через диалоговое окно необходимо следующее, по картинке:
{{doc:iar:iar_pathes.png}}
- Пути хорошо бы добавить с относительным путем
- При добавлении пути через диалоговое окно,
- Видно, что пути получаются абсолютными.
- Кликаем на кнопку с треугольником.
- Выбираем вариант с путем относительно проекта.
=====Собираем пустой проект=====
Для компиляции минимального проекта к уже существующему файлу main.c необходимо подключить startup-файлы с таблицей векторов прерываний и т.д.
Перед подключением файлов в проект давайте заведем переменную в среде IAR, которая будет задавать путь к нашей папке с кодом IAR_CODE. В главном меню выбираем //Tools - Configure Custom Argument Variables//.
{{doc:iar:iar_toolmenu.png}}
В открывшемся окне создаем группу MDR_Lib и переменную MDR_CODE, которая будет задавать путь к нашей головной папке.
{{doc:iar:iar_code.png}}
//Если проект не был сохранен, а при первом сохранении сохраняется Workspace, то кнопки в данной форме будут неактивны. В этом случае необходимо перед заходом в данную форму нажать Save All.//
Теперь подключая файлы из нашей директории IAR_CODE, пути в проекте будут указываться относительно переменной $MDR_CODE$, следовательно при переносе проекта в другое место достаточно будет переназначить новый путь в переменной MDR_CODE.
Давайте теперь подключим файлы необходимые для компиляции пустого проекта. Для подключения файлов кликаем правой клавишей мыши на созданной нами группе Startup, выбираем Add - Add Files, и подключаем следующие файлы:
Добавляем файлы:
IAR_CODE\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar\
startup_MDR32F9Qx.s
system_MDR32F9Qx.c
system_MDR32F9Qx.h
//Удобно выделить все файлы и добавить за один раз.//
После этого проект должен собираться - меню //Project - Rebuild All//. Наблюдаем ошибок 0, на ворнинги не обращаем внимания. Библиотека не сильно подчищена для среды IAR.
Для проверки того, что файлы подключились через переменную $MDR_CODE$ кликнем правой клавишей мыши на заголовок в дереве проекта "HelloWorld - Debug" и выберем в выпадающем меню //Open Containing Folder//. Откроется окно проводника в Windows с выделенным файлом HelloWorld.ewp. Открываем его notepad-ом и листаем в самый низ, где находим как подключены наши, только что добавленные файлы:
....
Startup
$MDR_CODE$\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar\startup_MDR32F9Qx.s
$MDR_CODE$\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar\system_MDR32F9Qx.c
$MDR_CODE$\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar\system_MDR32F9Qx.h
....
Видно, что пути указаны через переменную $MDR_CODE$. Надеюсь данный подход поможет при необходимости перенести весь репозитарий с проектами, то-есть папку IAR_CODE, в новое расположение или на другой компьютер с минимальными усилиями.
=====Собираем "HelloWorld"=====
Скопируем в наш файл main.c код из проекта [[PROG:Start:HelloWord|Hello World - светодиод]]. В этом коде используются библиотечные файлы управления портами и тактовой частотой. Давайте их так же добавим в проект.
Добавляем файлы:
IAR_CODE\SPL\MDR32F9Qx_StdPeriph_Driver\src\
MDR32F9Qx_port.c
MDR32F9Qx_rst_clk.c
Подключать *.h файлы не будем, пути у нас прописаны и они найдутся сами. Компилируем проект через кнопку в меню или F7. Проект должен успешно скомпилироваться.
Для того, чтобы прошить получившуюся программу в микроконтроллер выбираем в меню //Project - Download - Download active application//. В Debug Log окне выскакивают некоторые "ворнинги", но прошивка заканчивается успешно и микроконтроллер приветствует Мир!
В случае использования программаторов Segger, при загрузке в устройство подключенное впервые, драйвера Segger запрашивают какое ядро Cortex подключено.
{{prog:iar:iar_seggercortex.png}}
Выбор должен быть таким:
* 1986ВЕ9х - //"Unspecified Cortex-M3"//.
* 1986ВЕ1Т, 1986ВЕ3Т - //"Unspecified Cortex-M1"//,
* 1986ВЕ4У - //"Unspecified Cortex-M0"//
=====SPL и пример на GitHUB=====
Данный пример мигания светодиодом можно скачать с [[https://github.com/StartMilandr/IAR_CODE|GitHub - IAR_CODE]], так же как и аналогичные реализации для 1986ВЕ1Т и 1986ВЕ3Т. В репозитории содержится библиотека SPL на которой реализованы примеры. Эта библиотека собрана из официальной версии, были лишь вырезаны файлы не относящиеся к IAR и исправлены некоторые ошибки.
=====Резюме - Quick Start=====
В итоге, для того чтобы начать работать в IAR с микроконтроллерами Миландр необходимо:
- Поставить IAR Workbench
- Запустить исталлятор Setup_MDR_IAR.exe из {{prog:spec:setup_mdr_iar.zip|архива}}, который скопирует в IAR файлы поддержки Миландр.
- Скачать SPL c примерами - [[https://github.com/StartMilandr/IAR_CODE|GitHub - IAR_CODE]]
- Для запуска примеров задать переменную среды MDR_CODE и проверить пути "С/С++ Compiler" - "Preprocessor".