Андроид. Windows. Антивирусы. Гаджеты. Железо. Игры. Интернет. Операционные системы. Программы.

Iar описание. ARM. Учебный курс. IAR EWARM. Создание проекта. Что имеет смысл переделать в контроллере

Используя разные микроконтроллеры, возникает необходимость выбрать удобную среду разработки. Нам есть из чего выбирать – будь то IAR или Keil µVision, или, даже Code Composer Studio.
Ниже пойдет речь об IAR Embedded Workbench IDE на примере STM32F10x. Эта среда разработки достаточно мощная. Имеются всякие вкусняшки.

Настройка IAR

В первую очередь нужно настроить IAR.
Основные настройки
После запуска IAR заходим в опции (Tools->Options… ). Сразу же будет выбран пункт Editor . В поле Ident size число указывает на количество пробелов при нажатии Tab. Для меня удобно использовать число 4 .
Стоит уделить внимание пункту Key Bindings . Здесь можно назначить горячие клавиши. Согласитесь, все-таки, удобно и быстро пользоваться комбинациями клавиш. Пока что, можно назначить комбинацию Ctrl+W как закрытие активных вкладок. Для этого в Menu выбираем Window и для команды Close active tab назначаем Ctrl+W .
С остальными горячими клавишами познакомимся ниже.
Настройки проекта
Допустим, создавать новый проект мы умеем (если нет, то Project->Create New Project… ). После создания проекта нам доступны две конфигурации проекта – Debug и Release . Переключаться между ними можно в окне Workspace :


Рис. 1

Удобно использовать несколько конфигураций. В конфигурации Debug можно выбрать симулятор программатора, а в Release – конкретный программатор (к примеру, J-Link). Что позволит сначала отлаживать в симуляторе, не теряя время на прошивку микроконтроллера, а потом уже прошивать под конфигурацией Release .
Добавлять новые конфигурации можно через меню: Project->Edit Configurations .
Опции самого проекта – Project->Options… (Alt+F7 ). Для открытия окна опций проекта нужно выделить сам проект в окне Workspace , иначе откроются опции того файла, который был выделен.
Настройки буду приводить для конфигурации Debug (в скобках – для Release ).
Открываем опции (Alt+F7 )

Некоторые приемы

Горячие клавиши
Поиск:
Обычный поиск – Ctrl+F
Найти дальше – F3
Поиск по файлам проекта – Ctrl+Shift+F
Шагать по найденному (или по ошибкам/ворнингам) – F4
Навигация по проекту:
Перейти к объявлению переменной (даже, если она в другом файле) – F12 - очень полезная функция!
Навигация вперед – Alt+Right
Навигация назад – Alt+Left
Разное:
Открыть header/source – Ctrl+Shift+H (или П.К.М в редакторе, и в контекстном меню выбрать Open Header/Source File )
Закомментировать выделенный блок – Ctrl+K
Разкомментировать – Ctrl+Shift+K
Выделить содержимое скобок – Ctrl+B
Автовыравнивание – Ctrl+T
Поставить/убрать Breakpoint – F9
Вставить шаблон – Ctrl+Shift+Space – тоже интересная штука.

Чтобы добавить свой шаблон, нужно открыть файл CodeTemplates.ENU.txt через меню Edit->Code Templates->Edit Templates
Теперь можно ввести примерно следующее:

#TEMPLATE "&Warning","Введите текст:"="Не забыть изменить" #warning %1

Синтаксис шаблона:

#TEMPLATE ,[=default value], ...

Знак «&» нужен для быстрого доступа (буква будет подчеркнута). Можно использовать знак «>» для создания подменю. Все интуитивно понятно.

Сохраним файл и вызовем Template menu (Ctrl+Shift+Space ). В нем выберем Warning:


Рис. 3

Введем необходимый текст:


Рис. 4

Жмякаем по кнопке OK. В результате, появится строчка:

Рис. 5

