|
У кого-нибудь есть bootloader для mega32 и ft232rl? |
|
|
|
Feb 4 2012, 17:46
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Вам подойдёт любой бутлоадер для уарта коих подавляющее большинство. Ведь FT232RL - это преобразователь USB в уарт и обратно. На стороне ПК видится как виртуальный ком-порт. На стороне контроллера обычный уарт. Слово USB можете вообще игнорировать  Ну а алгоритм входа в загрузчик можете организовать по вашему вкусу.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 4 2012, 18:12
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Нашел вот это. Нельзя ли как-то пошагово объяснить, как все это состыковать? 1. В коде есть строки типа " #if defined _CHIP_ATMEGA128_ " нужно где-то в начале написать "#defined _CHIP_ATMEGA128_ " ? Или же компилятор CodeVision будет брать эту нформацию из настроек проекта? 2. В коде написано "Clock frequency : 7.372800 MHz". Поменяю я настройки проекта на 16 Мгц, пересчитаю настройки USART, надо ли что-то еще делать? 3. Чем программировать? МОжно ли программировать средствами COdeVision, просто указав номер порта, присвоенного FT232 ? 4. Как организовать вход в загрузку? Не могу же я заставить программу-программатор на компе слать какое-то кодовое слово, по которому запускается процесс загрузки? Извините за глупые вопросы, я в этом полный ноль, чтение информации по бутлоадерам пока что приводит в смятение...
|
|
|
|
|
Feb 5 2012, 01:45
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (zheka @ Feb 5 2012, 02:12)  1. В коде есть строки типа " #if defined _CHIP_ATMEGA128_ " нужно где-то в начале написать "#defined _CHIP_ATMEGA128_ " ? Или же компилятор CodeVision будет брать эту нформацию из настроек проекта? Вряд ли из настроек проекта. Хотя... Вы исходник под какой компилятор нашли? Обычно игроков несколько: IAR, GCC, ну еще ImageCraft. CodeVision тоже популярен... QUOTE (zheka @ Feb 5 2012, 02:12)  2. В коде написано "Clock frequency : 7.372800 MHz". Поменяю я настройки проекта на 16 Мгц, пересчитаю настройки USART, надо ли что-то еще делать? Да вроде бы этого должно быть достаточно. Хотя, нужно смотреть как бут реализован. М.б. ему что-нить от системной частоты нужно. QUOTE (zheka @ Feb 5 2012, 02:12)  4. Как организовать вход в загрузку? Не могу же я заставить программу-программатор на компе слать какое-то кодовое слово, по которому запускается процесс загрузки? Как душа пожелает  На AVR у меня при запуске (Вы же понимаете, что вначале всегда запускается бут) бутлоадер ждет в течение небольшого времени символ 's'. Если появился - входим в бут, если нет - запускаем приложение. На ARM применен "более серьезныей подход". Там в течение 5 секунд нужно нажать 'Y' для входа, либо запустится приложение. Но и бут там с командной строкой и множеством "ненужных" прибамбасов QUOTE (zheka @ Feb 5 2012, 02:12)  Извините за глупые вопросы, я в этом полный ноль, чтение информации по бутлоадерам пока что приводит в смятение... Все нормально. Глупых вопросов не бывает. Бывает глупая реакция на вопросы А вообще для AVR написать свой бут по мотивам готовых, да при поддержки даташита - не очень сложно... ИМХО (самое смешное, что бут под AVR я с нуля не писал ни разу, а вот для ARM - сделал )))) ) Прикладываю свой бут. Он под 485-й интерфейс, но это не принципиально. Должен без переделки работать на USART (ведь отличие интерфейсов только в том, что первый - полудуплекс). За качество загрузчика - простите) Не задавался целью это дело красифо оформить. Да, ну и чип там другой - ATmega8. Но, думаю, это не принципиально...
--------------------
Выбор.
|
|
|
|
|
Feb 5 2012, 07:04
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Мой под CodeVIsion. После того, как создал тему досконально проштудировал выложенный код и в прнципе, во всем разобрался. Осталось только два вопроса. 1. Чем после этого программировать-то по USB? Я прошил бут, прошил основную программу. Она точно работает, так как отправляет по USART приветствие и на отправку условного символа "<" отвечает. ПРобовал после этого в настройках CodeVision поменять номер порта програамматора на соответствующий - пытается программировать, но вытает сообщение которое обычно бывает при отсутствии ответа от МК. 2. как-то странно все работает. Поставил флажки в программе загрузки и основной программе. Когда прошиваю бут - срабатывает флажок бута и из бута программа не выходит. КОгда прошиваю основную программу - срабатывает ее флажок. В параметрах проекта бутлодера тип "bootloader" ставил, и при программмировании пишет, что прошиваю бут. Размер - 512 слов, начальный адрес бута 0xE00. ВРоде все правильно. Где копнуть, как понять где ошибка? Цитата Вряд ли из настроек проекта. Хотя... Наверное все-таки как-то из настроек проекта параметр берется: в хидере бута есть такие строки Код #elif defined _CHIP_ATMEGA32_ #define DeviceID 'E' // Mega32 #define FlashSize 'n' // Flash 32k #define PageSize 'S' // 128 Bytes #define PageByte 128 // 128 Bytes #define AddressLshift 7 #asm(".EQU SpmcrAddr=0x57") #include <mega32.h> Когда связываюсь через терминал с устройством (путем отправки "<") устройство в ответ присылает те самые символы "Ens". Вот для информации: главный цикл бутлодера: CODE // USART initialization <<< // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0xD8; UCSRC=0x86; //UBRRH=0x00; //UBRRL=0x2F; DDRD.5=1; ubbr = (unsigned long int)_MCU_CLOCK_FREQUENCY_ / (BAUDRATE * 16) - 1; UBRRH=ubbr >> 8; UBRRL = ubbr;
putchar('>'); // ПРИ ЗАПУСКЕ КОНТРОЛЛЕРА ПОСТОЯННО ШЛЕТСЯ ПРИВЕТСТВИЕ.
while ( (! (UCSRA&128)) &( i < 32000) ) i++; //wait for data in or timeout if (i < 32000) inchar= getchar(); if (inchar == '<') BootLoad(); // ПРИ ПОСЫЛКЕ ИЗ ТЕРМНАЛА УКАЗАННОГО СИМВОЛА ПРОГРАММА ЗАХОДИТ В // BootLoad, проверено установкой флажка. ExecCode(); // set up and jump to application А вот собственно функция запуска основной программы: CODE void main(void) {
void ExecCode(void) { #if defined _CHIP_ATMEGA128_ RAMPZ = 0; #endif MCUCR = 0x01; // Enable interrupt vector select MCUCR = 0x00; // Move interrupt vector to flash
//<---- ФЛАЖОК, ПОСТАВЛЕННЫЙ ЗДЕСЬ СРАБАТЫВАЕТ #asm("jmp 0x00"); // Run application code
//<---- А ФЛАЖОК, ПОСТАВЛЕННЫЙ ЗДЕСЬ УЖЕ НЕ СРАБАТЫВАЕТ, ТО ЕСТЬ ПРЫЖОК НА НУЛЕВОЙ АДРЕС ВСЕ ТАКИ ПРОИСХОДИТ. // ВОТ ТОЛЬКО ПО ЭТОМУ АДРЕСУ НИЧЕГО НЕ ВЫПОЛНЯЕТСЯ, БУТ ЗАПУСКАЕТСЯ СНАЧАЛА. }
} Что делать и кто виноват? В общем, складывается ощущение, что бутлодер пишется не на адрес 3E00, а на нулевой адрес, затирая основную программу. Потому что флажок в функции срабатывает постоянно, то есть программа бутлодера запускается вновь и вновь.
Сообщение отредактировал IgorKossak - Feb 5 2012, 09:47
Причина редактирования: [codebox]!!!
|
|
|
|
|
Feb 5 2012, 09:01
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (zheka @ Feb 5 2012, 15:04)  В общем, складывается ощущение, что бутлодер пишется не на адрес 3E00, а на нулевой адрес, затирая основную программу. Потому что флажок в функции срабатывает постоянно, то есть программа бутлодера запускается вновь и вновь. Все правильно. А как же программатор узнает, с какого адреса записать бут? Для этого в hex-файле (или любом другом), должны быть соответствующие адреса. Тут нужно линкеру объяснить, с какого адреса размещать прошивку. См. документацию на CodeVision/
--------------------
Выбор.
|
|
|
|
|
Feb 5 2012, 09:34
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
У меня в CodeVision настроено с какого адреса писать бут. См скрин. Господа интересует другое. Нормальная связка бута и программы для его прошивки. То что я скачал содержит бут. В архиве есть файл со ссылкой на модифицированный прошивальщик. Ссылка битая. Скачал я еще два архива откуда-то: MegaLoadU.rar и Bootloader.rar. В первом из них прошивальщик без кода бутлоадера. К сожалению с тем бутом, что у меня есть, не работает. Во втором код бутлоадера, и программой прошивальщика, которая не запускается. А глядя на это: CODE void BootLoad(void) { // Send chip data to the programming software so that it knows // how to format transmissions putchar(DeviceID); putchar(FlashSize); putchar(BootSize); putchar(PageSize); // "!" means all ok and send the next data if there is more putchar('!'); while(1) { PageAddress = (unsigned int)getchar() << 8; // Receive PageAddress high byte PageAddress += getchar(); // Add PageAddress low byte putchar(PageAddress); if (PageAddress == 0xffff) ExecCode(); // The windows program sends this value when finished #if defined _CHIP_ATMEGA128_ if (PageAddress >> 8) RAMPZ = 1; else RAMPZ=0; #endif PageAddress = PageAddress << AddressLshift; //essentially the same as multiply by PageSize if (GetPage()) //receive one page of data followed by a checksum byte and verify data { for (i=0;i<PageByte;i+=2) //fill temporary buffer in 2 byte chunks from PageBuffer { Pagedata=PageBuffer[i]+(PageBuffer[i+1]<<8); while (SPMCR&1); //wait for spm complete CurrentAddress=PageAddress+i; spmcrval=1; #asm movw r30, r6 ;//move CurrentAddress to Z pointer mov r1, r3 ;//move Pagedata MSB reg 1 mov r0, r2 ;//move Pagedata LSB reg 1 sts SpmcrAddr, r10 ;//move spmcrval to SPM control register spm ;//store program memory #endasm } while (SPMCR&1); //wait for spm complete spmcrval=3; //erase page #asm movw r30, r4 ;//move PageAddress to Z pointer sts SpmcrAddr, r10 ;//move spmcrval to SPM control register spm ;//erase page #endasm while (SPMCR&1); //wait for spm complete spmcrval=5; //write page #asm movw r30, r4 ;//move PageAddress to Z pointer sts SpmcrAddr, r10 ;//move spmcrval to SPM control register spm ;//write page #endasm
while (SPMCR&1); //wait for spm complete spmcrval=0x11; //enableRWW see mega8 datasheet for explanation // P. 212 Section "Prevent reading the RWW section // during self-programming #asm sts SpmcrAddr, r10 ;//move spmcrval to SPMCR spm #endasm if (CheckFlash()) putchar('!'); //all ok, send next page else putchar('@'); //there was an error, resend page } //end if (GetPage()) else putchar('@'); //there was an error ,resend page } } Возникает сильное желание написать прошивальщик самому. У кого-нибудь есть РАБОЧАЯ связка бутлодера под CodeVision и утилиты для прошивки? Или информация о том, как залить прошивку через бутлоадер средствами CodeVision?
Сообщение отредактировал IgorKossak - Feb 5 2012, 09:44
Причина редактирования: [codebox]!!!
|
|
|
|
|
Feb 5 2012, 10:14
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Более или менее разобрался. Работает и бутлоадер и основная программа, из одной в другую командами перехожу без проблем. Теперь что касается софта - я так и не нашел подходящего (для скачанного мной бута есть лишь битая ссылка на модифицированную программу). Кроме того мне будет удобно интегрировать код для перепрошивки контроллера в тот софт, что общается с устройством. Как выяснилось, алгоритм его передачи не такой уж и сложный. У меня только возник вопрос по поводу формата HEX файла: Цитата :0A000000FFFFFFFFFFFFFFFFFFFF00 :10000A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :10001A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :10002A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :10003A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :10004A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 Объясните мне, почему размер страницы 128, а вышеуказанные строки - по 17 байт? Код бутлодера, который я привел подразумевает загрузку нескольких страниц, из 128 байт и одного байта контрольной суммы. Как исходя из этого алгоритма следует читать HEX файл?
Сообщение отредактировал zheka - Feb 5 2012, 13:22
|
|
|
|
|
Feb 5 2012, 14:10
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(zheka @ Feb 5 2012, 12:14)  Теперь что касается софта - я так и не нашел подходящего (для скачанного мной бута есть лишь битая ссылка на модифицированную программу).
Кроме того мне будет удобно интегрировать код для перепрошивки контроллера в тот софт, что общается с устройством. Как выяснилось, алгоритм его передачи не такой уж и сложный. Напишите свой софт. Это просто. Цитата(zheka @ Feb 5 2012, 12:14)  У меня только возник вопрос по поводу формата HEX файла: Не проще его преобразовать в bin? И ним работать. Цитата(zheka @ Feb 5 2012, 12:14)  Объясните мне, почему размер страницы 128, а вышеуказанные строки - по 17 байт? Размер записи в файле хекс и размер страницы флэш в контроллере - величины совершенно не связанные между собой: запись в файле может быть по 1,2,-100 байт (столько, сколько сгенерит линкер). А размер страницы зависит только от чипа. И кстати вышеуказанные строки по 16 байт(опечатка?). Цитата(zheka @ Feb 5 2012, 12:14)  Как исходя из этого алгоритма следует читать HEX файл? Посмотрите формат хоть в вики.
|
|
|
|
|
Feb 8 2012, 07:11
|
Группа: Участник
Сообщений: 12
Регистрация: 1-02-06
Пользователь №: 13 852

|
|
|
|
|
|
Feb 8 2012, 17:33
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Спасибо, я уже разобрался, контроллер пашет, из программы в бут и наоборот переключается. Программу для прошивки и искать не стал, ибо задумавшись о деталях моей задачи понял, что код прошивальщика мне надо писать свой и вставлять его в основную компьютерную программу. Софт написал, обмен данными наладил. Остался один вопрос. Вот фрагмент бутлоадера: Код char GetPage(void) { char LocalCheckSum = 0; char CheckSum = 0; // The programming software generates a simple checksum in the // same fashion as below to check for data transmission errors for (j=0;j<PageByte;j++) { PageBuffer[j]=getchar(); LocalCheckSum += PageBuffer[j]; } CheckSum = getchar(); if (LocalCheckSum == CheckSum) return 1; else return 0; } То есть в бутлоадере контрольная сумма проверяется для всей страницы, длина которой для mega32 - 128 байт. А в HEX файле контрольная сумма после каждого 16 байта. Мне что делать - в прошивальщике пересчитывать контрольную сумму для каждой страницы или в бутлодыре каждые 16 байт? Или я что-то не понял... И вот : Код :10026000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :10027000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E Строки одинаковые, а контрольные суммы разные.... Как понять "сумма всех байт в строке должна быть равна нулю" ? Считать байты данных или все байты кроме двоеточия?
|
|
|
|
|
Feb 9 2012, 00:14
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (zheka @ Feb 9 2012, 01:33)  То есть в бутлоадере контрольная сумма проверяется для всей страницы, длина которой для mega32 - 128 байт. А в HEX файле контрольная сумма после каждого 16 байта. Мне что делать - в прошивальщике пересчитывать контрольную сумму для каждой страницы или в бутлодыре каждые 16 байт? Или я что-то не понял... Я полагаю, что считать КС нужно для каждой строки hex-файла, т.к. количество данных в строке может быть и меньше 16. Может ли быть больше - не знаю, не встречал. Меньше точно встречал. Ну и рамер страницы МК и размер данных строки файла ни как не связанные величины. QUOTE (zheka @ Feb 9 2012, 01:33)  И вот : CODE :10026000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :10027000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E Строки одинаковые, а контрольные суммы разные.... Как понять "сумма всех байт в строке должна быть равна нулю" ? Считать байты данных или все байты кроме двоеточия? Как это строки одинаковые? В первой строке 10026..., во второй 10027... Если Вы просуммируете все байы (0x10 + 0x02 + 0x60 + ... + 0x9e, это для первой строки), то должен получиться ноль. Считать все байты. Двоеточие это не байт))) Имейте в виду, что кроме байтов данных в hex-файле еще может содержаться служебная информация, которая непосредственно в память МК не прошивается. В общем, настоятельно рекомендую скачать документ от Intel, описывающий формат intel hex.
--------------------
Выбор.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|