24306

Использование утилит Loader и Flasher из состава среды CM-LYNX

Дата последнего изменения: 20.01.2022 08:13:25

Микросхемы 1967ВН028/044 являются высокопроизводительными процессорами цифровой обработки сигнала с тактовой частотой 450/230 МГц. Для исполнения команд на такой частоте память процессора также должна обладать высокой скоростью работы.

Типичным представителем встроенной памяти в микроконтроллерах является Flash-память, которая, к сожалению, обладает очень большим временем доступа и, как следствие, не позволяет работать с высокой частотой обмена. Напротив, память типа СОЗУ обладает малым временем доступа, что делает её пригодной для использования в высокопроизводительных процессорах. Однако, память СОЗУ энергозависима, т.е. если отключить питание процессора, то вся сохранённая информация в СОЗУ будет утеряна и при включении её придётся восстанавливать. В связи с этим для хранения исполняемой программы обычно используется внешняя энергонезависимая память, например, Flash. При включении процессора программа из внешней ПЗУ копируется во внутреннее СОЗУ, после чего осуществляется её запуск.

В данной статье рассмотрено, как с помощью средств, встроенных в среду CM-LYNX, сформировать образ ПЗУ и загрузить его во внешнюю память. В качестве примера в статье использован отладочный комплект для процессора 1967ВН044 и проект "HelloWorld", описанный в статье "Подключаем библиотеки HAL в среде CM-LYNX".

Подготовка проекта для загрузки в ПЗУ

Объём памяти СОЗУ в процессоре 1967ВН044 составляет 12 Мбит. Для хранения исполняемой программы на отладочной плате для процессора 1967ВН044 предусмотрена энергонезависимая SPI Flash память Micron M25P80 объёмом 8 Мбит. Также на отладочную плату можно установить модуль памяти с микросхемой 1636РР1У.

Для загрузки исполняемой программы в ПЗУ в составе среды разработки CM-LYNX поставляются две утилиты:

  • Loader
  • Flasher

Последовательность их использования следующая:

1. Сборка проекта в среде CM-LYNX.

2. Создание с помощью утилиты Loader образа собранного проекта для записи в ПЗУ.

3. Загрузка с помощью утилиты Flasher полученного от утилиты Loader образа программы во внешнюю ПЗУ с использованием программатора JEM LYNX. Загрузка программы во внешнюю ПЗУ осуществляется через процессор 1967ВН028/044.

В качестве тестовой загружаемой программы воспользуемся проектом "HelloWorld". После сборки "HelloWorld" будет создан исполняемый файл с расширением *.dxe, находящийся в директории с проектом в папке "Debug". В дальнейшем он потребуется для создания bin файла в утилите Loader.

Утилита Loader

Утилита Loader предназначена для получения специального образа программы, состоящего из двух частей: специальной программы-загрузчика и программы пользователя. Загрузчик в полученном образе необходим, т.к. при загрузке процессора из внешнего ПЗУ во внутреннюю память СОЗУ копируется не вся программа, а только первые 256 32-разрядных слов. Количество слов определено аппаратно и не может быть изменено. Поэтому если программа занимает более чем 256 слов, то необходимо использовать загрузчик.

При старте процессора из внешней памяти во внутреннюю память СОЗУ загружается 256 слов, которые являются программой-загрузчиком. Загрузчик настраивает периферию и выполняет загрузку основного кода из ПЗУ в память процессора, после чего передает ему управление.

Пользовательская программа в образе ПЗУ

Пользовательская программа, полученная после сборки в среде CM-LYNX, в общем случае представляет собой не единый в адресном пространстве памяти массив данных, а набор нескольких блоков данных. Блоки данных могут быть исполняемым кодом, переменными, константами и т.д.. Каждый блок данных формируется в виде отдельной секции. Секции в свою очередь размещаются компоновщиком по отдельным банкам памяти процессора. Размещение секций по банкам памяти задаётся в файле *.ldf (Linker Description File).

Так, например, исполняемый код программы по умолчанию будет располагаться в секции «.program», который привязан к банку 0 процессора, а переменные, которые проинициализированы нулями, будут располагаться в секции «.bss» (банк 1).

Для корректной работы программы необходимо, чтобы загрузчик не просто скопировал программу пользователя, но и правильно разместил её части по отдельным банкам памяти. Для этого утилита Loader при формировании образа ПЗУ добавляет к каждой секции специальный тег из двух 32-разрядных слов, в котором указывается тип данных, размер и начальный адрес загрузки.

