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

 
 
> IAR Flashloader для AT91RM9200 + AM29LV160D, Выкладываю. Может кому будет полезно.
VladislavS
сообщение Jun 20 2005, 06:56
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Только начал работать с ARM и сразу на AT91RM9200. До этого имел дело c ATMega128. Потихоньку начал разбираться. Сначала во внутренней RAM простенькие программы запускал, шупал настройки и проникался масштабом бедствий. Потом дошло дело до Flashloader. Два дня отладчика и он заработал.

В эттаче FlashLoader для AT91RM9200 + AM29LV160DB(T) с исходниками.
Может кому полезно будет.

Ну и попутно вопросы созрели:

1. Помогите разобраться с тактовыми частотами. PLLB = 96 МГц c выходом 48 для USB это понятно. Все остальное буду тактировать от PLLA. Какую MCK надо подать на Memory Controller, если на нем подключено AM29LV160DB 70 нc и SDRAM с CL=2 при 100 МГц.

2. Тактовая на SDRAM равна MCK? Тогда что лучше в плане производительности
a) Процессор на 180 МГц и SDRAM на 90 МГц
б) Процессор на 100 Мгц и SDRAM на 100 МГц
Код будет исполняться из SDRAM.

3. Не совсем понял с времянкой работы FLASH на SMC. Во флэшлоадере MCK у меня 96 МГц c PLLB и все настройки SMC по умолчанию. Как это вяжется с 70 нc скоростью микросхемы AM29LV160D? Похоже, я что-то не понимаю.

4. Стоит ли стэк помещать во внутренней RAM процессора, а не в SDRAM. Получу ли я прибавку в скорости. Как к этому отнесется кэш?

Прикрепленный файл  FL_AT91RM9200_AM29LV160D.RAR ( 33.65 килобайт ) Кол-во скачиваний: 364
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
Bender
сообщение Sep 24 2005, 01:26
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Да, аналогично smile.gif
У фуджиков тоже были свои стартап'ы, но я их почти не трогал-все работало и так.
А тут без помощи не обойтись - все таки не понятно ни с .xcl, ни с cstartup.s79 - не мог бы кто нибудь поподробнее осветить это дело?

2VVJ- Тут буквально в пятницу в конце рабочего дня вроде заработал WIGGLER- похоже следовало поставить галку в DEBUGGER/DOWNLOAD на пункте Attach programm - стал коннектится, но это теперь до понедельника.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 24 2005, 06:04
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

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 ( 1.92 килобайт ) Кол-во скачиваний: 71
 
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 26 2005, 04:25
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Как и обещал выкладываю новую версию FlashLoader-а для IAR+AT91RM9200.
Добавлена поддержка DataFlash AT45DB321 и AT45DB642. Остальные легко добавляются по аналогии. Обратите внимание на параметры, которые надо передать при запуске - они орсаны в файле !Parameters.txt.
Прикрепленные файлы
Прикрепленный файл  FL_AT91RM9200_AM29_AT45.RAR ( 94.64 килобайт ) Кол-во скачиваний: 249
 
Go to the top of the page
 
+Quote Post
vvj
сообщение Sep 27 2005, 14:12
Сообщение #19


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 20-01-05
Пользователь №: 2 090



извиняюсь за повтор но наболело: cranky.gif
Закачиваю значит бинарник в SDRAM и прыгаю по 0x20000000
Начинает работать, криво правда (- медленно) - потом разберусь...
Если пишу закаченное в 16битный Flash - при BMS=0 - не начинает.
Содержимое флэша уже проверял после ресета.
Где та собака ? smile3046.gif
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 27 2005, 17:37
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал.
Go to the top of the page
 
+Quote Post
vvj
сообщение Sep 28 2005, 13:51
Сообщение #21


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 20-01-05
Пользователь №: 2 090



Цитата(VladislavS @ Sep 27 2005, 20:37)
А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал.

Виноват - не работает из SDRAMа - это из SRAMа код начинает работать...
Потому как загружаемая прога компайлится используя тотже cstartup и .xcl для запуска из SRAM (по 0x00) - прав ли я?
Но загрузив в SDRAM прект (с ftp://at91dist:distrib@81.80.104.162/ "AT91RM9200-Interrupt", из архива Прикрепленный файл  AT91RM9200_BasicTools_IAR4_11A_1_1.zip ( 572.63 килобайт ) Кол-во скачиваний: 115
) скомпайленый под 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
Кстати зачем перед прыжком там устанавливается режим процессора (или поправьте меня) ?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 28 2005, 14:18
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

А SDRAM А.C.Пушкин инициализирует? Ну хоть убейте, но никогда не поверю, что можно вслепую это сделать.
Go to the top of the page
 
+Quote Post
vvj
сообщение Sep 28 2005, 16:30
Сообщение #23


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 20-01-05
Пользователь №: 2 090



Цитата(VladislavS @ Sep 28 2005, 17:18)
JTAG по тебе плачет.
blush.gif
Цитата(VladislavS @ Sep 28 2005, 17:18)
А SDRAM А.C.Пушкин инициализирует?
Я честно говоря думал что мой "загрузчик" "оставляет" после себя (перед прыжком) проинициализарованный SDRC. Если не так, то как закаченный им в SDRAM код вообще должен считываться?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 28 2005, 18:26
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Ну из твоих постов не было очевидно, что ты проверяешь то что в SDRAM лежит. А что значит "прыжок" в твоем понимании? Почему ты переход по адресу 0x20000000 делаешь? Там ведь вектора прерываний в начале. А в нулевом стоит команда перехода на __program_start. Ты уверен что у тебя код скомпилирован так, что __program_start в SDRAM попадает? Посмотри Memory map, там все видно будет. Возможно, тебе нужно делать "прыжок", как ты говоришь, по адресу 0x20000040. А лучше написать XCL правильно и загружать код в соответствии с этим XCL.
Go to the top of the page
 
+Quote Post
vvj
сообщение Sep 29 2005, 10:17
Сообщение #25


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 20-01-05
Пользователь №: 2 090



Такой вопрос:
если посмотреть на 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 секунд
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 29 2005, 13:59
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Ну блин, когда 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
Go to the top of the page
 
+Quote Post
vvj
сообщение Sep 29 2005, 18:43
Сообщение #27


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 20-01-05
Пользователь №: 2 090



Цитата(VladislavS @ Sep 29 2005, 16:59)
Вот с таким 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ых. Настораживает однако.
Go to the top of the page
 
+Quote Post
Bender
сообщение Sep 30 2005, 05:01
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Цитата(vvj @ Sep 29 2005, 21:43)
И ещё: не нашёл в своём проекте .map файлов. Ни "на диске" , ни в настройках. В скачанных с инета проектах в List директории один .map, а у меня там куча .lst и .s79ых. Настораживает однако.

Посмотри настройки линкера - закладка "LIST" -> segment map,module map,static overlay map.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 30 2005, 05:37
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Вот тебе 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
Go to the top of the page
 
+Quote Post
vvj
сообщение Sep 30 2005, 09:50
Сообщение #30


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 20-01-05
Пользователь №: 2 090



Код
#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.gif

a14.gif
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 Текстовая версия Сейчас: 22nd July 2025 - 12:39
Рейтинг@Mail.ru


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