Руководство пользователя keil

Интегрированная
система предназначена:

  • для
    проектирования программного обеспечения
    путем формиро­вания
    текстов программ на одном из языков
    программирования (ассемблер
    или Си) в специализированном текстовом
    редакторе:

  • компиляции
    с получением исполнимого кода для
    микроконтрол­лера:

  • формирования
    модели работы портов ввода — вывода,
    тестирова­ния
    программ микроконтроллера путем
    симуляции их выполне­ния:

  • загрузки
    программ из компьютера в микроконтроллерную
    систему через интер­фейсы
    различных типов:

  • обмена
    данными между персональными ЭВМ и
    микроконтрол­лерной
    системой в реальном времени.

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

Проект

это совокупность файлов, которые
составляют некоторую разработку
и фактически являются элементами
описания прикладной
про­граммы
для
выбранного микроконтроллера. Таким
образом, каждый файл проекта может быть
сформирован пользователем. Обычно в
проекте поддер­живается организация
прикладной программы для микроконтроллера
на ос­нове модульного подхода, то есть
прикладная программа может состоять
из произвольного количества программных
модулей (файлов), которые содер­жат
взаимные ссылки. Целевые файлы проекта
формируются автоматически системой
из исходных файлов в процессе построения
при компиляции.
При
построении
проекта на основе исходных файлов
формируются промежуточ­ные
файлы, файлы, которые используются при
симуляции, а также исполни­мые
файлы в определенных форматах.

Базовым
понятием является также понятие модели
контроллера.
Мо­дель
контроллера определяет совокупность
аппаратных ресурсов, которые учитываются
компилятором и симулятором в составе
системы. Каждая мо­дель контроллера
соответствует аппаратной структуре
определенной моди­фикации
физического микроконтроллера семейства
MCS-51.
Таким образом, модель
микроконтроллера — это совокупность
следующих параметров:

  • объемы внутренней
    и внешней памяти программ и данных;

  • номенклатура
    и количество компонентов периферии,
    используе­мых
    в данной модификации микроконтроллера:

  • конфигурационные
    параметры, используемые при симуляции,
    например,
    размер и скорость доступа для модели
    памяти EEPROM.

С
каждым проектом связывается определенная
модель микрокон­троллера,
для которого создается программа в этом
проекте. Таким образом,

параметры
модели непосредственно влияют на процесс
компиляции
про­граммы
и симуляцию ее выполнения при тестировании.

Для
систем с микроконтроллерами 8051 разработаны
мощные инструментальные средства,
позволяющие снизить до минимума время
разработки и отладки программного
обеспечения. Среди прочих лидирующие
позиции занимают программные средства,
разработанные фирмой Keil. Инструментальные
средства этой фирмы включают целый ряд
мощных приложений, таких как компилятор
языка Cи для микроконтроллеров 8051,
известный под названием Keil C51, макроассемблер
A51, совместимый с ASM-51, и наконец, удобная
графическая оболочка для разработки и
отладки программ Keil uVision.

Среда
разработки Keil uVision (в настоящее время
используются версии 3 и 4) позволяет
создавать сколь угодно сложные проекты,
состоящие из разных модулей, написанных
как на C, так и на языке ассемблера,
подключать библиотеки функций и т.д.
Кроме того, эта среда включает удобный
отладчик (симулятор), позволяющий оценить
и быстро проверить работоспособность
программы. Хотя при разработке программ
можно обойтись только командной строкой,
откомпилировав и собрав программу вне
среды Keil uVision, графическая среда разработки
все же более удобна, поскольку позволяет
автоматизировать сборку программ и
проверить их работоспособность с помощью
отладчика.

Для
разработки и отладки программ в среде
Keil желательно иметь установленную
графическую среду Keil uVision версии 3 или
4 и компиляторы C51 и A51. Можно использовать
демонстрационные версии этих программных
инструментов, доступные для скачивания
на сайте www.keil.com. Более того, для разработки
программ на языке C в среде Keil uVision можно
использовать и свободно распространяемый
компилятор SDCC, который разработан в
рамках открытого лицензионного соглашения
GNU и не имеет ограничений по размеру
исполняемого программного кода. Несмотря
на некоторые отличия в синтаксисе,
многие (если не большинство) из принципов
программирования систем с 8051, используемые
в Keil C51, работают и в SDCC.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI. Настройка проекта в keil и мигание светодиодом

В прошлой статье я поделился личными впечатлениями о полученном мною наборе и запрограммировал контроллер демонстрацонным проектом с помощью MT-LINK (так же был предоставлен). Теперь, когда мы детально рассмотрели весь комплект, настало время начать его осваивать.
Для нетерпеливых — итог.

Создаем пустой проект в Keil 5 для К1986ВЕ92QI.
    1. Заходим в Project -> New uVision Project…

  • 1. Под пользовательские данные (наши файлы).
  • 2. Под драйвера LCD (те, что в комплекте).
  • 3. Для кода работы с Flash.
  • 4. Под SMSIS и подобие SPL.

