AVR. Учебный Курс. Использование Bootloader’а

Почти все микроконтроллеры серии Mega с памятью от 8КБ могут прошиваться через бутлоадер. Фишка удобная и применяется довольно часто, однако подробного мануала как работать с бутлоадером на AVR я в свое время не нашел и пришлось разбираться самостоятельно. С той поры мало что изменилось. Пора бы дать подробное описание как выбрать, скомпилировать, прошить и в дальнейшем использовать bootloader для AVR.
 

Ликбез
Что же это такое бут и с чем его едят. BootLoader это всего лишь небольшая программка которая сидит в специальной области памяти микроконтроллера и слушает какой-либо интерфейс. Обычно это UART, но бывает и SPI, USB и даже SoftUSB бутлоадеры.
 

При загрузке контроллера управление первым делом передается бутлоадеру и он проверяет есть ли условие для запуска. Условие может быть любым, но обычно это либо наличие спец байта по интерфейсу, либо наличие нужного логического уровня на выбранной ножке контроллера, сигнализирующее о том, что мы хотим обратиться к буту прошивку. Если условие есть — то бутлоадер может, например, принять прошивку по UART‘у и сам прошить ее во флеш. Или, наоборот, считать прошивку из флеша и выдать через UART, считать или записать EEPROM, подрыгать ножками. Да что угодно. Но обычно все же с помощью бута осуществляют прошивку микроконтроллера без применения спец программатора.
 

Если разрешающего условия при старте нет, то бут завершает свою работу и передает управление основной программе.
 


Зачем он нужен вообще?
В самом деле, зачем эти сложности? Зачем тратить и без того малое количество памяти на какую то вспомогательную утилиту? А порой иначе и нельзя! Вот, представь, стоит у тебя девайс где нибудь под землей на большой глубине. Или на высоченной башне куда лезть и лезть, или девайсов у тебя таких миллион? А связь у тебя с девайсом по UART какому нибудь или радиоканалу. И вот надо прошить девайс свежей версией прошивки. Выкапывать, лезть на башню или тыкать в каждый из девайсов шнур программатора… это же сдохнуть можно! А так дал девайсу общий сброс, приказал удаленно бутлоадеру всосать новую прошивку и вуаля!
 

Мало того, с помощью бута можно сильно облегчить обслуживание коммерческих устройств. Например, такая простая вещь как обновление прошивки, которую поддерживает масса девайсов вроде плееров или сотовых телефонов и которую делает обычный юзер. Выходит прошивка доступна и конкурентам? А вот фигу! Она шифрованая, а бутлоадер содержит ключ для ее дешифровки, дешифрует на лету и заливает во флеш. Красота, правда?
 

Недостатков у любого бутлоадера два — самый главный в том, что он отжирает часть флеша. Это неизбежное зло. Второй, не менее весомый, то что он стартует первый и если не позаботиться о грамотном алгоритме входа в бут, то девайс может сделать это самопроизвольно, записав в себя черт знает что. Такая беда была, ЕМНИП, со старыми GSM модулями SIM300DZ у которых часто ВНЕЗАПНО при неправильном выключении питания слетала прошивка. А просто модуль входил в бут режим и наведенные помехи на входах устраивали ему армагедец.
 

Откуда Bootloader берется в контроллере?
Многие современные МК уже изначально, с завода, идут с прошитым bootloader’ом. В AVR же ничего подобного нет, поэтому его надо прошить самостоятельно. Да, программатор потребуется. Обычный ISP, любой — Громова, STK200, Пять проводков, USBAsp да тысячи их. Им зашиваешь в память обычную прошивку, но содержащую бут. После чего программатор тебе уже не потребуется — дальше с контроллером можно общаться через загрузчик.
 

Bootloader в AVR
Что происходит при старте контроллера? В нормальном состоянии процессор начинает по одной выполнять инструкции из памяти программ, начиная с нулевого адреса. Вот так это примерно выглядит в ATmega16, в других все аналогично, только адреса другие.

Но если активировать Fuse бит BOOTRST то процессор будет стартовать не с нулевого адреса, а с адреса начала Boot сектора. Этот сектор расположен в самом конце памяти программ и его размер задается FUSE битами BOOTSZх.
 

Вот как, например, выглядит таблица соответствия битов BOOTSZх и размера загрузочной области для ATMega16:
 

Обрати внимание на то, что адрес задается в словах. Учитывая то, что одна команда в AVR занимает одно слово, то в самом скромном варианте бутлоадера нам надо уложиться в жалкие 128 команд, а в самом жирном в нашем распоряжении аж 1024 команды. Кроме всего прочего, у бутлоадера есть еще куча разных битов конфигурации разрешающие запись или чтение из памяти программ, организующие защиту от копирования и прочие фишечки. Я их описывать не буду — тут нужна отделная статья, да и они нужны в основном только если ты захочешь написать свой бутлоадер. Про них все написано в даташите, а если не шаришь в аглицком, то книга Евстифеева тебе будет хорошим подспорьем. Плюс есть куча примеров на этот счет.
 

Выбор bootloader’a
Мы же пока будем юзать готовый, благо их понаписано вагон и маленькая тележка. Но какой из них выбрать?
Для себя я обозначил ряд критериев исходя из которых выбирал подходящий бут. Итак, вот они:
 

  • Должен быть написан на Си (Бейсике, Паскале — нужное подчеркнуть). При всей моей любви к ассемблеру тут однозначно рулит Си. Дело в том, что удобно постоянно юзать один и тот же код, просто перекомпилируюя его под свой процессор. С ассемблером это довольно затруднительно, даже несмотря на единое ядро у AVR возникает куча различий на уровне периферии. Например, в ATmega8 регистр UART зовется как UDR, а в ATmega88 его обозвали уже UDR0 и обращаться к нему через команды IN/OUT уже нельзя — только через LDS/STS (т.к. из-за сильно разросшейся периферии его адресация вылезла за пределы досягаемости команды IN/OUT). Как результат — нативный ассемблерный код приходится править ручками. Хоть это и не сложно (обычно прокатывает автозамена), но не наш метод. Плюс ко всему, размер бутлоадера у нас меняется фиксироваными кусками. А поскольку, например, в самый маленький сегмент полнофункциональный бутак все равно не влезет, хоть ты заизвращайся с кодом, в более толстый же сегмент уже без напряга влезает Сишный код. Так что экономии особой тут не нароешь.
  • ; Должен поддерживаться родным софтом, в частности AVRProg’ом который идет в составе студии. Да, это немного громоздко, но зато не требует стороннего софта.
  • Должен позволять писать как во флеш, так и в EEProm
  • Должен быть не слишком жирным. Оптимально 512 слов. Меньше найдешь вряд ли, больше уже излишество.
  • Должен быть под WinAVR (т.к. я юзаю именно этот компилер)

В результате был нарыт проект Martin Thomas’a из Германии «AVRPROG compatible boot-loader» который идеально вписался в мои требования. Я лишь чуть чуть подправил его код под свои нужды.
 

И сейчас я покажу тебе как юзать эту замечательную программулину.
 

Итак, тебе нужна AVR Studio и WinAVR (она же AVR GCC). Если ничего этого ты еще не ставил, то сначала поставь студию, а потом сверху накати на нее WinAVR тогда они сцепятся друг с другом и будут работать в единой связке. WinAVR можно скачать с официального сайта. Ставить лучше по дефолтному пути C:\WinAVR\ — меньше потом будет косяков с путями в либах.
 

Потом тебе нужны сорцы загрузчика. Можешь взять у у автора, но я рекомендую сдернуть все же у меня. У меня сразу же готовый проект для AVRStudio:

Скачать исходные коды и файлы проекта для Bootloader’a
Я там чуток подправил для себя поэтому буду описывать свою версию. Ну и еще я некоторые комменты перевел, чтобы легче было ориентироваться в коде.
 

Компиляция
Запускай студию и создавай новый проект (если откроешь мой проект, то этот шаг можно пропустить) — NewProject. В качестве компилятора выбирай AVR GCC. Если опция AVR GCC не доступна, значит у тебя криво встала WinAVR, попробуй переустановить. В графу «Project Name» пиши что хочешь, а вот «Initail File» впиши «main» и поставь обе галочки что выше этой строки «Create initial file» и «Create Folder«.
 

Следующим шагом выбирается микроконтроллер и отладочная платформа. В качетсве платформы выбери AVR Simulator и свою модель контроллера. Хотя, в принципе, это не так важно — всю работу сделает makefile. Но пусть будет.
 

Жмешь финиш и имеешь пустой проект. Сохраняешь его и закрываешь.

Теперь находишь папку этого проекта и перекидываешь туда все исходники и хидеры из архива бутлоадера, в том числе и папочку, что там тусуется, перезаписывая свой пустой файл main.c
 

Осталось вновь открыть этот проект, но поскольку мы переписали main.c то он уже не будет пуст. Там будет дофига кода.
 

Следующим шагом будет прописывание настроек компиляции. Поскольку тут уже есть готовый make то надо всего лишь подсунуть студии его. Тычь в иконку с шестеренкой и ставь в разделе General галку «Use External Make File» и прописывай путь к makefile который идет вместе с исходником.

Жми на компиляцию (F7) и фтыкай в сообщения об ошибках. По хорошему их не должно быть, разве что ругнется что не нашел elf файл. Но elf тебе никуда не уперся поэтому не заморачивайся. На эту ошибку можно забить.
 

Во вкладке Build AVR Studio должно проскочить что то вроде:

Build started 29.8.2009 at 20:22:36
-------- begin --------
avr-gcc (WinAVR 20090313) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Size before:
main.elf  :
section          size       addr
.text           0x3ae     0x3c00
.trampolines      0x0     0x3fae
.bss             0x80   0x800060
.stab           0xeb8        0x0
.stabstr        0x9d4        0x0
Total          0x1cba
Size after:
main.elf  :
section          size       addr
.text           0x3ae     0x3c00
.trampolines      0x0     0x3fae
.bss             0x80   0x800060
.stab           0xeb8        0x0
.stabstr        0x9d4        0x0
Total          0x1cba
Errors: none
-------- end --------
Build succeeded with 0 Warnings...

Если полезли другие ошибки, например не найдена какая либо библиотека, то вполне возможно у тебя косяк в путях и придется прошерстить makefile и поправить пути к WinAVR и его библиотекам.
 

Конфигурация Bootloader’a
Но это так, тестовый прогон. Он тебе возможно нафиг не подойдет. Надо настроить лоадер под свой проц, свою частоту, свой размер.
 

Итак, вначале правим main.c
Первым делом твой взор должен воткнуться в строку с определнием F_CPU:

1
2
3
4
5
6
7
#ifndef F_CPU
// #define F_CPU 7372800
//#define F_CPU (7372800/2)
#define F_CPU 8000000
//#define F_CPU 16000000
//#define F_CPU 12000000
#endif

 

Эта запись означает, что если у нас нигде не определана директива F_CPU, то вот тут мы эту самую директиву и назначим. И присваиваем ей тактовую частоту в герцах на которой будет работать наш проц. Это очень важно, ибо не настроишь частоту — не заработает правильно UART. Можешь просто раскомментировать нужную, а можешь добавить свою, не забыв закомментировать остальные.
 

Смотрим дальше
 

1
2
3
4
5
6
7
/* UART Скорость UART оптимально 19200 */
//#define BAUDRATE 9600
#define BAUDRATE 19200
//#define BAUDRATE 115200
 
/* Режим двойной скорости UART (бит U2C)*/
//#define UART_DOUBLESPEED

Это настройка скорости передачи порта по которому наш бут будет общаться с внешним миром. По дефолту идет 115200, но у меня на 115200 так и не заработало, поэтому я понизил до 19200. Работает стабильней некуда. Режим удвоения скорости я никогда не юзаю. Он пригождается лишь когда работаешь на медленных кварцах, вроде часового. А так — лишняя сущность. Поэтому закомменчено.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * Выбор порта для кнопки входа в загрузчик
 * Чтобы войти в загрузчик надо чтобы при запуске эта кнопка замыкала пин на землю
 */