При компиляции все ворнинги и ерроры (#error <текст>) будут выводиться в окне Build .

Заключение

В этой статье были приведены основные возможности IAR, позволяющие достаточно быстро ориентироваться в проекте. Рекомендую использовать горячие клавиши. Это значительно сокращает время работы над проектом.
Буду признателен, если читатель дополнит или поправит меня.

Мы продолжаем изучение программирования микроконтроллеров STM32.



Прежде всего познакомимся с фирмой производителем — ST Microelectronics .

Переходим в раздел Products -> Microcontrollers . Выбираем вкладку STM32 ARM Cortex .

Фирма ST производит микроконтроллеры STM32 в трех основных сегментах:

  • Ультранизкопотребляющие
  • Общего назначения
  • Высокопроизводительные.

На данной схеме указано соответствие названия микроконтроллера и ядра ARM Cortex, примененного в нем.

Микроконтроллер STM32F303VCT6 , с которым нам предстоит познакомиться поближе, стоит в самой середине указанной схемы и может работать на тактовой частоте до 72 МГц. Производительность микроконтроллера оценена в 90 миллионов операций в секунду.

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

Пакет IAR может использоваться в двух режимах – это

  • режим 30-дневной полнофункциональной версии
  • режим с ограничением по объему компилируемого кода.

Для STM32 это 32 килобайта кода (из имеющихся 256 килобайт Flash-памяти). Но для учебных задач вполне достаточно, поэтому будем использовать именно этот вариант.

Запускаем скачанный архив и переходим в раздел Install IAR Embedded Workbench.


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

Дальше нам предлагается выбрать драйвера USB-устройств, которые нам понадобятся. Поскольку мы будем пользоваться программатором ST-link, я рекомендую убрать остальные драйвера, что немного ускорит процесс установки.

Устанавливаем программное обеспечение для STM микроконтроллеров, и на этом программа IAR завершает свою установку.

Теперь устанавливаем лицензионную информацию. Запускаем IAR License Manager, и нам предлагается ввести лицензионный ключ. Для этого необходимо зарегистрировать продукт на сайте IAR Systems. Если Вы уже имеете лицензионный ключ, можете ввести его. Если нет, переходим на сайт. Регистрация бесплатная. И нажимаем кнопку Register.

В соответствующей форме вводим тип лицензии – code size limited и заполняем обязательные поля. E-mail необходимо указать корректно, поскольку туда придет подтверждающее письмо. Также требуется указать отрасль, в которой будет применяться среда разработки IAR и указать производителя микроконтроллеров, для которых мы планируем применять эту среду – ST Microelectronics.
Отвечаем на несколько вопросов и подтверждаем регистрацию. Получаем соответствующее письмо подтверждения на указанный адрес электронной почты.

Лицензия успешно активирована, программа IAR готова к работе. Можем запустить IAR Systems. Выбираем язык интерфейса и видим окно среды разработки.


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

Не Keil’ом единым…
Есть такая компания, называется она IAR Systems. Делает много вещей, в том числе и среды разработки и компиляторы для различных архитектур, список которых довольно обширен. Также в числе продуктов компании есть отладчики, наборы разработчиков и т.д. Более подробно со всем этим разнообразием можно ознакомиться на их родном сайте iar.com

Нас же сейчас интересует среда для разработки приложений для архитектуры ARM, в частности Cortex-M3. Есть в их ассортименте и такой продукт и называется он EWARM, что является сокращением от Embedded Workbench for ARM, что в свою очередь, в моем вольном переводе на великий и могучий, звучит примерно как «Среда разработки для встроенных систем на архитектуре ARM», впрочем, за точность я не ручаюсь…

Данная среда поддерживает большое количество микропроцессоров и микроконтроллеров построенных на базе архитектуры ARM разных версий. Полный список можно посмотреть на их сайте Т.к. это серьезная среда разработки, то она поддерживает различные отладочные интерфейсы и средства сопряжения как производства самой IAR так и сторонних компаний, имеет встроенный отладчик, симулятор и т.д.

Но по причине отсутствия у меня какого либо девайса для внутрисхемной отладки рассказать я про все это не могу. А пользоваться симулятором как-то в голову даже не приходило. Я по старинке, пишу, заливаю в контроллер и смотрю что происходит. (Зато их есть у меня. И я вам скоро выдам пример того, какой это рулез. прим. DI HALT)

Есть мнение, что компилятор С/С++ у IAR один из самых лучших, но за это я не ручаюсь, хотя кое какие мои сравнения с Keil uVision v3 показали его превосходство.

В общем, это мощнейшая полноценная среда для разработчика. Кому интересно, изучайте описания на официальном сайте Есть ли версия для линукса я на сайте нигде не углядел, поэтому точно не скажу. (Боюсь, что как всегда;) Впрочем, там есть могучий и универсальный GCC и обязательно есть поддержка ARM. Так что если есть желающие показать старт проекта под линухом — ждем с распростертыми обьятьями. Пишите на dihalt@dihalt.ru прим. DI HALT)

На момент написания данной статьи доступна версия 6.10 (я же буду рассказывать на примере версии 5.4).

Сколько стоит данное чудо я, к сожалению, на их официальном сайте найти так и не смог, а лазить по сайтам дилеров как-то недосуг… На наше счастье, данный продукт доступен в демо режиме для ознакомления. (Я тоже полазил, не нашел. Кейл стоит около 3 килобаксов. IAR, думаю, в тех же пределах. Вполне подьемно для коммерческого применения прим. DI HALT)

И здесь есть 2 варианта

  • 1. Полнофункциональная версия с ограничением использования в 30 дней.
  • 2. Версия без ограничения по времени использования но генерирующая код не более 32Кб. Под наши ковыряния хватит с лихвой.

Обе версии, кроме того имеют следующие ограничения:

  • Они не включают исходный код библиотек.
  • Они не включают поддержку MISRA C (что это такое, к сожалению не знаю).
  • Имеют ограниченную техническую поддержку.
  • Версия с ограничением кода в 32Кб не имеет поддержки расширенной отладки (что это такое, к сожалению не знаю)

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

После установки можно приступать к созданию проекта. Запускаем IAR Embedded Workbench и видим следующее окно:

Project->Create New Project

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

Создался новый проект содержащий только один файл main.c который содержит только одну пустую функцию main(). А вы хотели большего? Дальше все ручками.

На данном этапе желательно нажать на кнопку с изображением трех дискеток или через меню

File->Save All.

File->Save All.

EWARM попросит ввести имя WorkSpace (воркспейс может содержать множество проектов) и не мудрствуя лукаво я назвал его также LEDTest.

В отличие от Keil’a EWARM не попросил указать целевое устройство и все остальное, поэтому лезем в свойства проекта и начинаем его настраивать.

По аналогии с Microsoft Visual Studio EWARM позволяет создавать произвольное число конфигураций и по умолчанию создает в проекте 2 конфигурации Debug и Release, что подразумевает 2 набора параметров, одни для компиляции кода содержащего отладочную информацию и другой для кода без нее. Выбираем наиболее подходящую для себя.

Я, например, сразу выставляю Release и настраиваю только ее, но это дело вкуса и наличия или отсутствия у вас средств отладки.

Итак, идем в меню

ST->ST STM32F10xxY

Где Y соответствует семейству имеющегося у вас микроконтроллера. Я выберу ST STM32F10xxE .


Output (вывод)
Здесь указываем что мы хотим получить навыходе, исполняемую программу или библиотеку. Оставляем без изменения – Executable. Также здесь можно прописать пути куда ложить откомпилированную программу/библиотеку, объектные файлы и файлы листингов. Меняем, если душа того просит.

Library Configuration (конфигурация runtime библиотеки языка С). Это тема отдельной телепередачи:-) но сейчас можно смело поставить None и пройти дальше.

Library options (опции стандартной библиотеки языка С)
Здесь настраивается работа функций printf и scanf. Вернее поддержка различных ключей строки форматирования. Ниже кратко расписано какая опция что поддерживает, а более подробно можно прочитать в документации идущей в комплекте с EWARM. Поддержка более сложных ключей форматирования увеличивает размер кода т.к. обработчики строки форматирования разные по сложности реализации. В данном проекте нам это не важно т.к. данными функциями мы пользоваться не будем. А в последущием я освещу данный вопрос подробнее.

MISRA-C: 2004 и MISRA-C: 1998. Настройки расширений MISRA-C. Что это такое, я честно не знаю. :-)

C/C++ Compiler (настройки компилятора С/С++)
Здесь настраивается поддержка расширений языков С/С++, режимы оптимизации компилятора, генерация отладочной информации, пути к инклудам и т.д. Здесь пока можно ничего не трогать.

Assembler
Соответственно настройки языка ассемблера. Здесь пока можно ничего не трогать.

Output Converter (конвертация вывода)
Вот это нам нужно. Дело в том, что по умолчанию EWARM генерирует исполняемый файл в формате ELF, что какбы намекает, что Unix и прочие линуксы IAR’у не чужды.

Но нам то они ни к чему, поэтому смело тыкаем галку Generate additional output (генерировать дополнительный выходной файл) и в списке Output format (формат выходного файла) выбираем подходящий для себя, вернее для используемого вами программатора, формат.

Выбор особо не велик и реально для большинства будет состоять из двух вариантов: Intel extended, в простонародье именуемый HEX или binary. Я лично пользуюсь вариантом binary. Здесь же, если того требуют ваши религиозные убеждения, можно задать имя выходного файла отличающееся от дефолтного.


Custom build (пользовательская сборка)
Здесь можно задать дополнительные утилиты и их параметры которые будут использоваться при сборке проекта, но нам это ни к чему — пропускаем.

Build Actions (действия при сборке)
Здесь можно указать команды которые нужно выполнить перед сборкой или после. Поступаем аналогично предыдущему пункту.

Категория Linker (линковщик)
Вот и добрались до второго, после указания целевого устройства, важного момента! Ибо от линковщика, вернее его настроек, очень сильно зависит запуститься ваш проект в микроконтроллере или нет т.к. именно линковщик располагает код и различные таблицы (например векторов прерываний) по нужным адресам.

Вкладка Config (конфигурация). Здесь содержится ссылка на используемый файл конфигурации линковщика. Это очень важный файл т.к. именно в нем прописана конфигурация нашего микропроцессора в части памяти (ее наличия или отсутствия, адресации и размера), размещения таблицы векторов прерываний, размеры стека и кучи. По умолчанию проставлена ссылка на файл конфигурации идущий в комплекте с EWARM’ом и едином для всех устройств на базе ядра Cortex, что не есть хорошо, т.к. устройства все разные, объемы флеша и ОЗУ у них разные и т.д. К счастью, есть возможность отредактировать этот файл самостоятельно, что дает широчайший простор творчеству, либо с использованием кнопки Edit… находящейся здесь же.


Самостоятельная конфигурация файла настроек линковщика, занятие бесспорно увлекательное и плодотворное, но оно выходит далеко за рамки данной статьи т.к. только об этом можно написать не одну статью. Подробно все описано в руководстве пользователя, идущем в комплекте с EWARM. Скажу лишь, что там можно создавать сегменты памяти, указывать их тип, размер, размещение и еще много чего. Иногда это очень нужно, но это уже в более серьезных проектах.
Поэтому ограничимся нажатием кнопочки Edit… Правда перед этим нужно решить один концептуальный вопрос.

Дело в том, что как я уже сказал выше, данный файл является заготовкой для всей архитектуры Cortex, поэтому если вы его измените, а потом захотите создать проект для другого контроллера, того-же NXP LPC17XX, то его опять придется редактировать уже под этот процессор. Тут есть 3 варианта решения:

  • Сказать себе, что кроме STM32F меня ничего не интересует и отредактировать данный файл.
  • Скопировать данный файл в той-же папочке где он лежит (а лежит он, как можно догадаться, в папке диск:путь куда установили EWARM\arm\CONFIG\) во что-то типа STM32F10XXX.icf и редактировать его.
  • Скопировать его в папочку с проектом переименовав во что-то типа STM32F10XXX.icf и редактировать его.

Итак, выбираем вариант себе по душе (я лично пользуюсь 3-им вариантом а путь прописываю так:

$PROJ_DIR$\stm32f103re.icf

$PROJ_DIR$\stm32f103re.icf

Переменная $PROJ_DIR$ разворачивается в путь до папки с проектом автоматически, т.е. путь получается относительным. Таким образом можно папку с проектами копировать потом куда угодно и файл не «потеряется» в отличие от использования жесткого пути), выбираем свой файл отредактировав путь или нажав кнопку выбора файла (кнопка с «…» справа от едита) и нажимаем кнопку Edit…

В появившемся окошке в первой вкладке Vector Table задаем адрес таблицы векторов прерываний. Что это такое, для тех кто не в курсе, я не буду раскрывать. (Я тоже не скажу:), т.к. все уже сказано в разделе про . Тут все точно также, только векторов больше. прим DI HALT)

Адрес может быть либо 0х00000000 либо 0х08000000. Я предпочитаю ставить 0х08000000 т.к. он указывает на начало внутренней флеш памяти, а адрес 0х00000000 может мэпиться на флешку а может и нет, в зависимости от состояния входов BOOT в момент инициализации контроллера, но это нужно уже курить даташит на устройство.

Вкладка Memory Regions (регионы памяти).
Здесь задается 2 важных для работы контроллера вида памяти ROM (ПЗУ) и RAM (ОЗУ) вернее их адреса начала и окончания. ROM — это наша внутренняя флеш память. Начинается она с адреса 0х08000000, это заложено в архитектуре контроллера. А вот заканчивается у каждого по разному. Зависит от объема который есть в вашем контроллере.

У меня ее 512Кб, а у вас может быть 32, 64, 128, 256. Т.е. адрес окончания этой области памяти вычисляете сами. Для меня он будет равен 0x0807FFFF (адрес начала 0x08000000 + размер флеша (512*1024) – 1 в шестнадцатеричном формате). Для вас это может быть 0x08007FFF, 0x0800FFFF, 0x0801FFFF и т.д. Желательно указывать точный размер чтобы полученная прошивка не превысила этот размер, а так линковщик ругнется в случае чего. Но нам это не грозит пока. Аналогично заполняем поля для RAM, зная из чтения даташита, что она начинается с адреса 0x20000000 и посчитав где она закончится.

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

Вкладка Stack/Heap Sizes (размеры стека и кучи)
Параметры говорящие сами за себя.
Стек нужен для передачи параметров функциям, сохранения точек возврата из них и т.д. Сильно большим его делать не имеет смысла т.к. зря будет расходоваться ОЗУ, а если сделать сильно маленьким, то может не хватить (особенно если будет использоваться много вложенных функций). Поставим его равным 0x200 т.е. 512 байт. В нашем проекте этого более чем достаточно.
Куча – это часть ОЗУ выделенная для функций работы с памятью языка С/С++ таких как malloc, оператор new и т.д. В данном проекте мы их использовать не планируем, поэтому ставим 0.

Все, нажимаем кнопочку Save.

В остальных вкладках категории Linker настраиваются подключаемые внешние библиотеки, пути к ним, настройка имени выходного файла, настройки генерации листингов, расчета контрольных сумм и т.д. Нам в данном проекте ничего из этого не понадобиться, а объяснять все слишком долго. Будут конкретные вопросы — спрашивайте в комментах.

Категория Debuger (отладчик)
Здесь настраиваются аппаратные средства внутрисхемной отладки либо отладка в симуляторе. Как я уже говорил, аппаратных средств у меня нет, а симулятором я не пользуюсь. Поэтому рассказать тут особо ничего не могу.

С облегчением жмем кнопку Ок справа-внизу окошка, и применяем выбранные параметры.

Теперь можно смело нажать кнопку F7 или в меню

Project->Make

Project->Make

и откомпилировать наш проект.

В папочке которую вы указали для выходных файлов программы (если ничего не меняли, то это будет, в зависимости от выбранной конфигурации, папка Debug/exe либо Release/exe в папке с проектом) увидим 2 файла. Один с раширением.out и второй.bin или.hex, в зависимости от того, что вы указали в качестве дополнительного выходного файла.

Все, наша первая программа готова! Можно прошивать ее в контроллер и она заработает! Не верите? А вы попробуйте.

На этом позвольте закончить мою первую статью т.к. она и так получилась не маленькой. А к написанию более функционально насыщенной программы мы перейдем на следующем нашем шаге.

PS:
Хочу еще пару слов сказать о прошивке контроллера. Как я написал в эпиграфе, если ничего нет, но очень хочется… Если у вас нет аппаратного прошивальщика и/или отладчика, то это не большая проблема. Дело в том, что прошить контроллер STM32F можно с использованием обычного интерфейса USART, в простонародье это называется через COM порт. В идеале, если на плате с микроконтроллером распаян преобразователь уровней USART в TTL и заведен на порт USART1 контроллера (ножки PA.8 PA.9). Если нет, то тоже не большая беда. Можно немного распотрошить любой кабель-переходник USBCOM (в крайнем случае покупается в магазине), там внутри стоит микросхема с TTL уровнями, и пользоваться им подключаясь напрямую к ножкам контроллера. Про выставление уровней BOOT0/1 и как входить в режим бутлоадера можно узнать из даташита. А прошивать можно программой Flash Loader Demo производства самой ST Microelectronics. Я пользуюсь именно ей. Правда почему-то найти ее на сайте ST невозможно, поэтому прикладываю ее к своей статье, спасибо за нее нашим китайским братьям!

FAQ. Компилятор IAR C для микроконтроллеров AVR фирмы Atmel

В. Полетаев

Frequently asked questions
ответы на часто задаваемые вопросы по компилятору IAR C для микроконтроллеров AVR фирмы Atmel дает В. Полетаев (vmp@aha.ru)

Компилятор IAR C для микроконтроллеров AVR фирмы Atmel

Существует несколько версий компилятора - 1.40, 1.41, 1.50, но по некоторым причинам наибольшее распространение в России получила версия 1.40c. Версия компилятора смотрится в файле ewa90d.txt - не путать с версией оболочки.

Вопрос: Я установил IAR Embedded Workbench и “патчи” к нему. Что мне ещё нужно?