В открывшемся окне нужно выбрать тип файлов «All files (*.*)». После чего выбрать 1 или выделить несколько файлов.

  • 1. В папку User -> «User -> main.c». Это наш самый главный файл. Чуть изменив его, мы начнем писать свой код именно в нем.
  • 2. В папку Flash -> «flash -> MilFlash.c». Здесь хранится библиотека для работы с Flash контроллера.
  • 3. В папку LCD -> «mlt -> mlt_lcd.c». Библиотека работы с LCD, который установлен на плате.
  • 4. В папку SMSIS_and_Drivers -> «Libraries1986BE9x_StdPeriph_Driversrc -> все файлы .c». Тут хранится аналог SPL у STM32. Проще говоря, это «обертки», которые позволяют не вдаваясь в структуру контроллера управлять его периферией (выводы, uart и т. д.).
  • 5. В папку SMSIS_and_Drivers -> « LibrariesCMSISCM3DeviceSupport1986BE9xstartuparm -> startup_1986be9x.s». Это файл «стартап». Тут прописаны все «вектора переходов». Иначе говоря, по любому прерыванию (к примеру, нажатие кнопки) контроллер возвращается к этой таблице и смотрит, куда ему перейти, чтобы выполнять код дальше.
  • 6. В папку SMSIS_and_Drivers -> «LibrariesCMSISCM3DeviceSupport1986BE9xstartuparm -> system_1986BE9x.c».

Компилируем простейшую программу.

Вставим в функцию main бесконечный цикл с увеличением счетчика на 1. Теперь наш файл должен выглядеть так.

Не забываем о том, что в конце каждого файла должна быть пустая строка. Keil считает это как предупреждение, которое частенько действует на нервы. Конечно компилироваться будет, но сам факт предупреждения – настораживает.
На этом настройка закончена. Мы можем перекомпилировать наш проект нажав F7. Если все прошло хорошо, ты мы увидим это.

Теперь осталось лишь в настройках настроить J-LINK и можно заливать. О том, как его настраивать – было подробно рассказано в предыдущей статье.

Кстати. J-LINK видит чип и без подключения дополнительного питания, а так же позволяет отлаживать чип. Так что внешнее питание не особо нужно. При переходах по строкам кода видно, как мелькает подцветка экрана.

Настраиваем ножку контроллера для работы со светодиодом

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

Для начала поймем, какой именно порт нам нужно настроить. В «Отладочная плата 1986ВЕ92У, К1986ВЕ92QI (MDR32F9Q2I)Печатная плата 1986EvBrd_LQFP64» есть файл 1986EvBrd_64_Rev2.pdf, в котором приведена схема платы. На ней мы можем увидеть, что 2 светодиода подключены к пинам PC0 и PC1. Отлично. Не придется мучиться со смещением.

Очень понравилось, что у Миландра вся информация о линейке чипов в одном документе. В STM32 очень путался в документах… Взглянем на схему порта ввода-вывода. Чем-то отдаленно напоминает схему порта у STM32. Не увидев ничего, что бы бросилось в глаза, идем настраивать регистры.

Так как я не знал, как именно Миландр назвал свои порты, я полез в библиотеку настройки портов. Там увидел следующее.

Убедившись, что адрес порта C совпадает с адресом в датащите, я создал новую функцию в файле main.c (Обязательно выше функции main! Иначе придется описывать прототипы функции в .h файле. А это лишние пока что заморочки.).

Начинаю писать PORTC-> (по привычке), зажимаю ctrl+пробел и вижу следующее.

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

Нам нужен светодиод на порту «0», так что можем записать: PORTC->RXTX |= 1;

Этим мы переводим 0-й бит порта в 1. Тем самым зажигая диод на порту 0. Но перед его включением стоит его настроить…
Так что данное действие выполняем в последнюю очередь, а перед.

У нас выход, так что: PORTC->OE |= 1;

Оставляем без изменений, так как по умолчанию везде нули.

А вот тут нам нужен цифровой: PORTC->ANALOG |= 1;

Подтяжка нам не нужна, так что, пропускаем.

Ну и это нам тоже не надо…

А вот тут нам нужно выбрать скорость. По умолчанию – все. Выбираем медленный фронт. Для светодиода его вполне хватит: PORTC->PWR |= 1;

Ну и последний регистр. Вообще неведомая для меня ранее вещь. С этим еще предстоит разобраться.

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

Нам нужны порты. Это вполне подходит под описание «периферийные блоки». Ищем этот регистр и вот.

Оставалось только понять, как в keil называется этот регистр. Так как в библиотеках толком ничего не нашел, то пошел подбором. В итоге выяснилось, что он именуется RST_CLK. Ну а дальше нам нужно лишь записать «1» в нужный блок.

RST_CLK->PER_CLOCK |=(1<<23);
На «PER_CLOCK» вышел случайно. Когда написал «RST_CLK» нажал ctrl+пробел и после появления списка, «p». После выбрал подходящий вариант.

В итоге получился такой код.

Код компилируется и мы получаем.

Русские комментарии в keil 5

Сейчас стоит расставить комментарии по коду, но на русском этого сделать не получается. Выходят непонятные символы, для того, чтобы можно было писать русский комментарии, нужно зайти Edit -> Configuration.

И там сменить кодировку, как показано на рисунке. После чего нажать «ОК».

Мигаем светодиодом

Теперь напишем код, который будет с помощью цикла мигать светодиодом.

Зашиваем и радуемся! Скорость взята по опыту мигания светодиодом на STM32. Светодиод мигает с частотой примерно раз в секунду.

Все. Вроде бы ничего не упустил. Советую этот проект сразу же заархивировать. Чтобы потом использовать как заготовку.

Еще раз напоминаю. В настройках проекта есть одна ссылка к директории проекта относительно «C:». Так что проект будет работать лишь по тому же пути, что и в статье. Вы легко можете сменить путь и свободно пользоваться.
Спасибо sguwenka за исправления.

STM32F103. Начало работы в Keil

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

