Очень удобной фичей в AVR-микроконтроллерах является возможность использования загрузчика кода. Загрузчик - это такая маленькая програмка, под которую выделяется блок флеш-памяти МК, размер этого блока задается фьюзами и может принимать одно из фиксированных значений: 256, 512, 1024, 2048 байт. Загрузчик помещается в самом конце флеш-памяти. Фьюзами выбирается, что именно будет запущено при сбросе МК - основная программа по адресу 0000 или загрузчик. При запуске загрузчик проверяет некоторое условие (активность интерфейса UART, нажатие некоторых кнопок, установку джамперов и т.д.) и в зависимости от этого либо ожидает приема данных для прошивки МК, либо передает управление основной программе. В итоге, вместо громозкого ISP-интерфейса при разработке и отладке программ можно использовать UART как для обновления прошивки, так и, например, для управлением устройством с компьютера или передачей в компьютер отладочной информации.
Из тех загрузчиков, что мне попадались, хочется выделить два. Первый загрузчик - ATMEL AVR UART Bootloader for AVR-GCC/avr-libc. К его достоинствам относится то, что он совместим с AVRPROG и, следовательно, поддерживается в AVRStudio. Второе достоинство - это загрузчик позволяет читать, проверять и записывать не только flash-память программы, но и eeprom-память. Основным недостаткам загрузчика является его слишком большой размер - 1024 байта в минимальной конфигурации. Я пользовался этим загрузчиком до тех пор, пока однажды свободной памяти в программирумой меге8 перестало хватать и килобайта памяти оказался слишком дорогой ценой для загрузчика.
Второй загрузчик - Small Serial Bootloader отличается минимально возможным размером (256 байт в минимальной конфигурации) но не может работать с eeprom и для управления предлагает только лишь скрипт на питоне, причем, похоже, только под линукс.
На основе этого второго загрузчика был сделан загрузчик t-boot. Из Small Serial Bootloader была выкинута вся лишняя функциональность и внесены некоторые измерения. Вместо питонового скрипта написано управляющее приложение (консольное под Windows и Linux), с синтаксисом аналогичным синтаксису программатора avrdude.
В программе был реализован "умный" режим прошивки - когда сначала считывается вся память МК, затем, при программировании перезаписываются только те страницы, содержимое которых изменилось. Этот режим может немного увеличить время прошивки (как, впрочем, и наоборот, ощутимо сократить его), но позволяет при этом увеличить максимальное количество циклов перезаписи МК.
К сожалению, в 256 байт загрузочного кода не удается уместить еще и код для программирования памяти eeprom, поэтому, пока операции с eeprom не поддерживаются. Эту функциональность планируется дописать в будущем по мере необходимости следующим образом: размер загрузчика оставить равным 256 байт, не увеличивать его до 512 байт, а код работы с eeprom записывать непосредственно перед началом загрузчика и передавать на него управление, если надо. Таким образом:
Синтаксис командной строки:
Usage: tboot [options] Options: -p <partno> Specify AVR device. -b <baudrate> Override RS-232 baud rate. -C <config-file> Specify location of configuration file. -p <partno> Specify AVR device. -b <baudrate> Override RS-232 baud rate. -C <config-file> Specify location of configuration file. -P <port> Specify connection port. -U <flash|eeprom>:r|w|v:<filename.ext> Memory operation specification. Multiple -U options are allowed, each request is performed in the order specified. -n Do not write anything to the device. -V Do not verify. -v Verbose output. -q Quell progress output.
Например, прошивка памяти:
tboot -U flash:w:data.hex
Чтение памяти:
tboot -U flash:r:data.bin
Имя файла должно иметь расширение .hex или .bin, исходя из этого файл будет сохраняться как файл в формате Intel hex, либо соответственно как простой бинарный файл.
Конфигурация загрузчика хранится в файле tboot.conf, который должен лежать в одном каталоге с tboot.exe,
либо путь к файлу конфигурации указывается директивой -C
.
В этом файле указываются настройки программы по умолчанию а также содержится описание всех программируемых МК (я тестировал это пока только на mega8 и mega8535).
В файле Makefile изменяем две следующие строки:
MCU=atmega8tboot.hex: BOOTSTART=0x1F00
В них указываем соответственно имя МК и смещение загрузчика (т.е., размер памяти МК-0xFF)
В файле tboot.S задаем константы FOSC и BAUDRATE. Первая определяет тактовую частоту, вторая - скорость UART. Там же меняем макросы CONTROL_PORT_DDR, CONTROL_PORT_PORT, CONTROL_PORT_PIN и CONTROL_PIN - тут определяется, какой вывод МК будет управлять включением режима заргузки. Если указанный пин замкнут на землю, работать будет загрузчик, иначе - управление перейдет программе по адресу 0000.
После внесения этих изменений надо выполнить команду make
(avr-gcc должен быть установлен и прописан в PATH), загрузчик будет
скомпилирован в файл tboot.hex.
Загрузчик принимает и передает данные в текстовом виде. Он принимает команды, обрабатывает их и выдаёт результат. Каждая команда - один символ, за которым могут следовать аргументы. Данные передаются в шестнадцатиричном формате. В случае неверной команды загрузчик посылает символ '!'. Когда ожидается команда, загрузчик посылает символ CR (0x0d). Все шестнадцатиричные данные посылаются в нижнем регистре. Пробелы и прочие символы в шестнадцатиричных значения не допускаются. При запуске загрузчик посылает строку 'ok' с последующим CR.
Команды:
По ссылкам ниже можно скачать прошивку загрузчика и его исходники с управляющей программой для Windows или Linux, а также исходники управляющей программы. Для компиляции последних потребуется cmake.
Скачать:
Загрузчик с исходником и программа прошивки для Windows