До того, как ARM купила компанию Keil, лучшими практически по всем показателям были компиляторы от IAR Systems. Сейчас ситуация выровнялась и по некоторым тестам компилятор от Keil даже превосходит компилятор от IAR. Но тем, кто привык работать в IAR нет большого смысла осваивать новую среду.
Миландр предоставляет файлы поддержки своих микроконтроллеров для среды IAR, но подключение этих библиотек не так очевидно, как в случае PACK для Keil. Эта статья будет посвящена тому, как начать работать с микроконтроллерами Миландр в среде IAR. Напишем обычный "HelloWorld", то есть помигаем светодиодами.
В разделе Резюме - Quick Start представлен краткий перечень необходимых действий для начала работы в IAR Workbench. Следование предложенному там варианту сэкономит время на чтение всей статьи.
Скачать архив среды можно с сайта IAR for ARM. На главной странице надо выбрать "… tool for ARM", тогда появится пункт "ARM. Download a free trial" и кнопка "Download Software, Version 8.11". На момент написания статьи актуальной была версия 8.11.2.
После скачивания архива запускаем инсталлятор, соглашаемся с лицензией и выбираем поддержку внутрисхемных отладчиков из списка. Я поставил по умолчанию все, что предлагалось при инсталляции.
При первом запуске среды IAR открывается приветственное окно с выбором лицензии. Лицензионного ключа я нас нет, поэтому выбираем пункт с ознакомительной лицензией.
В следующем окне необходимо нажать Register, после чего откроется окно браузера, где необходимо выбрать лицензию. Доступно два варианта - полная версия на 30 дней, или ограниченная по размеру кода, но бессрочная лицензия. Для демо примеров достаточно урезанной по коду версии. Далее необходимо заполнить регистрационные данные, в том числе Email, на который будет выслана ссылка для подтверждения регистрации.
Заполняем регистрационную форму с присущей нам фантазией, нажимаем Ок и дожидаемся письма. В письме кликаем на ссылку для подтверждения и в браузере открывается окно с кодом лицензии для продолжения инсталляции. Вбиваем код в окно инсталлятора и далее все по умолчанию.
Теперь необходимо скачать файлы поддержки от производителя. Заходим сюда, открываем плюсом раздел "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 и простейшие проекты мигания светодиодом для некоторых микроконтроллеров.
Теперь среда готова для создания первого проекта.
Создаем новый проект, выбираем язык Си.
Проект я сохраняю в созданную мной директорию C:\CODE\IAR_CODE\1986BE9x\HelloWorld, название проекта указываю такое-же "HelloWorld". Про организацию папок будет рассказано ниже - "Организация папок проекта и SPL".
Создастся проект с пустой реализацией функции main. Откроем опции проекта и настроим его под конкретный микроконтроллер, выбираем пункт меню или жмем Alt+F7. Далее приведу только те опции, которые необходимо поменять, все остальное остается по умолчанию. По вкладкам:
Здесь необходимо выбрать файл задающий раскладку памяти для МК. Этот файл MDR32F1.icf мы копировали ранее при установке SPL. Определение $TOOLKIT_DIR$ как раз содержит путь к директории установки, в которую мы копировали папки Milandr.
C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\Milandr\MDR1986VE9х\MDR32F1.icf
Области памяти можно скорректировать, нажав Edit, но тогда лучше сохранить измененную версию под новым именем, чтобы оставить рабочим исходный вариант.
В закладке Setup необходимо выбрать наш отладчик, J-link уже присутствует в списке, выбираем его. Отладчика Ulink2 нет в списке, видимо необходимо ставить дополнительно. Кроме этого необходимо выбрать приведенные на картинке ниже файлы FlashMDR32F1x.mac и jbr_1986BE9x.ddf, которые мы так же копировали при установке SPL.
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.
C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\Milandr\MDR1986VE9x\FlashMDR32F1x.board
В данном окне выставим опции аналогичные тем, что мы выставляем для данного отладчика в среде Keil. Укажем стартовую частоту микроконтроллера 8МГц и выставим Reset Pin. Далее можно выбрать использование Jtag или SWD, а так же увеличить скорость подключения, но мне сейчас это не критично, поэтому оставил по умолчанию.
После внесения изменений, да и вообще периодически, полезно нажимать кнопку Save All. При первом сохранении IAR предложит сохранить Workspace текущего проекта, сохраняем под таким же "HelloWord"-ом. При следующих запусках среды выбираем File - Recent Workspaces и IDE открывается в состоянии в котором мы ее оставили.
При организации проекта я руководствовался данной статьей IAR EWARM. Создание проекта часть 2. CMSIS и Standard Peripherals Library.
Полагаясь на рекомендации статьи раскладывать исходники по папочкам, я завел группы аналогично тем, что создает Keil по умолчанию - Startup и Driver. Приведу сразу конечный вид дерева проекта и выпадающее меню, показывающее как создавать группу.
Согласно статье, я так же создал отдельную папку 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
Это и есть наши пути относительно папки проекта. При расположении прочих проектов по данной раскладке, эти пути останутся валидны.
При добавлении путей через диалоговое окно необходимо следующее, по картинке:
Для компиляции минимального проекта к уже существующему файлу main.c необходимо подключить startup-файлы с таблицей векторов прерываний и т.д.
Перед подключением файлов в проект давайте заведем переменную в среде IAR, которая будет задавать путь к нашей папке с кодом IAR_CODE. В главном меню выбираем Tools - Configure Custom Argument Variables.
В открывшемся окне создаем группу MDR_Lib и переменную MDR_CODE, которая будет задавать путь к нашей головной папке.
Если проект не был сохранен, а при первом сохранении сохраняется 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-ом и листаем в самый низ, где находим как подключены наши, только что добавленные файлы:
.... <group> <name>Startup</name> <file> <name>$MDR_CODE$\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar\startup_MDR32F9Qx.s</name> </file> <file> <name>$MDR_CODE$\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar\system_MDR32F9Qx.c</name> </file> <file> <name>$MDR_CODE$\SPL\CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\iar\system_MDR32F9Qx.h</name> </file> </group> ....
Видно, что пути указаны через переменную $MDR_CODE$. Надеюсь данный подход поможет при необходимости перенести весь репозитарий с проектами, то-есть папку IAR_CODE, в новое расположение или на другой компьютер с минимальными усилиями.
Скопируем в наш файл main.c код из проекта 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 подключено.
Выбор должен быть таким:
Данный пример мигания светодиодом можно скачать с GitHub - IAR_CODE, так же как и аналогичные реализации для 1986ВЕ1Т и 1986ВЕ3Т. В репозитории содержится библиотека SPL на которой реализованы примеры. Эта библиотека собрана из официальной версии, были лишь вырезаны файлы не относящиеся к IAR и исправлены некоторые ошибки.
В итоге, для того чтобы начать работать в IAR с микроконтроллерами Миландр необходимо: