Iar описание. ARM. Учебный курс. IAR EWARM. Создание проекта. Что имеет смысл переделать в контроллере
Ниже пойдет речь об 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-драйвера. И в итоге выдает нам сообщение, что нет ни ошибок, ни предупреждений.
Компиляция прошла успешно, проект готов к использованию.