Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не получается прошить AES бутлодером
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
alux
Решил сделать бутлодер для Mega32L. Сделал все, по-моему, как описано в AVR231:
1)Линкеру указал линкерный файл в рабочей директории;
2)В опциях поставил установки для M32, как указано в table 3-4 (avr231);
3)Создал Config.txt:
PAGE_SIZE = 128
MEM_SIZE = 28672
CRC_ENABLE = YES
KEY1 = 0AF5EBEB3E7A77644FDC460048CF80690CEC
KEY2 = 56CFDB56AB33230816
KEY3 = FAFDA97243B3050D21
INITIAL_VECTOR = 4D5EDB8A7B5B8DB381059CA39B3AB955
SIGNATURE = A9E4781E
4)Создал BootLdr.h, AESKeys.inc :
create -c Config.txt -h BootLdr.h -k AESKeys.inc
5)Скомпилировал проект bootldr32 с подключенными файлами BootLdr.h, AESKeys.inc
Кварц 8 МГц, UBRRL = 25; // 19200 baud @ 8MHz, error 0.2%
6)Прошил в Mega32L bootldr32.hex с запрограммированными фьюзами BOOTSZ=0, BOOTRST=0, BLB1=0, BLB0=3, -L2 (LB2:LB1 -> 0 0);
5)Закодировал программный файл (~9k):
create -c Config.txt -f pribor.hex -o Update.enc -l BLB11 BLB12
6)При нажатой кнопке PROG осуществил сброс контроллера, чтобы запустить программу загрузчика:
if (!(PINA & (1 << PROG))) // Key pressed? Yes -> run the loader routine
Загрузил полученный файл Update.enc в контроллер:
update Update.enc -COM1 -19200
7)В итоге передача успешно завершилась.
А в ответ тишина... В смысле программа не работает. Работоспособность проверяю пищалкой. В начале программы после инициализации портов вставил секундное пищание. Если загрузить напрямую (без бутлодера) , все работает. Какие будут соображения?
P.S. Вообще, мне удавалось добиться работоспособности программы (по крайней мере пищания) зашифрованной программы. Но не могу добиться устойчивой работы бутлодера. Иногда после прошивки (AES-бутлодером) и после сброса программа никак не реагирует. Иногда вдруг начинает пищать спустя некоторое время . Смущает эта неопределенность. Бывало и так, что все работало сразу после загрузки. Затем повторяю те же действия (hex->encoding->update) и опять тишина.
java script:emoticon(':07:', 'smid_5')
Может быть причина в кварце? В апноте есть замечание по этому поводу установки скорости USART. Имеет ли смысл заменить кварц на 7,3728Мгц?
Сергей Борщ
Цитата(alux @ Jul 16 2007, 13:51) *
Если загрузить напрямую (без бутлодера) , все работает. Какие будут соображения?
Загрузите программу напрямую. Считайте ее обратно программатором, сохраните файл. Зашейте загрузчик без установки битов защиты. (не указывайте -L2). Зашейте с его помощью рабочую программу. Считайте память процессора программатором. Сравните файлы. Если прошивка действительно записалась, загрузите последний .hex в AVRStudio, пройдите по шагам, убедитесь, что загрузчик считает контрольную сумму прошивки и передает ей управление.
Цитата(alux @ Jul 16 2007, 13:51) *
Может быть причина в кварце? В апноте есть замечание по этому поводу установки скорости USART. Имеет ли смысл заменить кварц на 7,3728Мгц?
Если бы проблема была в кварце - у вас были бы сбои в обмене и процесс заливки заканчивался бы сообщением об ошибке.
А есть ли у вас внешняя подтяжка на кнопке PROG? Возможно просто не хватает внутренней подтяжки и вместо вашего приложения вы иногда принудительно попадаете в загрузчик? Опять же Watchdog в вашей программе используется?
alux
Цитата(Сергей Борщ @ Jul 16 2007, 17:28) *
А есть ли у вас внешняя подтяжка на кнопке PROG? Возможно просто не хватает внутренней подтяжки и вместо вашего приложения вы иногда принудительно попадаете в загрузчик? Опять же Watchdog в вашей программе используется?

