Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

LPC1759 - rejestry Clocking and power control [BRAK WARTOŚCI W REJESTRACH]

25 Maj 2011 15:35 1031 7
  • Poziom 26  
    Witam wszystkich Elektrodowiczów!

    Otóż mam taki dziwny problem:

    programuje mikrokontroler LPC1768 i wszystko jest OK.
    Po przejściu na mikrokontroler LPC1759 mam problemy z ustawieniem poprawnych wartości w rejestrach "Clocking and power control", których wartości ustawiane są w funkcji void SystemInit (void) w pliku CMSISv1p30_LPC17xx\src\system_lpc17xx.c a jej wywołanie wykonane jest w pliku \nazwaprojektu\src\cr_startup_lpc175x.c.

    Mam tu na myśli głównie takie rejestry jak:

    CLKSRCSEL - źródło głównego sygnału zegarowego dla pętli PLL0
    PLL0CFG - wartości dzielnika i mnożnika pętli PLL0
    CCLKSEL - wartość dzielnika sygnału taktującego dla rdzenia mikrokontrolera
    PCLKSEL0 - wartości dzielników sygnału taktującego dla magistrali urządzeń peryferyjnych

    np.:
    - w funkcji SystemInit jest ustawiony rejestr CLKSRCSEL na 1, czyli na "main oscillator (kwarc zewnętrzny - 12 MHz)", a jak w programie int main (void) odczytam wartość tego rejestru, to okazuje się że jego wartość to 0, czyli na "internal RC oscillator (4 MHz) "

    - wartość rejestru PLL0CFG w funkcji SystemInit ustawiona jest na 0x00050063, co daje mnożnik równy 100 i dzielnik równy 6, a jak w programie int main (void) odczytam wartość tego rejestru, to okazuje się że jego wartość to 0, co jest bez sensu ponieważ wartość dzielnika nie może być równa 0...

    I sam już nie wiem :cry:. Przez to stoi mi cały soft (urządzenia peryferyjne i komunikacje szeregowe, które działają bez problemu pod LPC1768) i nie mogę ruszyć cokolwiek dalej.

    Kompiluje w LPCXpresso 3.6.3.
  • Poziom 33  
    W jaki sposób to odczytujesz?
    - w programie?
    - przez JTAG'a/SWD podczas debugowania?
    - czy przeglądając pamięć bezpośrednio w mikrokontrolerze podczas debugowania ?
  • Poziom 26  
    markosik20 napisał:
    W jaki sposób to odczytujesz?

    Ano np. tak odczytuję jak poniżej:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I jak wartość rejestru CLKSRCSEL (Clock Source Select) będzie równa 1 (main oscillator), to zapali się dioda LED na wyprowadzeniu P1.10, a jak nie, to się nie będzie równa 1, to się nie zapali. Wtedy można zmienić wartość z 0x01 na np. 0x00, 0x02 (10 - binarnie) czy 0x03 (11 - binarnie).
    I tak dla innych rejestrów. Warunek "==" można zmienić na "<",">".

    Dla innych rejestrów, gdy wartość jest w środku rejestru (np. bity od 16 do 23), no to trzeba jeszcze przesunąć w prawo ten rejestr o 16 bitów:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    PLL0CFG - konfiguracja pętli PLL0
    bity 16-23 - wartość mnożnika lub dzielnika (nie pamiętam tak dokładnie) w pętli PLL0 (8 bitów -> maska 0xFF (11111111 - binarnie))
    0x63= 99 (dziesiętnie)
  • Poziom 33  
    Oczywiście zapis do rejestrów jest jak najbardziej prawidłowy?
    Na ile MHz "puszczasz" PLL ?
    Oczywiście wiesz o tym że najpierw musisz ustawić zegary peryferii a potem podłączyć szyny do PLL?
  • Poziom 33  
    OK, też korzystam z tego pliku.
    Reasumując, wszystkie peryferia nie działają z prawidłowym zegarem?, czy tylko nie możesz odczytać wartości z rejestrów?
  • Użytkownik usunął konto