Почти все микроконтроллеры серии 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 (т.к. я юзаю именно этот компилер)
В результате был нарыт проект который идеально вписался в мои требования. Я лишь чуть чуть подправил его код под свои нужды.
И сейчас я покажу тебе как юзать эту замечательную программулину.
Итак, тебе нужна 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 файл — обычную прошивку. Для проверки открой его блокнотом и позырь на начало и конец, предварительно рекомендую покурить :
: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ре секунды — прога пошла!
Ссылки по теме:
З.Ы.
Народ, кто юзает/пишет загрузчики накидайте мне в комменты линков на то чем пользуетесь вы. А то я особо тему не рыл, нашел что удовлетворяло моим условиям и успокоился. Хотелось бы в статью еще добавить подборку линков на разные бутлоадеры под разные языки и компиляторы.
З.З.Ы
Подумалось тут…
Бутлоадер настроен на определенную частоту. Но для отладочной платы это не очень удобно, там порой может потребоваться смена частоты. Частоту можно изменить переткнув кварц, но тогда бутлоадер работать перестанет — собьется частота UART и потребуется опять программатор (которого может и не быть под рукой), чтобы перешить бутлоадер под новую частоту. Единственно что можно менять кварцы с частотами степени 2, тогда просто у USART будет скакать скорость, скажем, кварц на 8мгц — скорость 9600 бод, поставили кварц на 16мгц — скорость на том же буте стала уже 19200.
Проблема может решаться таким образом — числа определяющие скорость уарта мы кладем в последниие адреса EEPROM (если там 0, то можно задать какой нибудь дефолт, например 9600 для частоты 8Мгц, чтобы можно было хоть как то оживить МК), а затем, если мы хотим поменять кварц и перешить прогу на новую частоту, то сначала, на прежнем буте не перезагружаясь, пока он еще доступен, зашиваем вначале новую прошивку, потом новый Епром с числами под новый кварц, перезагружаемся — меняем кварц и опа — у нас опять МК онлайн. Надо добавить в этот лоадер такую фичу. =)







