Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

arm AT91SAM7S64 w jaki sposób przespieszyć inicjację zegara?

WWektor 24 Wrz 2007 12:31 1604 6
  • #1 24 Wrz 2007 12:31
    WWektor
    Poziom 12  

    Niedawno uruchomiłem pierwszy raz procesor z rdzeniem arm AT91SAM7S64
    wszystko w zasadzie zadziałało poza inicjacją zewnętrznego zegara. Przeczytałem już kilka razy rozdział "Clock Generator" i dalej nic z tego nie wynika. Procesor pracuje wolno, ale nie aż tak wolno jakby pracował na Slow Clock. Program pisze w CrossStudio for ARM i z tego co się już dowiedziałem to do projektu automatycznie dołączone są pliki systemowe inicjujące zegar.
    Już próbowałem skorzystać z tych właśnie plików systemowych i tam pozmieniać parametry tak, żeby pasowało, ale niestety procesor dalej pracuje dziwnie wolno (zmiany są ale bardzo nieznaczne i niezgodne zupełnie z tym co zostało ustawione). Próbowałem też napisać własny kod inicjujący oscylator, ustawiający pętle PLL i dzielnik zegara, ale tak samo jak w poprzednim przypadku zmiany są ale bardzo nieznaczne. Wartość zwracana w rejestrze MAINF (czyli czytającym częstotliwość oscylatora) na każde 16 cykli Slow Clock wystawiana jest wartość równa około 1000 co po przeliczeniu daje prędkość oscylatora równą około 2MHz, a mój kwarc ma 12MHz i co gorsze procesor dalej pracuje gdy się mu ten kwarc odłączy :/ Przestaje pracować tylko po rozłączeniu pętli PLL.

    Czy ktoś z was miał podobne problemy? Bardzo proszę o pomoc.
    Dołączam mój kod inicjujący zegar:

    Code:

      // Włącza główny oscylator
      CKGR_MOR = (100<<8) | CKGR_MOR_MOSCEN;
      while ((PMC_SR & 0x1) < 1) {} //Czeka na stabilizację.

    // Ustawinie pętli PLL
    CKGR_PLLR = (CKGR_PLLR_PLLCOUNT_MASK & (40<<8)) | (CKGR_PLLR_MUL_MASK & (72<<16)) | (CKGR_PLLR_DIV_MASK & 2);

    while ((PMC_SR & 0x4) < 1) {}
    while ((PMC_SR & 0x8) < 1) {}  //Czeka na stabilizacje pętli i gotowość zegara

    //uruchomienie zegara bez dzielnika
    PMC_MCKR = PMC_MCKR_CSS_MASK;
    while ((PMC_SR & 0x8) < 1 ) {}

    Po takim ustawieniu zegar powinien mieć 96MHz a wygląda jakby pracował przy jakiś 3MHz.
    Gdy ustawię dzielnik tak żeby parametry mieściły się w granicach opisanych przez producenta to procesor pracuje dwa razy wolniej czyli około 1.5Mhz (te częstotliwości, 1.5MHz i 3MHz, zostały policzone ze stoperem i pustą pętlą w programie więc są bardzo przybliżone ale dające jakiś pogląd na szybkość pracy).

    0 6
  • #2 24 Wrz 2007 17:34
    piotrkopec
    Poziom 17  

    Cytat:
    CKGR_PLLR = (CKGR_PLLR_PLLCOUNT_MASK & (40<<8 )) | (CKGR_PLLR_MUL_MASK & (72<<16)) | (CKGR_PLLR_DIV_MASK & 2);

    z notki
    Cytat:
    RC Oscillator ranges between 22 kHz and 42 kHz

    40 kHz * 73 / 2 = 1460 kHz( już blisko ?)
    Cytat:
    ..est wartość równa około 1000 co po przeli...

    może 0x1000 czyli 4096
    MAINF = 4096 * 40kHz / 16 = 10240kHz... też blisko, albo coś nietak z kwarcem.. zmień go
    ja to robię tak:

    Code:

     AT91PS_PMC     pPMC = AT91C_BASE_PMC;
            // 'wait state' i opóźnienie zapisu
    AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(48 <<16)) |
    AT91C_MC_FWS_1FWS ;

     AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
            // wlaczenie 'main oscillator'-- qfartz
    pPMC->PMC_MOR = ( (AT91C_CKGR_OSCOUNT) & (0xa0 <<8)) | AT91C_CKGR_MOSCEN ;
       while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
            // ustawianie 'pll'a
    pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 105) |
                             (AT91C_CKGR_PLLCOUNT & (0x3f<<8)) |
                             (AT91C_CKGR_MUL & (352<<16)));
            // czekanie na zatrzaśnięcie pętli
            while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
            while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
             // 'prescaller' na 8
    pPMC->PMC_MCKR =  AT91C_PMC_PRES_CLK_8 ;
              while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
       
               // ustawienie 'main clock'a na pobieranie z 'pll'
    pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK  ;
        
              // wyłączenie 'prescaller'a
          pPMC->PMC_MCKR &=  ~(0x1c) ;
             while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

    i działa...
    robisz wszystko podobnie... może układ rąbnięty

    0
  • #3 24 Wrz 2007 18:32
    WWektor
    Poziom 12  

    No właśnie problem w tym, że ta wartość Mainf = 1000 to w systemie dziesiętnym jest :( I kwarc w ogóle jest ignorowany przez procesor. To wygląda trochę tak jakby jakiegoś bitu nie ustawić który byłby odpowiedzialny za dołączenie zewnętrznego kwarca. Procesor cały czas korzysta z jakiejś podstawy czasu którą sobie wewnętrznie generuje. A jak ustawie wartość MUL na niższą to nawet pętle PLL mogę odpiąć od procesora i i tak działa. Trochę to dziwne - bez pętli, bez kwarca i szybciej niż slow Clock (32kHz). Procesor w ogóle nie reaguje na wyjścia Xin i Xout (można je nawet zewrzeć do masy i nic dalej sobie pracuje).

    A tak przy okazji to jakie prędkości udało Ci się wycisnąć z procka przy jeszcze stabilnej pracy?

    Jak dobierałeś pętle PLL, ja swoją obliczałem kalkulatorem ze strony producenta, ale próbowałem też zupełnie innych wartości kondensatorów i opornika i w sumie cały czas działa tak samo (czyli przy zmianie parametrów widać nieznaczne różnice)

    0
  • #4 24 Wrz 2007 21:42
    Jj_Johnys
    Poziom 21  

    Spróbuj skorzystać z tego. Też dopiero zaczynam z arm'ami, ale próbowałem już timerów i pwm i z MCK jest wszystko OK. U mnie kwarc ma 18.432Mhz, PLL daje ponad 96Mhz, co daje ponad 48Mhz dla MCK (wszystko opisane w pliku "lowlevel.c").

    I tak jak napisałem, zakładając że MCK = 48Mhz i wg. tego wyliczając rejestry timera czy pwm wszystko się zgadzało.

    Pliki startowe zaczerpnięte ze strony atmela. Co prawda jest to dla SAM256 ale wystarczy zamienić plik z definicjami rejestrów dla Twojego SAM64 i powinno ruszyć. Zresztą, z tego co słyszałem są to identyczne układy. Różnią się tylko wielkością pamięci.

    pozdr, JnS.

    0
  • #5 25 Wrz 2007 10:08
    piotrkopec
    Poziom 17  

    Trochę to wszystko dziwne. Z tym stoperem to też nie tak, jak trzeba. Do testowania funkcjonalności najlepsze jest ręczne wklepywanie w rejestry i sprawdzanie ich. 'openocd + hyper_terminal' albo 'ocd commander'. Do sprawdzania rzeczywistych zegarów w układzie dobrze jest je wyprowadzić na zewnątrz. 'programable output clock controller'y-->PMC_PCKX z 'prescalerem' ustawionym w nich na 64 + multimetr z pomiarem częstotliwości( + ustawienie pinów na 'peripheri'um--nie zapomnieć, a i ZASILIC te kontrolery!). Próbowałeś uruchamiać procesor bez 'pll' tylko na 'main oscillator'?.
    Czym programujesz? Może procedurka 'flash'owania kombinuje coś z zegarami?
    Jeszcze jest możliwość, że panowie z 'atmel'a zrobili Ci psikusa i podmienili kabelki w bebeshkach 'sam'a:)( errata o tym nie wspomina). Posprawdzaj/podokładaj różnej maści pojemności gdzie tylko masz miejsce. I jeszcze raz spróbuj, czy układ działa na 'main oscillator'; czy po przełączeniu z 'main oscillator' na 'slow clock' jest jakaś różnica. Może Twój oscylator potrafi się rozbujać bez kryształu, wystarczą mu pojemnooporowości( możliwe???) i 'pll' potrafi się na tym zatrzasnąć.
    Przy programie działającym z 'ram'u 'sam7' ładnie działa na takich 96MHz. Do 150Mhz też dochodzi ale trudno mówić o stabilności. I dobrze znosi brak ostrożności. Bardzo fajny procesor, bardzo miły w użytkowaniu, więc nie ma sensu rwać sobie włosów przez felerną kość tylko włożyć nową. No a jeśli problem rozwiąże się... no to masz 2 'sam'y i pomysłów do kwadratu:)

    0
  • #6 27 Wrz 2007 16:14
    WWektor
    Poziom 12  

    Dziękuję wszystkim za pomoc :)
    Przyczyną był zimny lut na płytce z procesorem. Po zamontowaniu nowego procka wszystko było tak jak miało być i wtedy wnikliwa analiza poprzedniego układu wykazała zimny lut :P. Teraz mam już dwa procki. Pozdrawiam i jeszcze raz dziękuję.

    0
  • #7 16 Paź 2007 15:51
    dmneuro
    Poziom 21  

    Mam podobny problem. Rezonator 12MHz. Tylko u mnie chyba nie ma zimnych lutow a procek jakos dziwnie wolno pracuje....

    PLL mam 1.5kom + 10nF i do tego z pinu do masy 1nF. Kalkulator ze strony atmela nie dziala poprawnie na openoffice a worda nie mam. Jakie wartosci powinny miec te elementy dla czestotliwosci pracy powiedzmy 60MHz ?

    dziekuje za pomoc

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo