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

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

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

5 комментариев USART/RS485 Bootloader для AVR

Leave a Reply