Образ ПЗУ в итоге состоит из набора блоков данных с тегами. Для 8-ми разрядной Flash-памяти упрощённая структура полученного образа программы "HelloWorld" без MMAP таблицы представлена на рисунке 1.

Рисунок 1 - Структура полученного образа программы "HelloWorld"

Структура тегов приведена на рисунке 2, описание полей тегов приведено в таблице 1.

Рисунок 2 - Структура тегов загрузочного сегмента

Таблица 1 - Описание полей тегов

Поле

Описание

type

Тип блока. Существуют следующие типы блоков:

- b00 – final init, последний инициализационный блок. Блок такого типа всегда имеет объем 256 слов, должен располагаться с адреса 0x000000 и имеет только один тег;

- b01 – normal init, обычный инициализационный блок. За двумя словами тегов следует count 32- разрядных слов, которые должны быть размещены по адресу address;

- b10 – zero init, инициализация блока данных нулями. Такой блок состоит только из тегов и непосредственно не содержит нулевых данных. Загрузчик сам заполняет нулями область памяти по адресу address объемом count 32-разрядных слов.

ID

Идентификатор процессора, которому предназначен блок. Применяется для загрузки нескольких процессоров 1967ВН028.

tag

Вспомогательный идентификатор (11 бит).

сount

Количество 32-разрядных слов в блоке данных (максимум 65535)

address

Абсолютный адрес памяти процессора, по которому нужно расположить блок данных

После генерации образа ПЗУ в консоли утилиты Loader выводится информация по сформированным блокам данных, как показано на рисунке 3. Например, программа "HelloWorld" содержит 4 блока данных Block 0-3. В поле "Base" указывается начальный адрес блока в микросхеме памяти, "Addr" – адрес в памяти процессора, куда необходимо поместить данный блок, "Size" – размер блока в байтах, "Type" – тип данных.

Рисунок 3 - Информация в консоли Loader по созданному образу программы "HelloWorld"

Выделяют специальный блок "Final Init". Его размер составляет 256 32-разрядных слов, и он должен быть записан по адресу 0x00. Так как загрузчик всегда располагается в памяти процессора с адреса 0x00000000 и занимает 256 слов, то блок типа final init идёт последним, при этом загрузчик в конце загрузки переписывает свой код данными этого блока, после чего совершается переход на адрес 0x00, и начинает выполняться загруженная программа.

Подробнее про структуру сформированного образа можно прочитать в документе "ML_ЦППО_Loader_Руководство пользователя…", пункт «4.1.2.3. Загружаемые блоки кода/данных», который поставляется в составе среды CM-LYNX.

Создание образа ПЗУ

Выполним создание образа ПЗУ для микросхемы памяти Micron M25P80, которая идёт в составе отладочного комплекта для 1967ВН044. Утилита Loader находится в корневом каталоге среды CM-LYNX, по умолчанию это "Диск:\Milandr\CM-LYNX". Утилита может работать как в консольном режиме, так и с использованием графического интерфейса. Для наглядности будем использовать утилиту Loader с графическим интерфейсом, поэтому запустим файл Loader-gui.bat.

Сначала необходимо выбрать тип процессора, с которым будет осуществляться работа. Для процессора 1967ВН044 выбираем пункт "1967ВН044", и т.к. микросхема памяти Micron M25P80 работает по интерфейсу SPI, выбираем режим "1967ВН044 any Set of SPI bus FLASH bootloaders", как показано на рисунке 4.

Рисунок 4 - Выбор процессора в утилите Loader

Далее произведём необходимые настройки, как показано на рисунке 5.

1. В поле "Image segments" необходимо добавить полученный после сборки проекта .dxe файл.

2. В поле "Bootloader" выбираем необходимый тип загрузчика. Два доступных загрузчика отличаются только скоростью считывания основной программы из микросхемы памяти - это xti/4 и xti/20. На отладочной плате установлен кварцевый резонатор на 25 МГц, поэтому скорость считывания xti/4 = 25/4 = 6.25 МГц, xti/20 = 25/20 = 1.25 МГц. Согласно спецификации на память M25P80 максимальная скорость считывания (при использовании команды READ) составляет 20 МГц, поэтому можно выбрать любой из двух загрузчиков, например, загрузчик с максимальной скоростью "Boot kernel file for high-speed SPI bus FLASH (sclk = xti/4)".

3. В поле "Output file" выбираем путь, куда будет выгружен полученный образ. Обязательно нужно указать расширение файла. Например, для сохранения образа в бинарном формата необходимо в расширении указать .bin.

4. Нажав на кнопку "Generate image" по указанному пути будет сгенерирован образ для загрузки в ПЗУ.

Рисунок 5 - Конфигурация утилиты Loader для создания образа ПЗУ