Да! Действительно нет внешней подтяжки! Забыл про это. В бутлодере на кнопке PROG нет даже внутренней подтяжки. А достаточно ли внутренней подтяжки для бутлодера? Можно ли повредить порт микроконтроллера, закорачивая его на землю без подтяжки?
По-моему, в оригинальном loader.c содержится ошибка:
#if !defined(WDTCR) && !defined(__IOM8_H)
#define WDTCR WDTCSR
#endif
#if defined(__IOM16_H) || defined(__IOM32_H)
WDTCR = (7 << WDP0) | (1 << WDE);
#else
#if defined(__IOM8_H)
>>>> WDTCR = (1 << WDTOE) | (1 << WDE);
#else
>>>> WDTCR = (1 << WDCE) | (1 << WDE);
#endif
WDTCR = (7 << WDP0) | (1 << WDE);
#endif
...У меги8 нет бита WDTOE. Т.е. отмеченные строки следовало бы поменять местами. Кстати, если попытаться откомпилировать оригинальный bootldr32 компилятор (IAR 4.12A) выдаст ошибку:
Error[Pe020]: identifier "WDTCSR" is undefined D:\...\AVR231\Source Code\IAR\loader.c 137
Поэтому, я просто закомментировал кусок
// #if !defined(WDTCR) && !defined(__IOM8_H)
// #define WDTCR WDTCSR
// #endif

В основной программе WatchDog не используется. А надо ли?

Только что обратил внимание, AES bootloader занимает:
1 902 bytes of CODE memory
2 048 bytes of DATA memory (+ 9 absolute ) <<<<
Может в этом проблема?

В бутлодере в начале main функции добавил:
PORTA = (1<<PA7); // Pull-Up on the PROG
... Безрезультатно sad.gif
Сергей Борщ
Цитата(alux @ Jul 16 2007, 19:25) *
Да! Действительно нет внешней подтяжки! Забыл про это. В бутлодере на кнопке PROG нет даже внутренней подтяжки.
Возможно в описании сказано, что предполагается внешняя?
Цитата(alux @ Jul 16 2007, 19:25) *
А достаточно ли внутренней подтяжки для бутлодера?
Я бы на это не надеялся.
Цитата(alux @ Jul 16 2007, 19:25) *
Можно ли повредить порт микроконтроллера, закорачивая его на землю без подтяжки?
Если он настроен на вывод - можно. И подтяжка при этом совсем не при чем.
Цитата(alux @ Jul 16 2007, 19:25) *
По-моему, в оригинальном loader.c содержится ошибка:
Возможно в вашей версии заголовочного файла этот регистр и(или) бит называется иначе. Мне кажется я тоже наталкивался на эту ошибку.
Цитата(alux @ Jul 16 2007, 19:25) *
В основной программе WatchDog не используется. А надо ли?
Это уже вам решать. Но если не используете - проверьте фузы, вдруг он включен - тогда его надо сбрасывать, иначе сбросит он.
Цитата(alux @ Jul 16 2007, 19:25) *
2 048 bytes of DATA memory (+ 9 absolute ) <<<<
Может в этом проблема?
не вижу тут криминала. Сколько ОЗУ у вашей меге32? 2 К. вот они и заняты. И 9 SFR (указатель стека, SPMCR, PORTA, DDRA и т.д.)
Цитата(alux @ Jul 16 2007, 19:25) *
В бутлодере в начале main функции добавил:
PORTA = (1<<PA7); // Pull-Up on the PROG
... Безрезультатно sad.gif
Ну, телепатически лечить вашу систему вряд ли получится. Добавьте махание ногами в разные места программы - где она пошла на принудительный запуск загрузчика, где она пошла считать контрольную сумму, где сумма совпала и пошел запуск приложения, где сумма не совпала - и таким образом поймите, каким путем пошла программа. Если неожиданным - думайте почему, перемещайте контрольные точки
alux
Цитата(Сергей Борщ @ Jul 16 2007, 23:07) *
Но если не используете - проверьте фузы, вдруг он включен - тогда его надо сбрасывать, иначе сбросит он.

У Меги32 нет фузов, отвечающих за включение WatchDog. Нужно ли принудительно выключать WD в основной программе ?
Цитата(Сергей Борщ @ Jul 16 2007, 17:28) *
Загрузите программу напрямую. Считайте ее обратно программатором, сохраните файл. Зашейте загрузчик без установки битов защиты. (не указывайте -L2). Зашейте с его помощью рабочую программу. Считайте память процессора программатором. Сравните файлы. Если прошивка действительно записалась, загрузите последний .hex в AVRStudio, пройдите по шагам, убедитесь, что загрузчик считает контрольную сумму прошивки и передает ей управление.

