Микросхемы 1967ВН034/044 являются высокопроизводительными процессорами цифровой обработки сигнала с тактовой частотой 300/230 МГц. Для исполнения команд на такой частоте память процессора также должна обладать высокой скоростью работы.
Типичным представителем встроенной памяти в микроконтроллерах является Flash память, которая, к сожалению, обладает очень большим временем доступа и, как следствие, не позволяет использовать производительность данных процессоров в полном объёме. Другой представить встроенной памяти - СОЗУ, обладает более высокой скоростью работы, чем Flash, что делает её пригодной для использования в высокопроизводительных процессорах. Однако у памяти типа СОЗУ есть существенный недостаток - она энергозависима, т.е. если отключить питание процессора, то вся сохранённая информация в СОЗУ сотрётся и при включении её придётся восстанавливать. В связи с этим для хранения исполняемой программы обычно используется внешняя энергонезависимая память (например, Flash). При включении процессора программа из внешней ПЗУ копируется во внутреннее СОЗУ, откуда уже и происходит запуск.
В данной статье будет рассмотрено как с помощью средств, встроенных в среду CM-LYNX, прошить внешнее ПЗУ и выполнить с него запуск процессора.
На данный момент в моём распоряжении находится процессорный модуль для микросхемы 1967ВН044. Объём памяти СОЗУ в процессоре 1967ВН044 составляет 12 Мбит. Для хранения исполняемой программы на плате предусмотрена энергонезависимая SPI Flash память Micron M25P80 объёмом 8 Мбит. Также на отладочную плату можно установить модуль памяти с микросхемой 1636РРхх, но у нас его нет, поэтому будем прошивать память Micron M25P80.
Для загрузки исполняемой программы в ПЗУ в составе среды разработки CM-LYNX поставляются две утилиты:
Последовательность их использования следующая:
1. Собираем проект в среде CM-LYNX.
2. С помощью утилиты Loader создаём образ собранного проекта для записи в ПЗУ.
3. С помощью утилиты Flasher прошиваем полученный от утилиты Loader образ программы во внешнюю ПЗУ с использованием программатора JEM LYNX.
В качестве тестовой загружаемой программы воспользуемся проектом Hello World из статьи Подключаем библиотеки HAL в среде CM-LYNX. После сборки Hello World будет создан исполняемый файл с расширением .dxe, находящийся в директории с проектом в папке Debug. Он нам потребуется для создания bin файла в утилите Loader.
Утилита Loader предназначена для получения специального образа программы, состоящего из двух частей: специальной программы-загрузчика и программы пользователя, т.е. нашей Hello World. Загрузчик в полученном образе необходим, т.к. при загрузке процессора из внешнего ПЗУ во внутреннюю память СОЗУ копируется не вся программа, а только первые 256 32-разрядных слов образа. Количество слов определено аппаратно и не может быть изменено. Поэтому если наша программа занимает более чем 256 слов (а это скорее всего так), то необходимо использовать загрузчик.
При старте процессора во внутреннюю память СОЗУ загружается загрузчик, который настраивает периферию и выполняет загрузку основного кода из ПЗУ в память процессора, после чего передает ему управление.
Необходимо также обратить внимание, что пользовательская программа в общем случае представляет собой не единый в адресном пространстве памяти код, а разбитый на несколько секций. Так, например, исполняемый код программы по умолчанию будет располагаться в секции .program, который физически привязан к банку 0, данные программы будут располагаться в секции .data (банк 2), переменные, которые проинициализированы нулями, в секции .bss (банк 1). Указанные настройки по размещению исходного кода по выходным секциям задаются в файле *.ldf (Linker Description File).
Таким образом, загрузчик должен не просто скопировать программу пользователя, но и правильно разместить её части по отдельным банкам памяти. Чтобы загрузчик «знал», куда и какую часть кода положить, утилита Loader к каждому сегменту программы добавляет специальный тег, в котором указывается тип данных, размер и начальный адрес загрузки. После генерации образа ПЗУ в консоли утилиты Loader выводится информация по созданным сегментам памяти. Например, программа HelloWorld разбивается на 4 блока Block 0-3, при этом в поле Base указывается начальный адрес блока в микросхеме памяти, Addr – адрес в памяти процессора, куда необходимо поместить данный блок, Size – размер блока в байтах, Type – тип данных.
Выделяют специальный блок Final Init. Его размер составляет 256 32-разрядных слов, и он должен быть записан по адресу 0x00. Так как загрузчик всегда располагается в памяти процессора с адреса 0x00000000 и занимает 256 слов, то блок типа final init идёт последним, при этом загрузчик в конце переписывает свой код данными этого блока, после чего совершается переход на адрес 0x00, и начинает выполняться загруженная программа.
Для 8-ми разрядной flash-памяти упрощённая структура полученного образа программы HelloWorld без MMAP таблицы будет следующей:
Подробнее про структуру сформированного образа можно прочитать в документе "ML_ЦППО_Loader_Руководство пользователя…", который поставляется на диске со средой CM-LYNX.
Теперь перейдём непосредственно к практической части. Утилита Loader находится в корневом каталоге среды CM-LYNX, по умолчанию это "Диск:\Milandr\CM-LYNX". Утилита может работать как в консольном режиме, так и с использованием графического интерфейса. Мы для наглядности будем пользоваться графическим интерфейсом, поэтому запустим файл Loader-gui.bat.
Сначала нам необходимо выбрать тип процессора, с которым мы будем работать. Для нашего процессора 1967ВН044 выбираем пункт "1967ВН044", и т.к. микросхема памяти Micron M25P80 работает по интерфейсу SPI, выбираем режим "1967ВН044 any Set of SPI bus FLASH bootloaders".
Далее произведём необходимые настройки:
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" по указанному пути будет сгенерирован образ для загрузки в ПЗУ.
После того, как мы получили образ проекта 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".
На следующем этапе необходимо установить соединение между отладочной платой и ПК, поэтому подключаем к плате программатор JEM LYNX и включаем питание. Далее в утилите Flasher нажимаем кнопку "Connect". В консоли ниже должны появиться сообщения об успешном соединении с микросхемой памяти.
Теперь переходим к настройкам утилиты для загрузки образа в ПЗУ:
1. В поле "File" указываем путь к образу программы, сформированному ранее в утилите Loader.
2. В поле "Options" выбираем настройки "Erase before programming" и "Verify after programming", чтобы перед программирование память была автоматически стёрта, а после программирована - верифицирована.
3. В поле "Program & verify" нажимаем кнопку "Program". В консоли должен отразиться ход операций стирания, программирования и верификации.
Если программирование прошло успешно, нажимаем кнопку "Disconnect" и пробуем запустить программу на отладочной плате. Для этого отключаем питание и выставляем режим загрузки процессора "011" - "Старт из последовательной SPI FLASH-памяти (выборка по CS0)", согласно спецификации, таблица 256 – Режимы загрузки, стр. 422.
На моей отладочной плате для выбора режима стоит 4-х контактный переключатель, в то время как в спецификации указано 3 битное значение режима загрузки. Полистав схему отладочной платы, выяснилось, что 1 контакт не подключён, а нумерация идёт снизу вверх. Для выбора режима "011" необходимо перевести контакты 4 и 3 в положение ON, а контакт 2 в положение GND.
После задания режима загрузки процессора снова включаем питание. Процессор стартует из внешней ПЗУ и запускается проект Hello World.
Может возникнуть задача подключиться утилитой Flasher к произвольному процессору в JTAG цепочке (по умолчанию подключение осуществляется к первому процессору). Для этого необходимо запустить файл flasher_config.bat (находится также в корневой папке среды), в открывшемся окне "Настройки аппаратуры отладчика" задать позицию необходимого процессора в JTAG цепочке и нажать кнопку "ОК". Теперь после запуска утилиты Flasher всё взаимодействие будет осуществляться с выбранным процессором.
Например, для выбора 3 процессора в JTAG цепочке необходимо задать следующие настройки:
В утилите Loader есть возможность создания образа памяти 1636РРхх (параллельный интерфейс) для загрузки кластера из нескольких процессоров 1967ВН028.
Здесь есть 3 варианта:
1. "Boot kernel file for nBMS parallel bus FLASH ID0-3", файл VC2_PROM_DEFAULT.dxe. Позволяет создать образ для загрузки от 1 до 4 процессоров в кластере.
2. "Boot kernel file for nBMS parallel bus FLASH, ID0-7, bug workaround by patching ID4-7 DMA", файл VC2_PROM_PATCH47.dxe. Предназначен только для создания образа для кластера из 8 процессоров. Реализует механизм самостоятельной загрузки исполняемого кода из Flash памяти процессорами c ID 4-7 по DMA, канал 0. Инициализация DMA канала 0 у процессоров c ID 4-7 выполняется процессором с ID0. Для данного загрузчика требуется наличие элемента "И" на плате, чтобы процессоры с ID 4-7 могли работать с flash памятью по nBMS, но при сбросе видели высокий уровень на этой линии. У процессоров c ID 4-7 не должен быть выбран способ загрузки из внешнего EEPROM.
3. "Boot kernel file for nBMS parallel bus FLASH, ID0-7, bug workaround by directly booting ID4-7", файл VC2_PROM_PASSIVE47.dxe. Предназначен только для создания образа для кластера из 8 процессоров. Реализует механизм пассивной загрузки исполняемого кода в процессоры c ID 4-7. Инициализация памяти процессоров c ID 4-7 выполняется процессором с ID0. У процессоров с ID 4-7 не должен быть выбран способ загрузки из внешнего EEPROM.