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

 
 
> Пишем код для отладки платы + азы, RM9200
Ken@t
сообщение Aug 22 2006, 17:58
Сообщение #1


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

Группа: Свой
Сообщений: 144
Регистрация: 5-08-05
Пользователь №: 7 382



Вот сидел, читал форумы - at91, електроникс, йаха, телесиськи... . все спрашивают "а КАК".
Отвечаем (иар подразумеваю, для других компилеров товарищи добавят описание)
1. Ставим процессор +обвязку+питание и по Жтагу заливаем минимальный код для проверки работоспособности ...
2. Ставим СДРАМ и минимальным кодом проверем работоспособность памяти.
Код
unsigned int volatile *pSDRAM;
  unsigned int  wCount;
  unsigned int  wRead,
                wWrite;
  
  printf ("CPU %d MHz\n",GetCPUFrequencyMhz() );
  printf ("PCK %d MHz\n",GetPCKFrequencyMhz() );

  while (1){
    printf("-T WR- 0x00000000\n");
   pSDRAM = (unsigned int *) BASE_EBI_CS1_ADDRESS;
   for ( wCount = 0,wWrite=0x0;wCount < 0x800000;wCount ++  ){
     *pSDRAM = wWrite;
     wRead = *pSDRAM;
     if (wWrite != wRead )
       printf ("[0x%08X] = 0x%08X ( 0x%08X,0x%08X)\n",wCount,wRead^wWrite,wRead,wWrite );
     pSDRAM++;
   }
}

Здесь c помощью простого осцилографа можно определить - залипания и не пропай по линиям, конечно же, ставим сначала одну микросхему, потом другую, что бы проще отлаживать было.

далее отладили ... теперь очень хочется залить что-нибудь в SDRAM и выполнить оттуда. НО
1. Контроллер SDRAM не инициализирован
2. Частоты ПЛЛ не выставлены.
Вот здесь на помощь нам приходит инструмент Жлинка , а именно его mac файл

привожу его
Код
//---- Инициализация PLLA = 200 MHz , PLLB = 48 MHz , PCK = 100MHz
init_PLL()
{
__var     tmp,
        var;

__message("Init Clock");
__writeMemory32(0x0000FF01,0xFFFFFC20,"Memory"); // PMC_MOR: MOSCEN = 1, enable main clock
while( (( var =__readMemory32(0xFFFFFC24,"Memory")) & (0x1 << 16))  == 0 ) { };  // wait time out

// AT91C_BASE_CKGR->CKGR_PLLAR = PLLAR_Register;
__writeMemory32(0x2030BF04,0xFFFFFC28,"Memory");
tmp = 0;
while( !(( var=__readMemory32(0xFFFFFC68,"Memory")) & ( 0x1 <<  1)) && (tmp++ < 100) ) {};

var = __readMemory32(0xFFFFFC28,"Memory");
__message "PLLAR=",var;

//AT91C_BASE_CKGR->CKGR_PLLBR = PLLBR_Register;
  __writeMemory32(0x10533F0E,0xFFFFFC2C,"Memory");
  tmp = 0;
  while( !((var = __readMemory32(0xFFFFFC68,"Memory")) & ( 0x1 <<  2)) && (tmp++ < 100) ) {};


  __writeMemory32( 0x1 ,0xFFFFFC30,"Memory");

  tmp = 0;
  while( !((var = __readMemory32(0xFFFFFC68,"Memory")) & (0x1 << 3)) && (tmp++ < 100) ) {};


//  AT91C_BASE_PMC->PMC_MCKR = MCKR_Register;
  __writeMemory32(0x00000102,0xFFFFFC30,"Memory");

  tmp = 0;
  while( !((var = __readMemory32(0xFFFFFC68,"Memory")) & (0x1 << 3)) && (tmp++ < 100) ) {};


}

