Arduino bootloader STK500V2.

      В нашей предыдущей статье, посвященной устройству Arduino,  мы обсуждали работу бутлодера.  Напомню, что обмен данными ведется согласно протоколу STK500V2. В отличие от своего предшественника 1й версии он позволяет прошивать контроллеры с объемом памяти более 128К (актуально для новых Mega2560). Кроме того,  работает на увеличенной скорости 115200 бод.

Исходный код бутлодера позволяет использовать его в различных контроллерах AVR:  ATmega8, ATmega16, ATmega32, ATmega8515, ATmega8535, ATmega162, ATmega128,  ATmega1280,  ATmega2560, AVR_ATmega2561 без каких-либо доработок.

Одна из главных идей проекта Arduino – создать дешевое и простое электронное устройство, для которого можно создать модули расширения (shield) и написать код. По замыслу разработчиков это позволит  использовать плату в различных проектах.   Но на практике возникает необходимость для каждой задачи в отдельности создать свое электронное устройство.  Библиотеки, среда разработки и  бутлодер  в совокупности могут серьезно облегчить этот процесс.

С точки зрения разводки платы на базе контроллера AVR вам достаточно соблюдать минимум правил, сюда относится наличие последовательного COM (или USB-UART) интерфейса  для связи с компьютером, линия сброса DTR должна быть подтянута к ножке Reset через конденсатор 1nf  (сброс осуществляется перед прошивкой платы, для этого низкий уровень подается на ножку DTR, в незаряженном виде конденсатор имеет в начальный момент времени низкое сопротивление и низкий уровень временно проходит на ножку Reset, сбрасывая контроллер) . Все эти тонкости лучше изучить на базе простейшей платы Arduino Severino, документация на которую расположена на официальном сайте.

Для того, чтобы портировать проект Ардуино или создать свою плату необходимо выполнить следующее:

- получить исходный код бутлодера, скомпилировать его под свою платформу, отредактировав Makefile.

- отредактировать файл конфигурации портов в случае необходимости.

- создать профиль своей платы и добавить его в среду разработки.

1. Исходный код бутлодера содержится в папке hardware\arduino\bootloaders\stk500v2. Там же расположен Makefile для различных контроллеров.   Для чего редактировать Makefile? Это нужно, чтобы задать тактовую частоту контроллера и выбрать адрес начала загрузочной области, а также скорость обмена данными. Все полученные после компиляции коды команд будут записаны с начала этой области и занесение кодов команд в память программ бутлодером при прошивке будет проходить верно.  Мы не будем использовать исходный код  бутлодера из ядра Ардуино, а применим модифицированный вариант. К статье будет приложен проект бутлодера с Makefile, собранный в проект в среде AVR Studio. В Makefile уже прописаны настройки для различных контроллеров. Чтобы скомпилировать бутлодер под свой контроллер AVR, откройте Makefile, найдите объявления вида:

############################################################

mega1280: MCU = atmega1280

mega1280: F_CPU = 16000000

mega1280: BOOTLOADER_ADDRESS = 1E000

mega1280: CFLAGS += -D_MEGA_BOARD_

mega1280: begin gccversion sizebefore build sizeafter end

mv $(TARGET).hex stk500boot_v2_mega1280.hex

Перенесите его вверх по списку. Компилятор при обработке Makefile в отсутствии дополнительных указаний по модели платы выберет первую модель по списку. После этого полученный файл с расширением *.hex можно прошивать в загрузочную область. Здесь есть ряд ньюансов в виде кофигурации фьюз-битов, которую нужно правильно задать (описанное далее лучше выполнять при прошивке в среде AVR Studio):

-  размер загрузочной области – 1024 слова (2 КБайта) (биты BOOTSZ1..0)

-  активировать бит BOOTRST (на самом деле по отношению к фьюз-битам это означает сбросить его в ноль), чтобы при загрузке выполнение команд начиналось с загрузочной области.

-  активировать lock-bits BLB0, чтобы запретить команды LPM  и SPM из прикладной памяти программ (работа с флеш-памятью). По своему опыту заметил, что невыполнение этого условия приводит к тому, что данные могут быть повреждены. Также это предотвратит считывание прошивки загрузочной области и ее обновление из прикладной области памяти программ. Это повысит безопасность вашего кода и поможет предотвратить хищение бутлодера.

Итак, бутлодер зашит. Переходим к конфигурации ножек контроллера.

  1.  В случае, если вам нужно поменять конфигурацию ножек контроллера необходимо отредактировать файл  pins_arduino.с. Например,  самые внимательные пользователи, наверное,  заметили, что в платах Arduino на базе ATmega2560 доступны не все ножки контроллера. На практике такое случается у пользователей платы Crumb2560, на которой индикаторный светодиод выведен на последний пин контроллера. Итак, для объявления заходим в hardware\arduino\cores\arduino. Открываем  pins_arduino.с. Находим строчку:

   #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__), а затем

   после строчки const uint8_t PROGMEM digital_pin_to_port_PGM[] и видим список.

Добавляем в конец списка новый пин, пусть это будет  PJ (пин порта J).  Затем  ниже находим   строчку и     const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[],вниз добавляем битовую маску  _BV( 7 ), это будет соответствовать 8 ножке порта J. Заметим, что порядковый номер ножки стал 70 (так как в массиве это 70 по счету элемент). Далее видим ниже строчку const uint8_t PROGMEM digital_pin_to_timer_PGM[].Этот массив отвечает за классификацию пинов. Добавляем в самый низ  тип NOT_ON_TIMER. Всё, новая ножка получила конфигурацию. Вы можете применить к ней стандартные функции Arduino.

 

  1. Как добавить в среду разработки новую плату?  Допустим, вы спроектировали электронное устройство на базе контроллера AVR и назвали его UniRobot (так называется моя последняя разработка для управления мобильными роботами). Заходим в директорию hardware\arduino и открываем файл boards.txt. Видим список объявленных устройств.  Для Atmega2560 добавляем вниз

