Содержание

Настройки проекта на примере 1986ВЕ1Т

Опции проекта можно открыть через меню "Project - Options for Target…", либо через тулбар

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

Device

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

Target

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

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

Output

В данной вкладке можно активировать опцию - Create HEX file. Она позволит посмотреть машинный код получившейся программы. Так же можно поменять некоторые пути. Я здесь все оставляю по умолчанию.

Listing

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

User

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

C/C++

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

В строке "Define" можно задать ключи условной компиляции, если они используются в проекте.

При разработке и отладке программ рекомендуется выключать оптимизацию - "Optimization: Level 0". При высоком уровне оптимизации возможны различные артефакты в поведении программы, но зато получается более компактный и быстрый код. Повышение уровня оптимизации лучше оставить до полного окончания разработки и отладки программы.

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

Asm

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

Linker

По умолчанию Кейл будет считать заданными адреса ROM и RAM согласно пунктам "R/O Base = 0х00000000" и "R/W Base = 0х20000000". R/O - означает Read Only, R/W - Read Write, X/O - Executable Only. Для простейших примеров программирования этого достаточно, т.к. эти значения соответствуют адресам памяти, указанным в закладке Target.

Кроме этого, можно выставить опцию - "Use Memory Layout from Target Dialog". Тогда раскладка областей памяти будет полностью соответствовать раскладке для заданного микропроцессора. При компиляции проекта будет создан файл с расширением *.sct, где будут указаны эти области памяти. В строке "Linker control string" появится запись о подключении данного файла.

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

Дополнительные возможности

Иногда требуется пометить какую-либо область памяти некоторым атрибутом. Например, сделать так чтобы буфер лежал в определенном адресном пространстве. Для этого требуется модифицировать исходный *.sct файл и подключить его вручную. Для этого надо снять галочку "Use Memory Layout from Target Dialog", а в поле "Scatter File" выбрать этот модифицированный файл. Модифицированный *.sct файл лучше сохранить под своим именем, поскольку при включении галочки "Use Memory Layout from Target Dialog" компиляция проекта затрет все наши изменения на автоматические.

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

//main.c

#define SIZE       100
uint32_t Buf[SIZE] __attribute__((section("EXECUTABLE_MEMORY_SECTION")));

Мы задаем буферу атрибут EXECUTABLE_MEMORY_SECTION. А в *.sct файле дописываем строку в нужной секции

 .o (EXECUTABLE_MEMORY_SECTION)

Вот листинг всего файла, мы добавили только одну строку в "RW_IRAM2".

// HelloWord_my.sct

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00020000  {    ; load region size_region
  ER_IROM1 0x00000000 0x00020000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00008000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x20100000 0x00004000  {
   *.o (EXECUTABLE_MEMORY_SECTION) 
	.ANY (+RW +ZI)
  }
}

Когда Линкер, компонуя объектные *.o - файлы, встретит переменные с атрибутом EXECUTABLE_MEMORY_SECTION, он расположит их в области памяти с таким атрибутом.

Debug

В окне Debug мы выбираем программатор. Производитель рекомендует использовать программаторы JLink и ULink 2. У меня сейчас в наличии аналог JLink - поэтому выбираем этот программатор в строке Use:. Прежде чем нажать Settings, необходимо чтобы программатор был подключен к устройству через JTAG и затем к компьютеру через USB. Программатор может питаться от USB, поэтому важно сначала воткнуть его в JTAG, а уже затем подключить к USB кабелю. Не желательно подключать какие-либо разъемы на плате при поданном напряжении питания!. После подключения программатора и USB можно подать питание на плату.

Нажимаем Settings.

Данный подраздел не относится к программатору Ulink2!

При первом запуске Settings программатора J-Link, открывается окно Target device settings. Поскольку производитель J-Link, фирма Segger не знакома с продукцией Миландр, то нам необходимо выбрать аналог из списка.

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

Для нашего микропроцессора 1986ВЕ1Т это "Unspecified Cortex-M1". Жмем Ок.

Если выбор ядра был осуществлен не верно, то для смены данного выбора необходимо открыть утилиту J-Link, которая появляется в системном трее. Но эта утилита появляется только при входе в Settings отладчика, при настройке опций проекта. Питание на МК должно быть подано. Нагляднее это представлено на следующем рисунке:

Порядок смены ядра в программаторе J-Link (Отладчик J-link подключен к плате, питание включено):

  1. Зайти в опции проекта - Debug - JLink Settings. Если включение верное, то видно устройство в JTAG Device Chain.
  2. Открыть опции J-Link из системного трея.
  3. В J-Link Control Panel выбираем закладку Settings
  4. Меняем версию ядра.

Отладчик J-Link позволяет прошивать МК без участия среды Keil, поэтому его настройки не интегрированы в Keil и могут выставляться отдельно. Информацию о таком режиме можно найти на форуме.

Настройки программатора

Теперь нам необходимо выбрать отладочный интерфейс подключения к плате. Обычно во всех МК доступны два интерфейса Jtag и SWD. Интерфейс SWD использует меньшее количество выводов для связи, чем Jtag. Не буду на этом останавливаться подробно, почитать об этих интерфейсах можно в Google, информации достаточно. Добавлю лишь, что подключение к МК всегда начинается по Jtag, но если в Keil выбран режим SWD, то по выводам Jtag (по тем что используются совместно с SWD) подается команда в МК, и МК переходит в режим работы по SWD.

Выбираем, например, Port: SW. После выбора порта, если ранее было подключено питание и если все подключено правильно, то в окне справа появится наше подключенное устройство в JTAG Device Chain. Выбираем рабочую частоту, например, 2МГц. При такой частоте, как правило, прошивка всегда проходит успешно. При желании частоту можно увеличить.

В группе Connect & ResetOptions рекомендуют ставить Connect: with Pre-reset и Reset: Reset Pin.

В закладке Flash Download нам необходимо выбрать опцию Erase Full Chip и поставить галочку Reset and Run. Если галочку не поставить, то придется после прошивки программы, нажимать кнопку Reset на демо-плате. Ниже в секции Programming Algorithm выбран алгоритм прошивки нашего микроконтроллера. Этот алгоритм берется из *.FLM файла, который ставится вместе в установкой пака от производителя. Если алгоритм не выбран, тогда надо его выбрать, нажав Add, и выбрать из списка. Если алгоритм не выбран, тогда при прошивке программы Кейл выдает сообщение об отсутствии алгоритма.

При выборе алгоритма необходимо обратить внимание на область памяти, куда будет писаться программа, это область должна соответствовать области flash памяти. Алгоритм прошивки Flash работает из ОЗУ, поэтому выше представлен диапазон используемого ОЗУ. Эта область также должна соответствовать ОЗУ в карте памяти МК. Для микроконтроллеров на базе Cortex-M3 стартовый адрес Flash начинается с 0х0800_0000. Это отличие иногда помогает разобраться в ситуации - "почему у меня ничего не прошивается", когда случайно выбран неправильный алгоритм прошивки.

Utilites

Оставляем все как есть. Должна быть включена опция Use Debug Driver, тогда будут использованы наши настройки программатора из опции Debug.

Теперь наш проект настроен и можно дописать его до Hello World - светодиод.