Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: cамопрограммирование
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
QuickWitted
Решил прикрутить к своему девайсу самопрограммирование через RS232...
(RS232 уже реализован rx, tx, dsr)

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

Какие грабли ждать?

Какой протокол (если есть готовый) использовать?
(или самому насочинять...)

Куда сместиться таблица прерываний?
(понимаю, что в зависимости от настройки фусов,
но када, сразу после бут области?)

По мимо всего прочего интересует вопрос сброса... ну предположим
по определённой команде программа перейдёт в бут область...
Как вариант - прерывания у меня отключены на время прогрева,
настройки бортовой (на МК) периферии и тестирования ОЗУ...
После этого проверить пришел какой либо заданный символ за это
время по рс 232? Если да - самопрограммирование... но вопрос
как реализовать после всего этого Софтовый резет?

Немного истории:

Когда я разрабатывал Book reader на AVR ATMega16
http://www.swordgreenline.narod.ru/BookReader.html
столкнулся с проблемой занятости SPI порта программатором.

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

Теперь хочу сделать девайс на Mega32 с периферией:
SPI MMC флэш
RS232
LPT(мастер) на основной плате для подключения "стандартной" комповой периферии.
и 4х битная шина дисплея с МК опроса АТ клавиатуры на
вспомогательной...

и что бы
1) ускорить прошивку девайса (через LPT очень медленно)
2) не заниматься передёргиванием то флэши, то программатора в один SPI
хотелось бы прикрутить самопрограммирование...
Дон Амброзио
Делаю так.
После сброса попадаем в область загрузчика (для чего программирую соответствующий FUSE).
Затем перемещаю таблицу векторов в область загрузчика.
Затем делаю тест целостности программы.
Если она повреждена записываю это в последнюю страницу FLASH и жду загрузочных пакетов. При этом отвечая на "вопросы" внешних устройств о моём состоянии "Мой софт разрушен. Жду загрузки софта. Софт загружен до ... -ого блока".
Внешнее устройство, которое будет передавать мне прошивку получив мой пакет начинает передавать мне прошивку блоками начиная с того пакета, который я указал.
В самом первом блоке FLASH храню номер версии прошивки.
А при передаче пакетов с программой я всегда указываю в пакете к какой версии софта относиться данная прошивка (поскольку в сети одновременно могут обновляться прошивки нескольких разных устройств)

Уф.. Пока хватит.. Хотя я не перечислил и 10-й части всех нюансов и тонкостей организации работы загрузчика...Итак много букв написал.. Если есть неясные моменты и более конкретные вопросы - задавайте
QuickWitted
Цитата(Дон Амброзио @ Mar 31 2008, 10:03) *
После сброса попадаем в область загрузчика (для чего программирую соответствующий FUSE).
Затем перемещаю таблицу векторов в область загрузчика.


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

как реализовать выход из прошивки (без внешнего сброса)
если использовать внешний вход в эту область - это может быть не надёжным,
т.е. надо как то определиться при старте с перепрошивкой...

изобретать систему команд званого, или есть готовые или хотябы описание их набора?
(я про CRC16 и проверки)
Планирую использовать алгоритм CRC16 от флэшки MMC раз он у меня уже написан...
Дон Амброзио
Цитата(QuickWitted @ Mar 31 2008, 08:21) *
я ещё не совсем понял как разрулить прерывания...
ну предположим (хотя не обязательно) загрузчик будет пользоваться прерыванием рс232
но относительные адреса прерываний от версии прошивки к версии будут плавать?

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

А эти обработчики могут либо всегда сами обрабатывать прерывания(т.е. они не будут меняться от прошивки к прошивке). Либо можно грузить адрес перехода из ОЗУ. Либо в загружаемой программе можно сделать свою таблицу векторов которая будет использована после окончания загрузки и переключения на таблицу, расположенную в RWW.

Цитата(QuickWitted @ Mar 31 2008, 08:21) *
т.е. надо как то определиться при старте с перепрошивкой...

