Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прошивание Spartan3 с помощью AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
StanislavF
Здравствуйте.

На плате использую два Spartan3, которые прошиваются с помощью AVR Atmega2561, последовательно, один за другим. Использую WinAVR 2010****. В заголовочном файле в массиве размещаю сам код для ПЛИС. При компиляции кода компилятор ругается:
./sensor_part.h:4227: error: size of array is too large
В коде:
CODE
unsigned char xsf_buf0[] PROGMEM ={0xFF.......

Этот массив -- и есть прошивка для ПЛИС, файл bin.

Можно ли как-то по другому прошивать ПЛИС с помощью AVR? Возможно, без использования массивов.

Буду очень благодарен за советы и личный опыт.
Polaris
Цитата(StanislavF @ Jan 15 2010, 17:37) *
./sensor_part.h:4227: error: size of array is too large

Так видимо не влезает во флэш выбранного контроллера
Цитата(StanislavF @ Jan 15 2010, 17:37) *
unsigned char xsf_buf0[] PROGMEM ={0xFF.......

По поводу WinAVR я не сильно знаю, а вот в IAR в случае, когда флэш-массив выходил за 32 кб вроде бы вместо __flash использовалась директива __farflash. Возможно, WinAVR тоже как-то аналогичен, но врать не буду.
Цитата(StanislavF @ Jan 15 2010, 17:37) *
Можно ли как-то по другому прошивать ПЛИС с помощью AVR? Возможно, без использования массивов.

Естественно, самый очевидный способ - поставить туда какую-то микросхему внешней флэш (AT45DBxxx), стоит копейки, корпус можно взять небольшой, а объемы вполне адекватные, записать ее предварительно на каком-то программаторе, читать мегой по SPI и писать. Заодно и мегу можно взять поменьше, вряд ли там расход ног будет значительным.
Если делать универсальнее, то написать приложение на компьютер, которое будет высылать прошивку на мегу через виртуальный COM-порт, поставить FT232RL и использовать внутренний UART. Понятно, нужно будет какую-то защиту протокола обеспечить. Но тогда компьютер понадобится, не выйдет универсального решения.
Так что стоит, наверное, обратить внимание на ARM. LPC1768 имеет на борту 512 кб, судя по тому, что раньше хватало 256 кб, запас есть. И перешивать его довольно легко через встроенный загрузчик по COM-порту. Тут и универсально будет, и автономно...
SysRq
http://www.nongnu.org/avr-libc/user-manual...#faq_binarydata

--

Я делаю так (ПЛИС не помню, МК - ATMega128):

Файл *.cmd с командами на конвертирование исходного бинарного файла (у меня - fpga_zeroconfig.rbf, 77655 байт) в объектный (fpga_zeroconfig.o):
Код
@echo Creating relocatable object file with data for FPGA:

@avr-objcopy -v --rename-section .data=.progmem.data,contents,alloc,load,readonly,data -I binary -O elf32-avr fpga_zeroconfig.rbf fpga_zeroconfig.o
@avr-objdump -t fpga_zeroconfig.o
@avr-size fpga_zeroconfig.o

@pause

Далее я его тупо указываю линкеру в Makefile проекта:
Код
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) fpga_zeroconfig.o

И использую где надо:
Код
extern PGM_P _binary_fpga_zeroconfig_rbf_start;
extern PGM_P _binary_fpga_zeroconfig_rbf_end;

//...

uint32_t sz = GET_FAR_ADDRESS(_binary_fpga_zeroconfig_rbf_end) - GET_FAR_ADDRESS(_binary_fpga_zeroconfig_rbf_start);

//...
for(uint32_t i = 0; i < sz; i++)
    {
        // = pgm_read_byte_far(GET_FAR_ADDRESS(_binary_fpga_zeroconfig_rbf_start) + i);        
    }

Макрос GET_FAR_ADDRESS взят на avrfreaks.
Qwertty
Цитата(StanislavF @ Jan 15 2010, 18:37) *
Можно ли как-то по другому прошивать ПЛИС с помощью AVR? Возможно, без использования массивов.

А чем вызвано желание конфигурить FPGA именно мегой? Может внешнюю еепром поставить? Заодно и мега будет поменьше и подешевле, ведь именно Atmega2561 почти наверняка выбиралась из расчета хранения спартановских прошивок во флеши. Я угадал?
StanislavF
Цитата(SysRq @ Jan 15 2010, 19:43) *

Спасибо. Я модифицировал код. Компиляция проходит успешно. Но avrdude ругается на адрес:
Код
avrdude -p atmega2561 -P lpt1     -c stk200    -U flash:w:main.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9802
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: ERROR: address 0x100010 out of range at line 4098 of main.hex
avrdude: write to file 'main.hex' failed

Чтобы скомпилировать я закомментировал ifdef перед PCMSK2 в файле iomxx0_1.h, но тем не менее. В чём может быть проблема. Я прикрепил исходные файлы, взгляните, если будет возможность.

Что касается аппаратуры, то плата уже есть, мне лишь с ней работать.
SysRq
Ответ об avrdude автору темы дали тут: http://www.avrfreaks.net/index.php?name=PN...ic&p=659695

PS: в вашем проекте sensor_part.bin уже является объектным. Так и должно быть, или ошиблись в процессе?..
Student Pupkin
Цитата(SysRq @ Jan 15 2010, 19:43) *
Я делаю так (ПЛИС не помню, МК - ATMega128):
Файл *.cmd с командами на конвертирование исходного бинарного файла

А вариант написать простенькую консольную програмку, конвертирующую файл прошивки в заголовочный h-файл не рассматривали?
SysRq
Цитата(Student Pupkin @ Jan 20 2010, 22:39) *
А вариант написать простенькую консольную програмку, конвертирующую файл прошивки в заголовочный h-файл не рассматривали?
В avr-gcc ограничение в 64к на размер массива, так что не всегда получится (собстно, с этого эта тема и началась).
defunct
Цитата(Student Pupkin @ Jan 20 2010, 21:39) *
конвертирующую файл прошивки в заголовочный h-файл не рассматривали?

Вот чего не надо делать так это конвертировать бинарник в h-файл. Header файл не предназначен для того чтобы в нем хранить данные.
конвертировать надо в .c файл, и использовать по месту с помощью extern.

Цитата
В avr-gcc ограничение в 64к на размер массива,

ну так сделать два массива, простенькая консольная программа, думаю без труда сможет посчитать до 65535 и затем создать второй массив.
aaarrr
А еще лучше данные той же консольной программой упаковать, благо FPGA-битстримы достаточно хорошо "утаптываются".
StanislavF
Цитата(SysRq @ Jan 20 2010, 18:06) *
PS: в вашем проекте sensor_part.bin уже является объектным. Так и должно быть, или ошиблись в процессе?..

После Xilinx ISE я получаю bit и bin файлы. Использую второй, чтобы конвертировать в elf32-avr и компоновать потом с прошивкой для AVR. Проблема с аресом решиласт обновлением дудки (avrdude) до 5.10.

У меня прошивка процессора проходит, но ПЛИС никаких сигналов не подаёт и XSP_DONE не приходит. Их там ещё и две, но сейчас только первую программирую. Какие средства и способы вы можете подсказать, чтобы понять что идёт не так? Возможно, в Xilinx требуется поставить специальные флаги. Читаю спецификации, но нити не нахожу.
aaarrr
Попробуйте порядок следования битов поменять.
SysRq
И еще:
Цитата
DriveDone, DONE
If set to Yes, this option allows the FPGA’s DONE pin to drive High when configuration completes. By default, the DONE is an open-drain output and can only drive Low.

В МК подтяжка не включена. А есть ли в железе, и каково состояние DriveDone, вам виднее rolleyes.gif
XVR
Startup Clock в iMPACT'е правильно назначен?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.