Основные вопросы этой заметки:

  • как начать разрабатывать ПО для stm32 в Keil ;
  • что для этого необходимо.

Начать необходимо со второго вопроса. Необходимый минимум это среда программирования ( Keil ), программатор и отладочная плата. Можно конечно и в симуляторе запускать программу, но это не так инетресно, так что плата и программатор нужны. Где брать писать не буду, не моя это забота.

Для начала необходимо установить keil, его можно взять на официальном сайте, на данный момент последняя версия 5.26 , если у вас 5.25 не отчаивайтеся, там различий не много, есть весьма полезные функции, но они вам не нужны.

Я сразу же после установки на новую машину произвожу настройку среды программирования:

Описание изображения

Вот так они выглядят. Теперь по пунктам, что и где настроено.

  • Изменена кодировка файлов на юникод, так у вас гарантированно будут отображаться русские символы в комментариях
  • Настраиваю замену табуляции на 4 пробела (это довольно холиварная тема, но я любю так), с такими настройками код гарантированно одинаково будет выглядить в любом редакторе.

Теперь установим паки (различные библиотеки) необходимые для разработки под наш чип. Минимум установлен на картинке. FreeRTOS на самом деле не обязательно устанавливать, но пусть будет, ведь после игр с различной переферией будет пытаться оседлать её.

Описание изображения

И так, все настройки сделаны, всё установлено, пробудем создать новый проект. Делается это через меню Project->New μVision Project. Сразу после нажатия откроется окно с предложением выбрать используемый чип, его название можно посмотреть на корпусе =)

Описание изображения

Следующим этапом нам будет предложено выбрать необходимые в нашей работе паки. Отмечаем всё как на картинке.

