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

 
 
 
Reply to this topicStart new topic
> SAMBA (Загрузка и выполнение в ОЗУ для SAM7S), Как загружать и стартовать проект из самбы в ОЗУ без шаманства test
kumle
сообщение Oct 15 2010, 22:34
Сообщение #1


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

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Всем привет. недавно занялся ARM и сразу столкнулся с трудностью записи программы в оперативную память AT91SAM7S256 с помощью САМБЫ. На мой взгляд это очень хорошее решение так как не требует перезаписи самбы во флеш (а как известно для этого кристалла сделать это можно всего 100 раз)
Три дня побродив по просторам интернета я так и не нашел вразумительного ответа на мой вопрос и о чудо, после набора критической массы (прочитанного и собранного по крупицам материала) мне удалось наконец-то это сделать.

Итак имеем:
IAR 5.5 (линкер ilink)
Samba 2.10
Плата OLIMEX SAM7P256 с контроллером AT91SAM7S256

-Из папки примеров IAR берем basic_adc_project для платы AT91SAM7-EK (так как моей там не оказалось)
-Загружаем его в IAR
-Так как моей платы нет в списке, то и проект basic_adc_project мне особо не нужен,
поэтому я вставил туда простейшее моргание светодиодом в порту pa18
-вот кусок файла main.c с моими добавленными строками: //sasha
....
....
#define BIT18 0x00040000 //sasha

AT91PS_PIO m_pPio = AT91C_BASE_PIOA; //sasha

void Delay (unsigned long a) { while (--a!=0); } //sasha


//------------------------------------------------------------------------------
// Global functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Performs measurements on ADC channel 0 and displays the result on the DBGU.
//------------------------------------------------------------------------------
int main(void)
{
unsigned int id_channel, advalue;
char key;



m_pPio->PIO_SODR = BIT18; // Set PA18 to HIGH -> led off //sasha
m_pPio->PIO_OER = BIT18; // Configure PA8 as output //sasha

unsigned long i; //sasha

for(i = 0; i < 100000; i++) //sasha

{ //sasha
m_pPio->PIO_CODR = BIT18; //sasha
Delay(1000000); //sasha
m_pPio->PIO_SODR = BIT18; //sasha
Delay(1000000); //sasha
} //sasha



TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
printf("-- Basic ADC Project %s --\n\r", SOFTPACK_VERSION);
printf("-- %s\n\r", BOARD_NAME);
printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);
....
....

-Выбираем в окне workspace вариант at91sam7s-ek - at91sam7s256_sram
-В опциях линкера смотрим поле Entry symbol. Он равен 'resetHandler'. Запоминаем это
-Далее открываем файл скриптов линкера sram.icf и правим строчку
define symbol __ICFEDIT_region_RAM_start__ = 0x200000;
на строчку
define symbol __ICFEDIT_region_RAM_start__ = 0x202000;
-Это нужно потому что samba занимает не только флеш но и часть ОЗУ под свои нужды (переменные стек итп)
-Затем в настройках линкера ставим опцию для генерации файла xxx.map
-Делаем Make
-Открываем файл xxx.map и ищем строчку с адресом точки входа 'resetHandler'
кусок файла xxx.map
printf 0x002053e4 0x38 Code Gb printf.o [3]
putchar 0x002052cc 0x8 Code Gb trace.o [1]
resetHandler 0x002051b0 Code Gb board_cstartup_iar.o [1]
resetVector 0x00202000 Code Gb board_cstartup_iar.o [1]
strchr 0x00205570 Code Gb strchr.o [4]
strlen 0x0020515c Code Gb strlen.o [4]

-Видим что адрес входа равен 0x002051b0
-Загружаем самбу во флеш (комбинация с кнопкой tst и 10-и секундным ожиданием итп)
-Вызываем приложение Sam-ba boot assistant 2.10
-Выбираем закладку SRAM
-Указываем адрес начала 0x202000
-Выбираем файл xxx_sram.bin
-Делаем Send file
-Делаем Compare (должно совпадать)
-Внизу в окошке для команд пишем : go 0x002051b0 (это наш адрес входа)
-Наша программа должна сразу начать работать (моргает светодиод)!!!

-Чтоб повторно загрузить программу надо просто передернуть питание и перезагрузить самбу (на компе)
-Подозреваю, что есть какая то возможность проще вернуть управление к самбе но пока не изучал этот вопрос.

Спасибо за внимание, надеюсь это кому нибудь пригодиться.
Go to the top of the page
 
+Quote Post
Sinelogic
сообщение Oct 22 2010, 20:36
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 17-06-04
Из: Украина. Черкассы
Пользователь №: 49



