USART/RS485 Bootloader для AVR
Понадобилось мне прошивать ATmega88, которая находится в труднодоступном месте, куда с ISP программатором залезть не получится, но от нее идет шина RS485, по которой атмега общается с компом, вот через нее и можно перепрошивать.
Как вы уже догадались, для этого мы будем использовать Bootloader (бутлоадер). Объяснять что это такое я не буду, инфу о нем вы можете найти в инете. С нуля писать бутлоадер не хотелось, да и плюс я на компе нашел уже готовый, который использовал года 2 назад, автор этого бутлоадера Martin Thomas. Со стороны компа используется программка AvrProg.exe, которая входит в комплект AVR Studio, а в МК бутлоадер занимает 512 слов (1Кб), но после моих доработок стал весить 2 Кб, конечно же, кому то это покажется много, но меня вполне устраивает (даже для Atmega8). Изначально, в бутлоадере было 2 минуса - он не поддерживал ATmega88 и не работал по RS485, но я это исправил.
Итак, основные файлы, в которых нам надо сделать настройки - это main.c и makefile.
Здесь огромное количество настроек, но 95% с них нам не нужны, а нужны только 2 опции:
Здесь уже опций побольше.
С частотой все понятно. На счет скорости - рекомендую ставить 19200, так как на остальных прога редко находит бутлоадер.
Настройка RS485. Если вам нужно перепрошивать через USART, то закоментируйте #define USE_RS485, если нужен RS485, то укажите, к какой ножке МК подключен выбор направления передачи драйвера rs485.
Для входа в режим бутлоадера можно использовать несколько условий, одно с них - наличие низкого уровня на ножке микроконтроллера. На счет светодиода понятно.
Условие входа в бутлоадер. Вообще то, нам нужны только первые 2 варианта. START_SIMPLE - переход в бутлоадер, если после ресета на ножке BLPNUM(смотрите выше) низкий уровень. Если START_WAIT, то после ресета бутлоадер определенное время будет ждать, пока будет получен запрос с программы, если он не получен за это время, то будет переход к основой программе. Само время задается опцией WAIT_VALUE.
Теперь все настроено, компилируйте проект (F7), для компиляции должен быть установлен WinAVR, так как тулчейн компилировать эту хрень не хочет. У меня на компе установлен WinAVR и тулчейн, вроде друг другу не мешают. При компиляции вылезет куча ошибок в окне Messages, не обращайте на них внимания, главное - чтобы ошибок не было в окне Build.
После компиляции нужно залить прошивку бутлоадера(которую только что скомпилировали) в МК и установить некоторые фьюзы:
Фьюзами BOOTSZ нужно указать размер бутлоадера (у меня 1024). Также, надо установить BOOTRST, это для того, чтобы после перезагрузки МК, выполнение кода начиналось не с начала, а с сектора, где находится бутлоадер. Остальные фьюзы настраиваются стандартно.
Итак, мк прошит, подключает его к компу через usart или rs485, сначала надо проверить связь. Запускаем любую терминальную програмку, устанавливаем скорость 19200 и отправляем символ S, в ответ должно придти AVRBOOT.
Теперь, попробуем прошить через бутлоадер. Открываем AVRProg (обычно лежит в c:\Program Files\Atmel\AVR Tools\AvrProg\AvrProg.exe), программа начнет сканировать СОМ порты с номерами 1-4, если номер порта будет 5 и больше, то программа его не найдет. После того, как мк с бутлоадером найден, выскочит такое окно:
Снизу указан МК. У меня, правда, Атмега88, но его, насколько знаю, AVRProg не поддерживает, но ничего страшного. выбираем прошивку, которую надо залить и жмем Program. Прошивка начнет заливаться, но при верификации у атмега88 вылазит вот такая ошибка:
Это гласит, что по адресу 0x0080 находится неверный байт. Я считал прошивку по ISP и сровнял ее с той, которую заливал - они были одинаковы, значит прошилось нормально, может это из-за того, что атмега88 не поддерживается в AVRProg. Пробовал еще на Атмега128, там ошибки не было.
При прошивке через бутлоадер важно помнить, чтобы размер основной прошивки был не более чем размер_памяти_мк-размер_бутлоадера.
Как вы уже догадались, для этого мы будем использовать Bootloader (бутлоадер). Объяснять что это такое я не буду, инфу о нем вы можете найти в инете. С нуля писать бутлоадер не хотелось, да и плюс я на компе нашел уже готовый, который использовал года 2 назад, автор этого бутлоадера Martin Thomas. Со стороны компа используется программка AvrProg.exe, которая входит в комплект AVR Studio, а в МК бутлоадер занимает 512 слов (1Кб), но после моих доработок стал весить 2 Кб, конечно же, кому то это покажется много, но меня вполне устраивает (даже для Atmega8). Изначально, в бутлоадере было 2 минуса - он не поддерживал ATmega88 и не работал по RS485, но я это исправил.
Итак, основные файлы, в которых нам надо сделать настройки - это main.c и makefile.
Makefile
Здесь огромное количество настроек, но 95% с них нам не нужны, а нужны только 2 опции:
- MCU. Здесь нужно указать название микроконтроллера, в моем случае - atmega88pa.
- BOOTSIZE. Размер бутлоадера. Здесь, в принципе, менять что то не желательно, я установил 1024, но если у вас получится как то ужать код, то можете выбрать 512.
main.c
Здесь уже опций побольше.
// Тактовая частота контроллера (кварца)
#ifndef F_CPU
// #define F_CPU 7372800
//#define F_CPU (7372800/2)
//#define F_CPU 11059200
#define F_CPU 14745600
#endif
// Скорость UART
//#define BAUDRATE 9600
#define BAUDRATE 19200
//#define BAUDRATE 115200
С частотой все понятно. На счет скорости - рекомендую ставить 19200, так как на остальных прога редко находит бутлоадер.
// передача через RS485
#define USE_RS485
#define RS485_DDR DDRD
#define RS485_PORT PORTD
#define RS485_PNUM 2
Настройка RS485. Если вам нужно перепрошивать через USART, то закоментируйте #define USE_RS485, если нужен RS485, то укажите, к какой ножке МК подключен выбор направления передачи драйвера rs485.
/* Выбор порта для кнопки входа в загрузчик
Чтобы войти в загрузчик надо чтобы при запуске эта кнопка замыкала пин на землю*/
#define BLPORT PORTB
#define BLDDR DDRB
#define BLPIN PINB
#define BLPNUM PINB0
/* Выбор порта для индикатора работы загрузчика
Светодиод горит - мы в загрузчике*/
#define ENABLE_BOOT_LED
#define BIPORT PORTD
#define BIDDR DDRD
#define BIPIN PIND
#define BIPNUM PIND3
Для входа в режим бутлоадера можно использовать несколько условий, одно с них - наличие низкого уровня на ножке микроконтроллера. На счет светодиода понятно.
//#define START_SIMPLE
#define START_WAIT
//#define START_POWERSAVE
//#define START_BOOTICE
Условие входа в бутлоадер. Вообще то, нам нужны только первые 2 варианта. START_SIMPLE - переход в бутлоадер, если после ресета на ножке BLPNUM(смотрите выше) низкий уровень. Если START_WAIT, то после ресета бутлоадер определенное время будет ждать, пока будет получен запрос с программы, если он не получен за это время, то будет переход к основой программе. Само время задается опцией WAIT_VALUE.
Теперь все настроено, компилируйте проект (F7), для компиляции должен быть установлен WinAVR, так как тулчейн компилировать эту хрень не хочет. У меня на компе установлен WinAVR и тулчейн, вроде друг другу не мешают. При компиляции вылезет куча ошибок в окне Messages, не обращайте на них внимания, главное - чтобы ошибок не было в окне Build.
После компиляции нужно залить прошивку бутлоадера(которую только что скомпилировали) в МК и установить некоторые фьюзы:
Фьюзами BOOTSZ нужно указать размер бутлоадера (у меня 1024). Также, надо установить BOOTRST, это для того, чтобы после перезагрузки МК, выполнение кода начиналось не с начала, а с сектора, где находится бутлоадер. Остальные фьюзы настраиваются стандартно.
Итак, мк прошит, подключает его к компу через usart или rs485, сначала надо проверить связь. Запускаем любую терминальную програмку, устанавливаем скорость 19200 и отправляем символ S, в ответ должно придти AVRBOOT.
Теперь, попробуем прошить через бутлоадер. Открываем AVRProg (обычно лежит в c:\Program Files\Atmel\AVR Tools\AvrProg\AvrProg.exe), программа начнет сканировать СОМ порты с номерами 1-4, если номер порта будет 5 и больше, то программа его не найдет. После того, как мк с бутлоадером найден, выскочит такое окно:
Снизу указан МК. У меня, правда, Атмега88, но его, насколько знаю, AVRProg не поддерживает, но ничего страшного. выбираем прошивку, которую надо залить и жмем Program. Прошивка начнет заливаться, но при верификации у атмега88 вылазит вот такая ошибка:
Это гласит, что по адресу 0x0080 находится неверный байт. Я считал прошивку по ISP и сровнял ее с той, которую заливал - они были одинаковы, значит прошилось нормально, может это из-за того, что атмега88 не поддерживается в AVRProg. Пробовал еще на Атмега128, там ошибки не было.
При прошивке через бутлоадер важно помнить, чтобы размер основной прошивки был не более чем размер_памяти_мк-размер_бутлоадера.
Спасибо за статью! Очень помогло! А есть ли какая прога в замену AVRprog?
ОтветитьУдалитьЯ только этой пользовался.
ОтветитьУдалитьЕще вопрос: А можно ли как то сделать "преднастройку" для ATmega328p в хиддерах загрузчика ее нет... Поможете?
ОтветитьУдалитьТам в исходниках нужно сделать несколько изменений, вроде как только заменить некоторые регистры
ОтветитьУдалитьЕсли не хотите AVRprog, можно использовать BootLoader (avr-assm.ru)
ОтветитьУдалитьПрошу помощи! Очень заинтересовался этим проектом - хочу RS485 в бутлоудере и все, хоть убейте! Изначально нашел этот проект у другого автора - там он пишет про загорание и погасание светодиода, хотя из кода он убрал управление светодиодом. Бог с ним, но связи нет. Здесь есть управление светодиодом, но он не гаснет и связи опять нет. Черт со связью, почему светодиод не гаснет??? Просмотрел код - должен гаснуть через 4 сек, но гад не гаснет. Я недавно начал писать на СИ и AVR, может туплю...
ОтветитьУдалитьmakefile:
MCU = atmega16
BOOTSIZE=1024
main:
#ifndef F_CPU
#define F_CPU 7372800
#endif
#define BAUDRATE 19200
#define USE_RS485
#define RS485_DDR DDRC
#define RS485_PORT PORTC
#define RS485_PNUM 2
#define DEVTYPE DEVTYPE_BOOT
#define BLPORT PORTC
#define BLDDR DDRC
#define BLPIN PINC
#define BLPNUM PINC3
#define ENABLE_BOOT_LED
#define BIPORT PORTC
#define BIDDR DDRC
#define BIPIN PINC
#define BIPNUM PINC4
В памяти загрузчик ложится с адреса 0х3800, фьюзы прошиты правильно... Не могу понять в чем дело - уже крыша едет.
Да, еще:
ОтветитьУдалить#define START_WAIT
Проблемы решены
ОтветитьУдалитьПосмотрел я код . В исходнике есть ошибка.
ОтветитьУдалитьЕсли расскомментировать USE_RS485 дефайн , то функция переключения драйвера будет завершаться не выполнив своей функции.
Нужно наоборот закомментировать тот дефайн , чтобы использовать rs485 :)