//----------- Инициализация SDRAM 2х8х16 (2х MT48LC8M16A2-75)
init_SDRAM ()
{
__var i;
__message("Init SDRAM");

  __writeMemory32(0xFFFF0000,0xFFFFF800 +0x0070,"Memory");
  __writeMemory32(0x0,0xFFFFF800 +0x0074,"Memory");
  __writeMemory32(0xFFFF0000,0xFFFFF804,"Memory");      
  i = __readMemory32(0xFFFFFF60,"Memory");
  __writeMemory32(i|(0x1 << 1),0xFFFFFF60,"Memory");
  __writeMemory32( 0x0 ,0xFFFFFF64,"Memory");


__writeMemory32( 0x2A99C255,0xFFFFFF98,"Memory");

__writeMemory32(0x02,0xFFFFFF90,"Memory");
__writeMemory32(0x0,0x20000000,"Memory");
__writeMemory32(0x04,0xFFFFFF90,"Memory");

for(i=0;i<8;i++)
  __writeMemory32(0x0,0x20000000,"Memory");
__writeMemory32(0x3,0xFFFFFF90,"Memory");
__writeMemory32(0x0,0x20000000,"Memory");

__writeMemory32(0x610,0xFFFFFF94,"Memory");
__writeMemory32(0x00,0x20000000,"Memory");
__writeMemory32(0x0,0xFFFFFF90,"Memory");
__writeMemory32(0x0,0x20000000,"Memory");
}


execUserPreload()
{

init_PLL();
__writeMemory32(0xAAAAAAAA,0x00000000,"Memory");
  if(__readMemory32(0x00000000,"Memory") != 0xAAAAAAAA)
  {
    __writeMemory32(0x01,0xFFFFFF00,"Memory");    // MC_RCR: toggle remap bit
  }
init_SDRAM ();
  __message("Target init macro complete");
}


теперь можите компилить код с загрузкой в сдрам и выполнять его отуда.
Замечу , что с адреса 0х0 распологается SRAM и в стартап коде надо перенести в область 0х0 - 0х38
вектора прерывания.
пример стартапа at91_cstartup.s79
Код
        MODULE    ?RESET
;        COMMON    INTVEC:CODE:NOROOT(2); Я убрал, линкер подразумевает эту секцию с 0 , но её мы будем копировать в SRAM
            RSEG    ICODE:CODE:NOROOT(2)
                PUBLIC  __program_start
        EXTERN    ?cstartup
;        EXTERN    undef_handler, swi_handler, prefetch_handler
;        EXTERN    data_handler, irq_handler, fiq_handler
        CODE32; Always ARM mode after reset    
ADRSTART:
        org    0x00+ADRSTART
__program_start
        ldr    pc,=?cstartup; Absolute jump
        org    0x04+ADRSTART
undef_handler:
        ldr    pc,=undef_handler
        org    0x08+ADRSTART
swi_handler:
        ldr    pc,=swi_handler
        org    0x0c+ADRSTART
prefetch_handler:
        ldr    pc,=prefetch_handler
        org    0x10+ADRSTART
data_handler:
        ldr    pc,=data_handler
        org    0x18+ADRSTART
    ldr pc, [pc,#-0xF20]  ; IRQ : read the AIC
        org    0x1c+ADRSTART
fiq_handler:
        ldr    pc,=fiq_handler

; Constant table entries (for ldr pc) will be placed at 0x20
        org    0x20+ADRSTART
        LTORG
;        ENDMOD    __program_start
                ENDMOD


;---------------------------------------------------------------
; ?CSTARTUP
;---------------------------------------------------------------
        MODULE    ?CSTARTUP

        RSEG    IRQ_STACK:DATA(2)
        RSEG    SVC_STACK:DATA:NOROOT(2)
        RSEG    CSTACK:DATA(2)
        RSEG    ICODE:CODE:NOROOT(2)
        PUBLIC    ?cstartup
        EXTERN    ?main

; Execution starts here.
; After a reset, the mode is ARM, Supervisor, interrupts disabled.


        CODE32
?cstartup

; Add initialization nedded before setup of stackpointers here


; Initialize the stack pointers.
; The pattern below can be used for any of the exception stacks:
; FIQ, IRQ, SVC, ABT, UND, SYS.
; The USR mode uses the same stack as SYS.
; The stack segments must be defined in the linker command file,
; and be declared above.
                mrs     r0,cpsr                        ; Original PSR value
                bic     r0,r0,#MODE_BITS                  ; Clear the mode bits

.... дальше как было


понятно , что в lowlevelinit пишите перемещение области памяти 0х2000000 - 0х20000038 на 0 адрес
или прямо в стартапном коде перемещение делаете.
хотя можно и использовать TTB для ремпаирования, но это вы дальше будете делать...


--------------------
Свет мой зеркальце, скажи, да всю правду расскажи я ль на свете всех тупее, бесполезней и пьянее?
Ты - придурок. Спору нет! Но живет на белом свете вот ТАКИХ еще две трети!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dron_Gus
сообщение Jan 20 2007, 16:48
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(aaarrr @ Jan 16 2007, 22:28) *
В TRM на ARM7TDMI есть пример генератора псевдослучайной последовательности с использованием barrel shifter'а.


Носом не ткнете? А то мне что-то не найти...


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 20 2007, 21:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Dron_Gus @ Jan 20 2007, 16:48) *
Носом не ткнете? А то мне что-то не найти...


