| Простейший начальный загрузчик для микроконтроллеров AVR® фирмы Atmel с возможностью самостоятельного программирования памяти команд В этом примере мы рассмотрим драйвер (boot loader) для микроконтроллеров семейства AVR фирмы Atmel, обеспечивающий работу с блоком автопрограммирования (Self-Programming), позволяющим производить запись памяти программ «на лету» и без применения каких-либо внешних программаторов. 1. Процедура установления связи Программа начальной загрузки (загрузчик) обменивается данными с персональным компьютером (ПК) через асинхронный интерфейс RS-232. Формат передачи: 8 бит данных, стоп-бит 2 интервала, без контроля четности. Возможны 3 варианта вызова загрузчика: I. | В данной версии реализован вызов загрузчика при первой подаче питания на устройство через изменение вектора начальной загрузки. При старте загрузчик проверяет состояние бита PORF и сбрасывает его, затем запускается сторожевой таймер с максимальным временем задержки, в течение которого загрузчик ожидает установления связи. Если связь не была установлена, то контроллер сбрасывается сторожевым таймером и загрузчик, не обнаружив установленный бит PORF, передает управление программе пользователя по адресу 0x0000. Если связь была установлена, то загрузчик останавливает сторожевой таймер и продолжает свою работу. Для установления связи ПК передает подряд 16 байт (0x80), по ним определяется скорость передачи. В ответ загрузчик передает подряд 3 байта: полученный коэффициент деления асинхронного интерфейса (первым целая часть, вторым дробная) и байт 0x0D. Коэффициент деления, отличающийся от ближайшего целого числа больше чем на 4 - 5%, не рекомендуется для использования из-за низкой точности синхронизации [2, стр. 180-181]. | II. | Вызовом из программы пользователя по адресу boot_soft с автоматическим подбором скорости передачи, как указано выше. | III. | Вызовом из программы пользователя по адресу boot_main_proc с заранее настроенным асинхронным интерфейсом и указателем стека. В ответ загрузчик передает байт 0x0D/0x1B (в зависимости от состояния контроллера перед началом работы загрузчика). | 2. Протокол обмена данными между ПК и загрузчиком Загрузчик поддерживает минимальный набор команд, необходимый для работы со всеми ресурсами ИМС, предоставляемыми блоком «Self-Programming». Команда ПК/ | Код команды | Ответ загрузчика | Холостая команда | 0x0 | 0x0D/0x1B | Загрузка буфера страницы в количестве count слов | 0x1,count,count(DATAl:DATAh) | 0x0D/0x1B | Чтение памяти команд в количестве count байт | 0x2,count | count(DATA),0x0D/0x1B | Загрузка SPMCR и вызов SPM | 0x3,control | 0x0D/0x1B | Загрузка SPMCR и вызов LPM | 0x4,control | 0x0D/0x1B | Загрузка RAMPZ (для mega128) | 0x5,control | 0x0D/0x1B | Загрузка регистровой пары с адресом addr = a aaaa | 0b xx1aaaaa,DATAl:DATAh | 0x0D/0x1B | Выход | 0x80 | нет | После выполнения каждой команды загрузчик выдает код 0x0D. Код 0x1B выдается, если произошло переполнение регистра данных приемника асинхронного интерфейса. «0» в качестве холостой команды выбран потому, что это единственные данные, которые, будучи записаны в регистр SPMCR, не вызовут несанкционированной записи. Для адресации при загрузке буфера страницы или чтении программной памяти используется регистровая пара ZL:ZH. После чтения/записи каждого байта содержимое указателя (включая бит RAMPZ) увеличивается на 1. При загрузке буфера страницы контроллера mega163 необходимо заполнять все неиспользуемые позиции кодом 0xFF, так как в противном случае содержимое этих позиций после записи будет неопределено. У контроллера mega128 буфер страницы автоматически заполняется кодом 0xFF при подаче питания, после выполнения операции записи или после записи «1» в бит RWWSRE. Перед командой «Выход» (передача управления программе пользователя по адресу 0x0000) необходимо исполнить команду «Загрузка SPMCR и вызов SPM» с параметром 0x11 (кроме mega161). 3. Биты конфигурации и используемые ресурсы. Биты конфигурации микроконтроллера должны быть установлены следующим образом: BootRST = 0; BootSize[1,0] = размер загрузочного блока не менее 256 байт; BodEN = 0; BodLEV соответственно напряжению питания устройства. Используемые ресурсы: - Регистры R0..1, R16..18, XL:XH, ZL:ZH;
- 16-битный таймер 1 и сторожевой таймер;
- Бит PORF и флаг Т;
- Регистр RC-генератора OSCCAL;
- Асинхронный интерфейс UART или синхронно-асинхронный интерфейс USART;
- ОЗУ по адресу 0x01FD..0x01FF стек.
По адресу FLASHEND рекомендуется располагать в младшем байте версию загрузчика, в старшем калибровочный байт RC-генератора. 4. Тестирование Проверка работы загрузчика производилась с использованием терминальной программы, работающей под управлением MS-DOS. Связь устанавливалась c контроллером ATmega128-16AI на скорости 19200 бод при тактировании от встроенного RC-генератора и напряжении питания 3.3 В и на скорости 115200 бод при тактировании от внешнего генератора с частотой 3.6864 МГц и напряжении питания 5 В. Протестированы все описанные в протоколе обмена операции загрузчика. 5. Исходные коды на ассемблере Тестовая программа содержит «Application section» в виде изображения бегущей строки (бегущие «0» выводятся на порт Б) и обращение к внешнему файлу с исходным кодом загрузчика. В составе включаемых файлов имеются 2 подпрограммы для работы с асинхронным интерфейсом (с программным опросом флагов готовности), которые могут быть использованы самостоятельно: по адресу boot_receive расположена подпрограмма приема байта; по адресу boot_transmit расположена подпрограмма передачи байта. 6. Продолжение следует / coming soon... (BOOT LOADER по мотивам AVR910 и AVR911 с поддержкой AVRProg и AVRDUDE). Литература: Автор: Станислав Лещинский aka «Точка Опоры» ООО «МФК Точка Опоры», Москва, www.fulcrum.ru 04.02.2002 |