Описание изображения

  • CMSIS (Cortex Microcontroller Software Interface Standard);
  • Startup — это ассемблерный файл для запуска нашей программы, с содержимым можно будет ознакомиться самостоятельно;
  • STDPeriph — Библиотека переферийных устройств:
    • Fraemwork — оснойной файл, подлючающий бибилотеку;
    • GPIO — для управления портами ввода-вывода;
    • RCC — для управления тактированием.

    Всё выбрано, значить пожно приступать к следующему шагу. Настройка проекта. открывается через меню Project->Option for Target.

    Рассмотрим наиболее интересные и необходимые вкладки.

    Здесь можно выбрать версию компилятора, для простоты будем использовать версию 5.

    Описание изображения

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

    Описание изображения

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

    Описание изображения

    Следующая вкладка для настройки отладки, здесь можно выбрать используемый программатор и настроить его.

    Описание изображения

    Настройки программатора. При загрузке прошивки будем стирать весь чип, программировать, верифицировать и запускать программу на исполнение.

    Описание изображения

    Ну вот с настройка мы разобрались.

    Приступим к написанию кода.

    Программа для микроконтроллера выглядит в виде бесконечного цикла. Что бы это понять предлагаю ознакомиться с кодом:

    Что нужно сделать чтоб ы помигать светодиодом?

    1. Включить тактирование порта к которому подключен светодиод;
    2. Настроить порт на выход;
    3. в вечном цикле переключать вывод с небольшой задержкой то в 0 , то в 1 .

    Вот и наш учебный код:

    Код мигалки специально реализован несколькими возможными способами, используя STDPeriph и без него (только CMSIS )

    Проект с этим кодом можно скачать здесь. Но лучше научиться создавать проект с нуля.

    Программирование ARM-контроллеров STM32 на ядре Cortex-M3. Часть 1. Установка MDK, создание проекта, основы Keil uVision

    Сегодня мы начнём учиться программировать ARM-контроллеры STM32 на ядре Cortex-M3. Эти камни уже гораздо серьёзнее, чем восьмибитные пики и атмелы, поэтому для полного использования всех их возможностей без языка высокого уровня нам при программировании не обойтись (если мы конечно не мазохисты), но для лучшего понимания происходящего, начнём мы всё же с ассемблера, а потом уже подмешаем Си (тем более, что до полного использования возможностей этих камней нам пока как до Луны пешком).

    Сред разработки под ARM-ы в настоящее время существует достаточно много, мы будем пользоваться одной из таких сред (кстати, одной из самых популярных), которая называется Keil uVision.

    Первое, что нужно сделать — это скачать с официального сайта Keil и установить себе на компьютер пакет MDK-ARM. В настоящее время в его состав входит Keil uVision версии 5.11. Бесплатная версия, естественно, урезана и позволяет скомпилить максимум 32 Кбайта кода, но нам, простым радиохламерам, для любительских нужд этого более чем достаточно (ну, а если недостаточно, то, я думаю, все знают что делать).

    Помимо пакета MDK-ARM нужно скачать и установить пакет для работы с контроллерами STM32, который называется Keil.STM32F1xx_DFP.1.0.5.pack. После установки этого пакета в среде uVision появится база данных контроллеров STM.

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

    Итак, запускаем Keil uVision и выбираем пункт меню «New uVision Project…»

    В появившемся окне проводника выбираем папку, в которой проект будет расположен, придумываем ему какое-нибудь имя и жмём кнопку «Сохранить».

    После этого появится база различных контроллеров STM32, в которой нужно будет выбрать свой камень (в моём случае это stm32F103C8) и нажать «Ok».

    Дальше нам предложат подключить к нашему проекту различные готовые куски кода и библиотеки драйверов. Достаточно поставить напротив соответствующего компонента галочку и он будет включен в наш проект. Это очень сильно облегчает жизнь программиста, но мы пока не будем этим пользоваться. Пока мы ставим перед собой цель разобраться как это всё работает и нас интересует проект на асме с чистого листа, поэтому не ставим никакие галочки, а просто жмём кнопку «OK».

    Проект создан и окно uVision теперь выглядит вот так:

    Слева расположен многофункциональный менеджер проекта, в котором в зависимости от выбранной внизу вкладки открывается либо структура проекта (вкладка Project), либо библиотека документации (вкладка Books), либо список используемых в проекте функций (вкладка Functions), либо шаблоны для часто используемых структур (вкладка Templates). Пользоваться менеджером просто и удобно, — когда мы выбираем камень, в библиотеку документации автоматически добавляются нужные книжки, список используемых в проекте функций также составляется автоматически. В области справа показывается содержимое открытых файлов проекта.

    Добавим в наш проект asm-файл, в котором мы будем писать код. Щёлкаем по Source Group 1 правой кнопкой мыши и выбираем пункт Add New Item to Group ‘Source Group 1’…

    После этого появится окошко, в котором нам предложат выбрать тип добавляемого файла и попросят этот файл как-нибудь назвать. Выбираем тип файла Asm File, назовём его, скажем, Proga1 и жмём кнопку Add. В менеджере проекта появляется наш файл. Если по нему два раза щёлкнуть мышкой — он откроется в окошке справа.

    Пока этот файл пустой, но прежде чем писать в него какой-либо код, давайте вернёмся ещё раз к менеджеру проекта. Если щёлкнуть правой кнопкой мыши на Target1 и выбрать пункт меню Options for Target ‘Target1’, то откроется окошко с настройками нашего проекта. Кое-какие из этих настроек нам придётся подправить, а кое-какие просто интересно посмотреть.

    На вкладке Device можно поменять модель контроллера.

    На вкладке Target указаны начальные адреса и размеры используемых областей памяти. В случае с нашим STM32F103C8 мы имеем внутри кристалла 64 кБ (0x10000) flash-памяти (IROM1 — internal ROM), которая расположена по адресам, начиная с 0x08000000, а также 20 кБ (0x5000) ОЗУ (IRAM — internal RAM), которая расположена по адресам, начиная с 0x20000000. Эти данные устанавливаются автоматически при выборе контроллера, но если вдруг они случайно испортились, то их всегда можно подглядеть в доке на камень, открыв карту памяти (memory map).

    На вкладке Output нужно не забыть поставить галочку напротив пункта Create HEX File. Здесь же можно выбрать отдельную папку для сохранения всяких вспомогательных файлов, создающихся при компиляции проекта. (кнопка Select Folder for Objects…)

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

    На вкладке User можно настроить запуск различных пользовательских программ и скриптов в процессе построения проекта

    Вкладки С/С++ и Asm предназначены для настройки процедур препроцессинга и ассемблирования и пока нам не интересны.

    На вкладке Linker настраивается линковщик. Здесь возможны три варианта:

    1) Ничего не менять. В этом случае стартовые адреса областей памяти (flash и RAM) будут взяты те, что прописаны на вкладке Linker напротив пунктов R/O Base, R/W Base. Кроме того, линковщик захочет чтобы точка входа была обозначена меткой Reset_Handler, а начало таблицы прерываний — меткой __Vectors. Это можно увидеть в командной строке линковщика (Linker Control String). Запись —entry Reset_Handler говорит о том, что метку Reset_Handler нужно считать точкой входа, а запись —first __Vectors — о том, что секцию с именем __Vectors нужно расположить в памяти первой. Соответственно, если наши названия не будут совпадать с теми, которые ожидает линковщик, — мы при компиляции получим ошибки и ворнинги. Кроме того, мы должны экспортировать эти метки, директивой EXPORT.

    2) Поставить галочку напротив Use Memory Layout from Target Dialog. Если посмотреть в командную строку линковщика, то можно увидеть, что теперь набор команд выглядит по другому. В таком варианте линковщик будет использовать адреса областей памяти, указанные на вкладке Target. Причём он сначала на основе этих данных автоматически создаёт так-называемый scatter-файл (файл с расширением .sct), а потом компилит проект на основе scatter-файла. Если мы откроем scatter-файл в блокноте, то увидим, что теперь компилер хочет, чтобы секция, помещаемая в самое начало flash-памяти (там должна размещаться таблица векторов прерываний, но об этом позже) называлась RESET. Но в этом случае линковщику уже не нужно чтобы мы что-то куда-то экспортировали и не обязательно, чтобы метка, обозначающая точку входа, называлась именно Reset_Handle. Зато теперь нам нужно либо в программе обозначить точку входа директивой ENTRY, либо на вкладке Linker в окошке Misc controls добавить директиву —first, указав после неё имя нашей метки, отмечающей точку входа. Кроме того, теперь линковщик выдаёт при компиляции ворнинг из-за того, что хочет найти секции, обозначенные как InRoot$$Sections. Но у нас таких секций и нет, поэтому на этот ворнинг можно смело забить (а чтоб не надоедал — можно выключить его, добавив в строку Disable Warnings на вкладке Linker).

    3) Ну и наконец, последний вариант — можно самому создать этот самый scatter-файл, который расскажет линковщику где какие области располагать. Для этого галочка Use Memory Layout from Target Dialog должна быть снята, а в папке с проектом нужно создать файл с раширением sct. Подробно о том, чем этот файл заполнять и как использовать описано в пятой главе мануала RealView Compilation Tools, а нам для простейшей программы хватит и вот такого:

    Здесь ROM_Start_Address — адрес начала flash-памяти (в нашем случае 0x08000000), ROM_Size — размер flash-памяти (в нашем случае 0x10000), RAM_Start_Address — адрес начала оперативы нашего камня (в нашем случае 0x20000000), RAM_Size — размер оперативы (в нашем случае 0x10000).

    Директива *.o (First_Section_Name, +First) в секции ER_IROM1 означает, что надо во всех объектных файлах поискать область с именем First_Section_Name и разместить её самой первой в секции ER_IROM1. Для контроллеров STM32 первой во flash-памяти должна быть область с адресом вершины стека и таблицей адресов прерываний.

    Директива .ANY (+RO) означает, что далее в этой секции будут размещены все остальные области, помеченные в исходнике как READONLY, причём без разницы в каком порядке.

    Директива .ANY (+RW +ZI) в секции RW_IRAM1 означает, что в этой секции будут размещены все области, помеченные в исходнике как READWRITE, причём без разницы в каком порядке.

    После того, как файл создан и заполнен нужно на вкладке Linker, в строке Scatter File указать путь к этому файлу. Для удобства, справа есть кнопочка «…» при нажатии на которую откроется проводник и вам останется только выбрать этот файл в проводнике.

    Обратите внимание, что после выбора scatter-файла набор команд в строке Linker control string изменится. Оттуда пропадут команды, размечающие области памяти и распределяющие различные секции по этим областям, поскольку теперь предполагается, что это сделано в scatter-файле.

    На вкладке Debug нужно выбрать как вы будете отлаживать свой проект. Если у вас есть отладочная плата, то нужно поставить флажок, напротив пункта Use: и далее выбрать из выпадающего списка свою отладочную плату. Если отладочной платы у вас нет, то нужно поставить флажок напротив пункта Use Simulator. Это даст возможность пользоваться для отладки встроенным в IDE симулятором.

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

    Полную информацию по настройкам компилятора, ассемблера и прочим можно узнать, почитав литературу из раздела Tools Users Guide на вкладке Books в менеджере проекта, а с минимальными настройками мы только что разобрались. На этом пока всё, а в следующий раз давайте попробуем написать в созданном ранее asm-файле какую-нибудь маленькую программулинку.

Статья посвящается Пановой Ксении.

Все картинки в этой статье кликабельны.

STM32 — это семейство 32-разрядных микроконтроллеров фирмы STMicroelectronics.

Микроконтроллеры содержат микропроцессорное ядро ARM, точнее ARM Cortex-M. Это ядро присуще не только микроконтроллерам STM32, оно существует само по себе, и на его основе выпускается множество микроконтроллеров от разных производителей.

Keil MDK-ARM (произносится «Кеил эм-ди-кей арм») — это среда разработки для микроконтроллеров с ядром ARM Cortex-M.

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

Существует множество других сред разработки. Например, последнее время автор пользуется средой, которую описал в другой статье. Но в этой пойдет речь о Keil MDK-ARM, потому что она имеет большую популярность и достаточно проста.

Первым делом качаем последнюю версию Keil MDK-ARM с официального сайта. Она имеет ряд ограничений, которые не влияют на большинство задач. Самое существенное ограничение состоит в том, что среда не сгенерирует программу объемом больше 32 КБ, но такую программу надо постараться написать. Хотя микроконтроллеры STM32 часто имеют намного больший объем, вплоть до 2 МБ.

На момент написания статьи последняя версия Keil MDK-ARM — 5.18 (от 5 февраля 2016).

Чтобы скачать среду, надо заполнить форму на сайте Keil:

Форма для скачивания MDK-ARM

Следует ввести настоящий адрес электронной почты, иначе сайт будет ругаться. После заполнения и нажатия Submit, дается ссылка для скачивания:

Сcылка для скачивания MDK-ARM

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

Качаем и устанавливаем. Установленная среда занимает на диске около 1,3 ГБ. После установки автоматически запускается менеджер пакетов:

Менеджер пакетов

Он нужен, чтобы качать, устанавливать и обновлять различные дополнения (пакеты).

Менеджер пакетов появился в MDK-ARM версии 5, что уменьшило объем установочного файла почти в два раза (версия 4.71 была объемом 550 МВ, а версия 5.00 — 300 МБ).

В левой части менеджера мы выбираем устройства (микроконтроллеры), а в правой соответствующие им пакеты.

Допустим, нам надо вести разработку под микроконтроллер STM32F407VG, который установлен на отладочной плате STM32F4-Discovery.

Тогда находим этот микроконтроллер в списке слева и устанавливаем соответствующий пакет DFP:

Установка DFP

Можно заметить, что среди установленных пакетов есть CMSIS. CMSIS — это библиотека для ядра Cortex-M, общая для всех микроконтроллеров. Библиотека разрабатывается фирмой ARM и доступна для скачивания с официального сайта после регистрации. Можно было бы не устанавливать этот пакет, а пользоваться официальным выпуском библиотеки, но это дополнительные сложности.

Закрываем менеджер пакетов и запускаем Keil uVision5 (произносится мю-вижен):

Значек Keil uVision5

Keil uVision5 — это часть MDK-ARM, графический интерфейс среды, который включает редактор кода:

Keil uVision5

Я рекомендую произвести небольшую настройку редактора. Выбираем меню «Edit -> Configuration…», и производим следующие настройки:

Настройка Keil uVision5

  1. Кодировка UTF-8.
  2. Правая граница кода в 80 символов.
  3. Отступы по 4  пробела.

Эти настройки довольно спорные. У каждого разработчика свои предпочтения.