Ответ: Версия 1.40 поставляется с не совсем корректными.xcl-файлами для линкера. Кроме того, описания регистров микроконтроллеров в нём неполные. Для нормальной работы имеет смысл либо взять комплект.xcl- и h-файлов от более новой версии компилятора, либо с сайта фирмы Atmel (ftp://www.atmel.com/pub/atmel/avr030.zip ; ftp://www.atmel.com/pub/atmel/io_def.zip).

Файлы из этих архивов следует переписать в соответствующие каталоги вместо поставлявшихся с компилятором.

При работе в Embedded workshop правильное имя.xcl-файла следует указывать отдельно для каждой target в Project|Options|XLINK|Include|XCL file name, включив Override default.

Вопрос: С чего начать?

Кроме того, рекомендуется посетить на сайте фирмы Atmel раздел http://www.atmel.com/atmel/products/prod201.htm и скачать оттуда ряд документов:

  • AVR030: Getting Started With C for AVR (http://www.atmel.com/atmel/acrobat/doc1483.pdf). Хороший пример для быстрого начала работы. В качестве приложения к нему идёт ftp://www.atmel.com/pub/atmel/avr030.zip - сборник правильных.xcl-файлов для различных конфигураций микроконтроллеров.
  • AVR032: Linker Command Files for the IAR ICCA90 Compiler (http://www.atmel.com/atmel/acrobat/doc1079.pdf). Здесь описывается, как составлять.xcl-файлы. Просто пересказ документации от IAR. Как приложение идёт ещё один пример с.xcl-файлами, но более ранний. Лучше пользоваться вариантом от Getting Started.

В этом разделе есть ещё ряд документов, посвящённых работе с Си и заслуживающих внимательного ознакомления, из которых особенно отмечу AVR035: Efficient C Coding for AVR (http://www.atmel.com/atmel/acrobat/doc1497.pdf).

Для эффективной работы следует также взять с http://www.atmel.com/atmel/products/prod200.htm последнюю редакцию datasheet и errata на выбранный микроконтроллер и тщательно их изучить, особенно errata.

Вопрос: Отличается ли IAR C от стандартного ANSI C?

Ответ: Да. В IAR C входят различные расширения, связанные с реализацией компилятора для микропроцессора с гарвардской архитектурой (два адресных пространства - для кода и данных) и для более эффективной работы в ограниченных условиях микроконтроллеров. Подробнее смотрите AT90S C Compiler Programming Help, раздел Language extensions.

В исполняющей системе (библиотеке) отсутствуют функции, связанные с вызовами операционной системы (операции с файлами и пр.).

Вопрос: Можно ли разместить таблицы (строки и т. д.) в ПЗУ?

Ответ: Можно. Для этого существует расширение языка - зарезервированное слово flash. Переменная, описанная с применением данного слова, размещается в адресном пространстве кода и доступна только по чтению.

Flash char aaa = “aaa”; flash char bbb = “bbb”; flash char ccc = “ccc”; flash char flash *xxx = {aaa, bbb, ccc, 0};

Если используется более чем один уровень вложенности, как в вышеприведённом примере (массив указателей на строки), то flash должен стоять для каждого уровня.

Вопрос: Как передать строку char flash * в функцию? Прямое написание строки в параметрах функции не проходит: printf_P(“Строка\n”);

Ответ: Вариант 1.

Описать её отдельно:

{ static flash char str = “Строка\n”; printf_P(str); }

Вариант 2. Пользоваться явным преобразованием типа:

Printf_P((char flash *)(int)“Строка\n”);

Можно слегка сократить запись при помощи #define:

#define F (char flash *)(int) printf_P(F“Строка\n”);

В этом варианте строка будет размещаться в сегменте CSTR. По умолчанию данный сегмент размещается в адресном пространстве данных, поэтому для корректной работы надо исправить XCL-файл. Надо убрать упоминание CSTR из строки:

Z(DATA)CSTR,CONST=9000-FFFF

(если эта строка присутствует в исходном XCL-файле) и вставить его в строку:

Z(CODE)INTVEC,RCODE,CDATA0, CDATA1,CCSTR,SWITCH, FLASH,CODE=0-1FFFF

Вариант 3. Использовать ключ –E.

Этот вариант возможен только при работе с компилятором из командной строки. После указания данного ключа компилятор размещает строковые данные в сегменте CSTR и данные типа const - в CONST, причём считает, что эти сегменты расположены в адресном пространстве кода.

В этом варианте также требуется исправление XCL-файла с переносом CSTR и CONST в строку -Z(CODE).

Кроме того, в этом варианте могут возникнуть проблемы с использованием библиотеки, оттранслированной без ключа –E.

Ну и наконец, в этом варианте компилятор выдаёт предупреждающее сообщение Dangerous configuration, которое можно отключить только вместе со всеми предупреждениями, что неудобно.

На мой взгяд, наиболее приемлимыми являются первый и второй варианты.

Вопрос: Как преобразовать указатель char * в char flash *?

Ответ: Воспользоваться промежуточным int:

Char *s; char flash *p; p = (char flash *)(int)s;

Вопрос: Где размещаются переменные типа const?

Ответ: Это зависит от установленных опций компилятора. По умолчанию (если не задан ни один из параметров –y или –E) эти переменные размещаются в сегменте CONST, который считается находящимся в адресном пространстве данных. Данный режим делался с расчётом на использование внешней энергонезависимой памяти данных и в большинстве случаев не применяется. Кроме того, в этом режиме компоновщик помещает эти переменные в область кода по тем же адресам, что может вызвать серьёзные проблемы.

Если установлен режим –y –“Writable constants and strings”, то компилятор строит код в полном соотвествии со стандартом ANSI, размещая константы и строки в адресном пространстве данных. Их начальные значения сохраняются в адресном пространстве кода в сегментах CDATA0 или CDATA1 для констант и CCSTR - для строк, а в момент запуска они переписываются в ОЗУ в сегменты IDATA0/IDATA1 и ECSTR, соответственно. Основной недостаток данного режима - непроизводительное использование ОЗУ.

Вариант с указанием ключа –E рассматривался выше. Одновременное использование ключей –y и –E невозможно.

Для написания оптимального варианта программы лучше не пользоваться const, а описывать неизменяемые данные как flash, что приведёт к их явному размещению в памяти программ без лишнего расхода ОЗУ.

Вопрос: Как удобнее работать с битами в регистрах внешних устройств?

Ответ: Для начала описать полезный макрос:

#define Bit(n) (1 << (n)) Для установки бита n в порту p: p |= Bit(n); Для сброса бита: p &= ~Bit(n); Для проверки бита: if ((p & Bit(n)) != 0) ...

Полный перечень всех битов доступен на сайте фирмы Atmel в разделе software, файл io_def.zip. Следует поместить эти.h-файлы из этого архива в каталог C:\IAR\EW22DEMO\A90\INC\ вместо существующих.

Вопрос: У меня не работает printf. Что делать для правильного вывода информации в последовательный порт?

Ответ: Во-первых, включить в свою программу отдельную функцию putchar:

Int putchar(int c) { while ((USR & (1 << UDRE)) == 0); UDR = c; return c; }

Стандартный putchar в библиотеке представляет один оператор RET и не выполняет никакого вывода.

Для доступа к именованным названиям битов регистров следует взять правильный.h-файл из io_def.zip.

Эту функцию следует включать только при компиляции под target=release, иначе под отладчиком может отказаться работать окно Terminal I/O. Простейший способ это сделать - определить для target=debug символ DEBUG (Project|Options|ICCA90|#define, ввести символ) и окружить определение putchar директивами условной компиляции (например, #ifndef DEBUG … #endif).

Во-вторых, следует вставить в начало своей программы процедуру установки скорости обмена последовательного порта. Например, для кварца 5,53 МГц и скорости обмена 115200 бод надо установить:

UBRR = 2; UCR = 0x18;

В-третьих, обычный printf будет работать только с включенным режимом –y –“Writable constants and strings”.

В-четвёртых, надо правильно выбрать вариант функции printf. Подробности смотрите в AT90S C Compiler Programming Help, Configuration, Input and output.

Стандартная функция printf требует для своей работы минимум 134 байт ОЗУ в стеке. Это страшное расточительство, поэтому есть сокращённые версии printf, обладающие значительно меньшими возможностями форматирования (в частности, не поддерживают задание поля ширины вывода), зато не требующие для работы так много ОЗУ.

В качестве окончательного решения проблемы я бы порекомендовал сделать следующее:

Взять за основу файл C:\IAR\ \EW22DEMO\A90\ETC\intwri.c и произвести в нём следующие изменения:

  • добавить строку #include “pgmspace.h”;
  • заменить описание функции на int printf_P (const char flash *format, ...);
  • изменить тип массива hex с const на flash: static flash char hex = “0123456789ABCDEF”.

После этого не забыть внести нужные изменения в XCL-файл (перенести CSTR в раздел CODE).

Разумеется, надо вставить putchar и инициализацию порта.

После этого забыть про существование printf и пользоваться только printf_P.

Вопрос: Мне не хватает ОЗУ. Что делать?

Если кратко - включить оптимизацию по размеру. По возможности, использовать байтовые (char) переменные. Hе перегружать стек локальными переменными большого размера. Стараться делать функции большого (в меру!) размера - так компилятор разложит максимум переменных по регистрам. Об эффективности лучше судить по листингу с включенным режимом insert mnemonics. Передавать в функции лучше не более 2 входных переменных - так они лягут в регистры. Размещать константы в ПЗУ, с ключевым словом flash.

Внимательно изучить используемый.xcl-файл - он приведён в поставке только для примера и кое-где неэффективен. Поставить нижнюю границу всех DATA сегментов (RSTACK, CSTACK, IDATA1, UDATA1, ECSTR) в 60 - так будет достигнуто полное, без дырок, использование ОЗУ. Уточнить размеры аппаратного (RSTACK) и программного (CSTACK) стеков.

Вопрос: У меня не работает порт A. Почему?

Ответ: Порт A используется как шина адреса-данных при работе с внешним ОЗУ. Если оно не используется, то в.xcl-файле следует закомментировать строку -e?RSTACK_IN_EXTERNAL_RAM=? C_STARTUP.

Вопрос: Можно ли создать выходной файл в двоичном виде?

Ответ: Да. Для этого следует указать в качестве выходного формата mpds. Полученный файл с расширением.tsk и будет образом ПЗУ.

Вопрос: Как заменить библиотечный модуль на свой?

Ответ: Проще всего поместить исходный файл с ним в свой рабочий каталог проекта и подключить его к файлу проекта. Дальше оболочка сама разберётся с его типом (.c или.s90) и позаботится о его пристыковке раньше библиотечного.

Вопрос: Как лучше отлаживать программу?

Ответ: Если нужно отладить алгоритм, не зависимый от работы периферии, можно воспользоваться C-SPY. Преимущество - отладка на уровне исходного текста (но можно посмотреть и ассемблерный текст), недостаток - периферия практически отсутствует.

Если нужна работа со стандартной периферией, можно воспользоваться Atmel AVR studio 3.0, которая достаточно точно эмулирует поведение кристаллов. Для передачи в неё файла следует указать xlink’у тип выходного формата debug. Если в окне исходного текста в Astudio символы искажены, то следует установить подходящий моноширинный фонт (например, terminal для ДОС-кодировки русских букв или Courier для Windows) в меню Edit|Fonts… ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel - пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah.

Вопрос: EWA90 работает только под Windows?

Ответ: Оболочка - да. Однако есть command-line версии компилятора, ассемблера и компоновщика, которые прекрасно работают под MS-DOS, используя встроенный DOS Extender от Phar Lap Software, Inc.

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

Вопрос: Периодически при компиляции совершенно правильного файла выдаётся системная ошибка. Что делать?

Ответ: Повторить компиляцию. Это какая-то ошибка в компиляторе, которая иногда возникает.

Ответ: На российском сайте фирмы Atmel есть подборка практических рекомендаций: http://www.atmel.ru/AVR/AVR.htm и http://www.atmel.ru/Spec/Spec.htm .

Ответы на вопросы по AVR, задаваемые посетителями сайта ATMEL, можно найти на http://www.atmel.ru/FAQ/FAQ.htm .

Можно задать вопросы российским представителям Atmel - фирме ЭФО через конференцию Atmel на сайте http://www.efo.ru .

Большое число специалистов по AVR регулярно общается и в конференции по микроконтроллерам на сайте Телесистем -

На этом уроке мы создадим первый проект для STM32.



Запускаем STM32CubeMX и выбираем New Project.
В появившемся окне мы можем выбрать тип микроконтроллера… или отладочную плату.
Первый проект создадим для отладочной платы.
В дальнейшем я покажу, как работать непосредственно с микроконтроллером, установленным на ней.
Выбираем Board Selector ST Microelectronics, тип платы – Discovery. Серию микроконтроллера можно выбрать по типу микроконтроллера. Выбираем STM32F3Discovery и нажимаем OK.


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


Питание микроконтроллера подается на выводы VDD (верхний уровень) и VSS (нижний уровень) и составляет стандартно от 2 до 3.6 В. Для отладочной платы это 3.3В.

Оставим для первого проекта все по умолчанию и перейдем в следующую вкладку – Clock Configuration – конфигурация тактирования.


Система тактирования поддерживает 4 типа тактового генератора.
Внешний низкочастотный генератор, который на отладочной плате, к сожалению, не запаян, внутренний низкочастотный генератор 40кГц, внутренний высокочастотный генератор 8МГц и внешний высокочастотный генератор. Давайте для этого проекта выберем внутренний высокочастотный генератор в качестве опорного сигнала и оставим все остальное по умолчанию.

Следующая вкладка – Configuration – это конфигурация тех периферийных модулей, которые мы выбрали в начале. Поскольку этот проект у нас будет пустым, то и настраивать мы здесь ничего не будем.


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


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

Дальше выбираем меню Project ->. В появившемся окне мы выбираем, куда будет сохранен проект, задаем имя проекта и выбираем ту среду разработки, для которой будет сгенерирован файл проекта. В данном случае мы будем использовать Embedded Workbench for ARM – IAR. Все остальное оставляем по умолчанию и нажимаем OK.

Выдается сообщение, что код успешно сгенерирован, и мы можем открыть проект в IAR.

Работа с проектом в IAR

В левой части окна отображаются 3 папки.


Первая папка – Application – состоит из двух подпапок. Первая подпапка включает файл startup_*.s , написанный на языке ассемблера, который предназначен для начальной конфигурации микроконтроллера, а также содержит таблицу векторов прерываний. Вторая подпапка – User – содержит файлы пользователя.
Основной текст программы будет размещаться в файле main.c . Здесь подключается библиотечный файл *_hal.h . Для тех, кто не знаком с языком Си, скажу, что директива include используется для подключения библиотечных файлов, которые, как правило, имеют расширение .h .
И далее идет описание конфигурационных функций, которые предоставляет нам Cube.

В языке Си главная исполняемая функция имеет имя main() . Именно здесь и расположено само тело программы.
Как правило, любая программа для микроконтроллера состоит из двух частей:

  • инициализации
  • бесконечного цикла.

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

В части инициализации в данном случае вызываются функции инициализации HAL-драйверов, системного тактирования и портов ввода-вывода.
Ниже функции main() идут сами функции конфигурации, которые сгенерировал конфигуратор Cube.

В файле main.c есть комментарии, обозначающие начало и конец пользовательского кода:

  • USER CODE BEGIN
  • USER CODE END

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

Второй файл, который содержит подпапка User – это *_hal_msp.c – предназначен для низкоуровневой инициализации, и, в частности, конфигурации векторов прерываний. Пока мы на нем подробно останавливаться не будем.
И третий файл – это файл с аббревиатурой *_it.c в конце – это файл, который будет содержать обработчики прерываний. В данном случае у нас никаких прерываний кроме системного таймера нет, поэтому здесь – всего одна функция. И тоже выделены участки, куда можно вставлять пользовательский код.

Вторая папка – это папка драйверов. Она содержит в себе две подпапки – это

  • драйвера ядра CMSIS
  • HAL -драйвера

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

Если мы посмотрим на список заголовочных файлов любого Си-файла проекта, то увидим довольно внушительный перечень. Сейчас остановимся более подробно на файле stdint.h .
Это файл переопределения типов. Конечно, компилятор IAR будет поддерживать стандартные типы языка Си, такие как char , int , long , но рекомендуется во избежание путаницы придерживаться переопределенных типов. Тем более, что стандартный тип int в этом компиляторе занимает 16 бит, long – 32 бита, а для 64-битных данных вообще нет стандартного типа.

Согласно переопределению типов, представленному в файле stdint.h , число типа int может быть четырех размерностей – 8, 16, 32 и 64 бита и соответственно может быть представлено в знаковой или беззнаковой форме. Так вот, чтобы не путаться с размерностью типов рекомендуется все-таки придерживаться переопределенной типизации.

Теперь зайдем в настройки проекта Правая кнопка-> Options . Здесь уже выбран тип микроконтроллера и его ядро.

Во вкладке Си/С++ компиляторы ->Оптимизация кода установлена по умолчанию высокая степень оптимизации. Я рекомендую для учебных задач поставить или низкую оптимизацию кода, или вообще убрать ее, потому что в случае высокой оптимизации кода выполнение проекта по шагам будет затруднительно.


Ну и еще войдем во вкладку Output Converter и выберем здесь Generate Additional Output , Intel-Extended , Overwrite Default . В результате при компиляции проекта мы получим hex -файл, который можно загрузить во Flash-память микроконтроллера, не используя отладчик.


Попробуем скомпилировать проект. Выбираем меню Project->Rebuild All . Мы видим, как проект постепенно подгружает все hal-драйвера. И в итоге выдает нам сообщение, что нет ни ошибок, ни предупреждений.


Компиляция прошла успешно, проект готов к использованию.

Похожие публикации