Программа прошивается, считывается программатором. И что мне с ним делать? hex-файл - зашифрованный.
...Третий день топчусь на месте sad.gif IgorKossak и СергейБорщ, вы говорили, что AES-bootloader (avr231) -рабочий. У меня большие сомнения по этому поводу. Я все сделал как написано в апноте... Но безрезультатно. Не понял , как можно использовать AES-bootloader без ключей(просто как загрузчик без кодирования)? При попытке создания BootLdr.h команда:
create -c Config.txt -h BootLdr.h
выдает ощибку:
KEY parity error in 010101010101010101

java script:emoticon(':help:', 'smid_14')
Сергей Борщ
Цитата(alux @ Jul 17 2007, 14:43) *
У Меги32 нет фузов, отвечающих за включение WatchDog. Нужно ли принудительно выключать WD в основной программе ?
Действительно нет. Значит не нужно - по умолчанию он выключен.
Цитата(alux @ Jul 17 2007, 14:43) *
Программа прошивается, считывается программатором. И что мне с ним делать? hex-файл - зашифрованный.
Раз он зашифрованный - разберитесь почему. Он должен расшифроваться в процессе "заливки" и программатором вы должны считать его уже в расшифрованном виде.
Цитата(alux @ Jul 17 2007, 14:43) *
...Третий день топчусь на месте sad.gif IgorKossak и СергейБорщ, вы говорили, что AES-bootloader (avr231) -рабочий. У меня большие сомнения по этому поводу.
Сомневаться вы можете. Заходите в гости - покажу примерно 6 устройств на меге8 в которых он работает и несколько на AT91SAM7S64, LPC2214. Вы выяснили чем занимается ваш контроллер? Т.е. он передает управление вашей программе или уходит в загрузку из-за несовпавшей CRC или уходит в загрузку потому что кнопка PROG работает или обрабатывается неправильно?
Цитата(alux @ Jul 17 2007, 14:43) *
Не понял , как можно использовать AES-bootloader без ключей(просто как загрузчик без кодирования)?
Это не знаю, не было необходимости использовать его в таком режиме.
alux
Я уже было переключился на avr109. Немного потренировался с этим бутлодером. Но все же решил вернуться к AES. Как оказалось, проблема была в том, что BOOTSIZE у меня был выставлен 2048, а MEM_SIZE=28672. Надо было согласовать размеры BOOTSIZE с MEM_SIZE . Т.е. BOOTSIZE=2048, то MEM_SIZE=30720. А если BOOTSIZE=4096, то MEM_SIZE=28672. и т.д. smile.gif
Все! Спасибо, Сергей.
Сергей Борщ
Цитата(alux @ Jul 17 2007, 16:55) *
BOOTSIZE у меня был выставлен 2048, а MEM_SIZE=28672.
01.gif Я же специально смотрел даташит на 32 мегу чтобы проверить, чему соответствует
Цитата
6)Прошил в Mega32L bootldr32.hex с запрограммированными фьюзами BOOTSZ=0
В таблице 100 явно сказано 2048 words, но 2048 с вашей цифрой совпало и на words я внимания не обратил. "Какой осел" 01.gif Тогда обратите внимание, что при старте управление передается на начало boot-области, и если у вас загрузчик 2Кбайт, то надо шить BOOTSIZ=1. Уже не мы первые натыкаемся на замечательные грабли, которые нам подолжил атмел, пронумеровав программную память в словах cranky.gif
alux
Самое обидное, что если бы была подтяжка на кнопке, то проблемы бы не было. Фузы у меня вначале были правильно выставлены! Вы верно подметили, а я сам сразу должен был бы догадаться. Хотя бы по поведению бутлодера. Потом я стал экспериментировать с фьюзами bootsz, решив, что не в этом дело. a14.gif
alux
Ну это вообще!!!... Снова проблема sad.gif Начинаю вставлять "пищалки" , начиная с начала программы. Все шло нормально, пока размер кода не превысит 3045 байт. Как только размер программы превысит 3047 байт - все, опять тишина!!! 07.gif В смысле после сброса нет никаких пищалок. Что за фигня? Я снова посматриваю в сторону AVR109.

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