Теперь создаем проект. Для этого выбираем меню «Project -> New uVision Project…». В открывшемся окне выбираем расположение и имя проекта. Для проекта лучше создать отдельную папку и сохранить проект туда.

После сохранения появится окно выбора устройства. Выбираем нужный микроконтроллер и нажимаем «ОК». Если бы мы не установили нужный пакет, то микроконтроллера не было бы в списке:

Выбор микроконтроллера

В следующем окне предстоит выбрать компоненты, которые будут использоваться в проекте. Необходимо выбрать «CMSIS:CORE» и «Device:Startup»:

Компоненты CMSIS и Startup

После нажатия «OK» процесс создания проекта завершится.

В дальнейшем вы всегда сможете запустить окно выбора компонентов, чтобы добавить или удалить их. Для этого надо выбрать меню «Project -> Manage -> Run-Time Evironment…».

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

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

Здесь мы видим название проекта «example», цель проекта «Target 1», пустую группу файлов «Source Group 1», компоненты CMSIS и Device.

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

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

В структуре мы видим два файла. Один с расширением «s». Он содержит исходный код на языке ассемблера. Другой с расширением «с». Он содержит исходный код на языке Си.

Собрать проект и получить файл прошивки можно нажав клавишу F7. Но в таком виде проект не будет собран и вы получите ошибку, потому что отсутствует функция «main()».

Функция «main()» — это точка входа в вашу программу, то с чего начинается программа. Ее наличие обязательно если вы пишите программу на языке Си.

Давайте создадим эту функцию. Кликнем на группе «Source Group 1» правой кнопкой и выберем «Add New Item to ‘Source Group 1’…» (перевод: добавить новый элемент в группу ‘Source Group 1’). Создадим файл «main.c»:

Создание файла main.c

В созданный файл добавим код:

int main() {
    return 0;
}

В конец файла стоит добавить пустую строку, иначе при сборке вы получите предупреждение «warning: #1-D: last line of file ends without a newline».

Теперь проект можно собрать клавишей F7. В результате вы получите файл «Objectsexample.axf» (по умолчанию имя файла совпадает с именем проекта). Файл располагается в папке с проектом.

Обычно разработчику требуется файл прошивки в формате Intel HEX. Чтобы получить его, надо произвести настройку цели. Чтобы увидеть настройки цели нажмите Alt-F7, перейдите на вкладку «Output» и выберите «Create HEX File».

После очередной сборки вы получите файл «Objectsexample.hex».

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

Запустим выбор компонентов с помощью меню «Project -> Manage -> Run-Time Evironment…» и выберем компонент «Device:STM32Cube Hal:GPIO».

В нижней части окна мы увидим неудовлетворенную зависимость «Device:STM32Cube Hal:Common». Выберем этот компонент и увидим еще больший список зависимостей. Необходимо выбрать все требуемые зависимости:

  • Device:STM32Cube Hal:Common
  • Device:STM32Cube Hal:RCC
  • Device:STM32Cube Hal:PWR
  • Device:STM32Cube Hal:Cortex
  • Device:STM32Cube Framework:Classic

STM32Cube — это библиотека, которую предоставляет STMicroelectronics.

При выборе компонентов мы выбираем какие возможности этой библиотеки использовать.

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

Библиотека STM32Cube многоуровневая, то есть включает в себя множество промежуточных библиотек. Одна из промежуточных библиотек называется STM32Cube HAL, или просто HAL. Она поделена на модули и каждый модуль соответствует какому-нибудь периферийному устройству. Название модуля совпадает с названием устройства, например, имеется модуль GPIO.

Существует большое количество документации по STM32Cube. Но основное описание по работе с периферийными устройствами содержится в руководстве по HAL. Это руководство разработчик использует большую часть времени. Обратимся к нему, чтобы заставить шевелиться ножки микроконтроллера.

Для начала подключим HAL в нашей программе, добавив строчку перед определением функции «main()»:

#include "stm32f4xx_hal.h"

В самом начале функции «main()» вызовем функцию «HAL_Init()», которая инициализирует библиотеку.

Таким образом мы получим следующий код в файле «main.c»:

#include "stm32f4xx_hal.h"

int main() {
    HAL_Init();

    return 0;
}

Продолжение следует…

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

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

В статье я хотел еще привести конечный код и объяснить, как он работает. Могу лишь поделиться непроверенной программой:

#include "stm32f4xx_hal.h"

int main() {
    HAL_Init();

    // Разрешить тактирование порта A.
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // Настройки порта.
    GPIO_InitTypeDef s;
    s.Pin   = GPIO_PIN_0;                // Вывод 0.
    s.Mode  = GPIO_MODE_OUTPUT_PP;       // Цифровой выход.
    s.Pull  = GPIO_NOPULL;               // Без подтяжки.
    s.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // Максимальная скорость.

    // Настроить вывод 0 порт A.
    HAL_GPIO_Init(GPIOA, &s);

    // Бесконечно переключать состояние порта с максимальной скоростью.
    while(1) {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
    }

    //return 0;
}

void SysTick_Handler(void) {
    HAL_IncTick();
}

Ссылки

  1. Скачать продукты Keil без заполнения формы.
  2. Скринкаст «Eclipse и GNU Tools для разработки под ARM-микроконтроллеры«.
  3. Микроконтроллер STM32F407VG.
  4. Отладочная плата STM32F4-Discovery.
  5. Библиотека STM32CubeF4.
  6. Руководство по STM32CubeF4 HAL.
  7. Библиотека CMSIS.
  8. Отсчет времени в STM32Cube.