Я сначала проверяю целостность прошивки. Затем смотрю содержимое служебной области FLASH или EEPROM(не поступали ли команды извне на перезаливку софта). И по результатам перехожу либо на сброс в RWW(т.е. передаю управление приложению) либо перехожу в режим загрузчика.
QuickWitted
Цитата(Дон Амброзио @ Mar 31 2008, 10:35) *
И по результатам перехожу либо на сброс в RWW(т.е. передаю управление приложению) либо перехожу в режим загрузчика.


Перезагружаться из программы то как?
Прыгнуть на начало? Заново залить указатель стека и забыть о том что
находишься в какой то вложенности? или как?

Ps to All
вопросы по программированию протокола не снимаются
изобретать всё заново и вслепую искать грабли (наступая на них)
или кто уже делал?
_Sam_
Цитата
если можно немного подробнее с этого места....
я ещё не совсем понял как разрулить прерывания...

В мегах давно уже есть бит IVSEL который позволяет перемещать вектора прерываний в начало Boot области.

Цитата
Перезагружаться из программы то как?
Прыгнуть на начало? Заново залить указатель стека и забыть о том что
находишься в какой то вложенности? или как?


((void (*)())0x0000)();
только если пользовались IVSEL не забываем его перенастроить на App область
GDI
Для начала посмотрите AVR-109.pdf и AVR-109.zip, все довольно просто и работает со стандартным АВРПрогом.
QuickWitted
Цитата(GDI @ Mar 31 2008, 12:09) *
Для начала посмотрите AVR109, все довольно просто и работает со стандартным АВРПрогом.


Спасибо конечно, но:
1) Я это уже читал.
2) Работаю я на асме
3) Хотелось бы без переделки аппаратной части... (нет свободных пинов)
4) причём пунк 3 не основной, в идеале хочу получить нажал мышкой - прошивка залилась...
(а тут надо думать о резете и замыкать пин...) на рс232 это не вешать библиотека на хардовый
режим настроена



Цитата(_Sam_ @ Mar 31 2008, 11:41) *
В мегах давно уже есть бит IVSEL который позволяет перемещать вектора прерываний в начало Boot области.


Я к сожалению не знаю всех тонкостей работы с фусами...
На данный момент запускаю фусы так
http://palmavr.sourceforge.net/cgi-bin/fc....amp;B_BOOTSZ0=P

проще спрошу что надо выставить и куда при этом уйдут вектора прерываний...
(на данный момент мне было бы удобнее что бы вектора прерываний шли сразу после бут области
и переписывались каждый раз...)

И смежный с этим вопрос как пояснить студии что в коде появилась бут область
(я пишу в блокноте, компилирую батником и иногда отлаживаю на студии)
Дон Амброзио
Цитата(QuickWitted @ Mar 31 2008, 08:59) *
Перезагружаться из программы то как?

Я делал по Watchdog-таймеру... Правда не в AVR32, а в ATmega-х. Также перезагрузку каждую минуту делал если девайс находился в режиме загрузчика, а пакеты загрузки не приходили


Цитата(QuickWitted @ Mar 31 2008, 08:59) *
вопросы по программированию протокола не снимаются изобретать всё заново и вслепую искать грабли (наступая на них)
или кто уже делал?

Ну это уже другая тема к загрузчику НИКАК не относящаяся, поскольку протокол приёма/передачи пакетов не зависит загрузчик у Вас или не загрузчик - что в пакет положите, то и передадите. Создайте отдельную тему "Реализация стека протоколов"

Цитата(QuickWitted @ Mar 31 2008, 10:56) *
проще спрошу что надо выставить и куда при этом уйдут вектора прерываний...

Положение таблицы векторов задаётся не ФУСАМИ, а программированием соответствующего регистра статуса и управления.. Курите даташифт


Цитата(QuickWitted @ Mar 31 2008, 10:56) *
И смежный с этим вопрос как пояснить студии что в коде появилась бут область
(я пишу в блокноте, компилирую батником и иногда отлаживаю на студии)

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

