Перейти к содержанию
    

IAR Flashloader для AT91RM9200 + AM29LV160D

Да, аналогично :)

У фуджиков тоже были свои стартап'ы, но я их почти не трогал-все работало и так.

А тут без помощи не обойтись - все таки не понятно ни с .xcl, ни с cstartup.s79 - не мог бы кто нибудь поподробнее осветить это дело?

 

2VVJ- Тут буквально в пятницу в конце рабочего дня вроде заработал WIGGLER- похоже следовало поставить галку в DEBUGGER/DOWNLOAD на пункте Attach programm - стал коннектится, но это теперь до понедельника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребят, давайте мух от котлет отделять.

 

1. vvj, Если у тебя 29LV160 в 16-разрядном режиме, то забей на Bootloader. Тебе достаточно прошить код, перевести BMS в 0 и он стартанет прямо с флэшки. Только не забывай про ремэпы и что внутренняя SRAM проца будет по адресу 0x200000 и это надо указать в XCL-файле. Для 8-разрядного режима будет работать механизм Bootloader, только почитай Errata пункт 37.

 

2. Насчет cstartup.s79 и векторов. Все вектора, которые используются в приложении, будут вкомпилены в выходной файл. Если часть векторов не используется, как в вашем случае, на их местах будут нули. Для обычного приложения это штатная ситуация. Если мы хотим чтобы BootLoader признал наш код за валидное приложение, то должны прописать все вектора, а шестой еще и специальной информацией. Проще всего это сделать в cstartup.s79. Пример такого cstartup.s79 прикрепляю. Обратить внимание на код по адресу 0x14.

 

3. Насчет XCL-файла. Смею вас огорчить, но запрограммировать ARM в IAR не прописав руками XCL нереально. Справедливости ради надо отметить, что в настройках линкера есть кнопочка Command line configuration tool, но я как-то попробовал ей законфигурить и плюнув просто написал все в XCL. А необходимо это все по очень простой причине. ВЫ ДОЛЖНЫ СКАЗАТЬ КОМПИЛЯТОРУ СКОЛЬКО КАКОЙ ПАМЯТИ ПО КАКИМ АДРЕСАМ ЕСТЬ В СИСТЕМЕ И КУДА РАЗМЕЩАТЬ ВЕКТОРА ПРЕРЫВАНИЙ, СТЭКИ, СЕГМЕНТЫ КОДА И ДАННЫХ, КУЧУ. Ведь ARM может иметь довольно богатый набор различных типов памяти на борту и за бортом. Плюс тот же REMAP надо учесть. При этом, в отличии напримр от AVR, адресное пространство данных не отделено от адресного пространства программ, что дает множество возможных вариантов построения проекта. На этом месте советую почитать про сегменты в IAR-вском хэлпе.

 

4. Более того, один проект обычно содержит несколько XCL. Например, для отладки совсем не обязательно прошивать флэшки, а можно использовать для размещения кода SDRAM. При финальной же компиляции все переносится во flash. И примеров, когда надо использовать разную память в проекте, может быть множество.

 

5. Насчет Wiggler. Он хорош, если ARM для вас хобби. Но если это ваша работа, то я не понимаю как можно экономить на инструменте. Сравните стоимость фирменного J-Link и более чем вдвое дешевого MT-Link со стоимостью изготовления опытной четырех-шестислойной печатной платы для AT91RM9200 со всей его периферией !!! После подписания счета на печатные платы мой директор счет на J-Link подмахнул даже не спросив что это.

 

Кстати, Flashloader для DataFlash уже работает. Так что, сегодня-завтра еще обкатаю на предмет ошибок и в понедельник выложу.

cstartup.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как и обещал выкладываю новую версию FlashLoader-а для IAR+AT91RM9200.

Добавлена поддержка DataFlash AT45DB321 и AT45DB642. Остальные легко добавляются по аналогии. Обратите внимание на параметры, которые надо передать при запуске - они орсаны в файле !Parameters.txt.

FL_AT91RM9200_AM29_AT45.RAR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

извиняюсь за повтор но наболело: :cranky:

Закачиваю значит бинарник в SDRAM и прыгаю по 0x20000000

Начинает работать, криво правда (- медленно) - потом разберусь...

Если пишу закаченное в 16битный Flash - при BMS=0 - не начинает.

Содержимое флэша уже проверял после ресета.

Где та собака ? :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может просто неправильно инициализируешь клоки? Не забудь, что SCM для флэшки надо инициализировать до того как переходишь на высокие тактовые MCK - флэшка то поди 70 нс?

 

А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал.

Виноват - не работает из SDRAMа - это из SRAMа код начинает работать...

Потому как загружаемая прога компайлится используя тотже cstartup и .xcl для запуска из SRAM (по 0x00) - прав ли я?