Вот цитата из мануала:
Код
4.18.2 Pseudo-random binary sequence generator
It is often necessary to generate (pseudo-) random numbers and the most efficient
algorithms are based on shift generators with exclusive-OR feedback rather like a
cyclic redundancy check generator. Unfortunately the sequence of a 32 bit generator
needs more than one feedback tap to be maximal length (i.e. 2^32-1 cycles before
repetition), so this example uses a 33 bit register with taps at bits 33 and 20. The basic
algorithm is newbit:=bit 33 eor bit 20, shift left the 33 bit number and put in newbit at
the bottom; this operation is performed for all the newbits needed (i.e. 32 bits). The
entire operation can be done in 5 S cycles:
; Enter with seed in Ra (32 bits),
Rb (1 bit in Rb lsb), uses Rc.
;
TST Rb,Rb,LSR#1; Top bit into carry
MOVS Rc,Ra,RRX; 33 bit rotate right
ADC Rb,Rb,Rb; carry into lsb of Rb
EOR Rc,Rc,Ra,LSL#12; (involved!)
EOR Ra,Rc,Rc,LSR#20; (similarly involved!)
; new seed in Ra, Rb as before


И пример использования C + Asm:
Код
extern randtest(u_int *start_addr, u_int word_count, u_int *seed);

void ramtest(u_int address, u_int word_count)
{
    static u_int addr;
    static u_int seed[0x02] = {0xdeadbeef, 0xcafedeca};
    u_int pass = 0x00, fcount = 0x00;

    addr = address;
    while(0x01)
    {
        printf("%d:%d Testing RAM...", pass, fcount);
        if(randtest(&addr, word_count, seed) == 0x00)
        {
            pass++;
            printf ("Passed.\n\r");
        }
        else
        {
            fcount++;
            printf("Failed at 0x%08x, Exp: 0x%08x; Rcv: 0x%08x\n\r", addr, seed[0x00], *(volatile u_int *)addr);
            addr = address;
        }
    }
}

+
Код
        EXPORT    randtest

        AREA    code0, CODE, READONLY

randtest
        stmfd    sp!, {r4-r6, lr}
        ldmia    r2, {r4, r5}
        ldr        r6, [r0]
        mov        r7, r1
0
        tst        r5, r5, lsr #0x01    ; to bit into carry
        movs    r12, r4, rrx        ; 33-bit rotate right
        adc        r5, r5, r5            ; carry into LSB of a2
        eor        r12, r12, r4, lsl #0x0c; (involved!)
        eor        r4, r12, r12, lsr #0x14; (similarly involved!)

        str        r4, [r6], #0x04
        subs    r7, r7, #0x01
        bne        %B0

        ldmia    r2, {r4, r5}
        ldr        r6, [r0]