##############################################################

atmega2560.name=UniRobot

mega2560.upload.protocol=stk500v2

mega2560.upload.maximum_size=258048

mega2560.upload.speed=115200

mega2560.bootloader.low_fuses=0xFF

mega2560.bootloader.high_fuses=0xD8

mega2560.bootloader.extended_fuses=0xFD

mega2560.bootloader.path=stk500v2

mega2560.bootloader.file=stk500boot_v2_mega2560.hex

mega2560.bootloader.unlock_bits=0x3F

mega2560.bootloader.lock_bits=0x0F

mega2560.build.mcu=atmega2560

mega2560.build.f_cpu=16000000L

mega2560.build.core=arduino

После  проведенной операции в среде появится новая плата:

 Использование готового устройства.

   Среда разработки Arduino IDE написана на JAVA и является мультиплатформенной, поэтому не возникает  проблем при использовании ее как из Windows, так и других ОС ( в частности Linux). Что делать, если в проекте используется только  Arduino bootloader?

Для пользователей Windows можно использовать AVRProg.   Эта программа идет в комплекте  с AVRStudio. При запуске она опрашивает доступные COM порты в системе. Будьте внимательны, есть основания полагать, что если номер порта выше 4, то программа его не видит. Это актуально в случае  наличия виртуальных COM портов в системе.

Для пользователей Linux всё немного сложнее.  Расскажу на примере OpneSuse, Лично мне достоверно известно, что AVRDude идет в комплекте с ОС начиная с версии 10.1.  Чтобы убедиться в его наличии, воспользуйтесь менеджером пакетов:  -zypper se AVRDude.  Если AVRDude не установлен в системе, то наиболее удобно иметь интернет-соединение и командой –zypper in AVRDude установить модуль программатора в систему. Далее необходимо знать номер порта, куда подключена плата, допустим это ttyUSB0. Тогда типичный формат команды будет выглядеть так:

     avrdude –p m2560 -b 115200 –c stk500v2 –P /dev/ttyUSB0 -v  –U flash:w:uniRobot.hex

  Будьте внимательны, высота букв меняет команду. Краткая расшифровка параметров:
-p – модель контроллера
-b – baudrate (скорость обмена)
-с – модель программатора (протокола бутлодера в данном случае) 
-P- порт
-U – тип памяти, код команды (w-считать из файла, записать в память), после двоеточия – название файла.
-v – вывод отладочной информации. Удобно для отслеживания ошибок.

Здесь часто возникают проблемы, связанные с текущей локацией и правами доступа.  На это нужно обратить внимание.

При правильном выполнении команды в консоли вы получите следующую информацию:

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e940b
avrdude: Expected signature for ATMEGA168 is 1E 94 06
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "ATmegaBOOT_168.hex"
avrdude: input file ATmegaBOOT_168.hex auto detected as Intel Hex
avrdude: writing flash (16294 bytes):

Writing | ################################################## | 100% 2.50s

avrdude: 16294 bytes of flash written
avrdude: verifying flash memory against ATmegaBOOT_168.hex:
avrdude: load data flash data from input file ATmegaBOOT_168.hex:
avrdude: input file ATmegaBOOT_168.hex auto detected as Intel Hex
avrdude: input file ATmegaBOOT_168.hex contains 16294 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 22.43s

avrdude: verifying ...
avrdude: 16294 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done. Thank you.

Приложение: 

Модифицированный исходный код бутлодера на базе STK500V2. (AVR Studio 4).

P.S.  До недавнего времени я пользовался бутлодером от chip45. Напомню, он сам определяет необходимый baud rate в зависимости от тактовой частоты контроллера. Для этого при подключении контроллера проводится тест, код программа для прошивки шлет на контроллер определенный символ. Так вот, для частоты 12 МГц  этот механизм с завидной частотой отказывает, не говоря уже про скорость 19200, при которой большой проект шьется чуть ли не минуту,  поэтому я перешел на бутлодер, описанный в этой статье, думаю, окончательно.

3 Comments

  1. Delphi:

    Итак, практика показала, что этот бутлодер также не является надежным. Достаточно в режиме ожидания прошивки подключить плату к modBus мастеру, как поток запросов вводит бутлодер в состояние прошивки и убивает устройство. Удивительно, тестировали ли разработчики протокола STK на его устойчивость к запросам других протоколов. К сожалению, этот факт заставляет опять заняться вопросом бутлодинга

  2. babadusya:

    Доброго время суток! Я недавно занимаюсь программирования МК, поэтому извините за некоректные вопросы! Правильно я понимаю, что во втором пункте в АтМега2560;1280 можно задействовать в работу до 70 (digital)пинов??? Когда проекте АРДУНО2560 только 54п. Там как раз по даташиту в сумме 16пинов(включительно целый порт) не задействаны!

  3. babadusya:

    Я уже разобрался! И даже более того, получил 86 управляемых пинов! Большое спасибо этому разделу и особенно Delphi! Многое недотающее я для себя здесь "подчерпнул"! Удачи всем!

Leave a Reply

You must be logged in to post a comment.