An Introduction to Keil MicroVision

Embedded system means some combination of computer hardware and programmable software which is specially designed for a particular task like  displaying message on LCD. If you are still wondering about an embedded system, just take a look at these circuit applications using 8051 microcontroller. You can call these applications embedded systems as it involves hardware (8051 microcontroller) and software (the code written in assembly language).

1. Voltmeter using 8051

2. Thermometer using 8051

3. Frequency counter using AVR

Some real life examples of embedded systems may involve ticketing machines, vending machines, temperature controlling unit in air conditioners etc. Microcontrollers are nothing without a Program in it.

One  of the important part in making an embedded system is loading the software/program we develop into the microcontroller. Usually it is called “burning software” into the controller. Before “burning a program” into a controller, we must do certain prerequisite operations with the program. This includes writing the program in assembly language or C language in a text editor like notepad, compiling the program in a compiler and finally generating the hex code from the compiled program. Earlier people used different softwares/applications for all these 3 tasks. Writing was done in a text editor like notepad/wordpad, compiling was done using a separate software (probably a dedicated compiler for a particular controller like 8051), converting the assembly code to hex code was done using another software etc.  It takes lot of time and work to do all these separately, especially when the task involves lots of error debugging and reworking on the source code.

Keil MicroVision is a free software which solves many of the pain points for an embedded program developer. This software is an integrated development environment (IDE), which integrated a text editor to write programs, a compiler and it will convert your source code to hex files too.

Here is simple guide to start working with Keil uVision which can be used for

  • Writing programs in C/C++ or Assembly language
  • Compiling and Assembling Programs
  • Debugging program
  • Creating Hex and Axf file
  • Testing your program without Available real Hardware (Simulator Mode)

This is simple guide on Keil uVision 4 though also applicable on previous versions also.

These are the simple steps to get off the mark your inning!

Step 1: After opening Keil uV4, Go to Project tab and

Create new uVision project

Now Select new folder and give name to Project.

Getting started with Keil MicroVision

Step 2: After Creating project now Select your device model. Example.NXP-LPC2148  

[You can change it later from project window.]

Getting started with Keil MicroVision

Step 3: so now your project is created and Message window will appear to add startup file of your Device click on Yes so it will be added to your project folder

Getting started with Keil MicroVision

Step 4: Now go to File and create new file and save it with .C extension if you will write program in C language or save with .asm for assembly language.

i.e., Led.c

Getting started with Keil MicroVision

Step 5: Now write your program and save it again. You can try example given at end of this tutorial.

Step 6: After that on left you see project window [if it’s not there….go to View tab and click on project window]

Now come on Project window.

Introduction to Keil MicroVision

Right click on target and click on options for target

Here you can change your device also.

Introduction to Keil MicroVision

Click output tab here & check create Hex file if you want to generate hex file

Now click on ok so it will save changes.

Introduction to Keil MicroVision

Step 7: Now Expand target and you will see source group

Right click on group and click on Add files to source group

Introduction to Keil MicroVision

Now add your program file which you have written in C/assembly.

You can see program file added under source group.

Step 8: Now Click on Build target.You can find it under Project tab or in toolbar.It can also be done by pressing F7 key.

Introduction to Keil MicroVision

Step 9:  you can see Status of your program in Build output window

[If it’s not there go to view and click on Build output window]   

Introduction to Keil MicroVision

Now you are done with your program. Next time we will look at Debugging and Simulation of Program. Hope you find it helpful.

Статья носит характер небольшого мануала о том, как начать программировать микроконтроллеры STMicroelectroniks на примере популярного и простого в освоении семейства stm32f1

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

Основные вопросы этой заметки:

  • как начать разрабатывать ПО для stm32 в Keil;
  • что для этого необходимо.

Начать необходимо со второго вопроса. Необходимый минимум это среда программирования (Keil), программатор и отладочная плата. Можно конечно и в симуляторе запускать программу, но это не так инетресно, так что плата и программатор нужны. Где брать писать не буду, не моя это забота.

Для начала необходимо установить keil, его можно взять на официальном сайте, на данный момент последняя версия 5.26, если у вас 5.25 не отчаивайтеся, там различий не много, есть весьма полезные функции, но они вам не нужны.

Я сразу же после установки на новую машину произвожу настройку среды программирования:

Описание изображения

Вот так они выглядят. Теперь по пунктам, что и где настроено.

  • Изменена кодировка файлов на юникод, так у вас гарантированно будут отображаться русские символы в комментариях
  • Настраиваю замену табуляции на 4 пробела (это довольно холиварная тема, но я любю так), с такими настройками код гарантированно одинаково будет выглядить в любом редакторе.

Теперь установим паки (различные библиотеки) необходимые для разработки под наш чип. Минимум установлен на картинке. FreeRTOS на самом деле не обязательно устанавливать, но пусть будет, ведь после игр с различной переферией будет пытаться оседлать её.

Описание изображения

И так, все настройки сделаны, всё установлено, пробудем создать новый проект. Делается это через меню Project->New μVision Project...
Сразу после нажатия откроется окно с предложением выбрать используемый чип, его название можно посмотреть на корпусе =)

Описание изображения

Следующим этапом нам будет предложено выбрать необходимые в нашей работе паки. Отмечаем всё как на картинке.

Описание изображения

  • CMSIS (Cortex Microcontroller Software Interface Standard);
  • Startup — это ассемблерный файл для запуска нашей программы, с содержимым можно будет ознакомиться самостоятельно;
  • STDPeriph — Библиотека переферийных устройств:
    • Fraemwork — оснойной файл, подлючающий бибилотеку;
    • GPIO — для управления портами ввода-вывода;
    • RCC — для управления тактированием.

