Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Самопрограммирование AVR МК
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
KIG
Здравствуйте!
Использую самопрограммирование МК через GSM модем. Часто обрывается канал связи и сбивается работа МК (прошивка МК портится). Подскажите, пожалуйста, как реализовать (где можно прочитать) самопрограммирование МК из внешней Flash памяти? Возможно ли хранить резервную копию прошивки МК в собственной Flash памяти МК (Как это сделать)? Заранее спасибо.
mempfis_
Цитата(KIG @ Nov 28 2009, 17:12) *
Здравствуйте!
Использую самопрограммирование МК через GSM модем. Часто обрывается канал связи и сбивается работа МК (прошивка МК портится). Подскажите, пожалуйста, как реализовать (где можно прочитать) самопрограммирование МК из внешней Flash памяти? Возможно ли хранить резервную копию прошивки МК в собственной Flash памяти МК (Как это сделать)? Заранее спасибо.


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

По поводу прошивки из внешней флеш - она отличается от прошивки по GSM только тем что данные будут браться из внешней флеш а не поступать с сервера. Вообще странный вопрос для человека написавшего фразу
Цитата
Использую самопрограммирование МК через GSM модем
которая подразумевает что вы уже научили ваш мк самопрограммироваться.

Я бы не рискнул хранить откат прошивки в самой флеш мк. Вдруг с какогото момента основная программа начнёт превышать по объёму половину от размера флеш минус секция бутлоадера.
Xenia
Цитата(KIG @ Nov 28 2009, 16:12) *
Часто обрывается канал связи и сбивается работа МК (прошивка МК портится). Подскажите, пожалуйста, как реализовать (где можно прочитать) самопрограммирование МК из внешней Flash памяти? Возможно ли хранить резервную копию прошивки МК в собственной Flash памяти МК (Как это сделать)?

Надо не резервную копию хранить, а начинать перепрошивку не раньше, чем убедишься в том, что новая прошивка скачалась целиком и без ошибок.
Самый простой способ - взять МК с запасом собственной Flash. С таким расчетом, чтобы после прошивки оставалось не меньше половины свободного места. Тактика такая: новую прошивку прошиваем сначала на свободное место флэша - на верхние свободные адреса памяти. Тут мы ничем не рискуем, даже если связь по дороге оборвется или новая прошивка придет с ошибками. Когда загрузка новой прошивки будет завершена, приступаем к ее проверке - тут самое простое проверить по контрольной сумме. Убедившись, что новая прошивка хороша, переписываем новую провшику из верхних адресов флэш-памяти в нижние, чем и замещаем старую прошивку на новую. Код в верхних адресах стирать нет необходимости. Этот подход удобен еще и тем, что на время копирования из верхней памяти в нижную, можно заблокировать все прерывания, чтобы обезопасить процесс замещения. В то время как запись фрагментов новой прошивки в верхнюю память осуществляется в обычном режиме, т.к. работу МК повредить не может.
KIG
Процесс замены прошивки организован с помощью программы из интернета с небольшими модификациями. МК выходит на связь с сервером из основной программы, затем получает страницу памяти, стирает область памяти и заливает новую информацию, при этом отправляется запрос на получение следующей страницы памяти. На сервере установлена программа в которой указываю путь к Hex файлу. Исходника серверной программы у меня нет, поэтому я не знаю как организовать поступление данных из внешней флэш, если подскажите буду благодарен! (Хотя бы где можно прочитать об этом).

Вариант с предварительной загрузкой программы на свободное место собственной флэш памяти (либо внешней флэш), проверкой контрольной суммы, а лишь затем заменой старой прошивки на новую мне подходит. Подскажите, пожалуйста, как переделать код моей программы-загрузчика для реализации данного алгоритма, либо где можно посмотреть похожие примеры (прочитать о самопрограммировании подробно). Спасибо.
Xenia
Цитата(KIG @ Nov 28 2009, 19:20) *
Вариант с предварительной загрузкой программы на свободное место собственной флэш памяти (либо внешней флэш), проверкой контрольной суммы, а лишь затем заменой старой прошивки на новую мне подходит. Подскажите, пожалуйста, как переделать код моей программы-загрузчика для реализации данного алгоритма, либо где можно посмотреть похожие примеры (прочитать о самопрограммировании подробно).


Переписывать вашу программу мне лениво, тем более отлаживать мне ее не на чем. Между тем причины, вызывающие у вас затруднения, мне непонятны. Ведь если вы уже умеете перезаписывать прошивку, начиная с нулевого адреса, то разве может возникнуть проблема загружать не нуля, а выше? Начинайте запись не с нулевой страницы, а с той, где у вас пустота начинается, - вот и вся разница.

Пример самопрограмирования обычно приводится в даташите, в разделе про boot-загрузчик. Конкретнее ответить не могу, т.к. вы не называете ни типа вашего МК, ни компилятор, которым пользуетесь.
Александр Куличок
Цитата
Исходника серверной программы у меня нет, поэтому я не знаю как организовать поступление данных из внешней флэш