А при прогоне проги в симуляторе, чтобы у Вас прога стартовала в NRWW надо поставить галку Debug/Simulator Option/Enable Boot Reset
Dog Pawlowa
Цитата(QuickWitted @ Mar 31 2008, 08:59) *
Ps to All
вопросы по программированию протокола не снимаются
изобретать всё заново и вслепую искать грабли (наступая на них)
или кто уже делал?


Передавайте в пакете строку Hex-файла, ну а для ответа достаточно одного байта -
продолжить / повторить / продолжить с задержкой (жгу страницу) / закончил
Дон Амброзио
Цитата(Dog Pawlowa @ Mar 31 2008, 12:20) *
Передавайте в пакете строку Hex-файла

Слишком большая избыточность кодирования. Коэффициент аж 2. Скорость заливки будет низкая. Лучше в бинарном формате передавать, а не в ASCII
Dog Pawlowa
Цитата(Дон Амброзио @ Mar 31 2008, 12:36) *
Слишком большая избыточность кодирования. Коэффициент аж 2. Скорость заливки будет низкая. Лучше в бинарном формате передавать, а не в ASCII

Доктор, Вы как крупный специалист в области протоколов, какой протокол посоветуете?
Дон Амброзио
Цитата(Dog Pawlowa @ Mar 31 2008, 12:46) *
Доктор, Вы как крупный специалист в области протоколов, какой протокол посоветуете?

А Вы не согласны, что передавать в ASCII слишком накладно, т.к. скорость заливки упадёт в 2 раза..А?
Dog Pawlowa
Цитата(Дон Амброзио @ Mar 31 2008, 12:56) *
А Вы не согласны, что передавать в ASCII слишком накладно, т.к. скорость заливки упадёт в 2 раза..А?

Вы можете посоветовать протокол или не можете? Не можете - так и скажите.
А на попытку начать флуд я не ведусь.
Дон Амброзио
Цитата(Dog Pawlowa @ Mar 31 2008, 13:04) *
А на попытку начать флуд я не ведусь.

Аналогично. Тоже не ведусь на Ваши попытки. Засим дискуссию с Вами я прекращаю.
QuickWitted
Цитата(Дон Амброзио @ Mar 31 2008, 14:56) *
А Вы не согласны, что передавать в ASCII слишком накладно, т.к. скорость заливки упадёт в 2 раза..А?


Я согласен...
А исходя из того что писать за раз меньше или больше одной страницы нельзя то предагаю буфер размером со страницу... потом 2 байта CRC16...

команда залить в буфер страницу и принять байты и срс
команда считать буфер в рс232 и срс
команда задать адрес страницы
команда читать страницу в буфер
команда писать из буфера в память
команда софтовый сброс (только так и не понял пока как)

Цитата(Дон Амброзио @ Mar 31 2008, 13:52) *
Положение таблицы векторов задаётся не ФУСАМИ, а программированием соответствующего регистра статуса и управления.. Курите даташифт


Заранее на 100% предугадываемый вопрос...
А какие регистры статуса за это отвечают?
(Плиз. датащит большой и поиск почемуто неработает...)
defunct
Цитата(QuickWitted @ Mar 31 2008, 12:35) *
Заранее на 100% предугадываемый вопрос...
А какие регистры статуса за это отвечают?

см. IVSEL.


Цитата
команда залить в буфер страницу и принять байты и срс
команда считать буфер в рс232 и срс
команда задать адрес страницы
команда читать страницу в буфер
команда писать из буфера в память
команда софтовый сброс (только так и не понял пока как)


У меня используются такие команды:
1. Запись страницы (передаются зашифрованные данные)
2. Чтение страницы (передаются зашифрованные данные, шифрование совпадает с командой "запись")

(т.о. расшифрованные данные будут только внутри МК).

3. Проверка целостности (проверяет не блоки, а CRC всей пользовательской секции, плюс выдает последнюю страницу пользовательской флеш "как есть" (т.е. не шифрует ее), в этой странице хранится версия, дата создания, и проч. информация о залитой прошивке, защищенная отдельной CRC).
4. Выход из загрузчика (делается JMP 0x00, предварительно выключив всю периферию которую использовал бутлоадер).

Протокол modbus RTU.
IJAR
Посмотрите по этой ссылке.
http://www.fractal.com.ru/_pdf/description/4_39.pdf
это сделано для pic18 контроллеров, но легко может быть реализовано для AVR
QuickWitted
Цитата(IJAR @ Mar 31 2008, 18:29) *
это сделано для pic18 контроллеров, но легко может быть реализовано для AVR


Долго искал на асме и под авр
и вроде откапал... Нажмите для просмотра прикрепленного файла
система команд вроде "стандартна" только пока не разобрался
"стандартна" для чего?

сейчас ковыряю hex формат....
вроде пока ковыряется...
прошивкой займусь позже...

если кому интерестно рад буду обсудить...
Дон Амброзио
Цитата(QuickWitted @ Apr 1 2008, 12:49) *
сейчас ковыряю hex формат....

А зачем? 05.gif
QuickWitted
Цитата(Дон Амброзио @ Apr 1 2008, 15:03) *
А зачем? 05.gif


Да трудно с вами...
А чем шить результат то по твоему?

У меня собственная терминалка с макросами...
(под каждую задачу свой набор команд отправляемых по таймеру)
Дон Амброзио
Цитата(QuickWitted @ Apr 1 2008, 13:26) *
Да трудно с вами...
Почему?

Цитата(QuickWitted @ Apr 1 2008, 13:26) *
А чем шить результат то по твоему?

Что такое "результат"? И почему его надо "шить"? Насколько я знаю "шьётся" в микроконтроллере FLASH или EEPROM

Цитата(QuickWitted @ Apr 1 2008, 13:26) *
У меня собственная терминалка с макросами...
(под каждую задачу свой набор команд отправляемых по таймеру)

И какое это отношение имеет к Вашей фразе "сейчас ковыряю hex формат"?
Не обижайтесь. Я правда не улавливаю связи.. Простите
Dog Pawlowa
Цитата(QuickWitted @ Apr 1 2008, 12:49) *
Долго искал на асме и под авр
и вроде откапал... Нажмите для просмотра прикрепленного файла
система команд вроде "стандартна" только пока не разобрался
"стандартна" для чего?

сейчас ковыряю hex формат....
вроде пока ковыряется...
прошивкой займусь позже...

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


Если хочешь, пришлю готовый проект под IAR С mega 16/32/64/162/128 при одном условии - не выкладывать.
sergeeff Jr.
Почитайте тут
http://avrubd.googlepages.com/avrub.htm
про универсальный загрузчик...
QuickWitted
Цитата(Dog Pawlowa @ Apr 1 2008, 16:13) *
Если хочешь, пришлю готовый проект под IAR С mega 16/32/64/162/128 при одном условии - не выкладывать.


Условие не выкладывать я соблюдаю всегда...
(у меня ни одного исходника на сайте)

Но мне бы под асм...
если не трудно опиши алгоритм в 2х словах...
как я понял у мег 16/32/64/162/128 размер страницы одинаков?
defunct
Цитата(QuickWitted @ Apr 2 2008, 13:29) *
Но мне бы под асм...

На ASM будет более запутано.
Да и собсно какая разница под что, если вам только посмотреть?

Цитата
как я понял у мег 16/32/64/162/128 размер страницы одинаков?

разный.
8k флеша - 64 байта страница
16k/32k - 128 байт страница
64k/128k - 256 байт страница.
QuickWitted
Цитата(defunct @ Apr 2 2008, 16:39) *
На ASM будет более запутано. Да и собсно какая разница под что, если вам только посмотреть?


Всем спасибо пока всё боле или менее прояснилось буду стыковать ПК с железом...
Если есть примеры Я ЗА !!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.