SAM7S + SAM-BA — Загрузка и выполнение в RAM

SAM-BA (Загрузка и выполнение в ОЗУ для SAM7S)

Вот в этой теме один из участников форума задал вопрос — «sam-ba и sam7s, не хочется каждый раз перезписывать sam-ba во флеш» — http://electronix.ru/forum/index.php?showtopic=81515

На что я ему ответил что лучше для тестовых программок писать в ОЗУ. И проще и быстрее.

И вот тут тот же человек,немного разобравшись дал развернутый ответ в теме — «SAM-BA (Загрузка и выполнение в ОЗУ для SAM7S), Как загружать и стартовать проект из самбы в ОЗУ без шаманства test» — http://electronix.ru/forum/index.php?showtopic=81665

Где он показывает как это делать под компилятором IAR-ARM.

Привожу полную цитату:

Всем привет. недавно занялся 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 (это наш адрес входа)
-Наша программа должна сразу начать работать (моргает светодиод)!!!

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

Спасибо за внимание, надеюсь это кому нибудь пригодиться.

Надеюсь это Вам пригодится, и для кого то может оказаться новой информацией.

Добавить комментарий