"На городі бузина, а в Києві дядько".
Как вообще связана серверная программа с внешней флеш? Внешняя флеш находится максимум в 10-ти сантиметрах от Вашего контроллера и непосредственно связана с ним (а не с программой на сервере). Поэтому Вы, как разработчик, должны сами обеспечить связь с этой флешью. Или может наши понятия о "внешней флэш" не совпадают?
Цитата
МК выходит на связь с сервером из основной программы, затем получает страницу памяти, стирает область памяти и заливает новую информацию, при этом отправляется запрос на получение следующей страницы памяти.

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

Прочитать о самопрограммировании подробно и с примерами можно на сайте атмела,раздел Application notes. Искать по словам "self-programming","boot" Плюс раздел Boot Loader Support из даташита Вашего МК.
KIG
Подскажите, пожалуйста, можно ли использовать прерывания в тексте программы бутлоадера? Мне необходимо использовать таймер и АЦП. Заранее спасибо.
SasaVitebsk
Цитата(KIG @ Dec 4 2009, 21:46) *
Подскажите, пожалуйста, можно ли использовать прерывания в тексте программы бутлоадера? Мне необходимо использовать таймер и АЦП. Заранее спасибо.

Естественно. Для этого требуется перенести вектора. В даташите всё детально описано.
KIG
Компилирую программу загрузчика в ICC AVR.В настройках установил область памяти загрузчика в 1Кб по описанию меги644 это адреса flash памяти с FC00 до 7FFF. Однако после компиляции создается hex-файл в котором программа располагается в области с F800 до 7FFF. Такое впечатление, что компилятор неправильно воспринимает настройки. Подскажите, пожалуйста, что не так?
V_G
Цитата(KIG @ Dec 5 2009, 22:32) *
Компилирую программу загрузчика в ICC AVR.В настройках установил область памяти загрузчика в 1Кб по описанию меги644 это адреса flash памяти с FC00 до 7FFF.

Не понял, а почему конечный адрес меньше начального?
KIG
Цитата
Не понял, а почему конечный адрес меньше начального?


Информация из Datasheet. Затрудняюсь ответить.
SysRq
Цитата(KIG @ Dec 5 2009, 15:32) *
В настройках установил область памяти загрузчика в 1Кб по описанию меги644 это адреса flash памяти с FC00 до 7FFF.
Если первое значение в байтах, а второе в словах, то тогда всё правильно.
Читайте еще раз внимательно раздел "ATmega644 Boot Loader Parameters" в datasheet'е.
А вот в ICC AVR выбираете в размере загрузчика, видимо, пункт с цифрой "1024" - только опять же слов, а не байт. Тогда это 2кБ, и начало кода как раз по адресу 0xF800 в байтах...
KIG
Опять к вопросу о прерываниях в режиме бутлоадера. Для проверки работы прерываний включил прерывание по приему символа, установил бит IVSEL (перенес таблицу векторов). Посылаю символ в МК и должен получить ответ (режим эхо), однако контроллер перезагружается. Подскажите, пожалуйста, что не так?
demiurg_spb
Цитата(KIG @ Dec 11 2009, 20:58) *
...что не так?
Пошагайте в AvrStudio - многое поймёте.
KIG
В AVRStudio прерывание от UARTa срабатывает, все нормально. А в МК нет.
V_G
Цитата(KIG @ Dec 12 2009, 04:58) *
В AVRStudio прерывание от UARTa срабатывает, все нормально. А в МК нет.

Ну, может, и в МК срабатывает? Вы дерните какой-нить внешний сигнал в прерывании, чтобы проверить.
А в Студии программа входить-то в прерывание входит, а вот выходит ли? И что потом делает?

Я правда, в бутлоадере прерывания не использую, предпочитаю ограниченный набор команд AVRProg и прием/передачу по состоянию, а не по прерыванию.
Shtil
Всем доброго времени суток.
Столкнулся с проблемой описаной выше. Загрузка прошивки через GSM модем, также при потере связи контроллер выходит из строя, приходится ехать менять прошивку вручную.
Устройство имеет пямять 2Mb(AT45DB161 ). Чтобы прошивка была безопасной сначала записываю ее в память, после читаю - все ОК. Прошивка сходится с исходных файлом, дальше следует команда перейти на загрузчик который должен прочитать прошивку и залить ее в контроллер, тут и возникают проблемы. Даже память не могу как следует прочитать, если кому нить не жалко поделитесь симпатичным примерчиком.
_Pasha
Цитата(Shtil @ Mar 12 2010, 13:56) *
Прошивка сходится с исходных файлом, дальше следует команда перейти на загрузчик который должен прочитать прошивку и залить ее в контроллер, тут и возникают проблемы. Даже память не могу как следует прочитать

Надо прочитать страницу из флеша, прочитать страницу из внешней памяти, поменять их местами (в смысле - записать туда и туда) и проапдейтить состояние бута. Потом, по завершению, если ничего не работает, бут стартует после собаки, и возвращает все на место. И пишет: "ну вас нафиг, с вашей прошивкой" smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.