Dspic33ep256mu806 i pt чем прошить
Загрузчик для dsPIC33
Загрузчик (bootloader) — очень удобный инструмент работы с микроконтроллерами (далее — МК). Это маленькая программа, которая позволяет МК «самопрограммироваться» (self-programming). Обычно, при подаче питания на МК, управление сначала получает загрузчик, которые проверят заранее заданные условия (определенное состояние на ножке МК, флаг в EEPROM, подходящий файл прошивки на SD-карте и т.д.). Если условия не выполняются, то управление передается основной программе. Если же условия выполняются, то загрузчик переключается в режим программирования, получая данные новой прошивки по предопределенному интерфейсу. Это позволяет обновить прошивку МК не прибегая к паяльнику, программатору или внутрисхемному программированию.
Обычный алгоритм использования загрузчика для МК, только что вынутого из упаковки:
В своей практике я столкнулся с довольно жутким методом получения такой прошивки — в HEX-файл основной прошивки просто дописывался HEX-файл с кодом загрузчика. Конечно. такой подход имеет право быть — как ни крути, но итоговые «прошивки имени др. Франкенштейна» работали как надо. Но чувство, что для решения этой задачи должны быть более корректные методы, меня не оставляло.
Когда Я поискал решения в Интернете, то был неприятно удивлен, что простого и понятного описания решения нет. Собственно, именно это побудило меня написать публикацию, описывающую мое решение этой ситуации. Возможно мое видение решения этой проблемы отличается от максимально правильного, но оно гораздо более логичней, чем сшивание HEX-файлов.
Прежде чем перейти к самой теме публикации, хочу привести список упрощений и инструментов, которые были использованы:
Компоновка загрузчика в основной проект
Просто скомпилировать…
Начнем с самого простого случая. Добрый Дедушка Мороз прислал Вам на Новый Год готовый загрузчик. Причем он уже потрудился на славу и скомпилировал и скомпоновал его для Вас. Итак, у Вас в руках (на флешке/в сети/на жестком диске) есть файлик – UltraBoot3000.blob. Дальше алгоритм очень простой – просто добавь его к себе в проект.
Касаемо MPLAB IDE его надо добавить в категорию «Object Files». К сожалению, по умолчанию в эту категорию можно добавить только файлы с расширением «o». Отмечу так же, что файлы с расширением «o» получаются так же в процессе компиляции Вашей программы. Чтобы нечаянно не перепутать и не забыть о файле загрузчика, рекомендую держать его с другим расширением, например blob – binary linked object. Чтобы IDE положило файл blob в категорию «Object Files», этой категории нужно скорректировать настройки фильтров. Жмем правой кнопкой мыши на этой категории и выбираем пункт «Filter…». В появившемся окне в поле через точку-с-запятой дописываем необходимый нам шаблон фильтра. В нашем случае в поле должно быть в итоге следующее описание фильтров:
*.o;*.blob
После настройки фильтров можно добавить файл загрузчика в проект.
Запускаем процесс компи… НЕТ! СТОП!
Чтобы корректно собрать прошивку с нашим загрузчиком, нужен правильный скрипт компоновщика. Конечно, если Дедушка Мороз был настолько добр, что и этот скрипт Вам прислал, то просто добавляем его себе в проект (MPLAB IDE поддерживает файлы с расширением «gld»), запускаем процесс сборки проекта и на выходе получаем корректный файл прошивки с уже встроенным кодом загрузчика.
Но что делать, если Дедушка забыл про это скрипт или может быть именно Вы и являетесь тем, кто сделал этот загрузчик и Вам надо встроить его в свой/чужой проект? Читаем дальше…
Подготовка скрипта компоновщика
Первым делом надо вписать два символа, описывающих начало области загрузчика и основной программы. Например, так:
_Booter = 0x000400;
_mainFW = 0x002000;
Далее в структуре MEMORY <…>в поле program указать начальную позицию (origin) и длину (length), соответствующие началу загрузчика и размеру flash-памяти минус начало загрузчика. Примерно так:
.reset :
<
SHORT(ABSOLUTE(_Booter));
SHORT(0x04);
SHORT((ABSOLUTE(_Booter) >> 16) & 0x7F);
SHORT(0);
> >reset
Осталось только добавить описание зоны загрузчика. Зона описывается в структуре SECTIONS <…>. Это описание необходимо вставить перед описанием зоны «.text». Описание следующее:
Создание загрузчика
Сделать загрузчик из программы
Первое, что хотелось бы отметить: загрузчик не должен быть самостоятельной программой. Конечно, в процессе отладки загрузчика его можно реализовать как самостоятельную программу. Но как только Вы планируете его встроить в другую программу его необходимо специально подготовить.
Итак, чего лишается программа, превращаясь в загрузчик:
Доработка исходных текстов
Доработка несложная. Убираем все макросы, описывающие конфигурационные биты. Исключаем использование глобальных констант.
Настройка проекта
Так же необходимо проверить и, при необходимости, скорректировать настройки проекта. Все изменения – во вкладке «MPLAB LINK30», категория «General». Установить чек-боксы: don’t pack data template; don’t create hanldes; don’t create default ISR; remove unused sections.
Доработка скрипта компоновщика
Так же как и для основной программы с загрузчиком скрипт будет отличным от скрипта по умолчанию. Итак, берем скрипт по умолчанию и вносим следующие изменения.
Структуру MEMORY <…>уменьшаем до двух позиций: data и program. Причем начало и длина program соответствуют началу и длине области загрузчика:
<
data (a!xr) : ORIGIN = 0x800, LENGTH = 0x4000
program (xr) : ORIGIN = 0x400, LENGTH = 0x1C00
>
Удаляем полностью описание «Reset Instruction» в структуре SECTIONS <…>. В этой же структуре удаляем описание «Configuration Words». Полностью удаляем структуру SECTIONS <…>, которая описывает вектора прерываний (метка «Section Map for Interrupt Vector Tables»).
В структуре SECTIONS <…>дорабатываем описание зоны «.text», заменив название зоны на «.booter» и приведя ее к следующему виду:
.booter 0x400 :
<
*(.init);
*(.user_init);
*(.handle);
*(.libc) *(.libm) *(.libdsp); /* keep together in this order */
*(.lib*);
*(.dinit);
*(.text);
> >program
Естественно, полученный скрипт надо добавить в проект.
Постобработка выходного файла
После осуществления предыдущих действий можно запустить процесс компиляции. В выводе процесса сборки (для MPLAB IDE это будет в окне Output, вкладка Build) можно увидеть результат компоновки. Например, так:
Program Memory [Origin = 0x400, Length = 0x1c00]
Total program memory used (bytes): 0xbb8 (3000) 27%
Data Memory [Origin = 0x800, Length = 0x4000]
Total data memory used (bytes): 0xa6c (2668) 16%
Если в program memory больше одной секции – то скорей всего вы не до конца выполнили действия описанные выше. Если там именно одна секция с названием «.booter» — то все сделано правильно.
Также надо обратить внимание на количество секций в data memory.
Теперь надо выполнить постобработку выходного файла. Постобработка проводиться с файлом с расширением «cof». Открываем командную строку в папке с этим файлом. Допустим файл имеет имя ultraboot.cof, тогда выполним команду:
Далее надо провести финальную проверку полученного бинарного файла с загрузчиком. Команда:
Вывод будет примерно следующим:
ultraboot.blob: file format coff-pic30
И в конце ссылки на примеры файлов для линкера: