реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> У кого-нибудь есть bootloader для mega32 и ft232rl?
zheka
сообщение Feb 4 2012, 17:06
Сообщение #1


Гуру
******

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



Господа, долго рылся в интернете в поисках - в основном вижу варианты, где D+ и D- напрямую подключены к контроллеру.
У меня Mega32 работает в связке с FT232RL.
Реально ли как-то организовать устройство, чтобы пр программировании не перетыкать перемычку, а просто выключать основную программу, работающую с устройством и включать программу прошивальщик?
Есть ли какие-нибудь готовые бутлоадеры, работающие с FT232RL или же придется переделывать? Желательно под COdeVision

Сообщение отредактировал zheka - Feb 4 2012, 17:08
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 4 2012, 17:46
Сообщение #2


неотягощённый злом
******

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



Вам подойдёт любой бутлоадер для уарта коих подавляющее большинство.
Ведь FT232RL - это преобразователь USB в уарт и обратно.
На стороне ПК видится как виртуальный ком-порт. На стороне контроллера обычный уарт.
Слово USB можете вообще игнорироватьsm.gif
Ну а алгоритм входа в загрузчик можете организовать по вашему вкусу.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 4 2012, 18:12
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 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. Как организовать вход в загрузку? Не могу же я заставить программу-программатор на компе слать какое-то кодовое слово, по которому запускается процесс загрузки?

Извините за глупые вопросы, я в этом полный ноль, чтение информации по бутлоадерам пока что приводит в смятение...

Прикрепленные файлы
Прикрепленный файл  CVmegaload.rar ( 12.35 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 5 2012, 01:45
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 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. Как организовать вход в загрузку? Не могу же я заставить программу-программатор на компе слать какое-то кодовое слово, по которому запускается процесс загрузки?

Как душа пожелает rolleyes.gif На AVR у меня при запуске (Вы же понимаете, что вначале всегда запускается бут) бутлоадер ждет в течение небольшого времени символ 's'. Если появился - входим в бут, если нет - запускаем приложение.
На ARM применен "более серьезныей подход". Там в течение 5 секунд нужно нажать 'Y' для входа, либо запустится приложение. Но и бут там с командной строкой и множеством "ненужных" прибамбасов rolleyes.gif
QUOTE (zheka @ Feb 5 2012, 02:12) *
Извините за глупые вопросы, я в этом полный ноль, чтение информации по бутлоадерам пока что приводит в смятение...

Все нормально. Глупых вопросов не бывает. Бывает глупая реакция на вопросы rolleyes.gif rolleyes.gif rolleyes.gif
А вообще для AVR написать свой бут по мотивам готовых, да при поддержки даташита - не очень сложно... ИМХО (самое смешное, что бут под AVR я с нуля не писал ни разу, а вот для ARM - сделал )))) )


Прикладываю свой бут. Он под 485-й интерфейс, но это не принципиально. Должен без переделки работать на USART (ведь отличие интерфейсов только в том, что первый - полудуплекс). За качество загрузчика - простите) Не задавался целью это дело красифо оформить. Да, ну и чип там другой - ATmega8. Но, думаю, это не принципиально...
Прикрепленные файлы
Прикрепленный файл  m8_16MHz_485.7z ( 41 килобайт ) Кол-во скачиваний: 41
 


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 5 2012, 07:04
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 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]!!!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 5 2012, 09:01
Сообщение #6


Познающий...
******

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



QUOTE (zheka @ Feb 5 2012, 15:04) *
В общем, складывается ощущение, что бутлодер пишется не на адрес 3E00, а на нулевой адрес, затирая основную программу. Потому что флажок в функции срабатывает постоянно, то есть программа бутлодера запускается вновь и вновь.

Все правильно. А как же программатор узнает, с какого адреса записать бут? Для этого в hex-файле (или любом другом), должны быть соответствующие адреса.
Тут нужно линкеру объяснить, с какого адреса размещать прошивку. См. документацию на CodeVision/


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 5 2012, 09:34
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 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]!!!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 5 2012, 09:38
Сообщение #8


неотягощённый злом
******

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



Цитата(zheka @ Feb 5 2012, 12:34) *
CodeVision?
Очень настоятельно рекомендую отказаться от CodeVision и чем раньше вы сделаете это тем быстрее поймёте смысл моего совета.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 5 2012, 10:14
Сообщение #9


Гуру
******

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



Более или менее разобрался. Работает и бутлоадер и основная программа, из одной в другую командами перехожу без проблем.

Теперь что касается софта - я так и не нашел подходящего (для скачанного мной бута есть лишь битая ссылка на модифицированную программу).

Кроме того мне будет удобно интегрировать код для перепрошивки контроллера в тот софт, что общается с устройством. Как выяснилось, алгоритм его передачи не такой уж и сложный.

У меня только возник вопрос по поводу формата HEX файла:

Цитата
:0A000000FFFFFFFFFFFFFFFFFFFF00
:10000A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
:10001A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6
:10002A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
:10003A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
:10004A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6


Объясните мне, почему размер страницы 128, а вышеуказанные строки - по 17 байт?
Код бутлодера, который я привел подразумевает загрузку нескольких страниц, из 128 байт и одного байта контрольной суммы.
Как исходя из этого алгоритма следует читать HEX файл?


Сообщение отредактировал zheka - Feb 5 2012, 13:22
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 5 2012, 14:10
Сообщение #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 файл?

Посмотрите формат хоть в вики.
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 5 2012, 15:12
Сообщение #11


Гуру
******

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



Спасибо, я уже нашел информацию по хекс-формату, и пишу свой софт.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 5 2012, 22:57
Сообщение #12


Познающий...
******

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



QUOTE (zheka @ Feb 5 2012, 17:34) *
и утилиты для прошивки?

HyperTerminal, terraterm, minicom и др...? rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
FAV
сообщение Feb 8 2012, 07:11
Сообщение #13





Группа: Участник
Сообщений: 12
Регистрация: 1-02-06
Пользователь №: 13 852



Посмотрите проект, как раз на CodeVision http://sites.google.com/site/osamaslab/Hom...ls/spark_loader
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 8 2012, 17:33
Сообщение #14


Гуру
******

Группа: Участник
Сообщений: 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


Строки одинаковые, а контрольные суммы разные....

Как понять "сумма всех байт в строке должна быть равна нулю" ?
Считать байты данных или все байты кроме двоеточия?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 9 2012, 00:14
Сообщение #15


Познающий...
******

Группа: Свой
Сообщений: 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.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2025 - 01:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016