24184

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

Дата последнего изменения: 17.02.2020 10:11:39

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

 Рисунок 1 -  Toolbar

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

Device

 Рисунок 2 - Options for Target. Вкладка 'Device'

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

Target

 Рисунок 3 - Options for Target. Вкладка 'Target'

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

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

Output

 Рисунок 4 - Options for Target. Вкладка 'Output'

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

Listing

 Рисунок 5 - Options for Target. Вкладка 'Listing'

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

User

 Рисунок 6 - Options for Target. Вкладка 'User'

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

C/C++

 Рисунок 7 - Options for Target. Вкладка 'C/C++'

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

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

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

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

Asm

 Рисунок 8 - Options for Target. Вкладка 'Asm'

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

Linker

 Рисунок 9 - Options for Target. Вкладка 'Linker'

По умолчанию Keil будет считать заданными адреса 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" появится запись о подключении данного файла.

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

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

 Рисунок 10 - Options for Target. Вкладка 'Debug'

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

  Не рекомендуется подключать какие-либо разъемы на плате при поданном напряжении питания!

После подключения программатора и USB можно подать питание на плату.

Переходим ко вкладке Settings.

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

 Рисунок 11 - Options for Target. Вкладка 'Debug'

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

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

  • 1986ВЕ9х - "Unspecified Cortex-M3".
  • 1986ВЕ1Т, 1986ВЕ3Т - "Unspecified Cortex-M1",
  • 1986ВЕ4У - "Unspecified Cortex-M0"


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

 Рисунок 12 - Options for Target. Debug->Control panel->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 JTag и SWD . Стоит отметить, что подключение к микроконтроллеру всегда начинается по JTag, но если в Keil выбран режим SWD, то по выводам JTag (по тем, которые используются совместно с SWD) подается команда в микроконтроллер, и микроконтроллер переходит в режим работы по SWD.

 Рисунок 13 - Options for Target. Вкладка 'Debug'

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

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

 Рисунок 14 - Options for Target. Вкладка 'Flash Download'

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

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

 Рисунок 15 - Flash Download -> Add Flash Programming Algorithm

Utilites

 Рисунок 16 - Options for Target. Вкладка 'Utilities'

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

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


Сохранить статью в PDF

Теги

Была ли статья полезной?