Всё выбрано, значить пожно приступать к следующему шагу. Настройка проекта. открывается через меню Project->Option for Target...

Рассмотрим наиболее интересные и необходимые вкладки.

Здесь можно выбрать версию компилятора, для простоты будем использовать версию 5.

Описание изображения

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

Описание изображения

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

Описание изображения

Следующая вкладка для настройки отладки, здесь можно выбрать используемый программатор и настроить его.

Описание изображения

Настройки программатора. При загрузке прошивки будем стирать весь чип, программировать, верифицировать и запускать программу на исполнение.

Описание изображения

Ну вот с настройка мы разобрались.

Приступим к написанию кода.

Программа для микроконтроллера выглядит в виде бесконечного цикла. Что бы это понять предлагаю ознакомиться с кодом:

/* Точка входа в программу */
int main( void )
{
    /*
    Здесь производится инициализация основных узлов программы и микроконтроллера
    */

    while( 1 )
    {
        /*
        Вечный цикл необходим для работы, иначе программа останомиться
        Сюда обычно помещают код который выполняется постоянно 
        или оставляют цикл пустым если работают на прерываниях, можно совмещать.
        */
    }
}

Что нужно сделать чтоб ы помигать светодиодом?

  1. Включить тактирование порта к которому подключен светодиод;
  2. Настроить порт на выход;
  3. в вечном цикле переключать вывод с небольшой задержкой то в 0, то в 1.

Вот и наш учебный код:

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"     // Файл с функциями управления ножками контроллера
#include "stm32f10x_rcc.h"      // Управление тактированием
#include <stdint.h>             // Правильные типы данных, вместо всяких int, char и тому подобных

// Далее будут ссылки на страницы референс мануала, его можно сказать по ссылке:
// https://www.st.com/resource/en/reference_manual/CD00171190.pdf

// Примитивнейшая функция задержки
// Для орагнизации задержек (или периодических событий)
// обычно применяются таймеры, но нам пока рано, так что
// тупо мотаем такты

void Delay( void )
{
    for( uint16_t i = 0; i <= 50000; i++ )
        for( uint16_t j = 0; j <= 25; j++ );
}

// точка входа в программу, всегда именно "int main ( void )"
int main( void )
{

    // ---------------- Включаем тактирование порта GPIOC
    // 1. С использованием SPL
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );  

    // 2. С использованием CMSIS, магические числа
//    RCC->APB2ENR |= (1 << 4);                       // см 146 стр. 
    // ---------------- 

    // ---------------- Инициализируем ногу со светодиодом (PC13 - Порт С нога 13)    
    // 1. С использованием SPL
    GPIO_InitTypeDef PortC;                     // Структура с необходимыми полями
    PortC.GPIO_Mode         = GPIO_Mode_Out_PP;     // Выход пуш-пул, см 164 стр.
    PortC.GPIO_Speed        = GPIO_Speed_10MHz;     // По сути это ток который сможет обеспечить вывод
    PortC.GPIO_Pin          = GPIO_Pin_13;          // Номер ноги
    GPIO_Init(GPIOC, &PortC);                       // Применяем настройки

    // 2. С использованием CMSIS
//    GPIOC->CRH |= (0x00 << 22) | (0x01 << 20);      // см 172 стр. 
    // ---------------- 

    // Основной цикл, программа ВСЕГДА должна зацикливаться!!!
    // Не всегда наполнен чем-то вразумительным, иногда может быть пустым, 
    // например когда вся логика реализована в прерываниях.
    while( 1 )
    {
        // ---------------- Устанавливае ногу со светодиодом (PC13 - Порт С нога 13)
        // 1. С использованием SPL
        GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);     
        // 2. С использованием CMSIS и ODR регистра, см 173 стр.
//        GPIOC->ODR |= (1 << 13);                     
        // 3. C использованием CMSIS и BSRR регистра, см 173 стр.
//        GPIOC->BSRR = (1 << 13);                        
        // ---------------- 

        Delay();

        // ---------------- Сбрасываем ногу со светодиодом (PC13 - Порт С нога 13)
        // 1. С использованием SPL
        GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);   
        // 2. С использованием CMSIS и ODR регистра, см 173 стр.
//        GPIOC->ODR &= ~(1 << 13);                       
        // 3. С использованием CMSIS и BRR регистра , см 174 стр.
//        GPIOC->BRR = (1 << 13);         
        // 4. С использованием CMSIS и BSRR регистра , см 173 стр.
//        GPIOC->BSRR = (1 << 29);                 
        // ---------------- 

        Delay();        
    }
}
// В конце файла для Кейла обязательна пустая строка! Хз зачем, просто нужна.

Код мигалки специально реализован несколькими возможными способами, используя STDPeriph и без него (только CMSIS)

Проект с этим кодом можно скачать здесь. Но лучше научиться создавать проект с нуля.

Будут вопросы пишите в комментариях, я обычно быстро отвечаю.

Как всегда — Спасибо за внимание и хорошего кодинга! =)

Понравилась статья? Поделить с друзьями:
  • Робот пылесос haier инструкция по применению на русском
  • Фитоспорин для роз инструкция по применению осенью
  • Эпримек инструкция по применению в ветеринарии для крс
  • Високор таблетки от давления инструкция по применению
  • Как установить электромеханический замок на калитку своими руками пошаговая инструкция