1
        tst        r5, r5, lsr #0x01    ; to bit into carry
        movs    r12, r4, rrx        ; 33-bit rotate right
        adc        r5, r5, r5            ; carry into LSB of a2
        eor        r12, r12, r4, lsl #0x0c; (involved!)
        eor        r4, r12, r12, lsr #0x14; (similarly involved!)

        ldr        r12, [r6], #0x04
        cmp        r12, r4
        bne        %F2
        subs    r1, r1, #0x01
        bne        %B1
        stmia    r2, {r4, r5}
        mov        r0, #0x00
        ldmfd    sp!, {r4-r6, pc}
2
        sub        r6, r6, #0x04
        str        r6, [r0]
        stmia    r2, {r4, r5}
        mov        r0, #0x01
        ldmfd    sp!, {r4-r6, pc}

        END


Только нужно учитывать, что диагностика в этом тесте может не сработать: ошибка будет зафиксирована в любом случае, но при повторном чтении *(volatile u_int *)addr может вернуть правильный результат.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ken@t   Пишем код для отладки платы + азы   Aug 22 2006, 17:58
- - Ruslan1   Спасибо! Интересно почитать. Ты рассказал как ...   Aug 25 2006, 10:50
|- - Ken@t   О , добрался до Москвы. здесь холодно и не уютно....   Sep 13 2006, 17:04
|- - Ruslan1   Цитата(Ken@t @ Sep 13 2006, 20:04) О , д...   Sep 14 2006, 06:52
|- - Ruslan1   Цитата(Ken@t @ Sep 13 2006, 20:04) О , д...   Sep 27 2006, 18:08
|- - AlexMad   Цитата(Ken@t @ Sep 13 2006, 17:04) Сначал...   Jan 14 2007, 23:57
- - LeonY   Если мы пишим программы, так же как и сообщения,...   Sep 13 2006, 18:52
- - Playnet   Цитата(Ken@t @ Aug 22 2006, 17:58) printf...   Jan 11 2007, 15:43
- - AlexMad   ЦитатаВот сидел, читал форумы - at91, електроникс,...   Jan 14 2007, 01:06
- - Dron_Gus   ЦитатаВопрос чисто дурацкий, где копать, житагом с...   Jan 14 2007, 14:57
- - AlexMad   И ещё дурацкий вопрос: как, имея МТ-линк залить в ...   Jan 15 2007, 09:35
- - Dron_Gus   Предлагаю пообщаться на предмет проверки памяти. ...   Jan 16 2007, 20:55
|- - aaarrr   Цитата(Dron_Gus @ Jan 16 2007, 20:55) Воз...   Jan 16 2007, 21:34
- - Dron_Gus   Почитал описание ядра - все кэши отключены после с...   Jan 16 2007, 21:51
- - Dron_Gus   Да. И зачем что-то изобретать. rand() + srand()   Jan 16 2007, 22:06
- - Dron_Gus   Эм... А rand() дает ту же последовательность, если...   Jan 16 2007, 22:19
|- - makc   Цитата(Dron_Gus @ Jan 16 2007, 22:19) Эм....   Jan 16 2007, 22:22
|- - aaarrr   Цитата(Dron_Gus @ Jan 16 2007, 22:19) Эм....   Jan 16 2007, 22:28
- - Playnet   Какой смысл тестить рандом? Лучше всего посмотреть...   Jan 17 2007, 23:59
|- - aaarrr   Цитата(Playnet @ Jan 17 2007, 23:59) Како...   Jan 18 2007, 03:12
|- - Newegor   Цитата(aaarrr @ Jan 18 2007, 02:12) Цитат...   Jan 18 2007, 12:27
|- - Playnet   Цитата(aaarrr @ Jan 18 2007, 03:12) Цитат...   Jan 18 2007, 13:01
|- - aaarrr   Цитата(Playnet @ Jan 18 2007, 13:01) Это ...   Jan 18 2007, 13:37
- - Dron_Gus   Вот тут вымучил. Явно бажное. Но все мои извраты с...   Jan 18 2007, 17:39
- - AlexMad   Извините за тупость, ноЦитатаВот отсюда и вниз ht...   Jan 24 2007, 00:42
- - Dron_Gus   А вы перекинули А12 и А14? У Вас же память с 13 би...   Jan 24 2007, 22:23


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:17
Рейтинг@Mail.ru


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