Содержание

Создаем проект в среде IAR

До того, как ARM купила компанию Keil, лучшими практически по всем показателям были компиляторы от IAR Systems. Сейчас ситуация выровнялась и по некоторым тестам компилятор от Keil даже превосходит компилятор от IAR. Но тем, кто привык работать в IAR нет большого смысла осваивать новую среду.

Миландр предоставляет файлы поддержки своих микроконтроллеров для среды IAR, но подключение этих библиотек не так очевидно, как в случае PACK для Keil. Эта статья будет посвящена тому, как начать работать с микроконтроллерами Миландр в среде IAR. Напишем обычный "HelloWorld", то есть помигаем светодиодами.

В разделе Резюме - Quick Start представлен краткий перечень необходимых действий для начала работы в IAR Workbench. Следование предложенному там варианту сэкономит время на чтение всей статьи.

Установка IAR Embeded Workbench

Скачать архив среды можно с сайта IAR for ARM. На главной странице надо выбрать "… tool for ARM", тогда появится пункт "ARM. Download a free trial" и кнопка "Download Software, Version 8.11". На момент написания статьи актуальной была версия 8.11.2.

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

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

В следующем окне необходимо нажать Register, после чего откроется окно браузера, где необходимо выбрать лицензию. Доступно два варианта - полная версия на 30 дней, или ограниченная по размеру кода, но бессрочная лицензия. Для демо примеров достаточно урезанной по коду версии. Далее необходимо заполнить регистрационные данные, в том числе Email, на который будет выслана ссылка для подтверждения регистрации.

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

Установка SPL (Standard Peripherial Library) от Миландр

Теперь необходимо скачать файлы поддержки от производителя. Заходим сюда, открываем плюсом раздел "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У

Создаем новый проект, выбираем язык Си.

Проект я сохраняю в созданную мной директорию C:\CODE\IAR_CODE\1986BE9x\HelloWorld, название проекта указываю такое-же "HelloWorld". Про организацию папок будет рассказано ниже - "Организация папок проекта и SPL".

Создастся проект с пустой реализацией функции main. Откроем опции проекта и настроим его под конкретный микроконтроллер, выбираем пункт меню или жмем Alt+F7. Далее приведу только те опции, которые необходимо поменять, все остальное остается по умолчанию. По вкладкам:

General Options

Выбираем наш микроконтроллер, 1986ВЕ92У относится к группе 1986ВЕ9х.

Output Converter

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

Linker

Здесь необходимо выбрать файл задающий раскладку памяти для МК. Этот файл MDR32F1.icf мы копировали ранее при установке SPL. Определение $TOOLKIT_DIR$ как раз содержит путь к директории установки, в которую мы копировали папки Milandr.

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.

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 открывается в состоянии в котором мы ее оставили.

Организация папок проекта и SPL

При организации проекта я руководствовался данной статьей 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

Это и есть наши пути относительно папки проекта. При расположении прочих проектов по данной раскладке, эти пути останутся валидны.

При добавлении путей через диалоговое окно необходимо следующее, по картинке:

  1. Пути хорошо бы добавить с относительным путем
  2. При добавлении пути через диалоговое окно,
  3. Видно, что пути получаются абсолютными.
  4. Кликаем на кнопку с треугольником.
  5. Выбираем вариант с путем относительно проекта.

Собираем пустой проект

Для компиляции минимального проекта к уже существующему файлу 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, в новое расположение или на другой компьютер с минимальными усилиями.

Собираем "HelloWorld"

Скопируем в наш файл 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 подключено.

Выбор должен быть таким:

SPL и пример на GitHUB

Данный пример мигания светодиодом можно скачать с GitHub - IAR_CODE, так же как и аналогичные реализации для 1986ВЕ1Т и 1986ВЕ3Т. В репозитории содержится библиотека SPL на которой реализованы примеры. Эта библиотека собрана из официальной версии, были лишь вырезаны файлы не относящиеся к IAR и исправлены некоторые ошибки.

Резюме - Quick Start

В итоге, для того чтобы начать работать в IAR с микроконтроллерами Миландр необходимо:

  1. Поставить IAR Workbench
  2. Запустить исталлятор Setup_MDR_IAR.exe из архива, который скопирует в IAR файлы поддержки Миландр.
  3. Скачать SPL c примерами - GitHub - IAR_CODE
  4. Для запуска примеров задать переменную среды MDR_CODE и проверить пути "С/С++ Compiler" - "Preprocessor".