Цитата
а как известно для этого кристалла сделать это можно всего 100 раз


А даташит пишет 10000.

10,000 Write Cycles, 10-year Data Retention Capability
Go to the top of the page
 
+Quote Post
kumle
сообщение Oct 26 2010, 11:14
Сообщение #3


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

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Цитата(Sinelogic @ Oct 23 2010, 00:36) *
А даташит пишет 10000.

10,000 Write Cycles, 10-year Data Retention Capability



Даташит то пишет, а вот что пишет errata:

4. NVM Bits: Write/Erase Cycles Number
The maximum number of write/erase cycles for Non Volatile Memory bits is 100. This
includes Lock Bits (LOCKx), General Purpose NVM bits (GPNVMx) and the Security Bit.
Not applicable to 256 KB Flash memory.

вот ссылка: http://www.atmel.com/dyn/resources/prod_do...nts/doc6173.pdf

А биты NVM перезаписываются при перезаписи самбы !

Иначе я бы и не парился с ОЗУ !

Go to the top of the page
 
+Quote Post
Alexey K
сообщение Sep 16 2011, 12:33
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220



Попытался повторить этот способ на плате AS-KIT с с установленной AT91sam7x512
Взял пример getting started для IAR выбрал кофигурацию AT91sam7x512_sram
Подправил строку в соотв icf файле
define symbol __ICFEDIT_region_RAM_start__ = 0x204000;
Собрал проект. Нашел стартовый адрес resetHandler.
Установил плату на загрузку с ROM(во флеш самбу не записываю)
Засылаю файл в память по адресу 0x204000 и даю команду go на адрес resetHangler из map файла;
Светодиод загорается и программа виснет. Когда зашиваю во флэш, включаю выключаю питание,
проект запускается, отсылает через dbgu данные, светодиоды мигает, все ок.

Подскажите в чем проблема.

Go to the top of the page
 
+Quote Post
kumle
сообщение Sep 19 2011, 06:24
Сообщение #5


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

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Вообще контроллеры SAM7S и SAM7X отличаются, может область RAM другая ?
Я вообще грузил в RAM только из-за того что ограничение по перезаписи самбы в моем контроллере.
Сейчас вообще wiggler собрал и работаю через jtag
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Sep 19 2011, 11:08
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220



Думаю неправильные параметры линкеру задаю. Поскольку тестовый проект для Keil собраля и похожим способом запустился. Придется купить PCI-LPT и спаять wiggller потому как задолбало передергивать питание.

Я с процессорами до этого не имел дел, больше vhdl и плис поэтому еще долго курить даташиты))

Сообщение отредактировал Alexey K - Sep 19 2011, 11:10
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 20 2012, 15:43
Сообщение #7


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

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Мне хотелося бы подетальнее понять момент старта процессора. Смотрите, не совсем понятно почему нужно выполнить команду перехода на адрес reset handler, я то с одной стороны понимаю, что контроллер сброса формирует прерывание при включении и обработка события происходит по вектору прерывания, от туда мы попадаем у main...Но что произойдет когда мы перейдем на адресс 0x0020 0000 ? Там дожен размещатся вектор прерываний и еще что-то...
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 22 2012, 10:12
Сообщение #8


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

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Самое интересное то, что когда я загрузил у RAM свой программу через SAMBA и запустил ее, то та часть программы когорая использовала прерывания не работала, не понятно почему?

Сообщение отредактировал Twen - Feb 22 2012, 10:12
Go to the top of the page
 
+Quote Post
kumle
сообщение Feb 22 2012, 12:29
Сообщение #9


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

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Цитата(Twen @ Feb 22 2012, 13:12) *
Самое интересное то, что когда я загрузил у RAM свой программу через SAMBA и запустил ее, то та часть программы когорая использовала прерывания не работала, не понятно почему?



В момент старта переход на вектор сброса 0x00000000, там к этому времени сидит бутлоадер SAMBA
Затем работает бутлоадер SAMBA, мы им загружаем нашу программу по адресу 0x00202000 и бутлоадер после загрузки передает ей управление, поэтому и идем туда, это никакой ни вектор а просто точка входа в нашу программу, можно еще сказать обработчик входа в программу.

Насчет того что прерывания не работают при таком запуске, то сам я не пробовал загружать так программу использующую прерывания, но думаю что они не будут работать так как адреса прерываний это 0x00000018 и 0x0000001C (для FIQ) и соответственно мы их не можем использовать так как там сидит SAMBA и она ими рулит. Как то так.

Если кто знает как победить эту проблему то буду благодарен за информацию.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:15
Рейтинг@Mail.ru


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