Но загрузив в SDRAM прект (с ftp://at91dist:[email protected]/ "AT91RM9200-Interrupt", из архива AT91RM9200_BasicTools_IAR4_11A_1_1.zip ) скомпайленый под at91_lnk_ram20000000.xlc, тоже наблюдаю тишину. Хотя с XModema, код скомпайленый, используя at91_lnk_ram.xlc и at91_lnk_ram200.xlc "лампочками мигает".

Может я прыгаю не так: Jump((unsigned int)0x20000000);

, хотя код взят из исходников loader'а (jump.s79):

 

#include <at91rm9200dk.h>

MODULE MyJump

COMMON INTVEC:CODE:NOROOT(2)

PUBLIC Jump

Jump:

CODE32

msr CPSR_c, #(ARM_MODE_SYS | I_BIT | F_BIT)

mov pc, r0

ENDMOD

END

Кстати зачем перед прыжком там устанавливается режим процессора (или поправьте меня) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

JTAG по тебе плачет. Недавно только на дружественном этому форуме кто-то спрашивал: "И что вы там JTAGом отлаживаете?". Мне кажется что это как раз тот случай.

 

А SDRAM А.C.Пушкин инициализирует? Ну хоть убейте, но никогда не поверю, что можно вслепую это сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

JTAG по тебе плачет.
:blush:

А SDRAM А.C.Пушкин инициализирует?
Я честно говоря думал что мой "загрузчик" "оставляет" после себя (перед прыжком) проинициализарованный SDRC. Если не так, то как закаченный им в SDRAM код вообще должен считываться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну из твоих постов не было очевидно, что ты проверяешь то что в SDRAM лежит. А что значит "прыжок" в твоем понимании? Почему ты переход по адресу 0x20000000 делаешь? Там ведь вектора прерываний в начале. А в нулевом стоит команда перехода на __program_start. Ты уверен что у тебя код скомпилирован так, что __program_start в SDRAM попадает? Посмотри Memory map, там все видно будет. Возможно, тебе нужно делать "прыжок", как ты говоришь, по адресу 0x20000040. А лучше написать XCL правильно и загружать код в соответствии с этим XCL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такой вопрос:

если посмотреть на map файлы каждой из конфигураций

Debug 0x20000000\List\interrupt.map:

Absolute parts

ENTRY ADDRESS REF BY

===== ======= ======

_HEAP_SIZE 00010000

_IRQ_STACK_SIZE 00000004

_CSTACK_SIZE 00010000

RAMEND 203FFFFF

RAMSTART 20000000

ROMEND 203FFFFF

ROMSTART 20000000

 

Debug 0x200000\List\interrupt.map:

_HEAP_SIZE 00000100

_IRQ_STACK_SIZE 00000004

_CSTACK_SIZE 00000100

RAMEND 00203FFF

RAMSTART 00200000

ROMEND 00203FFF

ROMSTART 00200000

 

Debug 0x00\List\interrupt.map:

_HEAP_SIZE 00000100

_IRQ_STACK_SIZE 00000004

_CSTACK_SIZE 00000100

RAMEND 00003FFF

RAMSTART 00000000

ROMEND 00003FFF

ROMSTART 00000000

то вроде бы отвечает ожиданиям, а вот если глядеть на визуальный AddressMap из Command File Configuration Tool от Linker'а то всё одно и тоже:

0-3F Вектора, 8000-F FFFF ROM, 10 0000-7F FFFF RAM

при любой (из трёх) выбранной конфигурации!

 

и я уже не понимаю что имеется ввиду под ROMом и RAMом?

 

2. Записал 1MB c ROMа(с 0x10 0000) во FLASH и всё равно при BMS=0 не грузится. Хотя должен ли BootLoader стартануть с 16b flash'ки?

причём осциллографом видно что (при BMS0) читает после ресета - nCS0 выдаёт меандр ~5kHz в течении ~10 секунд

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну блин, когда 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот с таким XCL сможешь из FLASH стартануть, только не забудь в low_level_init SDRAM инициализировать.

Есть ну очень тупая апликейшн: только лампочками мигает - никаких там PLL,SDRAM etc.

Она работает со SRAMа закружаясь по XModem'у.

Если её скомпайлить с приведённым выше .xcl и прошить во FLASH - должна ли она работать (у меня не хочет) или необходимо сделать что-то ещё ?

cstartup сейчас default'овый - но ведь при BMS=0 никто и не "рыщит" за первыми 8ю векторами.

 

Кстати, похоже что этот Linker Command File Configuration Tool не "парсит" изменения в отредоктированном ручками .xcl - всё время показывает свои

Region: ARM

[0-3F], [800-3FFF]

что вообще ни пришей ни..

И ещё: не нашёл в своём проекте .map файлов. Ни "на диске" , ни в настройках. В скачанных с инета проектах в List директории один .map, а у меня там куча .lst и .s79ых. Настораживает однако.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И ещё: не нашёл в своём проекте .map файлов. Ни "на диске" , ни в настройках. В скачанных с инета проектах в List директории один .map, а у меня там куча .lst и .s79ых. Настораживает однако.

Посмотри настройки линкера - закладка "LIST" -> segment map,module map,static overlay map.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тебе 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include "AT91RM9200.h"
unsigned long cnt;
void main(void)
{
* AT91C_PIOA_OER=AT91C_PIO_PA0 | AT91C_PIO_PA1;
 for (int l = 0; l<10; l++)
 {
   * AT91C_PIOA_SODR=AT91C_PIO_PA0;
   * AT91C_PIOA_SODR=AT91C_PIO_PA1;
   for (cnt=0;cnt<99999;cnt++);
   * AT91C_PIOA_CODR=AT91C_PIO_PA0;
   * AT91C_PIOA_CODR=AT91C_PIO_PA1;
   for (cnt=0;cnt<99999;cnt++);
 }
}

Тупее не придумал, но даже это с флэша не грузится. Может в default'овом cstartup'е дело?

EDIT : лампочки зажглися :w00t:

 

:a14:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...