#define BLPORT		PORTD
#define BLDDR		DDRD
#define BLPIN		PIND
#define BLPNUM		PIND7
 
/*
 * Выбор порта для индикатора работы загрузчика
 * Светодиод горит - мы в загрузчике
 */
 
#define ENABLE_BOOT_LED
#define BIPORT		PORTD
#define BIDDR		DDRD
#define BIPIN		PIND
#define BIPNUM		PIND5

Это выбор порта инициализации и порта индикации. Оба этих пина совершенно опциональные.
 

Порт инициализации нужен в том случае если мы в бутлоадер входим при замкнутом на землю выводе который вот этой настройкой и определяется. Я же обычно юзаю вход по таймеру, поэтому для меня эта опция не играет роли. А порт индикации это уже моя фича, сделана просто для удобства. На этот пин вешается светодиод и горит когда процессор находится в секции бутлоадера. Это позволяет мне знать что делает мой проц. Если фича не нужна, то закомментируй строку #define ENABLE_BOOT_LED и весь код обработки этого светодиода будет выпилен из исходника директивами условной компиляции ifdef-endif
 

Следующая важная опция — способ входа в бут

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
 * Выбор режима загрузчика
 * SIMPLE-Mode - Загрузчик стартует когда нажата его кнопка
 *   переход к основной программе осуществляется после сброса 
 *   (кнопка должна быть отжата) либо по команде от программатора
 *   При этом режиме вывод на кнопку конфигурируется как вход-с подтягом,
 *   но при выходе из загрузчика все выставляется по умолчанию
 * POWERSAVE-Mode - Startup is separated in two loops
 *   which makes power-saving a little easier if no firmware
 *   is on the chip. Needs more memory
 * BOOTICE-Mode - для зашивки  JTAGICE файла upgrade.ebn в Мегу16.
 *   что превращает ее в JTAG отладчик. Разумеется нужно добавить весь необходимый
 *   обвяз на кристалл для этого. И частота должна быть везде прописана как 7372800
 *   в F_CPU Для совместимости с родной прошивкой JTAG ICE
 * WAIT-mode Bootloader ожидает команды на вход, если ее не было в течении промежутка времени
 *   (который настраивается) то проихсодит переход к основной программе.
 */
//#define START_SIMPLE
#define START_WAIT
//#define START_POWERSAVE
//#define START_BOOTICE
 
/* Команда для входа в загрузчик в START_WAIT */
#define START_WAIT_UARTCHAR 'S'
 
/* Выдержка для START_WAIT mode ( t = WAIT_TIME * 10ms ) */
#define WAIT_VALUE 400 /* сейчас: 300*10ms = 3000ms = 3sec */

 

Выбираешь нужную, а остальное комментируешь. В принципе, рулят START_SIMPLE — вход по наличию низкого уровня на заданом выводе и START_WAIT — вход в бутлоадер по спец символу из UART в течении времени которое определено в переменной WAIT_VALUE. У меня комп немного подтормаживает (старичок, ага) поэтому ставлю 4 секунды. Иначе AVRProg не успевает пнуть в порт символ и запустить бут. После 4х секунд начинается выполнение основной программы.
 

В этом файле закончили, переходим к makefile тут комментарий начинается с #

 

Вначале выбираем свой проц:

1
2
3
4
5
6
7
8
9
10
11
12
# MCU name
## MCU = atmega8
MCU = atmega16
## MCU = atmega162
## MCU = atmega169
## MCU = atmega32
## MCU = atmega324p
## MCU = atmega64
## MCU = atmega644
## MCU = atmega644p
## MCU = atmega128
## MCU = at90can128

 

Затем размер бутсектора

1
2
3
4
5
6
#/* Select Boot Size in Words (select one, comment out the others) */
## NO! BOOTSIZE=128
## NO! BOOTSIZE=256
BOOTSIZE=512
## BOOTSIZE=1024
## BOOTSIZE=2048

Первые две опции не катят, ибо бут в них не влезет. А вот 512 и 1024 вполне пригодны. Для начала поставь 512, если не влезет, то изменишь на 1024. Размер бутлоадера зависит от количества включеных фишек и опции запуска. Для Wait и Simple хватает и 512 слов.
 

Ниже можешь посмотреть адреса загрузочных секторов у разных микроконтроллеров. Если твоего нет в списке, то можешь его добавить по аналогии, прописав по даташиту числа. Не забыв добавить его строку и в записях что я приводил выше. Еще надо поковырять файл chipdef.h который идет в составе сорцев и добавить и там свой контроллер, точнее его инклюдник.
 

Если поковырять makefile еще ниже, то можно найти где прописываются пути к WinAVR

1
2
3
4
5
6
7
# ---------------------------------------------------------------------------
# Define directories, if needed.
#DIRAVR = c:/winavr
#DIRAVRBIN = $(DIRAVR)/bin
#DIRAVRUTILS = $(DIRAVR)/utils/bin
#DIRINC = .
#DIRLIB = $(DIRAVR)/avr/lib

 

Это на случай если будут ошибки при компиляции.
 

Теперь сохраняй изменения в makefile и залезь в папку проекта, и грохни там все *.hex *.o *.map *.lss.
Я не знаю почему, но видимо в одном из этих файлов Студия при предыдущей компиляции сохраняет параметры из make и дальнейшие правки makefile не приносят результата. Я минут 20 пытался понять какого черта у меня бутлоадер не хочет влезать в память, пока не заглянул в hex файл и не увидел, что адрес бутсектора начинается далеко за пределами памяти Меги16 — т.к. первый раз, для пробы, я скомпилировал под Мегу32 и не смотря на то, что в makefile я все поправил на Mega16 и сохранил, но при компиляции Студия настойчиво совала бут черти куда. Пока не удалил эти файлы и не скомпилил заново (они появляются при компиляции) ничего не заработало.
 

Теперь компилируй загрузчик и получай на выходе main.hex файл — обычную прошивку. Для проверки открой его блокнотом и позырь на начало и конец, предварительно рекомендую покурить формат Intel HEX:

:103C000011241FBECFE5D4E0DEBFCDBF10E0A0E69B
……
тут куча барахла — это код нашего загрузчика
……
:0E3FA0;00B1CE5D9BFECF2CB8ADCEF894FFCF16
:0400000300003C00BD
:00000001FF

 

Жирным я выделил адреса которые тебя интересуют. 3C00 — адрес начала сектора (в байтах! В даташите он приведен в словах, так что умножай на два 1E00*2=3C00) размером в 512 слов. 3FA0 адрес начала последней строки кода загрузчика, а число перед адресом (0E) — длинна этой строки.
3FA0+0E = 3FAE адрес самого последнего байта загрузчика. Последний адрес флеш памяти для ATmega16 это 3FFF так что у нас еще 81 байт в запасе остался ;)))))
 

Ок, загрузчик с включенными фичами входит в память. Так что все в порядке. Если у тебя с твоим набором функций не влезет в память, то придется выбирать бутсектор на 1024 слова и перекомпилировать все заново.
 

Готово, у нас есть hex файл, можно прошивать. Подключаем программатор (да, он тут потребуется, а ты думал в сказку попал? Нифига, программатор штука такая без которой никуда) и заливаешь ее в МК. Сразу предупреждаю шиться будет долго. Т.к. будет заливаться полная прошивка на 16кБ (для мега16). Причем что avrdude@usbasp, что AVRProg@JtagICE — все ругаются на какую то ошибку, дудка порой виснет на чтении, однако если прочитать потом кристалл и сравнить два хекса, то будет видно, что лоадер четко встал в ввереные ему адреса.
 

Осталось сделать страшное :) Выставить Fuse биты.
 

Во-первых надо активировать бит BOOTRST
Во-вторых выставить размер бут сектора в битах BOOTSZ1..0, для 512 на Mega16 это 01
 

Готово.

Как проверить работу Bootloader’a
Теперь нам надо соединить микроконтроллер с компом через RS232 или его USB эмуляцию. У меня USB, главное чтобы виртуальный USB был в числе первых четырех COM портов. У меня он зарегился в системе как COM4
 

Запускем терминалку, делаем коннект на порт к которому подключен наш контроллер и вызваем срабатывание условиях. У меня в данный момент бут настроен на Start_Wait поэтому я просто жму RESET (зажигается диод что проц в буте) и посылаю микроконтроллеру букву «S» в ответ мне приходит «AVRBOOT» Ок, работаем. Если ничего не делать, то диод погаснет через 4ре секунды — вышли из бут сектора. Но если в микроконтроллер не зашито еще ничего, то быстро проскочив через 16кб пустоты проц опять выполнит код бутлоадера и так по кругу, диод будет тупо гореть.
 

Как прошивать через Bootloader
Закрываем терминалку, чтобы освободить порт.
Подключаем контроллер, подаем питание. Запускаю студию, жму RESET на плате микроконтроллера и в меню студии быстро выбираю Tool — AVR Prog… Помним, что у нас в запасе 4 секунды.
 

Запускается AVRProg, стучится в порты с вопросом»S»?, а из одного из них ему «Алоха браза я тут!» Это радостное событие отмечается открытием окна AVR Prog:

Ну, а дальше тривиально. Выбираем кекс для флеша, если надо и для епрома и шьем. Шьется просто реактивно! Закрываем AVR Prog, делаем RESET, ждем 4ре секунды — прога пошла!
 

Ссылки по теме:
Загрузчик MegaLoad более компактный, но требует свою прогу
 

З.Ы.
Народ, кто юзает/пишет загрузчики накидайте мне в комменты линков на то чем пользуетесь вы. А то я особо тему не рыл, нашел что удовлетворяло моим условиям и успокоился. Хотелось бы в статью еще добавить подборку линков на разные бутлоадеры под разные языки и компиляторы.
 

З.З.Ы
Подумалось тут…
Бутлоадер настроен на определенную частоту. Но для отладочной платы это не очень удобно, там порой может потребоваться смена частоты. Частоту можно изменить переткнув кварц, но тогда бутлоадер работать перестанет — собьется частота UART и потребуется опять программатор (которого может и не быть под рукой), чтобы перешить бутлоадер под новую частоту. Единственно что можно менять кварцы с частотами степени 2, тогда просто у USART будет скакать скорость, скажем, кварц на 8мгц — скорость 9600 бод, поставили кварц на 16мгц — скорость на том же буте стала уже 19200.
 

Проблема может решаться таким образом — числа определяющие скорость уарта мы кладем в последниие адреса EEPROM (если там 0, то можно задать какой нибудь дефолт, например 9600 для частоты 8Мгц, чтобы можно было хоть как то оживить МК), а затем, если мы хотим поменять кварц и перешить прогу на новую частоту, то сначала, на прежнем буте не перезагружаясь, пока он еще доступен, зашиваем вначале новую прошивку, потом новый Епром с числами под новый кварц, перезагружаемся — меняем кварц и опа — у нас опять МК онлайн. Надо добавить в этот лоадер такую фичу. =)
 

З.З.З.Ы.
Бутлоадером изначально прошиты все контроллеры AVR в моих демоплатах Pinboard

