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.

Makefile


Здесь огромное количество настроек, но 95% с них нам не нужны, а нужны только 2 опции:

  1. MCU. Здесь нужно указать название микроконтроллера, в моем случае - atmega88pa.

  2. 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.

После компиляции нужно залить прошивку бутлоадера(которую только что скомпилировали) в МК и установить некоторые фьюзы:

STK500

Фьюзами 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, там ошибки не было.

При прошивке через бутлоадер важно помнить, чтобы размер основной прошивки был не более чем размер_памяти_мк-размер_бутлоадера.

Скачать файлы статьи

Комментарии

  1. Спасибо за статью! Очень помогло! А есть ли какая прога в замену AVRprog?

    ОтветитьУдалить
  2. Я только этой пользовался.

    ОтветитьУдалить
  3. Еще вопрос: А можно ли как то сделать "преднастройку" для ATmega328p в хиддерах загрузчика ее нет... Поможете?

    ОтветитьУдалить
  4. Там в исходниках нужно сделать несколько изменений, вроде как только заменить некоторые регистры

    ОтветитьУдалить
  5. Если не хотите AVRprog, можно использовать BootLoader (avr-assm.ru)

    ОтветитьУдалить
  6. Прошу помощи! Очень заинтересовался этим проектом - хочу 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, фьюзы прошиты правильно... Не могу понять в чем дело - уже крыша едет.

    ОтветитьУдалить
  7. Посмотрел я код . В исходнике есть ошибка.
    Если расскомментировать USE_RS485 дефайн , то функция переключения драйвера будет завершаться не выполнив своей функции.
    Нужно наоборот закомментировать тот дефайн , чтобы использовать rs485 :)

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Прием команд с пульта дистанционного управления

STM32F4. Обновление прошивки с карты памяти (Bootloader SD)

Работа с шиной 1-wire. Подключение термодатчика DS18B20 к AVR