======Создаем проект в среде 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".