Загрузка проекта с помощью утилиты Flasher

После того, как был получен образ проекта "Hello World", переходим к его загрузки в ПЗУ. Для этого запустим утилиту Flasher. Она также, как и Loader, расположена в корневом каталоге среды CM-LYNX и имеет два интерфейса: консольный и графический. Для работы с графическим интерфейсом Flasher'a запустим файл Flasher-gui.bat.

Сначала необходимо выбрать микросхему памяти, в которую будет осуществляться загрузка. Для этого в поле "Device" нажимаем кнопку "Select". Чтобы работать с микросхемой памяти M25P80 в появившемся окне выбираем в поле Vendor либо пункт "Micron", либо пункт "Миландр - отладочная плата 1967ВН044 ТСКЯ.469575", далее "M25P80" и "SPI 25x series FLASH programmer", как показано на рисунке 6.

Рисунок 6 - Выбор микросхемы памяти M25P80 в утилите Flasher

При выборе в поле "Vendor" пункта "Миландр - отладочная плата 1967ВН044 ТСКЯ.469575" доступен также загрузчик "1636РР3(ПЗУ Данных)", который может использоваться для работы с модулем памяти на основе 1636РР3 (SPI). Возможность использования модуля памяти на основе 1636РР3 по интерфейсу SPI появилась, начиная с версии отладочного модуля 2.41, разъем XS1.1-2. При старте из внешней SPI памяти выборка осуществляется по сигналу CS0, что соответствует микросхеме Micron. Модуль памяти 1636РР3 подключается к сигналу выборки CS1, поэтому он может использоваться только в качестве ПЗУ данных.

Далее необходимо установить соединение между отладочной платой и ПК. Для этого подключаем к отладочной плате программатор JEM LYNX и включаем питание. После этого в утилите Flasher нажимаем кнопку "Connect". В консоли утилиты Flasher должны появиться сообщения об успешном соединении с микросхемой памяти, как показано на рисунке 7.

Рисунок 7 - Установление соединения с микросхемой памяти M25P80 

Переходим к настройкам утилиты для загрузки образа в ПЗУ, как показано на рисунке 8.

1. В поле "File" указываем путь к образу программы, сформированному ранее в утилите Loader.

2. В поле "Options" выбираем настройки "Erase before programming" и "Verify after programming", чтобы перед программирование память была автоматически стёрта, а после программирования - верифицирована.

3. В поле "Program & verify" нажимаем кнопку "Program". В консоли должен отразиться ход операций стирания, программирования и верификации.

Рисунок 8 - Конфигурация утилиты Flasher для загрузки образа в микросхему памяти

После программирования микросхемы памяти нажимаем кнопку "Disconnect" и запускаем программу на отладочной плате. Для этого отключаем питание и устанавливаем режим загрузки процессора "011" - "Старт из последовательной SPI FLASH-памяти (выборка по CS0)", как показано на рисунке 9.

Рисунок 9 - Установка режима работы BOOT MODE == 011 на отладочной плате для 1967ВН044

Для выбора режима "011" необходимо перевести верхний контакт BOOT_2 в положение переключателя ON, чтобы подтянуть линию к GND, а нижние контакты BOOT_1 и BOOT_0 перевести в положение OFF, при этом линии будут подтянуты к питанию. На некоторых версиях платы переключатель может быть установлен в перевернутом положении относительно рисунка 9, поэтому при установке ползунков необходимо ориентироваться на надпись ON, расположенную на самом переключателе.

После задания режима загрузки процессора снова включаем питание. Процессор стартует из внешней ПЗУ и запускается проект "Hello World".

Настройка отладчика для работы с утилитой Flasher

Может возникнуть задача подключиться утилитой Flasher к произвольному процессору в JTAG цепочке (по умолчанию подключение осуществляется к первому процессору). Для этого необходимо запустить файл flasher_config.bat (находится также в корневой папке среды), в открывшемся окне "Настройки аппаратуры отладчика" необходимо задать позицию требуемого процессора в JTAG цепочке и нажать кнопку "ОК". Теперь после запуска утилиты Flasher всё взаимодействие будет осуществляться с выбранным процессором. Подробное описание выбора процессора в JTAG цепочке описано в документе "ML_ЦППО_Flasher_Руководство пользователя".

Например, для выбора 3 процессора в JTAG цепочке, состоящей из 4-х процессоров, необходимо задать настройки, как показано на рисунке 10.

Рисунок 10 - Настройки аппаратуры отладчика для подключения к 3 процессору в JTAG цепочке, состоящей из 4-х процессоров   


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

Теги

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