-
Постов
1 240 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
По поводу AT91RM9200-29lv160d.bin точно не скажу. Но вы всегда можете на сайте у автора скачать исходники и посмореть (поправить это дело).
По моему проекту на все вопросы отвечу конечно. Для начала можно почитать в iar-вском хэлпе. Я все равно лучше не напишу. :) А насчет поддерживаемых микросхем, так протокол обмена у них стандартный, а отличие только в сигнатурах. Скачиваете даташит, смотрите сигнатуру и вставляете куда надо - все элементарно.
-
В варианте 1 есть поддержка DataFlash, просто файл так называется.
А вариант 2 сейчас выложу, только форум поборю... Блин, как архив rar загрузить?
Пишет: Ошибка загрузки. У Вас нет прав для загрузки файла с таким расширением.
Что за нафиг. Я же его уже выкладывал когда-то.
Вобщем, вот этот файл. Скачаете, переименуйте расширение txt в rar.
-
Вот еще два варианта:
1. Заливаем по X-Modem вот это и шьем что угодно
http://www.ucrouter.ru/download/AT91RM9200-29lv160d.bin
2. Через IAR можно прошивать вот этим (авторство моё)
-
На AT91RM9200 это вынлядит так. Думаю все основные моменты на AT91SAM7S64 будут теми же.
//Настройка AIC AIC_IDCR=0xFFFFFFFF; //Запретим все прерывания for(unsigned int i=0; i<8; i++) AIC_EOICR=0; AIC_IECR=(1<<1); //Разрешим прерывания Source 1 ST_IER=(1<<2); //Разрешить прерывания RTTINC AIC_SVR1=(int) &Interrupt_Source1; __enable_interrupt(); void Interrupt_Source1(void) { int st_sr=ST_SR; if(st_sr&0x00000004) { //Прерывание RTC (1 раз в секунду) } } #pragma vector=0x18 __irq __arm void interrupt_handler(void) { void (*interrupt_task)(); unsigned int vector; vector = AIC_IVR; // Get interrupt vector. interrupt_task = (void(*)())vector; AIC_IVR = 0; // Acknowledge interrupt in VIC. (*interrupt_task)(); // Execute the task associated with this interrupt. AIC_EOICR=0; return; }
-
Сейчас на тебя налетят - готовься! Дело в том, что в языке программированив С регистр имеет значение. Это надо принимать как есть и пользоваться этим как преимуществом, а не боротьcя.
-
Уточните, пожалуйста, вообще нет в системе команд - команд записи в сегменты кода или из-за того, что программа обычно во flash?
Команда записи в сегмент кода есть - процессор сам себя может перепрограммировать. Но, так как адресные пространства данных и кода раздельные, у контроллера в штатных режимах работы данные в RAM, а код во FLASH. AVR это вам не ARM, зато намного проще.
-
Извини, но твоя проблема не стоит выеденного яица. Напиши весь код в теле обработчика прерывания и все. Неужели твои функции настолько ГИГАНТСКИЕ, что нельзя объединить? Не забывай - это прерывание и код должен быть очень коротким и быстрым. А если код обработчика прерывания настолько большой, что его проблемно сделать без функций, то насколько в процентном соотношении он увеличится от добавления сохранения в стек?
-
To Vic1
Уже псали, что на AVR этот номер не пройдет из-за архитектуры гарвардского типа с сегментами кода размещенными во flash.
-
в классических системах это делается немного по другому. В теле Вашего прерывания должен находиться переход (call) на адрес расположенный в оперативной памяти (строго фиксировано), где размещается еще один вызов функции (переключение на функцию) адресс которой подставляется (настраивается в данный момент времени) в зависимости от логики работы программы. Так Вы получаете расширение ресурсов своего преравания. Что касается скорости выполнения, то здесь теряется время на дополнительный вызов. На asm это реализуется просто, как это сделать корректно на 'C' - надо подумать.
С AVR это не пройдет, так как адресное пространство кода и данных раздельное и сегменты кода во flash лежать обычно.
-
киньте проект, плз, у меня что-то несколько другой код получается.
или лист программы, которую компилируете.
Вот проект.
-
Это какой версией компилятора компилировалось? Какие опции оптимизации были установлены?
Последней вестимо - 4.30a. Из опций - оптимизация по скорости или по размеру дает один и тот же результат.
-
То же от IAR. Оценивать хорошо это или плохо не бурусь.
ARM
a: DS8 4096 `b`: DS8 4096 copy0: STMDB SP!,{R4-R11} ;; Push MOV R2,#+0x80 ??copy0_0: MOV R3,R1 MOV R12,R0 LDMIA R12,{R4-R11} STMIA R3,{R4-R11} ADD R0,R0,#+0x20 ADD R1,R1,#+0x20 SUBS R2,R2,#+0x1 BNE ??copy0_0 LDMIA SP!,{R4-R11} ;; Pop BX LR ;; return main: STR LR,[SP, #-4]! ;; Push LDR R0,??main_0 ;; a ADD R1,R0,#+0x1000 BL copy0 LDR LR,[SP], #+0x4 ;; Pop BX LR ;; return ??main_0: DC32 a
Thumb
a: DS8 4096 `b`: DS8 4096 PUSH {R4,LR} MOV R2,#+0x80 ??copy0_0: MOV R4,#+0x20 ??copy0_1: SUB R4,R4,#+0x4 LDR R3,[R0, R4] STR R3,[R1, R4] BNE ??copy0_1 ADD R0,#+0x20 ADD R1,#+0x20 SUB R2,R2,#+0x1 BNE ??copy0_0 POP {R4} POP {R0} BX R0 ;; return main: PUSH {LR} LDR R0,??main_0 ;; a MOV R1,#+0x80 LSL R1,R1,#+0x5 ;; #+0x1000 ADD R1,R0,R1 BL copy0 POP {R0} BX R0 ;; return NOP ??main_0: DC32 a
-
Используй стандартный cfgm128.xcl и усё будет ок.
-
Реальные гланды :)
Вот так работает в более десятка разных устройств и мастреров, и слэйвов:
#pragma vector=USART_TXC_vect __interrupt void UTX() { PORTC&=~(1<<PC5); }; #pragma vector=USART_RXC_vect __interrupt void URX() { unsigned char RCV_data = UDR; } void SendUART(unsigned char data) { while ( !(UCSRA&(1<<UDRE)) ); PORTC|=(1<<PC5); UDR=data; };
На PC5, как нетрудно догадаться, висит R/W
-
В принципе, IAR-ом c FlashLoader-ом можно прошить любой предварительно подготовленный файл в формате simple-code. Про этот формат есть в его доках. То есть, можно скомпилить чем хочешь в бинарник, сделать несложный конвертер в simple-code и шить. Но это, по большомуу счету, извращение. Намного проще залить по X-Modem вот это http://www.ucrouter.ru/download/AT91RM9200-29lv160d.bin и шить что хочешь и куда хочешь. FlashLoader удобен когда весь проект в IAR сделан и отлаживается.
-
По директиве LDR надо просто почитать о методах адресации. Я в этом не силен.
Запись
-Z(DATA)CODE_I=RAMSTART-RAMEND -QCODE_I=CODE_ID
сделана для функций, которые при инициализации сегментов копируются из ПЗУ в ОЗУ и оттуда запускаются. В программе такие функции имеют модификатор __ramfunc.
-
При BMS=0 Flash начинается с адреса 0x00000000 и копия с 0x10000000, а SRAM c 0x00200000
При BMS=1 Flash начинается с адреса 0x10000000, а SRAM c 0x00000000 и копия с 0x00200000
Remap лучше делать, так как вектора прерываний читаются из SRAM быстрее, чем из FLASH. Кэширование это немного сглаживает, но не до конца - разница в скорости исполнения кода небольшая есть.
-
Так заработало или нет?
Народ, а FlashLoader то у кого-нибудь работает? А то может зря распинался?
-
Вот тебе XCL для "тупого апликэйшина", работающего из FLASH при BMS=0. На коком MCK твой "тупой апликэйшин" работает? На забудь перед переходом с часового кварца на основной сделать что-то типа
SMC_CSR0= (1<<13)|(1<<12)|(3<<8)|(1<<7)|5; //DWB=1 | BAT=1 | TDF=3 | WSEN | NWS=4
-carm -DRAMSTART=200040 -DRAMEND=203FFF -DROMSTART=40 -DROMEND=1FFFFF -Z(CODE)INTVEC=00-3F -Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND -Z(CODE)SWITAB=ROMSTART-ROMEND -Z(CODE)CODE=ROMSTART-ROMEND -Z(CONST)CODE_ID=ROMSTART-ROMEND -Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND -Z(CONST)CHECKSUM=ROMSTART-ROMEND //************************************************ // Data segments. //************************************************ -Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND //************************************************ // __ramfunc code copied to and executed from RAM. //************************************************ -Z(DATA)CODE_I=RAMSTART-RAMEND -QCODE_I=CODE_ID //************************************************************************* // Stack and heap segments. //************************************************************************* -D_CSTACK_SIZE=400 // -D_SVC_STACK_SIZE=10 -D_IRQ_STACK_SIZE=100 -D_HEAP_SIZE=0000 -Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND // -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMEND
-
Через его родной BootLoader по протоколу DFU не проблема - загружается. Я хотел XModem через USB пропустить.
-
Есть опыт SDRAM на 100 Мгц на AT91RM9200. Плата шестислойка со средним слоем полностью залитым GND. Без резисторов, длины линий специально не выравнивал, но по возможности короткими делал.
ЗЫ: Знаю что так делать нехорошо, просто эксперимент на стабильность.
-
Ну блин, когда BMS=0, то FLASH с адреса 0x00000000 начинается, а SRAM с 0x200000.
-DRAMSTART=200040
-DRAMEND=203FFF
-DSDRAMSTART=20000000
-DSDRAMEND=21FFFFFF
-DROMSTART=40
-DROMEND=1FFFFF
Вот с таким XCL сможешь из FLASH стартануть, только не забудь в low_level_init SDRAM инициализировать.
// INTVEC -- Exception vector table. // SWITAB -- Software interrupt vector table. // ICODE -- Startup (cstartup) and exception code. // DIFUNCT -- Dynamic initialization vectors used by C++. // CODE -- Compiler generated code. // CODE_I -- Compiler generated code declared __ramfunc (executes in RAM) // CODE_ID -- Initializer for CODE_I (ROM). // ------------- // Data segments - may be placed anywhere in memory. // ------------- // CSTACK -- The stack used by C/C++ programs (system and user mode). // IRQ_STACK -- The stack used by IRQ service routines. // SVC_STACK -- The stack used in supervisor mode // (Define other exception stacks as needed for // FIQ, ABT, UND). // HEAP -- The heap used by malloc and free in C and new and // delete in C++. // INITTAB -- Table containing addresses and sizes of segments that // need to be initialized at startup (by cstartup). // CHECKSUM -- The linker places checksum byte(s) in this segment, // when the -J linker command line option is used. // DATA_y -- Data objects. // // Where _y can be one of: // // _AN -- Holds uninitialized located objects, i.e. objects with // an absolute location given by the @ operator or the // #pragma location directive. Since these segments // contain objects which already have a fixed address, // they should not be mentioned in this linker command // file. // _C -- Constants (ROM). // _I -- Initialized data (RAM). // _ID -- The original content of _I (copied to _I by cstartup) (ROM). // _N -- Uninitialized data (RAM). // _Z -- Zero initialized data (RAM). -carm -DRAMSTART=200040 -DRAMEND=203FFF -DSDRAMSTART=20000000 -DSDRAMEND=21FFFFFF -DROMSTART=40 -DROMEND=1FFFFF -Z(CODE)INTVEC=00-3F -Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND -Z(CODE)SWITAB=ROMSTART-ROMEND -Z(CODE)CODE=ROMSTART-ROMEND -Z(CONST)CODE_ID=ROMSTART-ROMEND -Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND -Z(CONST)CHECKSUM=ROMSTART-ROMEND //************************************************ // Data segments. //************************************************ -Z(DATA)DATA_I,DATA_Z,DATA_N=SDRAMSTART-SDRAMEND //************************************************ // __ramfunc code copied to and executed from RAM. //************************************************ -Z(DATA)CODE_I=SDRAMSTART-SDRAMEND -QCODE_I=CODE_ID //************************************************************************* // Stack and heap segments. //************************************************************************* -D_CSTACK_SIZE=800 // -D_SVC_STACK_SIZE=10 -D_IRQ_STACK_SIZE=300 -D_HEAP_SIZE=4000 -Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND // -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)HEAP+_HEAP_SIZE=SDRAMSTART-SDRAMEND
-
Ну из твоих постов не было очевидно, что ты проверяешь то что в SDRAM лежит. А что значит "прыжок" в твоем понимании? Почему ты переход по адресу 0x20000000 делаешь? Там ведь вектора прерываний в начале. А в нулевом стоит команда перехода на __program_start. Ты уверен что у тебя код скомпилирован так, что __program_start в SDRAM попадает? Посмотри Memory map, там все видно будет. Возможно, тебе нужно делать "прыжок", как ты говоришь, по адресу 0x20000040. А лучше написать XCL правильно и загружать код в соответствии с этим XCL.
-
JTAG по тебе плачет. Недавно только на дружественном этому форуме кто-то спрашивал: "И что вы там JTAGом отлаживаете?". Мне кажется что это как раз тот случай.
А SDRAM А.C.Пушкин инициализирует? Ну хоть убейте, но никогда не поверю, что можно вслепую это сделать.
Ethernet 100Mbit - как получить >4МБайт/сек?
в ARM
Опубликовано · Пожаловаться
Ну 100 Мбит встроено, например, в AT91RM9200. Уточни задачу. По Ethernet прокачать 4Мбайт/cек как три пальца, а где их проц возьмет? Или куда денет?