Иногда в более серьезной технике bootloader используют не только для загрузки софта, но и для каких-нибудь осмысленных действий (которые надо выполнить только один раз при старте). Например, в спутниковых ресиверах boot «выгружает» список каналов и настроек из флешки в ОЗУ, снабжая его всевозможными указателями — то есть выполняет всю работу по инициализации. Если место позволяет, а устройства разрабатываются на «одной и той же базе» (например, на отладочной плате), то boot прекрасно может, например, инициализировать LCD-индикатор или сделать что-то подобное.
тут имеется ввиду немного другой принцип, то что вы описали называется старт-ап
или инициализация
Дело в том, что эта инициализация расположена как раз в boot-секторе.
ну так это уже другой вопрос, что её(инициализацию) туда засунули.
из флешки в озу всё равно надо выгружать при каждом старте устройства.
разница ведь как-раз в том, что бутлоадер не сработает при старте устройства если не выполнены какие-то определенные условия:
>> Условие может быть любым, но обычно это либо наличие спец байта по
>> интерфейсу, либо наличие нужного логического уровня на выбранной ножке
>> контроллера, сигнализирующее о том, что мы хотим обратиться к буту
>> прошивку)
т.е.:
без запуска инициализации (которая должна быть безусловной, вам ведь полюбому надо загрузить список каналов из флеша и проинициализировать LCD) устройство в принципе неработоспособно
а без запуска бутлоадера (если не будет условий его запуска) устройство будет работать нормально.
или я что-то не понимаю…
Все происходит вот так:
…процессор будет стартовать не с нулевого адреса, а с адреса начала Boot сектора. Этот сектор расположен в самом конце памяти программ…
В Boot-секторе мы можем размещать что угодно. Обычно делают так — происходит проверка условия (его мы проверяем чисто программно), если условие не выполнено — то переход в «точку старта», если выполнено — то переход к «прошивальщику», размещенному в том же Boot-секторе.
Если совокупный размер проверки и прошивальщика меньше, чем выделенный под Boot-сектор, то там можно разместить и другой, более полезный код. В этом случае после «неудачной» проверки условия входа мы переходим по адресу, расположенному в _том же_ boot-секторе, а после выполнения этого кода (той самой инициализации) — уже по адресу начала программы.
Все это относится к устройствам, у которых задается некоторый объем загрузочного сектора, и есть аппаратная поддержка bootloader — то есть старт с адреса начала boot-сектора.
У PIC, например, такого нет, а возможность записи в память программ присутствует. Поэтому PIC-овский bootloader может быть гораздо более извращенным. Расположить его удобно в самом конце памяти, а запускать можно даже из «основного цикла» программы.
Никто не мешает извратиться подобным образом и на AVR, но всем хватает и описанных возможностей.
PS Никто не мешает использовать бутсектор и для других целей, совсем не связанных с прошивкой.
а ну тогда извиняюсь за тугодумство, я как-то не подумал, что это все для изврата ;-)
Хоть и не в тему, не ИМХО кого-то зацепит :-P
Написал протокол общения по беспроводному радиоканалу, в котором есть:
изменяемая длина пакета
программная фильтрация помех
отсечка поврежденных пакетов
отправка подтверждения о приемке
повторная отправка пакета в случае отсутствия подтверждения
Манчестерское кодирование
проверка CRC
неплохая гибкость под дальнейшие фичи/баги )
Потестил на парочке модулей DR1200-DK — половину общаги пробивает.
Теперь хочу железяки помощнее ) Есть аппаратура Hitec с модулем HPF-MI RF на ~1Вт, но там диапазон не интересный (40 МГц). Надо модуль в диапазоне 2.4 ГГц
Как исходники немного подчищу — покажу )
это модуль с юарт входом или просто генератор на паве и регенератор с компаратором в приемнике?
И тот и другой — просто генераторы
срочно выкладывай исходники
я весь инет перерыл и нашел только для ардуино, но там минимум мега4 нужна и среду ардуино не люблю
Мега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 и шлет подтверждение
Локальная, приняв подтверждение, рапортует об этом компу
Страшного кода там исчо много, но работает устойчиво.
Кста, киньте линк на те исходники для ардуино
http://www.open.com.au/mikem/arduino/
но мега64 это уже совсем круто
я думал, там просто любым пином дергает по таймеру
но в целом под мегу8 пойдет и с одним юартом
по поводу загрузчиков
готовый уже идет в комплекте с ардуино и совместим с 910
4к загрузчик с шифрованием http://vusb.wikidot.com/project:crypto-boot
правда проект 2006 года, зато есть свой софт для заливки и в коммерческих проектах как раз подойдет, чтобы заказчик вдруг не решил, что он самый крутой
http://www.fischl.de/avrusbboot/ усб 1к
хороший вариант, если девайс делался как подарок (например лампа с ргб светодиодом)
пользователь сам может прошить новый софт
http://www.obdev.at/products/vusb/bootloadhid.html софт для апдейта с использованием хид драйвера винды
А ардуино разве 910 совместим?
ну стк500 вроде и есть 910? вобщем там по умолчанию он прошивается чем-то типа стк500
В 910 протокол прошивки формирует контроллер в программаторе (когда-то 1200, потом 2313). С компа идут только данные и общее управление, через COM порт. А в в STK (по крайней мере 200,300; в 500 сразу не вспомню, а искать в архивах лень) — только буфер, и все сигналы и временные диаграммы формирует комп через LPT.
Насколько я понял, STK500 общается с компом через нормальный COM (а не bitbang как STK200/300), но протокол прошивки формируется на компе, поэтому не нужно обновлять прошивку для поддержки новых МК. И не возникает проблем с переходниками с USB.
а бутлоадер с софтовым уартом знает кто-нибудь?
желательно с CRC-проверкой принимаемых данных.
по поводу ЗЗЫ: а что мешает сделать автоопределение скорости UART в бутлоадере?
А сколько это сожрет кода?
Внизу в комменте я многословно выдумал, как в бутлоадере определить скорость усарта:
При старте не инициировать усарт. Зато на входящей для него ноге поставить прерывание — на изменение пина. Два таких изменения — это подъем одной-единственной иголки какбэ усарта (хотя он не включен еще) и следующий за ней спад. То есть длительность иголки. Ее соотнести с заданными константами реалистичных значений и на наиболее подошедшей скорости — инициировать Усарт.
Я что-то не понял чем бутлоудер отличается от Self-Programming the Flash. В спецификации к тайни так и написано про Self-Programming: mechanism for downloading and uploading program code by the MCU itself.
Self Programming это всего лишь фича контроллера. А Bootloader это программа которая эту фичу реализовывает.
Да, так я вот и про то, что можно сделать бутлоудер в тайни?
Хммм… надо покурить маны. ПОлноценный бут с защитой прошивки думаю не сделать, но вот просто засосать код и распихать его по адресам… Думаю может получиться.
А если взять и прошить контроллер новой прошивкой, без бутлоудера, то прошивка потрет его?
Да
жаль..(
А почему? если у тебя есть программатор, то зачем тебе лоадер?
ну да, тож верно
Я правильно понял, что для того, чтоб клиент обновил прошивку, он должен иметь комп со студией?
Не совсем. Достаточно иметь готовый файл с обновлением прошивки и AVR Prog — эта маленькая тулза в составе авр студии, но можно юзать и отдельно.
Если я правильно понял концепцию бутлоадера, то можно обойтись вообще без стороннего софта, а написать свой, работающий по собственному протоколу.
Да конечно.
Про файл прошивки- понятно. А как залить новую прошивку через стандартные средства? Иногда нет возможности ставить на чужой компьютер какой-либо софт без сисадмина (например, в корпоративной сети).
Через стандартные средства windows — IMHO никак( Только если через какой-нибудь hyperterminal (если устройство через COM-порт подключается).
Можно написать бутлоадер такой, чтобы он принимал вначале пару байт служебной инфы, а потом байт поток размещал в памяти.
Тогда можно будет прошивку сконвертить в bin, а потом через Hyper terminal какой нибудь (или в консоли вывод перенаправив) отрыгнуть вначале служебные команды, которые вручную набрал, а потом заслав файл.
Либо написать такой бутлоадер, который напрямую Intel HEX понимает. Получится контроллер — сам себе программатор)
Это лишнее. Интел хекс содержит много излишней инфы (не говоря уже о том, что там все в аскии) и такой бутлоадер будет весить слишком жирно.
А нет смысла сделать? Ведь если все на глубине да на высоте- наверняка сеть защищенная и просто так в нее не залезешь. По уму, даже от существующего управляющего компа чтобы отключить кабель РС232, комп надо сначала выключить, потом подключить свой, потом залить, потом выключть свой, переткнуть провод и загрузить первый комп. А это довольно продолжительно по времени и может быть критично. Пропадает прелесть бутлодера- если если с каждым устройством нужно проделывать все эти операции- проще их достать и перешить обычным способом.
В смысле просто так не залезешь? Если это твое устройство и перешивка это его штатная функция. Если устройство достать нельзя, то другого выхода кроме как бут нет. Или раскопать траншею и воткнуть программатор проще чем переткнуть кабель RS232?
Да нет же. Раскопать не проще. Проще (я так думаю) перешивать МК с управляющего (обрабатывающего) ПК посредством какой- нибудь штатной для винды утилиты. Чтоб не ставить новое ПО и не перетыкать кабели. Возможно ли это?
Так об этом и речь. Перешить прогу у МК с бутлоадером можно хоть через Гипертерминал.
Главное в UART в нужном порядке заслать байты :)
Та же AVRProg это крошечная утилитка весом в 300кб, идет в составе студии и лежит там в каталоге bin по моему.
Про AVRProg все известно: и где, и сколько весит. Гипертерминал разве может отправлять НЕХ-коды?
Он может отправлять файлы. Что тебе мешает послать бинарик? Разумеется бут придется писать свой, но работать так возможно
Видел девайс (кажется, на PIC), который умел общаться с компьютером через HyperTerminal, а самое интересное — «самопрошивался», принимая файл по Xmodem. Протокол этот довольно простой, передаются пакеты по 128 байт + контрольная сумма, так что при желании реализовать его на МК сравнительно несложно (а если «забить» на проверку контрольной суммы — то очень несложно).
Если это управляющий комп, то на него все равно ставится твоя программа управления. Что мешает вместе с ней поставить апдейтер или встроить его функции в управляющую программу?
DI HALT, классная статья. В свое время юзал AT89C51RD2 (8051) там bootloader дефолтом имеется. Очень удобно.
Напиши плиз статью по сопряжению AVR с внешними АЦП и ЦАП. Думаю будет интересно. Ну типа программный SPI с выдачей результатов в RS232 например.)))
да и у dallas-semi есть линейка контроллеров аля 8051. Так там на заводе еще вшит бутлоадер-программатор. Соответственно программирование их заключается в подключении двух проводов на УАРТ-ком-порт, и установке необх.лог.уровней на нескольких ногах. Программа-программатора представляет из себя терминальную программу которая отсылает бутлоадеру файл прошивки.
Поначалу тоже использовал “AVRPROG compatible boot-loader”, но однажды килобайт памяти на загрузчик оказался слишком дорогой ценой, тогда нашел вот этот загрузчик на 256 байт: http://www.hhhh.org/wiml/proj/avr/ssbl.html. Загрузчик изменил, выкинув лишний код, исправил обнаруженные баги и написал софтину для его заливки (авторами предлагался питоновский скрипт, причем, похоже, только под линукс).
В результате получилось это: http://trol.0fees.net/soft/tboot/
Вопрос к Гуру. Как компилить проект что бы процедуры скомпилированные и прошитые в загрузчике (например SoftHid) можно было использовать в программе которая будет залита этим загрузчиком?
Желательно для компилятора IAR.
Думаю достаточно будет знать точные адреса этих процедур и далее по ним переходить
А можно сделать так?
Чтобы бутлоадер сам настраивался на частоту com-порта.
При включении бутлоадера UART не включать (неожиданно?!). Зато мерять на соответствующей ноге (вход уарта) плюс там или нуль. Заранее известно, что на эту ногу придет волна, соответствующая букве S. Форма волны абсолютно одинаковая для любых скоростей соединения, но разная по ширине. Надо словить эту волну и записать ее:
Поэтому вместо Уарта в загрузчике инициируется Таймер, с частотой скажем в 10 раз быстрый чем максимальная скорость уарта. А входящая уартовская нога инициируется как обычная входная нога. По таймеру меряется состояние пина ноги. И сохраняется примерно до 20 точек (по две на каждую иглу плюс бит четности или как их там):
1. Первая точка — Напряжение ноги с нуля скакнуло верх. Записалась точка 0 миллисекунд. Дальше по таймеру отслеживание, что это напряжение держится.
2. Бах! Напряжение упало! Записана вторая точка — столько-то миллисекунд.
3) Скакнуло вверх! Третья точка.
..
4)
Этап 2. Итак записаны все точки — в них миллисекунды подъемов и спадов напряжения на ноге. Тут бутлоадер наконец инициирует УАРТ на скорости А и по таймеру воспроизводит в соответствующий бит записанную ранее волну. Уарт считывает это и распознает не «S», а что-то другое. Тогда Загрузчик переинициирует Уарт на другую скорость и снова воспроизводит волну. Пока не будет распознана «S».
Тут уже он пишет «Хелло» и готовицо программировать чип.
Точнее так: на этапе 2 нужно сделать вот что: без танцев с бубном просто взять ширину первой иголки в миллисекундах и соотнести ее с табличными значениями. Если иголка шире Х и уже Y — то скорость УСАРта будет такая-то. Релистично?
посмотрите в апноутах к ds89c450 есть алгоритм автоопределения скорости
Посмотрю, спасибо.
Но я на самом деле очень во многом ошибся:
В частности, оперировал миллисекундами, а это вообще не правильно, так как в поставленной задаче бутлоадер должен установить правильную скорость УАРТА не зная на какой частоте стартовал чип. Миллисекунды поэтому в принципе не вычисляемы.
Вот что будет иметь бутлоадер: ширину иголки в тиках. Ясно, что она прямо пропорциональна частоте связи в килогерцах, которую бутлоадеру предлагает установить компьютер. Значит эта скорость установится простой формулой — без всякой таблицы, которую я выдумывал выше. При этом бутлоадер не будет знать ни частоту кварца, ни скорость соединения — но установит правильное соединение.
Но какая это формула я сказать не могу, т.к. у меня не хватает знаний.
>посмотрите в апноутах к 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 в даташите прочитал. Как я понял, у него автоопределение скорости встроенное.
да, «встроенное», но это программно встроено и где-то там я видел алгоритм или даже код этой программы автоопределения, хотя искать всё-таки лучше в http://www.google.com.ua/search?&q=autobaud
может это поможет
Automatic Baud Rate Detection
http://www.pjrc.com/tech/8051/autobaud.html
это для 51-го, но я думаю алгоритм тот-же
или так http://www.google.com.ua/search?&q=autobaud
У меня возникли проблемы при компиляции проекта. http://files.unn.ru/09378444773
Нзнаю что делать. может кто подскажет!!! Срочно надо откомпилировать, но ничего. Все делал как написано выше. Сначала поставил студию, потом винавр. Что нужно сделать, чтоб исправить ошибку?
Доступ запрещен!
Сожалеем, но этот сервис работает только для сетей, включеных в точку обмена нижегородским трафиком. Если вы в Нижнем Новгороде, то обратитесь к своему Интернет-провайдеру с вопросом об участии в этой системе обмена.
По вопросам обмена трафиком с ННГУ — noc@unn.ru
http://rapidshare.com/files/285134026/Bootloader.png.html
при компилировании ( ALT + F7 )возникает такая проблема
http://rapidshare.com/files/285135191/_______________________01.png.html
У меня такую ошибку выдавал когда я мейк выключил, нажал скомпилить и включил его обратно.
Во первых после правки сохрани makefile студия его перед компиляцией не сохраняет и все что ты там изменил не изменилось.
Во вторых потри все обьектые, lss и прочие main.* файлы кроме main.c конечно. Пусть заново их создаст. Мне это помогло тогда.
Мне кажется студия глючила. Потому, что 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
Светодиод да, отключается тут.
А вот чтобы изменить способ входа в бут надо подправить тип загрузчика, выставив одну из этих опций:
//#define START_SIMPLE
#define START_WAIT
//#define START_POWERSAVE
//#define START_BOOTICE
Использую бутлодырь совместно с гипертерминалом, тот который идет в комплекте с окошками. Для этого бутлодырь адаптирован к приему «уартом» чистого «хекса». Что это значит ? То, что мы берем и открываем «ноутпадом» сгенеренный компиллером/ассемблером код, в привычном для всех программаторов формате — «хекс» файл, и делаем «коупи-пайст» в окно гипертерминала. Гипертерминал последовательно, строчку за строчкой отправляет содержимое в компорт, естественно с некоторой задержкой, порядка 15..20мс, которую в свою очередь устанавливаем в «аски» настройках гипертерминала. Выгода такого подхода налицо:
— простота реализации и использования;
— нет необходимости в специальнов софте;
— контроль целостности передачи кода в контроллер;
В дополнении на весь код накладываю контрольную сумму, которую записываю отдельной утилитой, в конец файла. Инициализация контрольной суммы уникальна и левая прошивка работать в неком устройтве не будет, плюс в бутлодыре храню пару-тройку важных функций, которые использует обновляемая программка. Удачи !
Привет TORNIS, это как раз то что нужно реализовать мне в одном проекте. Не скинешь мне на мыло этот бутлоадер?
Будет ли работать даный Bootloader на Мк ATmega8535? Если да то как подправить исходник,ведь доступны только:
## MCU = atmega8
MCU = atmega16
## MCU = atmega162
## MCU = atmega169
## MCU = atmega32
## MCU = atmega324p
## MCU = atmega64
## MCU = atmega644
## MCU = atmega644p
## MCU = atmega128
## MCU = at90can128 ?
Будет, но надо будет добавить файлы mega8535.h (он будет очень похож на mega8.h разница только в сигнатурах).
Также по аналогии добавить в makefile секцию с мега8535 по аналогии с мега8 помешает проверить начальные адреса
И то же сделать с файлом chipdef.h где указать все по аналогии.
Или попробовать скомпилировать для мега8 и залить в 8535, адреса у них вроде бы внутренние все совпадают (надо уточнить!) .
В языке С совсем не силен: как можно это сделать? Что должно быть внутри mega8535.h?
Насчёт «В графу “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
Си так Си. А всё- таки, есть у кого AVRprog- совместимый бут на асме? Не принципиально какой контроллер, интересно.
Да где то был, поищи AVR910 bootloader
нашел вот такую игрушку http://symlink.dk/electro/m163boot/avrboot.asm
Там под мегу163, буду копаться.
Перебрал код, порядок, на восьмой меге работает. Глюк1- не работает верификация, если сбросить и ввести контроллер в бут- читается без ошибок,
Глюк2- выдает предупреждение «flushing» перед операцией записи- чтения (всё равно, куда), после этого первый раз окно advanced открывается с крякозяблами вместо target board и hardware version, закрываем, тычем второй раз- хоккей, всё на своем месте.
С мегой163 разнятся регистры уарта, бит4 регистра SPMCR (у меги8 RWWSRE, у меги163- ASRE).
Перебрал код, порядок, на восьмой меге работает. Глюк1- не работает верификация, если сбросить и ввести контроллер в бут- читается без ошибок,
Глюк2- выдает предупреждение «flushing» перед операцией записи- чтения (всё равно, куда), после этого первый раз окно advanced открывается с крякозяблами вместо target board и hardware version, закрываем, тычем второй раз- хоккей, всё на своем месте.
С мегой163 разнятся регистры уарта, бит4 регистра SPMCR (у меги8 RWWSRE, у меги163- ASRE).
Обьем- 404 кб получился.
Подскажите, пожалуйста. А на скорости 31250 я смогу работать с бутлоадером? А то я сделал все как в статье, скомпилировалось, зашил программу загрузчика в мегу 16, нормально (кстати, довольно быстро, у меня всегда она так прошивалась). И все! И порт в гипертерминале не открывается, чтоб проверить, и соответственно, не запускается AVR Prog. :(
Не проверял. Где то слышал звон, что вроде как 19200 предел для AVRProg.
а я даже через гипертерминал послать S не могу, не подключается, че то((
а через виртуальный com порт загружать можно, если у меня переходник uart->usb?
Можно
ну с виртуальными портами вроде как должно работать, нашел в тексте об этом. А вот как Avr Prog стучится символом S, я не понял, это как то прописывать надо? У меня AvrProg не запускается вообще, когда подрубаюсь с загрузчиком в кристалле.
Нигде это прописывать не надо. Если аврпрог не стартует когда загрузчик есть и готов к работае, то значит загрузчик не работает.
S это команда AVR910 на которую загрузчик должен дать ответ. Если в терминале у тебя на S в сторону загрузчика нет ответа, значит загрузчик утебя не работает. Поэтому и аврпрог не стартует.
А в чем может быть проблема? Прошивку почти не менял, поменял только частоту, поставил 1000000 (у меня тактируется от встроенного на 1 МГц). Зашилось вроде нормально, единственно , что не медленно как написанно, а довольно быстро, секунд за 8 (у меня всегда так). Подключаю через виртуальный COM (делал переходник на FT232RL), одно НО еще, у меня токовая петля, т.е. с гальванической развязкой интерфейс от контроллера до компутера, использую для подключения миди устройств. Может как-то повлиять? протокол обмена тот же rsr232 асинхронный последовательный …
под новую частоту перекомпилил? В терминалке проверял?
Ну конечно, как исправил, срузу перекомпилил. А как мне в терминалке проверить? У меня нет связи же с ним, почему то
Там есть еще параметр U2X удвонеие скорости порта. Возможно 1мгц мало. Надо его активизировать.
а можно мне на почту jer@sura.ru Вашу аську, если есть, скинуть. Так было бы намного удобнее общаться. Заранее спасибо.
Я не общаюсь по аське на электронные темы :) Она только для потенциальных заказчиков и личных разговоров :)
а если удвоение скорости ставить, то 19200 оставлять? Получится уже 38400 ведь?
Нет там битрейт по формуле вычисляться должен, но проверь на всякий.
и какие настройки должны быть в гипертерминале, по умолчанию или выставлять чего?
На что бут скомпилил такие же и в терминале
а в проекте есть еще файл еепрома, его зашивать тоже?
Нет
смотрю лампочкой на пине D5, раз в 4 секунды она еле-еле на долю секунды вспыхивает и все это покругу. так может быть?
не должно
про гипертерминал я имел ввиду не скорость , а все остальное, то что на 19200 его ставить это понятно. А вот все остальное не трогать вообще? типа задержки символов, аппаратная ли поддержка, и т.п. Вобщем по дефаулту запускать гипертерминал, а потом править только скорость и все?
Уважаемый DI HALT, помогите! Программирую для ATMega128 а точнее бут для нее. Не могу понять какой адрес (смещение) ставить для программы. Судя по даташиту, например для размера бут области в 2048 надо адрес ставить 1F000 (F800*2)? Пробую так, но при открытии hex файла там совсем другие адреса. Это я к стати переделываю проект http://www.obdev.at/products/vusb/index.html под ATMega128. Когда программа не в загрузочной области, то все работает, а когда пишу в бут то нет :( может подскажите в какую сторону копать?
Так адрес то там задется в словах, а в хексе он в байтах. Вот и вся разница. Умножаешь на два адрес в словах и будет тот который в хексе.
Также проверь фуз рестарта с бутблока. Может ты где в мейке неправильно укзаал адрес загрузчика?
вот так у меня написано в 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 */
это правильно? что то мне подсказывает что что-то простое не замечаю и отсюда вся лажа… :(
Я канешно извиняюсь, но если чесно, то я уже заипался с этим бутлоадером. Я скачал исходные коды и файлы проекта для Bootloader’a, вибрал в мейкфайле мегу16, задал размер бута 1024, указал правильный адрес к папке ВинАВР; в main.c задал частоту 11059200Гц, вход в режим программирования с помощью перемычки. Прошил МК через ISP, AVRProg нашла МК(в строке Device написано Atmega16 BOOT) но при прошивке после верификации вискочила ошибка а программа для МК не работала:(
При компиляции вылазило какой то предупреждение где упоминалось о каком та векторе прерывания.
Народ, плиз, кинте ГОТОВЫЙ проект ВинАВР+АВРСтудио для мега16, тока желательно чтобы оно работало на последних версиях этих програм.
br.misha@gmail.com
Заранее спасиба!
Замылил тебе три проекта под Мегу16, 32 и 168
DI HALT, почемму то в вашем письме файлов небыло:(. попробуйте плиз сюда Br.Misha@mail.ru
Потому что гмайл говно. Переотправил.
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 слова?
У меня версия последняя. Просто я при установке инсталятором вытер из названия циферки версии. Поэтмоу у меня мэйк и такой.
Когда ты вручную задаешь опции, не через мейк, ты наверняка не указываешь адрес с которого надо зашить прошивку. В результате у тебя оно на запрос отвечает, но стоит черти где в памяти и поэтому прошить не может.
Вобщем бутлоадер получился хотя мне не нравиться то, что он почему то ругаеться на *.elf файлы, ну ладно, главное что работает.
Теперь интересует ещё один вопрос:
Есть например у меня несколько девайсов в которих зашит бутлоадер и установлены фузы для запрещения считывания FLESH и пользователь может запросто прошить девайс через СОМ порт испоользуя AVRProg. Но вот только мне нада сделать так, чтобы у каждого девайса был свой ID размером не более 10 байт. Тоесть мне нада при заливке бутлоадера (через ISP) записывался и этот ID, вроде бы ничего сложного — можна просто сделать в исходнике бутлоадера массив с 10 элементов, но проблема в том, что мне нада считать эти 10 байт основной программой(тоесть той, которую я загрузил через бутлоадер), как это сделать я незнаю, можна конешно записывать в EEPROM но этот вариант мне не оч подходит.
Может что нить подскажете?
А в чем проблема? Если у тебя бут сушится по одному и тому же адресу, то тебе главное увидеть этот массив. Запиши его после всех данных и все. А потом по абсолютному адресу к нему достучишься.
я почти 2 дня искал в инете как достучаться к отдельному адресу и не нашел:(. DI HALT, подскажи плиз как это сделать :)
епс… вобщем решил все такизаписывать в EEPROM
На асме через LPM, на сях через указатель на progmem.
Посоветуйте плиз бутлоадер для мега16/32 с шифрованием, интерфейс RS232. Софт для ПК тоже нада.
ЗЫ: эт нада для комерческого проекта.
http://www.atmel.com/dyn/resources/prod_documents/doc2589.pdf
http://www.atmel.com/dyn/resources/prod_documents/AVR231.zip
http://www.atmel.com/dyn/resources/prod_documents/doc2541.pdf
http://www.atmel.com/dyn/resources/prod_documents/AVR230.zip
Может у кого есть готовая прошивка бутлоадера для 8меги без кварца (по ходу 1Mz если я не ошибаюсь)…
по ходу удалось запустить бутлоадер изменив формулу расчёта скорости и инициализацию порта
возникла проблема может кто сталкивался
При попытке запуска AvrProg, он мне сообщает:
No supported board f
Это может быть что угодно. Номер порта какой?
Comm3, а вобще как указать порт для AvrProg? может я чегото делаю не так…
COM3 нормально. Должен найти, а в терминалке бут тебе отвечает нормально?
да
может у меня avrprog левий можешь мне скинуть 7380003@gmail.com
Да откуда бы он левый был. Тот что в студии идет.
да кстати в терминале мк регулярно шлёт 2290(символ е) ето нормально?
Мой ничего не шлет.
В общем сам задал сам отвечаю:) Проблема была в скорости ком порта… Я по привычке выставил в бутлоадере 9600 а оказиваеться AVRProg работает на 19200 по умолчанию… вот такие грабли…
У меня почемуто этот bootloader работает только с тактировкой от внешнего кварца на 7,3728 МГц. Есля я в main.c в строке F_CPU указываю F_CPU 8000000 и FUSE битами устанавливаю тактировку от внутреннего тактового генератора на 8 МГц то AVRProg не запускается, а в терминалку вместо «AVRBOOT» приходит мусор какой-то.Контроллер ATmega16-16PU. Подскажите, что делать?
Перед перекомпиляцией после правки на 8мгц
1. Сохрани ВСЕ файлы, в том числе и майн.
2. Удали все темп файлы и обьектники (F12 в студии) или вручную.
Я перекомпилировал бут, но на частоте 8 МГц нормально он работает только с переходником RS232-UART на транзисторах. Если я подключаю его через переходник USB-UART,
собранном на микроконтроллере ATmega48 по этой схеме: http://www.recursion.jp/avrcdc/cdc-232.html ,то бут работает толко на частоте 7,3728 МГц, а на 8 МГц происходит таже ошибка. Получается у меня кривой переходник?
Выражаю благодарность автору за статью.
Бут успешно запустился на меге8515.
Заметил один недостаток при обработке неподдерживаемых команд:
если команда была передана с аргументом, то аргумент воспринимается как следующая команда. В результате чего если бут скомпилирован без опций чтения записи фузов, то при нажатии кнопки Write в окне Additional аврпрога, бут не выходит из режима программирования, так как команду ‘l’ воспринимает как неподдерживаему, а следом вместо команды ‘L’ получает аргумент команды ‘l’.
Лечится путем изменения обработчика
else if(val != 0x1b)
{
_delay_ms(10); // немного ждем
// если был аргумент читаем
if (UART_STATUS & (1<<UART_RXREADY)) recvchar();
sendchar(‘?’);
}
Помогите, пожалуйста, с адаптацией кода для atmega8515. Я так понял там в makefile нужно прописать данные для этого кристалла?
Помогите с кодом для atmega8535. Какой makefile нужен?
Или дайте, пожалуйста, makefile для atmega8515.
По идее должно подойти в точности как для мега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 = 0×1800
endif
endif
Только адреса бутлоадера уточни в даташите. По идее они должны быть такие как в мега8, но мало ли…
Ну а все остальное контроллеронезависимое вроде бы.
А ну еще файл mega8535.h сделать по аналогии с мега8
DI HALT, правильно ли я понимаю, что в область памяти бутлоадера можно записать некий код, который будет делать то же самое, то есть — обновлять прошивку, но при этом он будет сидеть там тихой сапой и ждать, когда к нему сама программа обратится, вместо отработки reset`a? То есть идея такая — чтобы внешняя прога через UART сказала контроллеру, что хочет залить обновление, контроллер сказал бы ОК и передал управление в бутлоадер, который бы уже дальше общался с внешней прогой, залил бы прошивку и передал бы управление туда.
Ммм не совсем так. Короче, в памяти есть секция и можно выбирать (фузом) стартовать с нуля или с адреса этой секции. Таким образом, ты можешь записать туда стартап код который может сделать сампрошивку. Также ты можешь джампнуться на этот стартап код вручную, из программы (адрес то известен!).
Либо сделать проще — когда надо включить бут, то врубаем ватчдог и зацикливаемся наглухо. Чтобы вачдог нам сделал ресет контроллера. А ресет будет уже на бут.
Или ты хочешь сделать перешивальщик вместо бута? С обычным стартом с 0000 адреса? В принципе, тебе никто не запрещает сделать свой прошивающий код в бутлоадерской области и прыгнув туда вручную перешиться. А при ресете будет просто обычная загрузка.
Хочу сделать так, чтобы моя прога, которая рулит контроллером, могла бы сама заливать туда свежую прошивку, то есть без использования AVRProg, вот идея с натравливанием собачки очень даже хороша! Наверное, так и сделаю :) Сенкс!
у меня? как и написано? не находит .elf из-за этого не компилится. че делать то?:)
создал пустой файл boot.ini в папке с проектом вроде откомпилилось:)
я думал что в конце памяти обычно стек находится, а теперь выясняется что bootloader
Не путай оперативку и флеш память. В конце оперативки сидит стек, в конце флеша — бутсектор.
подойдет и такая схема для подключения МК к компу?
http://resendlers.clan.su/publ/15-1-0-3
Ссылка не открывается
Цитата:»У меня USB, главное чтобы виртуальный USB был в числе первых четырех COM портов. У меня он зарегился в системе как COM4″
а если у меня виртуальный USB зарегился под COM8, работать не будет?
Подключаюсь через Terminal 1.9b там можно выбрать COM8
Терминал то увидит, а вот аврпрог нет. Зайди в настройки системы-оборудование и выстави ком порт в первую четверку.
собрал плату с ft232r. прошил контроллер бутлоадером. Плата вроде рабочая если закоротить
Rx и Tx то буквы возвращаются. Не могу проверить выходит ли контроллер в бут. на portD5 че должно быть единица или ноль? и почему не надо перекрещивать rx и tx между микросхемой и контроллером?
при подаче питания на Mega8 на rxd 2.5v на txd 5v на pd5 5v. сигнал не возвращается на микросхему если поставить перемычку rxd-txd при подключенном контроллере. без него все сигнал с перемычкой возвращается
Нужно было прошить 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?
В чем проблема и как с ней бороться?
ХЗ никогда не пользовался CVAVR как программатором. Возможно надо предварительно стереть МК. Например унипроф без этого не прошьет.
DI HALT, загрузил ваш бутлоадер в атмегу128, поправил для работы с кварцем на 16мгц. Сделал запуск с кнопки. AVRProg определил контроллер, но при нажатии кнопки «write» задумывается на пару сек. и пишет «Failed erase». В терминале всё отлично отвечает = (
Видимо это глюк самого бута. Может что подскажите?
Нашел место зависания: boot_spm_busy_wait(); Причину до сих пор понять не могу.
У меги128 память фееричных размеров. И адресуется через RAMPZ как то хитро. Может бутлоадер достать не может?
Зависает с 0 адреса ещё при стирании (
Ужас. Кирпич в глазу не заметил. Проклятый фьюз M103C! Всё работает прекрасно.
Привет DI. Можно ли бутлоадер который ты выложил, настроить так чтоб он когда надо, по спец байту на UART принял новую прошивку и перепрошил МК? Мк подключен к СОМ порту по RS485 интерфейсу? СОМ порт скажем №15. А не с 1-го по 4-й.
Дак бутлоадер не причем тут. Тебе надо в нем сделать сразу же условие входа активное. А потом в софте ловить свою N15 и делать сброс.
Чтото с бутаком мозг мой стопарнулся. Надеюсь это временно. Если у меня МК торчит на 15 СОМ порте, значит AVRprog не пойдет, так как выше вроде как сказано что он работает с 1-го по 4-й СОМ порт. Значит нужно что то другое. А что? С каким софтом еще будет работать, твой бутак? Примет ли он формат INTEL HEX как есть через HyperTerminal? Нет не примет. Выше в коментах TORNIS так делает, но у него другой бутак. HyperTerminal вроде как работает с любыми СОМ портами, это удобно. Получается что AVRprog работает с твоим бутаком по определенному протоколу. И твой бутак заточен под этот протокол. Раз в моей ситуации AVRprog не идет нужна какая то софтина с таким же протоколом как у AVRprog но способная работать с любым номером сом порта. Я хоть в правильном направлении думаю?
Там вроде бы AVR109 протокол. Так что его должен поддерживать avrdude
Недавно находил в студии возможность выставить ком порт больше 4го. Но где уже не помню. После этой опции и аврпрог начинает опрашивать порты старше 4го.
О, это ценные мысли. Будем рыть в этом направлении. Кстати чета мысли с твоего сайта тырят не напрягаясь. Смотри здесь http://neving.my1.ru/news/avr_uchebnyj_kurs_ispolzovanie_bootloader_a/2010-10-26-45
Кстати здесь крутое описание протокола AVR109. Точнее просто перевод Атмеловского даташита. Если может тебе нужно, то бери без проблем. http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR109.htm
Я ведь всю студию переверну но найду эту фишку с сом портами.
Здеся она эта фишка Tuls/Options/General/Number of COM-ports to try
DI привет снова. Я сейчас работаю с предложенным тобой бутом. Прошил бут в мк. Потом тестовую прогу через сом порт. Все работает. Так что потихоньку двигаюсь к своей цели. Но возник по ходу вопрос.
1. После заливки проги, бут сам не отдает управление основной программе, нужно обязательно нажать ресет. А у меня ж МК будет находится на большом расстоянии. Как рестарт сделать? Можно ли какую то команду послать этому буту чтоб он отдал управление наверх?
2. Расстояние между СОМ портом и МК будет приличное допустим 1200 метров. Используем RS485. Может же быть такое что во время передачи прошивки, какая нибудь наводка угрохает какой нибудь байт по дороге. И бут все это запишет во флеш? Есть ли возможность у этого бута проверить корректность записи прошивки?
1. Надо там посмотреть каким образом отадется управление. Я уже не помню. Не я же его писал. Я только чуток подправил под свои нужды.
2. Насколько знаю нет. Надо вводить срц какое нибудь.
Если невозможно командой отдать управление наверх, тогда такой бут не подходит для прошивки на удаленные растояния. А жаль, а то я уже обрадовался. Здесь http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR109.htm описывается протокол avr109. Там говориться что L — это выход из режима программирования. Посылаю L и ничего не происходит. Хотя на некоторые другие команды ответ приходит. Может глянеш возможно это или нет. А то я в си не шарю. Тогда бы я начал искать чтонибудь другое. Хмм… интересно, а ведь после нажатия кнопки reset он же через 4 сек выходит из режима. По идее как-то ж можно сделать так, чтобы послав команду он отработал это же действие. Только как?
Да есть там такая фича. Вот только может быть глючит. Там весьма много каши изза директив условной компиляции. Дров там наломать раз плюнуть. По хорошему бы выкинуть все это дерьмо и заточить бут под конкретный камень.
А что за фича? Как ее врубить?
Выход по L в программу. Она даже врублена должна быть. Поддержка то команд полная. Но вот почему не работает хз. Надо разобраться. ПО идее там дело одного перехода. Домой приеду поковыряюсь. Тут совсем обстановка не рабочая.
Спасибо буду ждать. Если что у тебя мой email есть.
Привет DI, бутак заработал. Отправил команду Е, типа «exit» подразумевается. И МК стал сбрасываеться. Теперь его можно удаленно вырубать. Хотя про Е ничего в документации не говориться. Странно.
Мне самому бут написать еще пока кишка тонка.
Привет Ди, спасиб за статью. Подкну свои пять копеек, по работе с бутлоадером.
Уже года три алуюсь прошивкой телефонов, почему бы не сделать режим работы бута для заливки новой проши работающим до первого reset? Т.е выполнили условие входа(например нажали «3 волшебные кнопочки» как у андроидов или еще чего) и пока мы его не ребутнем он будет ждать новую прошу. Реализовать просто, особенно если остались ноги пустые.
Собираюсь делать на подарок пресловутую лампу настроений, если б не твои статьи, я бы и половины не узнал бы так быстро)
Доброго времени суток, ДИ!
Помоги пожалуйста переделать этот бут под Мегу88.
Пытался самостоятельно, не получилось. Брал за основу Мегу8, там даже адреса бутлоадера одинаковые. В хидере, все что связано с UART изменил где-надо.
А вот с верхней частью:
/* Part-Code ISP */
#define DEVTYPE_ISP 0×76
/* Part-Code BOOT */
#define DEVTYPE_BOOT 0×77
#define SIG_BYTE1 0x1E
#define SIG_BYTE2 0×93
#define SIG_BYTE3 0×07
Не могу разобраться, что откуда куда и зачем?
Помоги пожалуйста, буду очень благодарен!
По простому не выйдет. Надо найти сигнатурные байты иначе аврпрог тебя не поймет. Я подобрал для атмега168 от мега169 — подошли. Просто нагуглил Part Code для мега 169 поищи для 88 тоже должны быть.
Сигнатурные байты я нашел в даташите на стр. 288.
Также нашел вот эти парт-коды:
0×10 AT90S1200rev.A
0×11 AT90S1200rev.B
0×12 AT90S1200rev.C
0×13 AT90S1200
0×20 AT90S2313
0×28 AT90S4414
0×30 AT90S4433
0×34 AT90S2333
0×38 AT90S8515
0x3A ATmega8515
0x3B ATmega8515 BOOT
0×41 ATmega103
0×42 ATmega603
0×43 ATmega128
0×44 ATmega128 BOOT
0×45 ATmega64
0×46 ATmega64 BOOT
0×48 AT90S2323
0x4C AT90S2343
0×50 ATtiny11
0×51 ATtiny10
0×55 ATtiny12
0×56 ATtiny15
0×58 ATtiny19
0x5C ATtiny28
0x5E ATtiny26
0×60 ATmega161
0×61 ATmega161 BOOT
0×64 ATmega163
0×65 ATmega83
0×66 ATmega163 BOOT
0×67 ATmega83 BOOT
0×68 AT90S8535
0×69 ATmega8535
0x6C AT90S4434
0×70 AT90C8534
0×71 AT90C8544
0×72 ATmega32
0×73 ATmega32 BOOT
0×74 ATmega16
0×75 ATmega16 BOOT
0×76 ATmega8
0×77 ATmega8 BOOT
0×78 ATmega169
0×79 ATmega169 BOOT
Может кому и поможет, но сожаление моей меги88 тут нет.
Если никто не подскажет где искать, буду искать методом научного тыка..
Меги88 там нет и не будет, т.к. это новая модель и аврпрог ее не поддерживает.
Ищи от 8кб моделей. Может какой нибудь подойдет. Например 0×77 ATmega8 BOOT
Мне для 168 подошел от 169
Доброго времени суток, 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р да еще и извращаться с корпусом его…
прошу помощи, что я могу не так делать?
Доброго времени суток.
Есть странная проблема при работе с выше указанным бутлоадером.
Ошибка: AVRProg 1.4 No supported board found.
ТТХ оборудования:
Контроллер mega8, кварц на 8, скорость 19200.
Захожу через putty, пишу ‘S’ — отвечает AVRBOOT.
Светодиод на PD5 постоянно горит.
Использую FT232RL в качестве USB-UART преобразователя, в системе выставлен как COM2(или COM1 — результат одинаковый).
По светодиоду, подключенному к FT232RL — AVRProg посылает 5 раз что-то и сдается =\
Подскажите возможные пути исправления этой ошибки.
Нет таблицы после «Вот как, например, выглядит таблица соответствия битов BOOTSZх и размера загрузочной области для ATMega16:»
А как настроить COM-порт для AVRProg.
И что вообще должны быть подключено, что бы AVRProg запустилась, и как она об этом узнает?
Сам порт настраивать не надо. Бутлоадер же общается с аврпрог на 19200-8-N-1
Авпрог при запуске тыкается в порты 1…4 и спрашивает есть ли там чо? Т.е. шлет символ S и если ей в ответ AVRBOOT то начинается работа. Если нет, то пишет что нет поддерживаемых устройств на борту.
Иммется ли возможность прикрутить к данному буту управление внешним приемо-передатчиком RS485?
В обычных условиях это делается очень просто по прерываниям USARTа, но в данном буте прерываний нет вообще.
Если просто воткнуть управление в функции sendchar и recvchar, мне кажется будут проблемы.
Есть ли решение данного вопроса?
Господа, разъясните, плиз, в AVR Prog во второй закладке есть что-то касаемо фьюзов, т.е я так понимаю можно щёлкать фьюзы оттуда, но они все неактивные.. Почему? это от функционала бута зависит?
Бут не может шить фузы. А аврпрог работает не только через бут, но и через ряд других программаторов, аппаратных. Вроде того же AVR109 (или 910 черт их разберет)
Ок, понял, значит ISP далеко прятать не надо..
А в остальном зашил, ресет и всё работает. спасибо. только одна вещь, которая потребовала разбирательств: «Во-первых надо активировать бит BOOTRST». Не ясно что значит активировать.. Надо отметить, что его надо поставить UNPROGRAMMED(1).
Я по началу поставил его в 0, как бы «активировал», но ничего не заработало, даташит помог.
Активировать т.е. включить. Должен быть «0″ т.е. запрограммирован.
Да, всё правильно, должен быть 0, т.е. галка должна стоять.
Использую CVMegaload.
только сам немного переписал под себя загрузчик (сделал моргание светодиодом, добавил многократную отправку символа, причём на разных скоростях… заодно добавил 485 интерфейс (там надо отдельной ногой дрыгать, когда отправляешь данные — это вообще отдельный анекдот ))
Сделать на универсальном кварце не представляю возможности… да и желания нет. Мне проще подкорректировать код под конкретный девайс (благо только пару констант поменять) покопаться в коде разве только по принимаемому сигналу определять скорость, или перебирать скоростя согласно возможным кварцам, но проще 2 константы сменить и зашить.
>> Но если в микроконтроллер не зашито еще ничего, то быстро проскочив через 16кб пустоты проц опять выполнит код бутлоадера и так по кругу, диод будет тупо гореть…
Если Собачий таймер не обломает… (использую 3.6864 МГц на основе перестроенного внутреннего «типа калиброванного» RC генератора …уже второй подряд кристалл с уплывшей внутренней частотой резонатора — чем они там на заводе занимаются?)
Посему у меня есть желание сделать, чтобы прошивка бутлоадера работала нормально — по нулевому адресу добавить jmp , чтобы на время отладки он стартовал даже при не прошитых фьюзах, но CVAVR блин слишком умная :(, или руки не совсем выпрямил… Прям хоть вручную HEX файл править.
* по нулевому адресу добавить jmp «началобутлоадера» *
(про html теги забыл…)
DI HALT, а откуда достается информация, что AVRProg возвращает S?
Ну наверное гдето в доках описано. Либо проснифали протокол оригинальной железки от Atmel. Я же это из исходников бутлоадера подглядел.
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к. Там такой прикол что можно врубить rs485, а он всеравно будет работать и по rs232 и по rs485. Интерфейсы переключать не надо. Пароль можно вырубить. Я сейчас с этим китайцем переписываюсь по его бутаку. Смышленый пацан. Сам софтину для своего бутака написал. Я его бутак сейчас на 16 меге использую. И контрольная лампочка работает прикольно. Не просто тупо горит и все. А мигает, а когда идет загрузка мигает быстрее. Во!
Привет dima_m ! подскажи плз по вопросу выложенному мной ниже, и возможно ли с тобой как то связаться другим способом?
Привет. Я вродебы прочитал всюстатью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
— как я могу дать команду из основной программы на старт бутлоадера?
— что такое timeclk? (что такое базовы
Привет. Я вродебы прочитал всюстатью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
— как я могу дать команду из основной программы на старт
бутлоадера?
— timeclk — что это? (какой то базовый временной интервал)и на
что он влияет?
— TimeOutCnt — что это?…какой то счетчик бутлоадера….за что
отвечает?
— TimeOutCntC — это что? максимальное время ожидания файла
прошивки?
— VERBOSE — ето ХЕЛП чтоли….по какой команде его можно
выдернуть из МК?
Если есть описание команд, буду благодарен если их выложите. Было бы не плохо создать отдельную тему по данному бутлоадеру
Привет. Я вродебы прочитал всю статью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
— как я могу дать команду из основной программы на старт
бутлоадера?
— timeclk — что это? (какой то базовый временной интервал)и на
что он влияет?
— TimeOutCnt — что это?…какой то счетчик бутлоадера….за что
отвечает?
— TimeOutCntC — это что? максимальное время ожидания файла
прошивки?
— VERBOSE — ето ХЕЛП чтоли….по какой команде его можно
выдернуть из МК?
Если есть описание команд, буду благодарен если их выложите. Было бы не плохо создать отдельную тему по данному бутлоадеру
Привет. Я вродебы прочитал всю статью http://sites.google.com/site/shaoziyang/Home/avr/avr-universal-bootloadere, сконфигурил и залил булодырь в 128 мегу, работает, но у меня вопрос: — какие команды существуют для управления бутлоадером?
— как я могу дать команду из основной программы на старт
бутлоадера и скормить ему прошивку (хотябы через тайпер)?
— timeclk — что это? (какой то базовый временной интервал)и на что он влияет?
— TimeOutCnt — что это?…какой то счетчик бутлоадера….за что отвечает?
— TimeOutCntC — это что? максимальное время ожидания файла
прошивки?
— VERBOSE — ето ХЕЛП чтоли….по какой команде его можно
выдернуть из МК?
Если есть описание команд, буду благодарен если их выложите. Было бы не плохо создать отдельную тему по данному бутлоадеру
мда..
А зачем ты 20546 раз написал одно и тоже? Так места для сайта на сервере скоро не хватит.
Как войти из основной программы в загрузчик? Так этож раз плюнуть. Вот этой командой:
JMP FOURTHBOOTSTART ; и усе. ты в загрузчике.
Бутак сразу начинает отсылать в терминал букву С. Вот в этот момент времени ему нужно пихнуть прошивку либо с hyper terminala либо с его проги avrubd.exe лучше используй avrubd.exe очень удобно и просто а главное круто.
TimeOutCnt это максимальное время ожидания пароля, оно равно TimeOutCnt * timeclk
TimeOutCntC это время ожидания данных тобиш прошивки. оно равно TimeOutCntC * timeclk
timeclk это просто число интервал в мс который подставляется в вышеприведенные формулы. Да ты с этими числами не парься сильно поставь каие нибудь там, а пароль вообще отруби зачем он тебе?
И будет тебе большое счастье.
А в отношении отдельной статьи это дело говориш. Бутак то этот хорош. Бесплатный. Можно статью самому написать и выложить в сообщество. Но я не могу занят сильно, не до этого сейчас. Попроси di написать, может у него будет желание и настроение, тогда напишет.
Прошу извинить за написание одного и того же, у меня интернет тормознутый, один раз жму «Добавить а оно не добавляет», жму второй раз, уже 2 ответа, редактировать уже три…плохо что нельзя удалить свои сообщения…
dima_m спасибо за подсказки, однако о JMP FOURTHBOOTSTART прошу немножко поподробней (я только начинающий писатель на С). JMP — переход…FOURTHBOOTSTART — это название метки с адресом загрузчика?
Попробую создать статью на форуме о даном бутаке, мож кто еще какую инфо подкинет…
Здорово 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
Возникла необходимость сделать ус-во с перепрограмированием через GSM модем(по GPRS каналу). Сейчас разбираюсь со всем этим. Как я понял, самой ответственной частью в этом является бутлоадер. Может кто уже делал такое и может ответить на пару вопросов?
А то же самое для Atmega88pa есть? Как я понял надо переписывать .h файл..
И еще, можно ли им прошить контроллер не через родную совтину авр, а чем нибудь сторонним и маленьким?
Поставил на Atmega16 загрузчик MegaLoad который со своей прогой, отлично работает, а вот этот лодер не цепляет avrprog на 19200, хотя все терминалки пишут avrboot. Пробовал и через max232 и через PL2303 пофигу.
Чего то у меня с адресами какие-то непонятки. Сначала попробовал сбилдить для варианта входа в бут по кнопке, всё нормально. 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 делал.
А размер кода не вылез за границы бутсектора?
Я так понял что нет. Последний адрес записи в конечной области — FFF0, а последний адрес судя по даташиту — FFFE, то есть он недоиспользовал память в конце и переключился на начало.
Хотяяяя… А ведь вылез блин, оставшихся 13 байтов памяти МК всё равно не хватит для записи 2+10+10+10+6+4=42-х байтов программы…
И я не совсем понимаю, как один и тот же код (у тебя в примере и у меня) занимает разное место? А ведь по сути в main-е сменена только частота, а в makefil’е — девайс.
Оптимизатор может чудит. Сменилась версия компилятора и привет.
Кстати да, я поставил 5-ю студию и винавр какой-то свежий.
Хм, придется из-за пары десятков байт бутсектор увеличить до 1024…
Атас, но простите меня, я начинающий.
В билде выкидывает такое: Bootloader.aps:1: *** образец цели не содержит `%’. Останов.
В мессагах: gcc plug-in: Making arbitrary targets when using external makefile may fail
ничче не нашел по этому поводу. студия 4-ая. тулчейн к ней же. вин авр последний.
С этим разобрались пересозданием проекта. Теперь вылазит вот такой ворнинг, что надо поправить?
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