278 thoughts on “AVR. Учебный Курс. Использование Bootloader’а”

  1. Иногда в более серьезной технике bootloader используют не только для загрузки софта, но и для каких-нибудь осмысленных действий (которые надо выполнить только один раз при старте). Например, в спутниковых ресиверах boot «выгружает» список каналов и настроек из флешки в ОЗУ, снабжая его всевозможными указателями — то есть выполняет всю работу по инициализации. Если место позволяет, а устройства разрабатываются на «одной и той же базе» (например, на отладочной плате), то boot прекрасно может, например, инициализировать LCD-индикатор или сделать что-то подобное.

        1. ну так это уже другой вопрос, что её(инициализацию) туда засунули.
          из флешки в озу всё равно надо выгружать при каждом старте устройства.
          разница ведь как-раз в том, что бутлоадер не сработает при старте устройства если не выполнены какие-то определенные условия:
          >> Условие может быть любым, но обычно это либо наличие спец байта по
          >> интерфейсу, либо наличие нужного логического уровня на выбранной ножке
          >> контроллера, сигнализирующее о том, что мы хотим обратиться к буту
          >> прошивку)
          т.е.:
          без запуска инициализации (которая должна быть безусловной, вам ведь полюбому надо загрузить список каналов из флеша и проинициализировать LCD) устройство в принципе неработоспособно
          а без запуска бутлоадера (если не будет условий его запуска) устройство будет работать нормально.

          или я что-то не понимаю…

          1. Все происходит вот так:

            …процессор будет стартовать не с нулевого адреса, а с адреса начала Boot сектора. Этот сектор расположен в самом конце памяти программ…

            В Boot-секторе мы можем размещать что угодно. Обычно делают так — происходит проверка условия (его мы проверяем чисто программно), если условие не выполнено — то переход в «точку старта», если выполнено — то переход к «прошивальщику», размещенному в том же Boot-секторе.

            Если совокупный размер проверки и прошивальщика меньше, чем выделенный под Boot-сектор, то там можно разместить и другой, более полезный код. В этом случае после «неудачной» проверки условия входа мы переходим по адресу, расположенному в _том же_ boot-секторе, а после выполнения этого кода (той самой инициализации) — уже по адресу начала программы.

            Все это относится к устройствам, у которых задается некоторый объем загрузочного сектора, и есть аппаратная поддержка bootloader — то есть старт с адреса начала boot-сектора.

            У PIC, например, такого нет, а возможность записи в память программ присутствует. Поэтому PIC-овский bootloader может быть гораздо более извращенным. Расположить его удобно в самом конце памяти, а запускать можно даже из «основного цикла» программы.

            Никто не мешает извратиться подобным образом и на AVR, но всем хватает и описанных возможностей.

            PS Никто не мешает использовать бутсектор и для других целей, совсем не связанных с прошивкой.

  2. Хоть и не в тему, не ИМХО кого-то зацепит :-P
    Написал протокол общения по беспроводному радиоканалу, в котором есть:

    изменяемая длина пакета
    программная фильтрация помех
    отсечка поврежденных пакетов
    отправка подтверждения о приемке
    повторная отправка пакета в случае отсутствия подтверждения
    Манчестерское кодирование
    проверка CRC
    неплохая гибкость под дальнейшие фичи/баги )

    Потестил на парочке модулей DR1200-DK — половину общаги пробивает.
    Теперь хочу железяки помощнее ) Есть аппаратура Hitec с модулем HPF-MI RF на ~1Вт, но там диапазон не интересный (40 МГц). Надо модуль в диапазоне 2.4 ГГц

    Как исходники немного подчищу — покажу )

          1. Мега4 О_о?

            Ну да не важно, ибо в тини2313 встроить этого монстра будет крайне сложно, ибо написано для 64 меги (т.к. там два USARTа), и на Си
            Да и память я не сильно экономлю — приемные/передающие буферы по 256 байт * 2 трансивера (с 4Кб оперативки не жалко), немаленькая куча, плюс несколько тяжелых функций (тот-же расчет CRC)

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

            Терминал (Си быдлер) http://narod.ru/disk/12607933000/Terminal_demo.rar.html

            Прошивка (IAR) http://narod.ru/disk/12608004000/mega64_demo.rar.html

            Неплохие библиотечки от мелкого робота (soft_serout.h — программный UART) http://narod.ru/disk/12608090000/include.rar.html
            Их я еще не пользовал

            На текущий момент схема следующая — контроллер принимает пакет на USART1, и отправляет его в радиоканал (USART0)
            Удаленная станция в случае удачного принятия пакета мигает PD4 и шлет подтверждение
            Локальная, приняв подтверждение, рапортует об этом компу

            Страшного кода там исчо много, но работает устойчиво.

  3. по поводу загрузчиков
    готовый уже идет в комплекте с ардуино и совместим с 910

    4к загрузчик с шифрованием http://vusb.wikidot.com/project:crypto-boot
    правда проект 2006 года, зато есть свой софт для заливки и в коммерческих проектах как раз подойдет, чтобы заказчик вдруг не решил, что он самый крутой

    http://www.fischl.de/avrusbboot/ усб 1к
    хороший вариант, если девайс делался как подарок (например лампа с ргб светодиодом)
    пользователь сам может прошить новый софт
    http://www.obdev.at/products/vusb/bootloadhid.html софт для апдейта с использованием хид драйвера винды

        1. В 910 протокол прошивки формирует контроллер в программаторе (когда-то 1200, потом 2313). С компа идут только данные и общее управление, через COM порт. А в в STK (по крайней мере 200,300; в 500 сразу не вспомню, а искать в архивах лень) — только буфер, и все сигналы и временные диаграммы формирует комп через LPT.

          1. Насколько я понял, STK500 общается с компом через нормальный COM (а не bitbang как STK200/300), но протокол прошивки формируется на компе, поэтому не нужно обновлять прошивку для поддержки новых МК. И не возникает проблем с переходниками с USB.

      1. Внизу в комменте я многословно выдумал, как в бутлоадере определить скорость усарта:

        При старте не инициировать усарт. Зато на входящей для него ноге поставить прерывание — на изменение пина. Два таких изменения — это подъем одной-единственной иголки какбэ усарта (хотя он не включен еще) и следующий за ней спад. То есть длительность иголки. Ее соотнести с заданными константами реалистичных значений и на наиболее подошедшей скорости — инициировать Усарт.

        1. Хммм… надо покурить маны. ПОлноценный бут с защитой прошивки думаю не сделать, но вот просто засосать код и распихать его по адресам… Думаю может получиться.

      1. Про файл прошивки- понятно. А как залить новую прошивку через стандартные средства? Иногда нет возможности ставить на чужой компьютер какой-либо софт без сисадмина (например, в корпоративной сети).

        1. Можно написать бутлоадер такой, чтобы он принимал вначале пару байт служебной инфы, а потом байт поток размещал в памяти.

          Тогда можно будет прошивку сконвертить в bin, а потом через Hyper terminal какой нибудь (или в консоли вывод перенаправив) отрыгнуть вначале служебные команды, которые вручную набрал, а потом заслав файл.

          1. А нет смысла сделать? Ведь если все на глубине да на высоте- наверняка сеть защищенная и просто так в нее не залезешь. По уму, даже от существующего управляющего компа чтобы отключить кабель РС232, комп надо сначала выключить, потом подключить свой, потом залить, потом выключть свой, переткнуть провод и загрузить первый комп. А это довольно продолжительно по времени и может быть критично. Пропадает прелесть бутлодера- если если с каждым устройством нужно проделывать все эти операции- проще их достать и перешить обычным способом.

            1. В смысле просто так не залезешь? Если это твое устройство и перешивка это его штатная функция. Если устройство достать нельзя, то другого выхода кроме как бут нет. Или раскопать траншею и воткнуть программатор проще чем переткнуть кабель RS232?

              1. Да нет же. Раскопать не проще. Проще (я так думаю) перешивать МК с управляющего (обрабатывающего) ПК посредством какой- нибудь штатной для винды утилиты. Чтоб не ставить новое ПО и не перетыкать кабели. Возможно ли это?

                1. Так об этом и речь. Перешить прогу у МК с бутлоадером можно хоть через Гипертерминал.
                  Главное в UART в нужном порядке заслать байты :)

                  Та же AVRProg это крошечная утилитка весом в 300кб, идет в составе студии и лежит там в каталоге bin по моему.

                    1. Он может отправлять файлы. Что тебе мешает послать бинарик? Разумеется бут придется писать свой, но работать так возможно

                    2. Видел девайс (кажется, на PIC), который умел общаться с компьютером через HyperTerminal, а самое интересное — «самопрошивался», принимая файл по Xmodem. Протокол этот довольно простой, передаются пакеты по 128 байт + контрольная сумма, так что при желании реализовать его на МК сравнительно несложно (а если «забить» на проверку контрольной суммы — то очень несложно).

  4. DI HALT, классная статья. В свое время юзал AT89C51RD2 (8051) там bootloader дефолтом имеется. Очень удобно.

    Напиши плиз статью по сопряжению AVR с внешними АЦП и ЦАП. Думаю будет интересно. Ну типа программный SPI с выдачей результатов в RS232 например.)))

    1. да и у dallas-semi есть линейка контроллеров аля 8051. Так там на заводе еще вшит бутлоадер-программатор. Соответственно программирование их заключается в подключении двух проводов на УАРТ-ком-порт, и установке необх.лог.уровней на нескольких ногах. Программа-программатора представляет из себя терминальную программу которая отсылает бутлоадеру файл прошивки.

  5. Поначалу тоже использовал “AVRPROG compatible boot-loader”, но однажды килобайт памяти на загрузчик оказался слишком дорогой ценой, тогда нашел вот этот загрузчик на 256 байт: http://www.hhhh.org/wiml/proj/avr/ssbl.html. Загрузчик изменил, выкинув лишний код, исправил обнаруженные баги и написал софтину для его заливки (авторами предлагался питоновский скрипт, причем, похоже, только под линукс).
    В результате получилось это: http://trol.0fees.net/soft/tboot/

    1. /* offtop Извиняйте что сюда — это чтобы не регаться в 100500 местах. Хочу сказать спасибки ув. Trol за TrolCommander для Mac! Наконец-то нормальный ftp-клиент для этой враждебной машины! :) Только вот (имхо) с кнопкой (которая Backspace) косячок — всё-таки лучше на неё назначить удаление, а не хождение по каталогу. Особенно с учётом того что на ноутах-огрызках нормального Del нет :) */

      1. Благодарю за благодарность :) Рад, что мое творчество оказалось кому-то полезно :) По поводу команды удаления — вопрос о горячей клавиши весьма спорный, команды удаления и перехода назад имеют несколько разных горячих клавиш: удалить файл можно и по нажатию F8 и по fn+BackSpace на макбуке. Перейти назад можно и клавишей BackSpace и стрелкой влево. В любом случае, все (ну или почти все) горячие клавиши можно настроить как угодно в меню Preferences -> Shortcuts

  6. Вопрос к Гуру. Как компилить проект что бы процедуры скомпилированные и прошитые в загрузчике (например SoftHid) можно было использовать в программе которая будет залита этим загрузчиком?
    Желательно для компилятора IAR.

  7. А можно сделать так?

    Чтобы бутлоадер сам настраивался на частоту com-порта.

    При включении бутлоадера UART не включать (неожиданно?!). Зато мерять на соответствующей ноге (вход уарта) плюс там или нуль. Заранее известно, что на эту ногу придет волна, соответствующая букве S. Форма волны абсолютно одинаковая для любых скоростей соединения, но разная по ширине. Надо словить эту волну и записать ее:

    Поэтому вместо Уарта в загрузчике инициируется Таймер, с частотой скажем в 10 раз быстрый чем максимальная скорость уарта. А входящая уартовская нога инициируется как обычная входная нога. По таймеру меряется состояние пина ноги. И сохраняется примерно до 20 точек (по две на каждую иглу плюс бит четности или как их там):

    1. Первая точка — Напряжение ноги с нуля скакнуло верх. Записалась точка 0 миллисекунд. Дальше по таймеру отслеживание, что это напряжение держится.
    2. Бах! Напряжение упало! Записана вторая точка — столько-то миллисекунд.
    3) Скакнуло вверх! Третья точка.
    ..
    4)

    Этап 2. Итак записаны все точки — в них миллисекунды подъемов и спадов напряжения на ноге. Тут бутлоадер наконец инициирует УАРТ на скорости А и по таймеру воспроизводит в соответствующий бит записанную ранее волну. Уарт считывает это и распознает не «S», а что-то другое. Тогда Загрузчик переинициирует Уарт на другую скорость и снова воспроизводит волну. Пока не будет распознана «S».

    Тут уже он пишет «Хелло» и готовицо программировать чип.

    Точнее так: на этапе 2 нужно сделать вот что: без танцев с бубном просто взять ширину первой иголки в миллисекундах и соотнести ее с табличными значениями. Если иголка шире Х и уже Y — то скорость УСАРта будет такая-то. Релистично?

      1. Посмотрю, спасибо.

        Но я на самом деле очень во многом ошибся:

        В частности, оперировал миллисекундами, а это вообще не правильно, так как в поставленной задаче бутлоадер должен установить правильную скорость УАРТА не зная на какой частоте стартовал чип. Миллисекунды поэтому в принципе не вычисляемы.

        Вот что будет иметь бутлоадер: ширину иголки в тиках. Ясно, что она прямо пропорциональна частоте связи в килогерцах, которую бутлоадеру предлагает установить компьютер. Значит эта скорость установится простой формулой — без всякой таблицы, которую я выдумывал выше. При этом бутлоадер не будет знать ни частоту кварца, ни скорость соединения — но установит правильное соединение.

        Но какая это формула я сказать не могу, т.к. у меня не хватает знаний.

      2. >посмотрите в апноутах к ds89c450 есть алгоритм автоопределения скорости

        The ROM loader
        also has an auto-baud feature that determines which baud-rate frequencies are being used for communication and
        sets the baud-rate generator for that speed.

        Это я у ds89c450 в даташите прочитал. Как я понял, у него автоопределение скорости встроенное.

  8. У меня возникли проблемы при компиляции проекта. http://files.unn.ru/09378444773
    Нзнаю что делать. может кто подскажет!!! Срочно надо откомпилировать, но ничего. Все делал как написано выше. Сначала поставил студию, потом винавр. Что нужно сделать, чтоб исправить ошибку?

    1. Доступ запрещен!
      Сожалеем, но этот сервис работает только для сетей, включеных в точку обмена нижегородским трафиком. Если вы в Нижнем Новгороде, то обратитесь к своему Интернет-провайдеру с вопросом об участии в этой системе обмена.
      По вопросам обмена трафиком с ННГУ — noc@unn.ru

        1. У меня такую ошибку выдавал когда я мейк выключил, нажал скомпилить и включил его обратно.

          Во первых после правки сохрани makefile студия его перед компиляцией не сохраняет и все что ты там изменил не изменилось.

          Во вторых потри все обьектые, lss и прочие main.* файлы кроме main.c конечно. Пусть заново их создаст. Мне это помогло тогда.

          1. Мне кажется студия глючила. Потому, что WinAvr скомпилил без проблем и получил такойже *.hex как у тебя. У меня самая последняя AVRStudio. Может ето из-за етого??!!
            Вот еще вопрос. Можно отключить кнопку для входа в загрузчик, и светодиод.?

            Надо вроде закоментировать ети строки, и где они встречаются в тексте?
            /*
            * Выбор порта для кнопки входа в загрузчик
            * Чтобы войти в загрузчик надо чтобы при запуске эта кнопка замыкала пин на землю
            */

            #define BLPORT PORTD
            #define BLDDR DDRD
            #define BLPIN PIND
            #define BLPNUM PIND7

            /*
            * Выбор порта для индикатора работы загрузчика
            * Светодиод горит — мы в загрузчике
            */

            #define ENABLE_BOOT_LED
            #define BIPORT PORTD
            #define BIDDR DDRD
            #define BIPIN PIND
            #define BIPNUM PIND5

            1. Светодиод да, отключается тут.

              А вот чтобы изменить способ входа в бут надо подправить тип загрузчика, выставив одну из этих опций:
              //#define START_SIMPLE
              #define START_WAIT
              //#define START_POWERSAVE
              //#define START_BOOTICE

  9. Использую бутлодырь совместно с гипертерминалом, тот который идет в комплекте с окошками. Для этого бутлодырь адаптирован к приему «уартом» чистого «хекса». Что это значит ? То, что мы берем и открываем «ноутпадом» сгенеренный компиллером/ассемблером код, в привычном для всех программаторов формате — «хекс» файл, и делаем «коупи-пайст» в окно гипертерминала. Гипертерминал последовательно, строчку за строчкой отправляет содержимое в компорт, естественно с некоторой задержкой, порядка 15..20мс, которую в свою очередь устанавливаем в «аски» настройках гипертерминала. Выгода такого подхода налицо:
    — простота реализации и использования;
    — нет необходимости в специальнов софте;
    — контроль целостности передачи кода в контроллер;
    В дополнении на весь код накладываю контрольную сумму, которую записываю отдельной утилитой, в конец файла. Инициализация контрольной суммы уникальна и левая прошивка работать в неком устройтве не будет, плюс в бутлодыре храню пару-тройку важных функций, которые использует обновляемая программка. Удачи !

  10. Будет ли работать даный Bootloader на Мк ATmega8535? Если да то как подправить исходник,ведь доступны только:

    ## MCU = atmega8
    MCU = atmega16
    ## MCU = atmega162
    ## MCU = atmega169
    ## MCU = atmega32
    ## MCU = atmega324p
    ## MCU = atmega64
    ## MCU = atmega644
    ## MCU = atmega644p
    ## MCU = atmega128
    ## MCU = at90can128 ?

    1. Будет, но надо будет добавить файлы mega8535.h (он будет очень похож на mega8.h разница только в сигнатурах).

      Также по аналогии добавить в makefile секцию с мега8535 по аналогии с мега8 помешает проверить начальные адреса

      И то же сделать с файлом chipdef.h где указать все по аналогии.

      Или попробовать скомпилировать для мега8 и залить в 8535, адреса у них вроде бы внутренние все совпадают (надо уточнить!) .

  11. Насчёт «В графу “Project Name” пиши что хочешь» :

    Для начала я попробовал использовать готовый проект из архива, с именем «Bootloader»
    Компилю — выдаёт:
    gcc plug-in: Error: Object file not found on expected location.
    И уточняет, что оно хочет файл «Bootloader.elf», а в папке имеется только main.elf

    Может быть, эльф тут и не сдался, но у меня ж к еррорам и варнингам нетерпимость…

    Иду другим указанным путём — создаю новый проект, как описано; в качестве имени проекта указываю «boot». Та же картина, только теперь оно хочет «boot.elf».

    Смотрю мейкфайл — в TARGET прописано «main». Чешу в затылке… править стрёмно.

    Пересоздал проект с именем «main» — скомпилилось! (С двумя варнингами, прописанными в коде напрямую — про прерывания и «not read-protected», с ними я еще поразбираюсь).

    WinAVR-20090313
    Студия 4.16 билд 628

      1. Перебрал код, порядок, на восьмой меге работает. Глюк1- не работает верификация, если сбросить и ввести контроллер в бут- читается без ошибок,
        Глюк2- выдает предупреждение «flushing» перед операцией записи- чтения (всё равно, куда), после этого первый раз окно advanced открывается с крякозяблами вместо target board и hardware version, закрываем, тычем второй раз- хоккей, всё на своем месте.

        С мегой163 разнятся регистры уарта, бит4 регистра SPMCR (у меги8 RWWSRE, у меги163- ASRE).

        1. Перебрал код, порядок, на восьмой меге работает. Глюк1- не работает верификация, если сбросить и ввести контроллер в бут- читается без ошибок,
          Глюк2- выдает предупреждение «flushing» перед операцией записи- чтения (всё равно, куда), после этого первый раз окно advanced открывается с крякозяблами вместо target board и hardware version, закрываем, тычем второй раз- хоккей, всё на своем месте.

          С мегой163 разнятся регистры уарта, бит4 регистра SPMCR (у меги8 RWWSRE, у меги163- ASRE).

          Обьем- 404 кб получился.

  12. Подскажите, пожалуйста. А на скорости 31250 я смогу работать с бутлоадером? А то я сделал все как в статье, скомпилировалось, зашил программу загрузчика в мегу 16, нормально (кстати, довольно быстро, у меня всегда она так прошивалась). И все! И порт в гипертерминале не открывается, чтоб проверить, и соответственно, не запускается AVR Prog. :(

  13. ну с виртуальными портами вроде как должно работать, нашел в тексте об этом. А вот как Avr Prog стучится символом S, я не понял, это как то прописывать надо? У меня AvrProg не запускается вообще, когда подрубаюсь с загрузчиком в кристалле.

    1. Нигде это прописывать не надо. Если аврпрог не стартует когда загрузчик есть и готов к работае, то значит загрузчик не работает.

      S это команда AVR910 на которую загрузчик должен дать ответ. Если в терминале у тебя на S в сторону загрузчика нет ответа, значит загрузчик утебя не работает. Поэтому и аврпрог не стартует.

  14. А в чем может быть проблема? Прошивку почти не менял, поменял только частоту, поставил 1000000 (у меня тактируется от встроенного на 1 МГц). Зашилось вроде нормально, единственно , что не медленно как написанно, а довольно быстро, секунд за 8 (у меня всегда так). Подключаю через виртуальный COM (делал переходник на FT232RL), одно НО еще, у меня токовая петля, т.е. с гальванической развязкой интерфейс от контроллера до компутера, использую для подключения миди устройств. Может как-то повлиять? протокол обмена тот же rsr232 асинхронный последовательный …

  15. про гипертерминал я имел ввиду не скорость , а все остальное, то что на 19200 его ставить это понятно. А вот все остальное не трогать вообще? типа задержки символов, аппаратная ли поддержка, и т.п. Вобщем по дефаулту запускать гипертерминал, а потом править только скорость и все?

  16. Уважаемый DI HALT, помогите! Программирую для ATMega128 а точнее бут для нее. Не могу понять какой адрес (смещение) ставить для программы. Судя по даташиту, например для размера бут области в 2048 надо адрес ставить 1F000 (F800*2)? Пробую так, но при открытии hex файла там совсем другие адреса. Это я к стати переделываю проект http://www.obdev.at/products/vusb/index.html под ATMega128. Когда программа не в загрузочной области, то все работает, а когда пишу в бут то нет :( может подскажите в какую сторону копать?

  17. вот так у меня написано в Make-файле, это бут области в 2048 слов.

    BOOTLOADER_ADDRESS = 1F000
    LDFLAGS = -Wl,—section-start=.text=$(BOOTLOADER_ADDRESS)
    COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) $(LDFLAGS)

    вроде как все правильно, или нет?

    есть подозрения что это либо с прерываниями что-то не то, либо с watchdog_ом.
    в коде использую вот такуб конструкцию:
    MCUCR = (1 << IVCE); /* enable change of interrupt vectors */
    MCUCR = (1 << IVSEL); /* move interrupts to boot flash section */
    это правильно? что то мне подсказывает что что-то простое не замечаю и отсюда вся лажа… :(

  18. Я канешно извиняюсь, но если чесно, то я уже заипался с этим бутлоадером. Я скачал исходные коды и файлы проекта для Bootloader’a, вибрал в мейкфайле мегу16, задал размер бута 1024, указал правильный адрес к папке ВинАВР; в main.c задал частоту 11059200Гц, вход в режим программирования с помощью перемычки. Прошил МК через ISP, AVRProg нашла МК(в строке Device написано Atmega16 BOOT) но при прошивке после верификации вискочила ошибка а программа для МК не работала:(
    При компиляции вылазило какой то предупреждение где упоминалось о каком та векторе прерывания.
    Народ, плиз, кинте ГОТОВЫЙ проект ВинАВР+АВРСтудио для мега16, тока желательно чтобы оно работало на последних версиях этих програм.
    br.misha@gmail.com
    Заранее спасиба!

    1. DI HALT, наверно у вас старая версия WinAVR потому что в makefile написано #DIRAVR = c:/winavr а в последних трех версиях(более старых у меня небыло) WinAVR’a папка с програмой называлась WinAVR-********, где звездочки — это дата выхода данной версии компилятора(например у меня WinAVR-20090313) но почему то когда я прописываю правильный адрес то при компиляции выскакивает какая та ошибка связана с *.elf файлом и ещё какая та. Поэтому я переделал настройки проекта убрав галку с “Use External Make File” и зделав необходимые настройки в том же окне. Проект скомпилировался без ошибок, потом я подключил МК к компу через самодельный STK500, открыл в AVRStudio встроеный программатор, очистил МК, задал размер бута 1024 слова, поставил галку возле BOOTRST, прошил МК бутлоадером, подключил МК к компу через СОМ порт, поставил перемычку для программирования через бутлоадер, открыл AVRProg, и программа в строке «Device» написала «Atmega16 BOOT», прошил МК но после проверки AVRProg написала ошибку верификации и, соответственно программа в МК работала совсем неправильно. Я уже не знаю что мне делать:(.
      Но тут я подумал, еси при включеном BOOTRST программа МК пропускает 1024 слова то может в настройках компиляции проекта нада как то сделать чтобы компилято пропускал эти 1024 слова?

      1. У меня версия последняя. Просто я при установке инсталятором вытер из названия циферки версии. Поэтмоу у меня мэйк и такой.

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

  19. Вобщем бутлоадер получился хотя мне не нравиться то, что он почему то ругаеться на *.elf файлы, ну ладно, главное что работает.
    Теперь интересует ещё один вопрос:
    Есть например у меня несколько девайсов в которих зашит бутлоадер и установлены фузы для запрещения считывания FLESH и пользователь может запросто прошить девайс через СОМ порт испоользуя AVRProg. Но вот только мне нада сделать так, чтобы у каждого девайса был свой ID размером не более 10 байт. Тоесть мне нада при заливке бутлоадера (через ISP) записывался и этот ID, вроде бы ничего сложного — можна просто сделать в исходнике бутлоадера массив с 10 элементов, но проблема в том, что мне нада считать эти 10 байт основной программой(тоесть той, которую я загрузил через бутлоадер), как это сделать я незнаю, можна конешно записывать в EEPROM но этот вариант мне не оч подходит.
    Может что нить подскажете?

    1. А в чем проблема? Если у тебя бут сушится по одному и тому же адресу, то тебе главное увидеть этот массив. Запиши его после всех данных и все. А потом по абсолютному адресу к нему достучишься.

    1. В общем сам задал сам отвечаю:) Проблема была в скорости ком порта… Я по привычке выставил в бутлоадере 9600 а оказиваеться AVRProg работает на 19200 по умолчанию… вот такие грабли…

  20. У меня почемуто этот bootloader работает только с тактировкой от внешнего кварца на 7,3728 МГц. Есля я в main.c в строке F_CPU указываю F_CPU 8000000 и FUSE битами устанавливаю тактировку от внутреннего тактового генератора на 8 МГц то AVRProg не запускается, а в терминалку вместо «AVRBOOT» приходит мусор какой-то.Контроллер ATmega16-16PU. Подскажите, что делать?

  21. Я перекомпилировал бут, но на частоте 8 МГц нормально он работает только с переходником RS232-UART на транзисторах. Если я подключаю его через переходник USB-UART,
    собранном на микроконтроллере ATmega48 по этой схеме: http://www.recursion.jp/avrcdc/cdc-232.html ,то бут работает толко на частоте 7,3728 МГц, а на 8 МГц происходит таже ошибка. Получается у меня кривой переходник?

  22. Выражаю благодарность автору за статью.
    Бут успешно запустился на меге8515.
    Заметил один недостаток при обработке неподдерживаемых команд:
    если команда была передана с аргументом, то аргумент воспринимается как следующая команда. В результате чего если бут скомпилирован без опций чтения записи фузов, то при нажатии кнопки Write в окне Additional аврпрога, бут не выходит из режима программирования, так как команду ‘l’ воспринимает как неподдерживаему, а следом вместо команды ‘L’ получает аргумент команды ‘l’.
    Лечится путем изменения обработчика
    else if(val != 0x1b)
    {
    _delay_ms(10); // немного ждем
    // если был аргумент читаем
    if (UART_STATUS & (1<<UART_RXREADY)) recvchar();
    sendchar(‘?’);
    }

      1. По идее должно подойти в точности как для мега8. Просто впиши там рядышком MCU = atmega8535

        и добавь там ниже секцию:

        ifeq ($(MCU), atmega8535)
        BFD_MACH=avr4
        ifeq ($(BOOTSIZE), 128)
        MT_BOOTLOADER_ADDRESS = 0x1F00
        endif
        ifeq ($(BOOTSIZE), 256)
        MT_BOOTLOADER_ADDRESS = 0x1E00
        endif
        ifeq ($(BOOTSIZE), 512)
        MT_BOOTLOADER_ADDRESS = 0x1C00
        endif
        ifeq ($(BOOTSIZE), 1024)
        MT_BOOTLOADER_ADDRESS = 0x1800
        endif
        endif

        Только адреса бутлоадера уточни в даташите. По идее они должны быть такие как в мега8, но мало ли…

        Ну а все остальное контроллеронезависимое вроде бы.

  23. DI HALT, правильно ли я понимаю, что в область памяти бутлоадера можно записать некий код, который будет делать то же самое, то есть — обновлять прошивку, но при этом он будет сидеть там тихой сапой и ждать, когда к нему сама программа обратится, вместо отработки reset`a? То есть идея такая — чтобы внешняя прога через UART сказала контроллеру, что хочет залить обновление, контроллер сказал бы ОК и передал управление в бутлоадер, который бы уже дальше общался с внешней прогой, залил бы прошивку и передал бы управление туда.

    1. Ммм не совсем так. Короче, в памяти есть секция и можно выбирать (фузом) стартовать с нуля или с адреса этой секции. Таким образом, ты можешь записать туда стартап код который может сделать сампрошивку. Также ты можешь джампнуться на этот стартап код вручную, из программы (адрес то известен!).

      Либо сделать проще — когда надо включить бут, то врубаем ватчдог и зацикливаемся наглухо. Чтобы вачдог нам сделал ресет контроллера. А ресет будет уже на бут.

    2. Или ты хочешь сделать перешивальщик вместо бута? С обычным стартом с 0000 адреса? В принципе, тебе никто не запрещает сделать свой прошивающий код в бутлоадерской области и прыгнув туда вручную перешиться. А при ресете будет просто обычная загрузка.

      1. Хочу сделать так, чтобы моя прога, которая рулит контроллером, могла бы сама заливать туда свежую прошивку, то есть без использования AVRProg, вот идея с натравливанием собачки очень даже хороша! Наверное, так и сделаю :) Сенкс!

  24. Цитата:»У меня USB, главное чтобы виртуальный USB был в числе первых четырех COM портов. У меня он зарегился в системе как COM4″
    а если у меня виртуальный USB зарегился под COM8, работать не будет?
    Подключаюсь через Terminal 1.9b там можно выбрать COM8

  25. собрал плату с ft232r. прошил контроллер бутлоадером. Плата вроде рабочая если закоротить
    Rx и Tx то буквы возвращаются. Не могу проверить выходит ли контроллер в бут. на portD5 че должно быть единица или ноль? и почему не надо перекрещивать rx и tx между микросхемой и контроллером?

  26. при подаче питания на Mega8 на rxd 2.5v на txd 5v на pd5 5v. сигнал не возвращается на микросхему если поставить перемычку rxd-txd при подключенном контроллере. без него все сигнал с перемычкой возвращается

  27. Нужно было прошить ATMEGA8 (исполнении MLF-32pin). Согласно описанной методики создал main.hex файл.В CodeVisionAVR выбрал программатор STK200+/300(пять проводков), установил соответственно fuses,загрузил main.hex файл и начал прошивать Flash. В конце прошивки выскакивает ошибка:
    Flash contents mismatch at address:E00h
    Flash read: FFFFh
    Buffer data: E58Fh.
    Continue?
    В чем проблема и как с ней бороться?

  28. DI HALT, загрузил ваш бутлоадер в атмегу128, поправил для работы с кварцем на 16мгц. Сделал запуск с кнопки. AVRProg определил контроллер, но при нажатии кнопки «write» задумывается на пару сек. и пишет «Failed erase». В терминале всё отлично отвечает = (
    Видимо это глюк самого бута. Может что подскажите?

  29. Привет DI. Можно ли бутлоадер который ты выложил, настроить так чтоб он когда надо, по спец байту на UART принял новую прошивку и перепрошил МК? Мк подключен к СОМ порту по RS485 интерфейсу? СОМ порт скажем №15. А не с 1-го по 4-й.

      1. Чтото с бутаком мозг мой стопарнулся. Надеюсь это временно. Если у меня МК торчит на 15 СОМ порте, значит AVRprog не пойдет, так как выше вроде как сказано что он работает с 1-го по 4-й СОМ порт. Значит нужно что то другое. А что? С каким софтом еще будет работать, твой бутак? Примет ли он формат INTEL HEX как есть через HyperTerminal? Нет не примет. Выше в коментах TORNIS так делает, но у него другой бутак. HyperTerminal вроде как работает с любыми СОМ портами, это удобно. Получается что AVRprog работает с твоим бутаком по определенному протоколу. И твой бутак заточен под этот протокол. Раз в моей ситуации AVRprog не идет нужна какая то софтина с таким же протоколом как у AVRprog но способная работать с любым номером сом порта. Я хоть в правильном направлении думаю?

        1. Там вроде бы AVR109 протокол. Так что его должен поддерживать avrdude

          Недавно находил в студии возможность выставить ком порт больше 4го. Но где уже не помню. После этой опции и аврпрог начинает опрашивать порты старше 4го.

  30. DI привет снова. Я сейчас работаю с предложенным тобой бутом. Прошил бут в мк. Потом тестовую прогу через сом порт. Все работает. Так что потихоньку двигаюсь к своей цели. Но возник по ходу вопрос.

    1. После заливки проги, бут сам не отдает управление основной программе, нужно обязательно нажать ресет. А у меня ж МК будет находится на большом расстоянии. Как рестарт сделать? Можно ли какую то команду послать этому буту чтоб он отдал управление наверх?

    2. Расстояние между СОМ портом и МК будет приличное допустим 1200 метров. Используем RS485. Может же быть такое что во время передачи прошивки, какая нибудь наводка угрохает какой нибудь байт по дороге. И бут все это запишет во флеш? Есть ли возможность у этого бута проверить корректность записи прошивки?

    1. 1. Надо там посмотреть каким образом отадется управление. Я уже не помню. Не я же его писал. Я только чуток подправил под свои нужды.

      2. Насколько знаю нет. Надо вводить срц какое нибудь.

      1. Если невозможно командой отдать управление наверх, тогда такой бут не подходит для прошивки на удаленные растояния. А жаль, а то я уже обрадовался. Здесь http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR109.htm описывается протокол avr109. Там говориться что L — это выход из режима программирования. Посылаю L и ничего не происходит. Хотя на некоторые другие команды ответ приходит. Может глянеш возможно это или нет. А то я в си не шарю. Тогда бы я начал искать чтонибудь другое. Хмм… интересно, а ведь после нажатия кнопки reset он же через 4 сек выходит из режима. По идее как-то ж можно сделать так, чтобы послав команду он отработал это же действие. Только как?

        1. Да есть там такая фича. Вот только может быть глючит. Там весьма много каши изза директив условной компиляции. Дров там наломать раз плюнуть. По хорошему бы выкинуть все это дерьмо и заточить бут под конкретный камень.

            1. Выход по L в программу. Она даже врублена должна быть. Поддержка то команд полная. Но вот почему не работает хз. Надо разобраться. ПО идее там дело одного перехода. Домой приеду поковыряюсь. Тут совсем обстановка не рабочая.

              1. Привет DI, бутак заработал. Отправил команду Е, типа «exit» подразумевается. И МК стал сбрасываеться. Теперь его можно удаленно вырубать. Хотя про Е ничего в документации не говориться. Странно.

  31. Привет Ди, спасиб за статью. Подкну свои пять копеек, по работе с бутлоадером.
    Уже года три алуюсь прошивкой телефонов, почему бы не сделать режим работы бута для заливки новой проши работающим до первого reset? Т.е выполнили условие входа(например нажали «3 волшебные кнопочки» как у андроидов или еще чего) и пока мы его не ребутнем он будет ждать новую прошу. Реализовать просто, особенно если остались ноги пустые.

    Собираюсь делать на подарок пресловутую лампу настроений, если б не твои статьи, я бы и половины не узнал бы так быстро)

  32. Доброго времени суток, ДИ!
    Помоги пожалуйста переделать этот бут под Мегу88.
    Пытался самостоятельно, не получилось. Брал за основу Мегу8, там даже адреса бутлоадера одинаковые. В хидере, все что связано с UART изменил где-надо.
    А вот с верхней частью:
    /* Part-Code ISP */
    #define DEVTYPE_ISP 0x76
    /* Part-Code BOOT */
    #define DEVTYPE_BOOT 0x77

    #define SIG_BYTE1 0x1E
    #define SIG_BYTE2 0x93
    #define SIG_BYTE3 0x07
    Не могу разобраться, что откуда куда и зачем?
    Помоги пожалуйста, буду очень благодарен!

    1. По простому не выйдет. Надо найти сигнатурные байты иначе аврпрог тебя не поймет. Я подобрал для атмега168 от мега169 — подошли. Просто нагуглил Part Code для мега 169 поищи для 88 тоже должны быть.

      1. Сигнатурные байты я нашел в даташите на стр. 288.
        Также нашел вот эти парт-коды:
        0x10 AT90S1200rev.A
        0x11 AT90S1200rev.B
        0x12 AT90S1200rev.C
        0x13 AT90S1200
        0x20 AT90S2313
        0x28 AT90S4414
        0x30 AT90S4433
        0x34 AT90S2333
        0x38 AT90S8515
        0x3A ATmega8515
        0x3B ATmega8515 BOOT
        0x41 ATmega103
        0x42 ATmega603
        0x43 ATmega128
        0x44 ATmega128 BOOT
        0x45 ATmega64
        0x46 ATmega64 BOOT
        0x48 AT90S2323
        0x4C AT90S2343
        0x50 ATtiny11
        0x51 ATtiny10
        0x55 ATtiny12
        0x56 ATtiny15
        0x58 ATtiny19
        0x5C ATtiny28
        0x5E ATtiny26
        0x60 ATmega161
        0x61 ATmega161 BOOT
        0x64 ATmega163
        0x65 ATmega83
        0x66 ATmega163 BOOT
        0x67 ATmega83 BOOT
        0x68 AT90S8535
        0x69 ATmega8535
        0x6C AT90S4434
        0x70 AT90C8534
        0x71 AT90C8544
        0x72 ATmega32
        0x73 ATmega32 BOOT
        0x74 ATmega16
        0x75 ATmega16 BOOT
        0x76 ATmega8
        0x77 ATmega8 BOOT
        0x78 ATmega169
        0x79 ATmega169 BOOT
        Может кому и поможет, но сожаление моей меги88 тут нет.
        Если никто не подскажет где искать, буду искать методом научного тыка..

        1. Меги88 там нет и не будет, т.к. это новая модель и аврпрог ее не поддерживает.

          Ищи от 8кб моделей. Может какой нибудь подойдет. Например 0×77 ATmega8 BOOT

          Мне для 168 подошел от 169

  33. Доброго времени суток, DI.
    пытаюсь данный бут под мегу8 переделать, но я никак не пойму, что не так я делаю:
    1) поставил частоту 8Мгц (фьюзами) от внутреннего резионатора
    2) перекинул ногу светодиода на PB0
    3) последний раз компилировал с BAUDRATE 115200. но даже когда было 19200 — он на запрос ‘S’ отвечал символом 0x9F (џ). Сейчас (Win7) отвечает тоже 0x9F (Ÿ) (хотя в терминале ответом ASCII является буква z с черточкой)
    4) поменял тип старта на START_SIMPLE (соединил PD4 и землю)

    все это дело я подключаю через USB-COM (PL2303) http://monitor.net.ru/forum/files/pl2303_pinout_994_188.jpg
    в общем светодиод (говорящий о том, что мы в буте) горит постоянно

    самое интересное, что из всех моих попыток (а их было много) запустился AVRProg всего 1 раз да и тот я повторить больше не смог..
    потом я подумал, что у меня комп не успевает за 4 секунды и увеличил время ожидания до 10 секунд, а в конечном счете по замыканию контакта (START_SIMPLE).

    особо больше ничего не менял.. запутался уже.
    а всякие USB-boot под мегу8 — это жирно?
    ситуация такая, что хочется иногда на рабочем компе поиграться с контроллерами, а тут ни COM ни LPT, компы слишком новые.. вот и приходится извращаться. а покупать AT90USB162-16AU(tqfp32) за 350р да еще и извращаться с корпусом его…

    прошу помощи, что я могу не так делать?

  34. Доброго времени суток.
    Есть странная проблема при работе с выше указанным бутлоадером.
    Ошибка: AVRProg 1.4 No supported board found.

    ТТХ оборудования:
    Контроллер mega8, кварц на 8, скорость 19200.
    Захожу через putty, пишу ‘S’ — отвечает AVRBOOT.
    Светодиод на PD5 постоянно горит.
    Использую FT232RL в качестве USB-UART преобразователя, в системе выставлен как COM2(или COM1 — результат одинаковый).
    По светодиоду, подключенному к FT232RL — AVRProg посылает 5 раз что-то и сдается =\

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

    1. Сам порт настраивать не надо. Бутлоадер же общается с аврпрог на 19200-8-N-1

      Авпрог при запуске тыкается в порты 1…4 и спрашивает есть ли там чо? Т.е. шлет символ S и если ей в ответ AVRBOOT то начинается работа. Если нет, то пишет что нет поддерживаемых устройств на борту.

  35. Иммется ли возможность прикрутить к данному буту управление внешним приемо-передатчиком RS485?
    В обычных условиях это делается очень просто по прерываниям USARTа, но в данном буте прерываний нет вообще.
    Если просто воткнуть управление в функции sendchar и recvchar, мне кажется будут проблемы.
    Есть ли решение данного вопроса?

  36. Господа, разъясните, плиз, в AVR Prog во второй закладке есть что-то касаемо фьюзов, т.е я так понимаю можно щёлкать фьюзы оттуда, но они все неактивные.. Почему? это от функционала бута зависит?

    1. Бут не может шить фузы. А аврпрог работает не только через бут, но и через ряд других программаторов, аппаратных. Вроде того же AVR109 (или 910 черт их разберет)

      1. Ок, понял, значит ISP далеко прятать не надо..
        А в остальном зашил, ресет и всё работает. спасибо. только одна вещь, которая потребовала разбирательств: «Во-первых надо активировать бит BOOTRST». Не ясно что значит активировать.. Надо отметить, что его надо поставить UNPROGRAMMED(1).
        Я по началу поставил его в 0, как бы «активировал», но ничего не заработало, даташит помог.

      2. Вот тут: http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR109.htm сказано что таки может. Или я что-то не так прочитал… Кстати, это могло бы решить ранее обсуждавшуюся проблему со скоростью ком-порта при замене кварца. Можно было бы переключиться на внутренний генератор, прошиться и снова включить внешний… Надо подумать :)

  37. Использую CVMegaload.
    только сам немного переписал под себя загрузчик (сделал моргание светодиодом, добавил многократную отправку символа, причём на разных скоростях… заодно добавил 485 интерфейс (там надо отдельной ногой дрыгать, когда отправляешь данные — это вообще отдельный анекдот ))

    Сделать на универсальном кварце не представляю возможности… да и желания нет. Мне проще подкорректировать код под конкретный девайс (благо только пару констант поменять) покопаться в коде разве только по принимаемому сигналу определять скорость, или перебирать скоростя согласно возможным кварцам, но проще 2 константы сменить и зашить.

    >> Но если в микроконтроллер не зашито еще ничего, то быстро проскочив через 16кб пустоты проц опять выполнит код бутлоадера и так по кругу, диод будет тупо гореть…
    Если Собачий таймер не обломает… (использую 3.6864 МГц на основе перестроенного внутреннего «типа калиброванного» RC генератора …уже второй подряд кристалл с уплывшей внутренней частотой резонатора — чем они там на заводе занимаются?)

    Посему у меня есть желание сделать, чтобы прошивка бутлоадера работала нормально — по нулевому адресу добавить jmp , чтобы на время отладки он стартовал даже при не прошитых фьюзах, но CVAVR блин слишком умная :(, или руки не совсем выпрямил… Прям хоть вручную HEX файл править.

  38. DI привет.

    Ну вот, мои поиски увенчались успехом. Наконецто я нарыл и протестировал великий и могучий китайский загрузчик имени shao ziyang. Этот bootloader поддерживает все интерфейсы RS232,422,485. Есть функция watchdog, CRC, верификация, мигающий LED, пароль для входа от 1 до 8 символов.Написан на си. Открытый исходный код. Поддерживает все меги. Протокол Xmodem. Это означает что не требуется некий софт для загрузки прошивки. Можно грузить прямо с hyperterminal. Пробовал, с hyperterminal все работает. Но автор предлагает и софтину заточенную под его бутак. с софтиной конечно намного удобнее и приятнее работать. Можно грузить HEX а можно и BIN формат. Не проблема. Описанные выше примочки можно опционально отключать подключать по потребности. При этом при перекомпиляции прошивка уменьшается значительно. Этот великий и могучий загрузчик находится здесь

    http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere

    Предлагаю тебе в статье в конце для народу эту сносочку кинуть, кому надо пусть пользуются. Ну что думаеш то?

      1. Поюзай,поюзай, уверен что понравится. Весит чуток более 1к. Там такой прикол что можно врубить rs485, а он всеравно будет работать и по rs232 и по rs485. Интерфейсы переключать не надо. Пароль можно вырубить. Я сейчас с этим китайцем переписываюсь по его бутаку. Смышленый пацан. Сам софтину для своего бутака написал. Я его бутак сейчас на 16 меге использую. И контрольная лампочка работает прикольно. Не просто тупо горит и все. А мигает, а когда идет загрузка мигает быстрее. Во!

    1. Привет. Я вродебы прочитал всюстатью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
      — как я могу дать команду из основной программы на старт бутлоадера?
      — что такое timeclk? (что такое базовы

      1. Привет. Я вродебы прочитал всюстатью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
        — как я могу дать команду из основной программы на старт
        бутлоадера?
        — timeclk — что это? (какой то базовый временной интервал)и на
        что он влияет?
        — TimeOutCnt — что это?…какой то счетчик бутлоадера….за что
        отвечает?
        — TimeOutCntC — это что? максимальное время ожидания файла
        прошивки?
        — VERBOSE — ето ХЕЛП чтоли….по какой команде его можно
        выдернуть из МК?
        Если есть описание команд, буду благодарен если их выложите. Было бы не плохо создать отдельную тему по данному бутлоадеру

        1. Привет. Я вродебы прочитал всю статью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
          — как я могу дать команду из основной программы на старт
          бутлоадера?
          — timeclk — что это? (какой то базовый временной интервал)и на
          что он влияет?
          — TimeOutCnt — что это?…какой то счетчик бутлоадера….за что
          отвечает?
          — TimeOutCntC — это что? максимальное время ожидания файла
          прошивки?
          — VERBOSE — ето ХЕЛП чтоли….по какой команде его можно
          выдернуть из МК?
          Если есть описание команд, буду благодарен если их выложите. Было бы не плохо создать отдельную тему по данному бутлоадеру

          1. Привет. Я вродебы прочитал всю статью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
            — как я могу дать команду из основной программы на старт
            бутлоадера и скормить ему прошивку (хотябы через тайпер)?
            — timeclk — что это? (какой то базовый временной интервал)и на что он влияет?
            — TimeOutCnt — что это?…какой то счетчик бутлоадера….за что отвечает?
            — TimeOutCntC — это что? максимальное время ожидания файла
            прошивки?
            — VERBOSE — ето ХЕЛП чтоли….по какой команде его можно
            выдернуть из МК?
            Если есть описание команд, буду благодарен если их выложите. Было бы не плохо создать отдельную тему по данному бутлоадеру

              1. А зачем ты 20546 раз написал одно и тоже? Так места для сайта на сервере скоро не хватит.

                Как войти из основной программы в загрузчик? Так этож раз плюнуть. Вот этой командой:

                JMP FOURTHBOOTSTART ; и усе. ты в загрузчике.

                Бутак сразу начинает отсылать в терминал букву С. Вот в этот момент времени ему нужно пихнуть прошивку либо с hyper terminala либо с его проги avrubd.exe лучше используй avrubd.exe очень удобно и просто а главное круто.

                TimeOutCnt это максимальное время ожидания пароля, оно равно TimeOutCnt * timeclk

                TimeOutCntC это время ожидания данных тобиш прошивки. оно равно TimeOutCntC * timeclk

                timeclk это просто число интервал в мс который подставляется в вышеприведенные формулы. Да ты с этими числами не парься сильно поставь каие нибудь там, а пароль вообще отруби зачем он тебе?

                И будет тебе большое счастье.

                А в отношении отдельной статьи это дело говориш. Бутак то этот хорош. Бесплатный. Можно статью самому написать и выложить в сообщество. Но я не могу занят сильно, не до этого сейчас. Попроси di написать, может у него будет желание и настроение, тогда напишет.

                1. Прошу извинить за написание одного и того же, у меня интернет тормознутый, один раз жму «Добавить а оно не добавляет», жму второй раз, уже 2 ответа, редактировать уже три…плохо что нельзя удалить свои сообщения…

                  1. dima_m спасибо за подсказки, однако о JMP FOURTHBOOTSTART прошу немножко поподробней (я только начинающий писатель на С). JMP — переход…FOURTHBOOTSTART — это название метки с адресом загрузчика?

                    Попробую создать статью на форуме о даном бутаке, мож кто еще какую инфо подкинет…

                    1. Здорово welcom. Извини занят дико сейчас по жизни. Много не могу писать. Мой ящик dmalash@gmail.com не обещаю что буду сразу отвечать, это зависит от меры загруженности. Я пишу проги на асме, си тоже поковыриваю но не сильно активно, нет времени. FOURTHBOOTSTART это конкретный адрес во флеш памяти микроконтроллера. У каждого он свой может быть. То есть компилятор вместо FOURTHBOOTSTART подставит конкретное число адрес куда прыгнет МК.FOURTHBOOTSTART относится к секции загрузчика куда записан бутак. Эта секция часто разбита на еще более мелкие секции.Открой файл описывающий регистры мк там все это есть например там такое можно увидеть
                      .equ FIRSTBOOTSTART = 0x1f80
                      .equ SECONDBOOTSTART = 0x1f00
                      .equ THIRDBOOTSTART = 0x1e00
                      .equ FOURTHBOOTSTART = 0x1c00
                      .equ SMALLBOOTSTART = FIRSTBOOTSTART
                      .equ LARGEBOOTSTART = FOURTHBOOTSTART

  39. Возникла необходимость сделать ус-во с перепрограмированием через GSM модем(по GPRS каналу). Сейчас разбираюсь со всем этим. Как я понял, самой ответственной частью в этом является бутлоадер. Может кто уже делал такое и может ответить на пару вопросов?

  40. А то же самое для Atmega88pa есть? Как я понял надо переписывать .h файл..
    И еще, можно ли им прошить контроллер не через родную совтину авр, а чем нибудь сторонним и маленьким?

  41. Поставил на Atmega16 загрузчик MegaLoad который со своей прогой, отлично работает, а вот этот лодер не цепляет avrprog на 19200, хотя все терминалки пишут avrboot. Пробовал и через max232 и через PL2303 пофигу.

  42. Чего то у меня с адресами какие-то непонятки. Сначала попробовал сбилдить для варианта входа в бут по кнопке, всё нормально. ATmega644pa, начало FC00 (соответствует даташиту — 7E00*2 = FC00), конец — FFF0 (в даташите конец в 7FFF*2 = FFFE). Потом подумал, что нафиг мне лишняя кнопка, это ж к девайсу лезть постоянно, и решил сбилдить с режимом входа по таймауту.
    Сбилдил.
    Начало также, FC00, а вот конец вон какой:
    :10FFF0…
    :020000021000EC
    :100000…
    :100010…
    :100020…
    :060030…
    :040000030000FC00FD
    :00000001FF

    То есть он закончил записывать в FFF0 и потом вдруг начал записывать в начало памяти, в область основной прошивки.
    Ставлю вход по кнопке — снова всё нормально.
    Ребилды, Clean Solution, ручное удаление файлов .o, lss, hex, map делал.

      1. Я так понял что нет. Последний адрес записи в конечной области — FFF0, а последний адрес судя по даташиту — FFFE, то есть он недоиспользовал память в конце и переключился на начало.
        Хотяяяя… А ведь вылез блин, оставшихся 13 байтов памяти МК всё равно не хватит для записи 2+10+10+10+6+4=42-х байтов программы…
        И я не совсем понимаю, как один и тот же код (у тебя в примере и у меня) занимает разное место? А ведь по сути в main-е сменена только частота, а в makefil’е — девайс.

  43. Атас, но простите меня, я начинающий.
    В билде выкидывает такое: Bootloader.aps:1: *** образец цели не содержит `%’. Останов.
    В мессагах: gcc plug-in: Making arbitrary targets when using external makefile may fail
    ничче не нашел по этому поводу. студия 4-ая. тулчейн к ней же. вин авр последний.

    1. С этим разобрались пересозданием проекта. Теперь вылазит вот такой ворнинг, что надо поправить?

      main.c:179:3: warning: #warning «This Bootloader does not link interrupt vectors — see makefile»

      и это все еще не успокоится:
      gcc plug-in: Making arbitrary targets when using external makefile may fail

      1. А зачем тогда говорить что после чего ставить? Тем более в «ликбезе» выделено большими буквами, что WinAVR ставится до студии.
        Наверно я придираюсь, но все должно быть по существу. Не люблю пустых слов (в заморских документациях очень любят по тыще раз объяснять элементарные вещи).

        1. Разница между статьями — пара лет. Так что когда то я считал одно, потом другое. В итоге выяснилось, что разницы нет. Править все статьи и помнить где что — я не компьютер.

          1. Скажите , вот допустим есть некое устройство на PIC или AVR контроллере с дискретными входами и релейными выходами, по RS485 к нему цепляется другой контроллер с LCD дисплеем для удаленного отображениия состояния входов и выходов на дисплее,
            Можно ли как то менять надписи на дисплее состояния входов выходов с ПК, я понимаю это какойто конфигуратор нужен некая программа для параметрирования входов выхдов и сообщений.
            Чтото наподобе конфигуратора охранных сигнализаций с GSM , там можно и текст смс заколотить и привязать к конкретному входу.
            Интересно как это все можно организовать есть ли какие нибудь открытые программы конфигурирования. Тут и без бутлоадера помоему не обойтись.

  44. я имею ввиду такой некий интерфейс пользователя для настройки работы устройства, подсоединился по усб и настроил как тебе надо.
    Искал в интернете , ничего подобного по таким системам не нашел, хотя таких устройств очень много, хочется разобраться вв принципе устройства и работы, сделать чегонибудь подобное.

    1. Можно сделать в устройстве виртуальную машину оперирующую простыми командами вида «замкнуть реле»,» разомкнуть реле», «проверить кнопку», «вывести надпись», «цикл, ветвление, условие», а саму программу записать в EEPROM со всеми строками текста. И менять через зашитые в эту же виртуальную машину команды смены программы. Тогда основная память остается постоянной.

  45. Потрясающе! Очень удобно! Только AVRProg на скорости UART 9600 запускаться не хотел, хотя терминал с бутлоадером общался успешно. Позже вернул на оптимальные 19200 и понял, что трогать эту скорость вообще не было необходимости.

  46. А что делать если бут походу сам себя выносит при при прошивке?
    Собрал, зашил бут через усбасп. Условие выхода — таймаут, СИД отключен. Один раз avrprog зашивает через бутлоудер светодиодомигалку, определяя камень как Atmega16 BOOT. Далее при старте камень выдерживает таймаут, потом переходит к выполнению тестовой прошивки. Только в течение «первых пяти секунд» AVRProg больше не видит бутлоудер. )=

    1. Да не похоже что бут сам себя выносит. Он не может писать в ту секцию где сам сидит. Скорей всего он просто неправильно сконфигурирован. Точнее неправильно задан размер бутсектора. Либо вообще бут не стартует. Т.е. пока память пуста, проц стартует на reset с 000 и пробежав по пустоте втыкается в бут и запускается. Но когда прошивка уже есть, то до бута проц не добегает, т.к. уходит в прошивку. Проверь фузы bootrst и bootsize

  47. Cлушай DI. Тут запара выходит с загрузчиком описанным в статье. Не компилируется он в студии 4.19 пишет вот что.
    make: *** [sizebefore] Ошибка 255
    Это кажется из за avr tolchain? Сейчас же путь другой к компилятору. Раньше был кажись с:/winavr
    я так понимаю надо пути переправить в makefile? Не в курсе куда рыть надо? Может сразу знаешь что копать?

    1. Тоже столкнулся с этим. В makefile есть строчки:
      # Define directories, if needed.
      #DIRAVR = c:/winavr
      #DIRAVRBIN = $(DIRAVR)/bin
      #DIRAVRUTILS = $(DIRAVR)/utils/bin
      #DIRINC = .
      #DIRLIB = $(DIRAVR)/avr/lib
      Надо заменить на:
      # Define directories, if needed.
      DIRAVR = g:/Program Files/Atmel/AVR Tools/AVR Toolchain #здесь прописать путь.
      DIRAVRBIN = $(DIRAVR)/bin
      DIRAVRUTILS = $(DIRAVR)/utils/bin
      DIRINC = .
      DIRLIB = $(DIRAVR)/avr/lib

      1. Те же грабли толко в профиль:

        Непредвиденное появление: -f.
        make: *** [sizebefore] Error 255

        пробовал в разных студиях (4 & 6) компилировать чет нифига…

        в чем еще может быть проблема?

        1. Та же проблема. Версия студии 4.19
          Непредвиденное появление: -f.
          make: *** [sizebefore] Ошибка 255
          Причем, если не использовать внешний makefile, этой ошибки нет. Зато вылетает куча других.
          Смена адресов не особо помогает. Может проблема в том, что вместо WinAVR используется AVR Toolchain?

          1. Не поленился, снес все под корень. Накатил студию 4.13 и WinAVR к ней. И (барабанная дробь) все компилится.
            Заметил интересную багу. МК прошил, подключил по usb, завел в режим бута и начал компилить следующий проект. И тут-то студия и вылетела. Думаю, что за дела? Гружу по-новой, пытаюсь открыть проект. Опаньки, опять вылет. Открываю другой проект, то же самое. Потом я догадался отключить МК от ноута. Все загружается и компилиться нормально. Что я хочу сказать, вход в бут по кнопке — зло. Я частенько забываю сохраниться.

          2. Тоже неоднократно сталкивался с этой проблемой. ИМХО, студия 4.19 как-то некорректно интегрируется с WinAvr. И прописывание путей ручками в настройках проекта не помогает,- make.exe вылетает с ошибкой. Глубоко копаться в проблеме не хотелось, откатился на 4.18, которая прекрасно работает как с WinAvr2010, так и с avr-gcc 4.7.2 в разных ОС(W7x32, W7x64, XP32, W2KSP3)

  48. Cкажите, а как у вас AVR Prog запускается?
    Стоит AVR Studio 4.19 build 730. Программатор от Проттоса(AVR910,на atmega8).
    Без программатора AVR Prog ни разу не запускалась(сколько себя знаю), выдает ошибку:
    «No supported board found!
    AVR Prog Version 1.40 »

    Подскажите с какой студии выдрать нужный AVR Prog? Или чем еще можно лить прошивку?
    А так загрузчик работает,светодиод горит,и в консоле на «S» отвечает.

  49. Я не понял вот этого: (цитата) Выходит прошивка доступна и конкурентам? А вот фигу! Она шифрованая, а бутлоадер содержит ключ для ее дешифровки, дешифрует на лету и заливает во флеш. Красота, правда? (конец цитаты)
    Так что, для прошивки через бутлоадер надо компилировать какой то отдельный шифрованный файл? Или как .hex файл для прошивки через ISP получается не шифрованным, а для прошивки через бутлоадер он создается шифрованным при компиляции проекта? Короче запутался…
    И еще, кто-нибудь пробовал использовать не АВРпрог, а действительно написать свой загрузчик, или еще лучше сделать в управляющей программе (на стороне ПК) функцию передачи прошивки в МК. То есть для этого нужновсего лишь послать буту наш контрольный символ («S») и передать файл прошивки (.hex)? Или это намного сложнее чем мне показалось?

    1. Именно так. После компиляции файл шифруется неким сторонним софтом и его можно давать кому угодно, расшифровать сможет только бутлоадер. Что не дает возможность взять и вот так скопировать устройство. Даже при наличии прошивки.

      Вместо AVRProg я использую AVRDUDE она понимает этот загрузчик. Командная строка может выглядеть, например так:
      avrdude -p m16 -c avr109 -P COM2 -U flash:w:MainDemo16-RTOS.hex

  50. Аааа! Так значит скомпилировав исходник, я полуаю .hex который потом отдельно шифрую тем же AVRProg, потом зашифрованный .hex могу дать пользователю моего девайса, чтобы он перепрошил устройство опять же через этот же AVRProg. Правильно понял?

    1. Да все так, за исключением AVRProg он тебе ничего не зашифрует, т.к. это примитивнейшая оболочка, равно как и бутлоадер стандартный. Для шифрованного бута надо писать свой бутлоадер и свою программу шифратор.

  51. Значит бутлоадер, описанный Вами в статье, принимает незашифрованную прошивку? Теперь все становится понятно… а то я 5 раз статью со всеми комментариями перечитал, но так и не понял в каком месте шифруется прошивка =) Спасибо!

  52. Здравствуйте, решил перекомпилировать проект под мегу 88.
    1. Создал mega88.h
    #ifndef _MEGA88_H_
    #define _MEGA88_H_

    /* Part-Code ISP */
    #define DEVTYPE_ISP 0x76
    /* Part-Code BOOT */
    #define DEVTYPE_BOOT 0x77

    #define SIG_BYTE1 0x1E
    #define SIG_BYTE2 0x93
    #define SIG_BYTE3 0x0A

    #define UART_BAUD_HIGH UBRR0H
    #define UART_BAUD_LOW UBRR0L
    #define UART_STATUS UCSR0A
    #define UART_TXREADY UDRE0
    #define UART_RXREADY RXC0
    #define UART_DOUBLE U2X0
    #define UART_CTRL UCSR0B
    #define UART_CTRL_DATA ((1<<TXEN0) | (1<<RXEN0))
    #define UART_CTRL2 UCSR0C
    #define UART_CTRL2_DATA ((1<<UMSEL0) | (1<<UCSZ01) | (1<<UCSZ00))
    #define UART_DATA UDR0

    #endif // #ifndef _MEGA88_H_
    2. В main.c ничего неменял
    3. Изменил makefail
    Добавил MCU = atmega88
    Изменил bootload_adres

    atmega 8 88
    128 1F00 F80*2=1F00
    256 1E00 F00*2=1E00
    512 1C00 E00*2=1C00
    1024 1800 C00*2=1800
    4. Изменил chpdef.h
    #elif defined(__AVR_ATmega88__)
    #include "mega88.h"
    5. Запустил Bootloader.aps, не понравился bootloader.elf переименовал main.elf
    Скомпилировал без ошибок.
    Потом вспомнил что надо удалить .hex .o .lss в папке проекта, удалил скомпилировал все ок.
    Прошил контроллер из студии AVRDRAGONом. Выставил фьюзы. Все ок.
    Считываю прошивку, открываю а она пустая!!! одни ffff….варификация прошла успешно.
    Думал глючит DRAGON, залил прошивку другого проекта все ок.
    Куда посмотреть собственно? Где мог накосоручить?

  53. Тема сисек бутлодырей не расскрыта. Так все-таки, какой он, самый лучший бутлодырь? Или самый лучший это тот, что напишешь сам? Сейчас стою перед выбором или использовать дишный или лодырь шаоцзянга, предварительно допилив под нужды. Последний мне показался более простым, хотя возможно это оттого, что я пока через строчку код глянул.

  54. Подскажите пожалуйста, в чём может быть проблема: переписал под себя бут выставил мегу64 (использую мегу64L но у них полностью идентичные сигнатуры) скорость по дефолту 19200, кварц 8МГц, режим ожидаия на 10 секунд, на S отвечает AVRBOOT, но в самой проге не определяет МК. в чём может быть причина? куда копать?

        1. А попробуй как прошить через avrdude программатор там зовется avr109

          Вот примерно таким макаром:
          avrdude -p m64 -c avr109 -P COM2 -U flash:w:MainDemo16-RTOS.hex

          Т.к. есть подозрение, что avrprog в принципе не знает мегу64

  55. прошить только завтра на работе смогу.
    а есть вариант как научить его видеть непонятные микрухи? можно ведь подправить адреса бута и регистры и сделать вид, что это совсем не мега64 а вполне себе маленькая мега8 или 16? (правда как быть с сигнатурой и прочей гадостью..)

    1. Да хрен знает. Это примитивная тулза вообще. Но я как то шаманством с сигнатурами (их отдает бут и они в нем прописаны) научил его считать мегу168 как нечто иное и благополучно шить.

    2. Там же главное размер памяти и адреса таблицы векторов. Попробуй нагуглить какие вообще мк он знает и подобрать похожий по размеру памяти и таблице векторов.

  56. А вот вопрос, можно ли под JTAG ICE (который на ATmega16) влипенить uart butloader, а под usbasp засунуть USB программатор?
    Тогда из 2 МК получаем:
    -USB-UART
    -USBASP
    -какой-то программатор из статьи «превращение PB в программатор»
    -JTAG ICE

    Конечно, FT232 надежнее и полезнее, но вот ее корпус…

  57. Приветствую всех участников этого замечательного ресурса!
    Я только начинаю постигать прекрасный мир МК ;), поэтому, убедительная просьба — не пинайте сильно за частые, назойливые и, для кого-то, очевидные вопросы. :)
    Сразу хотелось бы выразить глубокую признательность и поприветствовать земляка (я из Миасса) Ув. DI HALT’а за столь кропотливый труд!
    Небольшая предыстория. Так сложилось, что своё изучение МК я начал с Arduino. Здесь, думаю, сыграла свою роль раскрученность бренда, ну и лёгкий старт для новичка, конечно… Но прошло 3…4 месяца и я понял, насколько поверхностные знания даёт ардуиновская среда разработки с её процессингом. Захотелось большего… Вот в поисках этого самого бОльшего я и наткнулся на этот замечательный ресурс и этот замечательный курс от DI HALT’а.
    Ну вот, о своих познаниях на уровне процессинга ;) я рассказал, теперь, собственно те самые глупые вопросы. :)
    В первую очередь интересует следующее. Можно ли в Atmel Studio написать программку на Ассемблере и залить её в Ардуину через её встроенный загрузчик? Если это возможно, то как это сделать? Есть у меня смутные подозрения, что это можно сделать через avrdude… Но, наверное, главный вопрос: при заливке avrdude, не испорчу ли я ардуиновский загрузчик и всякие там страшные FUSE-биты? Никаким программатором я пока ещё не обзавёлся… :( Заранее благодарю всех ответивших.

    1. Конечно можно.

      Делается это через avrdude и в качестве программатора выбирается ардуино :) Собственно сама среда дурки через avrdude это и делает, ну по крайней мере раньше делала. Поизучайте ключи аврдудки применимо к ардуиновскому загрузчику.

      Можно вообще сделать военную хитрость. Сделать в ардуине любой скетч, чтобы получился хекс файл, а потом вместо него подсунуть свой хекс и прошить ардуиновской средой все это. Хотя это удаление гланд через задницу, но как вариант.

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

  58. Спасибо, за оперативный ответ! :)
    Да, посмотрел прямо в ардуиновской среде разработки (если там в настройках поставить «Показывать подробный вывод при: |v| «Компиляции» |v| «Загрузке» «). Для моей Arduino Nano на МК ATmega328P под FreeBSD это выглядит так:
    /usr/local/arduino/hardware/tools/avr/bin/avrdude -C/usr/local/arduino/hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P/dev/cuau0 -b57600 -D -Uflash:w:/tmp/build2760878143420699781.tmp/Blink.cpp.hex:i
    Под Windows все ключи, думаю, будут те же, изменятся только пути:
    1) к самой avrdude;
    2) к файлу конфигурации (ключ «-С»);
    3) к файлу прошивки (…что-то там…*.hex).
    Ну и, конечно, имя порта, к которому подключена Ардуина (ключ «-Р») — так же будет другое.
    Это хорошо, что есть защита от дураков (в плане повреждения загрузчика и FUSE). Просто жалко даже не саму Ардуину, сколько время, потраченное на приобретение нового контроллера. У нас в городе резисторы-то проблематично бывает купить (приходится заказывать на ебэе или алиекспрессе :D ), не говоря уже о чём-то более продвинутом…
    Вобщем, успокоил. :) Буду пробовать…

  59. Решил попробывать переделать бутлоадер для atmega328p. Но сначала скачал текущий проект и решил для верности откомпелировать текущий для atmega16, в AVRStudio 4.19 + toolcain + winavr. Но при этом выдает ошибки atmega328p и bootloader. Помогите разобраться

  60. Друзья, столкнулся с ошибкой: при попытке сделать build процесс не запускается. В окне только появляется надпись
    Build started 27.10.2014 at 11:44:00
    и более ничего.
    Путь к avr-gcc.exe и make.exe прописан вручную.

  61. Как мне прописать в makefile, чтобы показало размер прошивки? Нет никакого желания считать байты. «Ах, простите, диск забыла отмонтировать» — это чудесно и прекрасно, но мне время дорого. Хочу видеть сразу, сколько занимает прошивка.

  62. В студии 4.19 не получается компилировать. Предидущую версию студии установить тоже ни как, так как после сноса этой остается что-то . В общем, дайте ктонибудь хекс для меги32. Есть кварцы на 16, 12, 10, 73728, на крайний случай внутренний рц на 8 мегагерц.

Добавить комментарий