Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Przykładowe projekty dla ARMów

Freddie Chopin 12 Jun 2009 14:00 100284 341
  • #1
    Freddie Chopin
    MCUs specialist
    Na swojej stronie ( www.freddiechopin.info ) w dziale Download > ARM > Przykłady umieszczone zostały dwa przykładowe projekty pod Eclipse - jeden dla NXP LPC2103, drugi dla ST STM32F103RB. Przykłady te (w założeniu) są dopełnieniem artykułu ze strony o nazwie ARM toolchain - tutorial (na stronie w dzale Artykuły > ARM, dyskusja na forum - https://www.elektroda.pl/rtvforum/topic1313509.html), a więc w dużej części bazują na przedstawionych tam schematach postępowania. W projektach zawarte są wszystkie podstawowe pliki - Makefile, skrypt linkera, startup, tablica wektorów. Do tego skonfigurowane skróty do debuggowania (External Tool oraz Debug Configuration). W kodzie głównym, poza miganiem diodką z ustalaną prędkością, znajduje się podstawowa konfiguracja systemu, taka jak aktywacja wszelkich akceleratorów pamięci Flash oraz ustawienie przy pomocy PLL maksymalnej prędkości rdzenia. Projekty w katalogu doc/ zawierają kompletną dokumentację wygenerowaną w Doxygen, na podstawie której łatwiej będzie je modyfikować do własnych potrzeb.

    Załączone do przykładów pliki Makefile do 100% poprawnego działania wymagają kilku plików z GNU Coreutils (poza make: echo, mkdir, rm, sh). Instalator dla systemu Windows z podstawowymi plikami znaleźć można również na mojej stronce w dziale Download > Programy > Coreutils. Pliki te dostępne są również w pakiecie WinAVR. Bez wymienionych plików konieczne jest ręczne stworzenie w projekcie folderu dla generowanych plików (domyślna nazwa tego folderu zawarta jest w Makefile w linii OUTPUT_DIR = ./out/ ) lub kompilowanie bezpośrednio do folderu głównego (wystarczy ustawić brak katalogu - OUTPUT_DIR = ).

    Wszelkie uwagi dotyczące tych kodów, jak i paczki z GNU Coreutils, wrzucajcie tutaj, jako komentarze do newsa o tych przykładach na stronie, lub poprzez forumlarz kontaktowy na stronie. Proszę też o kontakt jeśli ktoś chciałby pomóc w stworzeniu takich przykładów dla innych układów z rdzeniem ARM (AT91SAM, ADuC, STR7, STR9, LM, ...) - ze swojej strony pomogę jak tylko będę mógł.

    4\/3!!

    Moderated By And!:

    Temat podlinkowany w postach przyklejonych

  • #2
    Freddie Chopin
    MCUs specialist
    Przykładowe projekty dla procesorów NXP LPC2103 i ST STM32F103RB umieszczone na mojej stronie w dziale Download > ARM > Przykłady, doczekały się nowej wersji. Zmiany wprowadzone do przykładów dotyczą głównie tych elementów, o istnieniu których łatwo zapomnieć - tablicy wektorów, skryptu linkera, pliku Makefile, pliku startup.

    Lista najważniejszych zmian:
    - wsparcie dla C++ w skrypcie linkera, pliku Makefile i pliku startup (włączane w pliku Makefile zmienną USES_CPP),
    - zmiana w pliku Makefile i / lub w skrypcie linkera powoduje ponowną kompilację źródeł i / lub linkowanie obiektów,
    - tablica wektorów i funkcja __Default_Handler() w C, a nie w assemblerze,
    - zmiana skrótu do OpenOCD na odpowiedni dla aktualnej wersji 0.2.0,
    - pomniejsze zmiany w nazwach, formatowaniu, itp.,
    - (LPC2103) skróty do GDB zawierają opcje, dzięki którym debuggowanie jest bardziej niezawodne,
    - (STM32) pliki nagłówkowe zawarte w folderze inc/ pochodzą z stm32f10x_stdperiph_lib v.3.1.0 (najnowsza wersja).

    Wyjaśnienia może wymagać kwestia zwiększenia niezawodności debuggowania LPC2103. Sprawa jest skomplikowana, więc przedstawię ideę jedynie w skrócie. Ze względu na mechanizmy zastosowane przez producenta układów z serii LPC2xxx procesor rozpoczynający sesję debuggowania wykonał już pewną część wgranego kodu. Nie jest możliwe pełne zresetowanie układu i natychmiastowe zatrzymanie rdzenia. Jeśli w kodzie włączany jest MAM lub PLL, to na początku sesji debuggowania na 99% będą one już włączone (rdzeń zdążył już wykonać kod odpowiedzialny za uruchomienie tych peryferiów). Z tego względu podczas debuggowania mogą występować nieoczekiwane i bezsensowne błędy, a procesor może zachowywać się w sposób nieprzewidywalny. Skróty do GDB, które zawarte są obecnie w przykładach, za pomocą komend OpenOCD wyłączają zarówno MAM jak i PLL przed rozpoczęciem sesji (co oczywiście nie wyklucza możliwości ponownego ich włączenia w kodzie), dzięki czemu problemy te nie powinny występować.

    4\/3!!
  • #3
    Anonymous
    Level 1  
  • #4
    Freddie Chopin
    MCUs specialist
    To nie są adresy, tylko skompilowana postać instrukcji assemblerowych z tabelki powyżej. To jedyny sposób (który znam), aby zrobić dla ARM7 tabelę wektorów w C.

    Przerwania nie działają Ci z dwóch powodów:

    1. W skrypcie linkera standardowo ustawione są zerowe rozmiary stosu dla innych trybów niż User

    2. W LPC2478 adres rejestru VicVectAddr jest inny niż dla LPC2103. W LPC2103 jest to 0xFFFF F030, w LPC2478 - 0xFFFF FF00.

    Aby rozwiązać sprawę z punktu 2. musisz podstawić za instrukcję "ldr pc, [pc, #-0xFF0]" postawić odpowiednik dla LPC2478 - "ldr pc, [pc, #-0x120]". Innymi słowy - zastąp "0xe51ffff0" wartością "e51ff120". Jeśli chcesz sam to sprawdzić to wpisz sobie gdzieś w main:

    asm volatile ("ldr pc, [pc, #-0x120]");

    Swoją drogą chętnie poznam opinię na temat tak trickowej realizacji tablicy wektorów [;

    4\/3!!
  • #5
    Anonymous
    Level 1  
  • #6
    Freddie Chopin
    MCUs specialist
    Po pierwsze - WSZYSTKO jest w komentarzu powyżej tej tabeli, tam jest podana postać assemblerowa - jak sobie ją skompilujesz, to otrzymasz DOKŁADNIE taki sam efekt.

    atom1477 wrote:
    Ja pierniczę. Nawet przeszło mi to przez myśl, ale od razu to odrzuciłem bo nie sądziłem że ktoś inny niż ja jest w stanie coś takiego zrobić. A co dopiero Ty, zwolennik uniwersalności i ułatwiania sobie życia ;p

    Ułatwiłem sobie życie, bo plik jest w C <: Pozatym dla Cortex-M3 już jest to normalnie, bez takich cudów - jedynie ARMv4 wymaga takich akrobacji.

    Quote:
    Poza tym nie sądziłem że liczba 4-ro bajtowa zmieści się w 4-ro bajtowym rozkazie ;p Ale teraz się domyślam że jest tam tylko młodsza połówka albo coś jeszcze krótszego.

    Tam jest tylko offset, bo zastosowane jest adresowanie pośrednie z offsetem.

    Quote:
    Tylko nie rozumiem dlaczego 5 pierwszych wektorów jest takich samych. Chyba powinny być inne. No chyba że po prostu nie ma dedykowanej obsługi tych wektorów i dlatego są przekierowane do jednego miejsca.

    Takie same są rozkazy "załaduj do PC adres znajdujący się X bajtów dalej. Logicznym jest, że rozkaz taki umieszczony pod adresem 0 załaduje wartość znajdującą się pod 0 + X, natomiast rozkaz pod adresem 4 załaduje do PC adres z komórki 4 + X. Wszystko jest w najlepszym porządku.

    Quote:
    No i dopiero się zczaiłem że te adresy podane w nocie katalogowej to są adresy umieszczenia wektorów, a nie adresy wektorów ;p

    W architekturze ARMv4 w zasadzie nie są to typowe "wektory", czyli adres funkcji obsługi, tylko są to rozkazy które wykona rdzeń po wystapieniu wyjątku.

    Quote:
    Ten VicVectAddr to ten uniwersalny rejestr do którego trzeba wpisać dowolną wartość podczas wychodzenia przerwania? Nie wiedziałem że on jeszcze do czegoś służy. No to zaraz sprawdzę.

    Wszystko jest w datasheecie...

    Quote:
    A jak wyliczyłeś te liczby? Bo nie widzę związku pomiędzy 0xFFFFF030 a -0x0FF0 i pomiędzy 0xFFFFFF00 a -0x0120. Ani to przesunięcie (bo różne w obydwu przypadkach) ani zapis liczby ujemnej (bo też się nie zgadza).

    To jest przesunięcie względem aktualnej wartości PC (z tym że lekko większej, bo pipeline):
    0xFFFFFF00 + 0x0120 = 0x20
    0xFFFFF030 + 0x0FF0 = 0x20

    Quote:
    No na moje oko trochę naciągany ten sposób. Czy ma to jakieś specjalne zalety poza małą wadą że jest trochę ciężej zedytować adres?

    Podstawowe pytanie brzmi - po co edytować adres? Ta tabela nie wymaga żadnych zmian, nigdy i pod żadnym pozorem... Jeśli chcesz obsłużyć przerwanie, to po prostu piszesz w kodzie funkcję o odpowiedniej nazwie - np:
    void Data_Abort_Handler(void) __attribute__ ((interrupt("ABORT")));
    void Data_Abort_Handler(void)
    {...}

    Quote:
    A nie dało się jakoś umieścić stałych w pamięci programu pod określonym adresem?

    Są umieszczone w pamięci pod określonym adresem.

    Quote:
    Przy okazji: zawsze jak się ktoś o to pyta to słyszy odpowiedz że to podstawa C i jak ktoś tego nie wie to powinien się podszkolić a nie pytać o to na forum. No ale podszkalam się i podszkalam a nadal tego nie wiem. Mianowicie jak umieścić tablice stałych w pamięci programu? Najlepiej pod określonym adresem. Oczywiście stałe mają być w określonej kolejności. Na przykład jakaś tablica RGB, czyli jakiś obrazek.

    Nie wiem jakie ma zastosowanie ustawienie danych pod konkretnym adresem. Ustawienie ich "po prostu" w pamięci programu jest za pomocą "const" - to chyba oczywiste.

    Ustawienie pod konkretnym adresem jest bardziej skomplikowane, ale z grubsza podobne do metody jaka zastosowana jest dla tablicy wektorów.

    4\/3!!
  • #7
    Anonymous
    Level 1  
  • #8
    Freddie Chopin
    MCUs specialist
    atom1477 wrote:
    A to z const to mnie zaskoczyłeś. Zwykle takie stałe (w Delphi czy BASCOMie) nie są nigdzie umieszczane, lecz sobie po prostu są w kodzie źródłowym. A do pamięci programu trafiają w rozkazy assemblera a nie bezpośrednio jako bajt w pamięć programu.
    Np:
    
    const a = 10;
    If a < b Then
    …
    


    A mi chodziło o coś takiego raczej:
    
    db 10;
    …
    


    Ale jeżeli w C const załatwia te dwie rzeczy na raz to tym lepiej ;p

    W C może być dokładnie tak samo, bo dla podanego przez ciebie przykładu umieszczanie danych w pamięci, a nie bezpośrednio w rozkazie, nie ma najmniejszego sensu z punktu widzenia optymalizacji - używasz jedynie wartości, więc użycie tej wartości, a nie konkretnej komórki pamięci (którą trzeba adresować, odczytywać itp.), jest szybsze, mniejsze i wygodniejsze.

    Jeśli wg kompilatora będzie potrzeba wstawienia zmiennej fizycznie w pamięć (gdy np gdzieś używasz ich adresu, albo odwołanie znajduje się w innej jednostce kompilacji niż definicja), to kompilator zrobi to co trzeba...

    4\/3!!
  • #9
    Anonymous
    Level 1  
  • #10
    Freddie Chopin
    MCUs specialist
    Dobra, zrozumiałem swój błąd <:

    Może taka tablica wektorów - też jest w C <:

    
    static void __vectors(void) __attribute__ ((used, naked, section(".vectors")));
    static void __vectors(void)
    {
    	asm volatile(
    		" ldr	pc, Reset_Vector			\n"	// "Reset" vector
    		" ldr	pc, Undefined_Vector		\n"	// "Undefined instruction" vector
    		" ldr	pc, SWI_Vector				\n"	// "Software interrupt (SWI)" vector
    		" ldr	pc, Prefetch_Abort_Vector	\n"	// "Prefetch Abort (instruction fetch memory abort)" vector
    		" ldr	pc, Data_Abort_Vector		\n"	// "Data Abort (data access memory abort)" vector
    		"	.word 	0						\n"	// Reserved vector (code signature)
    		" ldr	pc, [pc, #-0xFF0]			\n"	// "IRQ" vector
    		" ldr	pc, FIQ_Vector				\n"	// "FIQ (fast interrupt)" vector
    
    		" Reset_Vector:						"
    		"	.word	Reset_Handler			\n"	// Reset
    		" Undefined_Vector:					"
    		"	.word	Undefined_Handler		\n"	// Undefined instruction
    		" SWI_Vector:						"
    		"	.word	SWI_Handler				\n"	// Software interrupt (SWI)
    		" Prefetch_Abort_Vector:			"
    		"	.word	Prefetch_Abort_Handler	\n"	// Prefetch Abort (instruction fetch memory abort)
    		" Data_Abort_Vector:				"
    		"	.word	Data_Abort_Handler		\n"	// Data Abort (data access memory abort)
    		" FIQ_Vector:						"
    		"	.word	FIQ_Handler				\n"	// FIQ (fast interrupt)
    	);
    }
    


    Wszystko widać, łatwo zmienić, żadnych kosmosów, działa na każdym poziomie optymalizacji itp.
    __________________________________

    Zaktualizowaną wersję przykładu dla LPC2103 wrzuciłem na stronę. Zmieniłem tablicę wektorów na taką jak widać wyżej, dodałem komentarz z wektorem IRQ dla dwóch różnych typów LPC (nowych i starych), oraz drobne kosmetyczne poprawki w funkcji __Default_Handler(), która obecnie jest z atrybutem "noreturn".

    4\/3!!
  • #11
    Anonymous
    Level 1  
  • #12
    Freddie Chopin
    MCUs specialist
    używasz skrótów do GDB które są w najnowszym przykładzie? Komendy do OpenOCD wyłączają profilaktycznie PLL i MAM po resecie. Bez tego miałem dokładnie taki sam problem jak opisujesz (oraz kilka innych, jeszcze bardziej kosmicznych).

    Assemblera znam niezbyt wiele, zwykle nie ma się po co go uczyć, bo nikłe szanse abyś był lepszy niż kompilator w 99% przypadków. Im bardziej procesor skomplikowany, tym kompilator lepszy (bo potrafi uwzględnić czynniki, o których nawet nie śniło się zwykłym ludziom).

    4\/3!!
  • #13
    Anonymous
    Level 1  
  • #14
    Freddie Chopin
    MCUs specialist
    atom1477 wrote:
    Nie. Wciąż jadę na starych przykładach i zmieniłem w nich tylko ten adres.
    Dodatkowo kilkanaście razy przekompilowywałem kod i wgrywałem go do procesora i działał. Po którymś przeprogramowaniu raptem przestał. I teraz jak już wiem o co chodzi to jadę na kodzie bez PLL.

    Po za tym to zawsze muszę dwa razy przeprogramować. Po pierwszym przeprogramowaniu procesor nie wstaje (tzn. nie uruchamia programu - programowanie działa). Odłączam kabel od programatora, zwieram VCC do GND na kilka sekund żeby mieć pewność że procesor się zresetuje (oczywiście po wcześniejszym odłączeniu zasilania). Nie, muszę przeprogramować drugi raz (nawet mogę bez odłączania zasilania. Po prostu dwa razy i dopiero odłączyć zasilanie) i dopiero wstaje. I tak było jak jeszcze PLL działało i teraz jest tak samo.
    Tak samo mam ze wszystkimi procesorami LPC2478. Zawsze kilkadziesiąt programowań przechodzi gładko, a później trzeba po dwa. A może po prostu programowanie nie idzie bezbłędnie i dlatego trzeba „poprawiać”? Tylko że przed każdym programowaniem jest kasowanie więc taka naprawa zawartości pamięci i tak by nic nie dała.

    Brzmi kosmicznie, więc może to być efekt MAM albo PLL - spróbuj skrótów do GDB z najnowszej wersji przykładów - powinno pomóc, jeśli nie całkiem, to choć częściowo. Jednym z efektów tych "cudów" było to, że procek pracuje źle, tak jakby wykonywał jakieś złe rozkazy, więc znów brzmi jak Twój opis. Z PLL nie warto rezygnować, tak samo z MAM, ale warto po resecie upewnić się, że faktycznie są wyłączone [;

    Quote:
    Co do assemblera. Trzeba strasznie znać się na C żeby napisać taki kod który potem zostanie mocno zoptymalizowany przez kompilator.
    Mi chodzi na przykład o szybką konwersję RGB-->YCrCb.
    Coś czuję że szybciej wyjdzie mi to w assemblerze.
    Oczywiście będzie ciężko, bo w ARMach na czas wykonywania się programu wpływa też sekwencja rozkazów a nie osobne czasy wykonywania się każdego rozkazu. Gdzieś wyczytałem że na przykład rozkaz NOP może w ogóle nie zająć żadnego cyklu, bo zostanie wchłonięty pomiędzy jakieś dwie dłuższe instrukcje i zginie gdzieś w środku potoku.
    Ale specjalnie na assemblera się nie porywam. Jak na razie faktycznie w C pisze się mi dość wygodnie. Ma problemy ze zrozumieniem pewnych rzeczy (szczególnie jak analizuje nie swój kod), ale jeszcze nie trafiłem na coś czego nie można zrobić. A w innych językach to owszem. A jeszcze jak stopień optymalizacji faktycznie będzie taki wysoki to już na pewno assemblerem się nie zajmę ;p

    Nie jest tak źle - wbrew pozorom jak starasz się optymalizować kod w C na siłę, to potem:
    a. nie wiadomo o co chodzi,
    b. kompilator nie potrafi tego zoptymalizować bardziej.

    Prosty i przejrzysty kod zwykle jest zoptymalizowany wystarczająco [;

    "Premature optimization is the root of all evil" - warto poczytać w necie o tej frazie, bo można spojrzeć na sprawę z innej perspektywy [;

    4\/3!!
  • #15
    Anonymous
    Anonymous  
  • #16
    Freddie Chopin
    MCUs specialist
    albertb wrote:
    Ta nowa wersja jest lepsza

    Chyba nikt nie lubi skompilowanej postaci assemblera <: Niezły kosmos stworzyłem <: Dobrze że dla STM32 nie trzeba takich kombinacji...

    Quote:
    przejście na C miałoby w/g mnie sens wtedy, gdybyś poszedł za ciosem i wyeliminował startup.s. Inaczej to sztuka dla sztuki.

    To jest w planie dla kolejnej wersji - 1.2.0 <;

    4\/3!!
  • #17
    markosik20
    Level 33  
    atom1477 wrote:
    Po za tym to zawsze muszę dwa razy przeprogramować. Po pierwszym przeprogramowaniu procesor nie wstaje (tzn. nie uruchamia programu - programowanie działa).


    No widzę że nie tylko ja tak mam :wink:.. Z braku czasu i trochę lenistwa nie drążyłem tematu i nie szukałem przyczyny takiego zachowania.
  • #18
    Freddie Chopin
    MCUs specialist
    No to spróbujcie skrótów do GDB które są w najnowszej wersji przykładu do LPC2103 - myślę, że powinny naprawdę pomóc choć trochę! Aktualnie nawet na liście OpenOCD ten temat jest "na tapecie", więc im więcej doświadczeń tym lepiej.

    4\/3!!
  • #19
    Anonymous
    Level 1  
  • #21
    Anonymous
    Level 1  
  • #22
    markosik20
    Level 33  
    Moje Eclipse + reszta załogi (LPC2364) chyba toporne jest :wink:.
    Pomysł z plikami .lunch do bezpośredniego wgrania u mnie nie funkcjonuje, więc musiałem "ręcznie" przeczytać tego xml.
    Mam nadzieje że o to chodziło

    target remote localhost:3333
    monitor reset
    monitor soft_reset_halt
    monitor mwb 0xE01FC040 0x01
    monitor mwb 0xE01FC000 0
    monitor mwb 0xE01FC080 0
    monitor mwb 0xE01FC08C 0xAA
    monitor mwb 0xE01FC08C 0x55
    load


    Niestety rdzeń się "wykłada":
    Quote:
    275 monitor mwb 0xE01FC08C 0x55
    &"monitor mwb 0xE01FC08C 0x55\n"
    monitor mwb 0xE01FC08C 0x55
    @"timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: 0\n"
    timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: 0
    @"Runtime error, file \"command.c\", line 469:\n"
    Runtime error, file "command.c", line 469:
    @" "
    @"\n"

    275^done
    (gdb)
    276 load
    &"load\n"
    load
    &"Error erasing flash with vFlashErase packet\n"
    276^error,msg="Error erasing flash with vFlashErase packet"
    Error erasing flash with vFlashErase packet
    (gdb)


    U siebie muszę zrobić
    monitor reset halt
    żeby w ogóle mówić o programowaniu
  • #23
    Freddie Chopin
    MCUs specialist
    No i zgadza się, bo w pliku właśnie tak jest - bez soft_reset_halt. Zrobiłeś jakąś wariację na temat tych dwóch, a ich zawartość MUSI być różna.

    Do programowania powinno być tak:

    
    monitor reset halt
    monitor mwb 0xE01FC040 0x01
    monitor mwb 0xE01FC000 0
    monitor mwb 0xE01FC080 0
    monitor mwb 0xE01FC08C 0xAA
    monitor mwb 0xE01FC08C 0x55
    load
    


    Anyway - zasadnicze pytanie jest takie, czy tego typu uruchomienie programowania pomaga?

    P.S.

    podaje od razu wartość dla "debuggowania bez programowania":

    
    monitor reset
    monitor soft_reset_halt
    monitor mwb 0xE01FC040 0x01
    monitor mwb 0xE01FC000 0
    monitor mwb 0xE01FC080 0
    monitor mwb 0xE01FC08C 0xAA
    monitor mwb 0xE01FC08C 0x55
    


    4\/3!!
  • #24
    markosik20
    Level 33  
    Freddie Chopin wrote:

    Anyway - zasadnicze pytanie jest takie, czy tego typu uruchomienie programowania pomaga?



    U mnie w zasadzie niestety nie.
    W przypadku LPC2144 wystarczy

    monitor reset halt
    load 


    gdzie konfiguracja MAM, PLL itd. jest zrobiona w startup.s.

    W LPC2364 (gdzie PLL już jest w main.c) w sumie też działa.....ale muszę dwa razy to wykonać żeby "się dobrze wgrało" .

    ______________________________________________________
    No i się wyjaśniło....w pliku .cfg przy odpalaniu OpenOCD zamiast

    
    .....
    .....lpc2000_v2 4000 calc_checksum
    ...


    trzeba było zmienić na
    
    .....
    .....lpc2000_v2 14765 calc_checksum
    ...


    Mała zmiana i problemy znikneły jak ręką odjął.
  • #25
    Freddie Chopin
    MCUs specialist
    1. U mnie samo "reset halt" i "load" w większości przypadków działało... do czasu gdy działać nagle przestało [; A kod różnił się jedynie tym, że main i Reset_Handler były 4 adresy dalej... Czasem działało, czasem nie, z wyłączaniem PLL i MAM przy rozpoczęciu sesji (na razie) działa zawsze.

    2. Nie wiem czy zmiana którą zrobiłeś jest dobra - w końcu po resecie procesor działa na wewnętrznym oscylatorze 4MHz właśnie...

    4\/3!!
  • #26
    markosik20
    Level 33  
    Freddie Chopin wrote:

    Nie wiem czy zmiana którą zrobiłeś jest dobra - w końcu po resecie procesor działa na wewnętrznym oscylatorze 4MHz właśnie...


    Ważne że działa prawidłowo :wink:, wszak po resecie nie następuje automatyczne zerowanie wszystkiego i rdzeń sobie dalej hula na PLL....wykonywany jest tylko kod od początku.

    Sprawdziłem to wszystko z PLL i bez PLL....bez problemu się z targetem można łączyć.
  • #27
    Freddie Chopin
    MCUs specialist
    markosik20 wrote:
    Ważne że działa prawidłowo :wink:, wszak po resecie nie następuje automatyczne zerowanie wszystkiego i rdzeń sobie dalej hula na PLL....wykonywany jest tylko kod od początku.

    Powód jest inny. Podczas resetu wszystkie rejestry są zerowane. Tyle że jak chcesz debuggować, to JTAG resetuje procka, czeka chwile, zatrzymuje go i ustawia reejstr PC na 0 (software'owy reset). Do momentu zatrzymania rdzenia procek już włączył sobie PLL i MAM - stąd większość problemów.

    4\/3!!
  • #28
    markosik20
    Level 33  
    Freddie Chopin wrote:
    Podczas resetu wszystkie rejestry są zerowane.


    Ale tylko te podstawowe r0->r14 ? Bo jeżeli tak to przecież rejestry od PLL są w przestrzeni peryferii więc PLL działa.
  • #29
    Freddie Chopin
    MCUs specialist
    Wszystkie rejestry peryferyjne przyjmują wartości opisane w datasheecie przez "reset value" - zwykle zero. Zarówno rejestry PLL jak i MAM mają jako "reset value" wpisane zero.

    Za przykład niech posłuży jakiś inny rejestr, choćby ADCR (rejestr ten NIE jest modyfikowany w kodzie wgranym do pamięci):

    
    Open On-Chip Debugger
    > reset run
    JTAG tap: lpc2103.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ve
    r: 0x4)
    JTAG Tap/device matched
    > halt
    target state: halted
    target halted in ARM state due to debug-request, current mode: User
    cpsr: 0x80000010 pc: 0x00000138
    > mdw 0xE0034000 1
    0xe0034000: 00000000
    > mww 0xE0034000 0xFFFFFFFF
    > mdw 0xE0034000 1
    0xe0034000: 0fefffff
    > reset halt
    JTAG tap: lpc2103.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ve
    r: 0x4)
    JTAG Tap/device matched
    srst pulls trst - can not reset into halted mode. Issuing halt after reset.
    target state: halted
    target halted in ARM state due to debug-request, current mode: User
    cpsr: 0x80000010 pc: 0x0000012c
    > mdw 0xE0034000 1
    0xe0034000: 00000000
    >
    


    Domyślny stan PLLa i MAM po resecie to "wyłączony" - często są włączone z powodu opisanego w drugim poście (ostatni akapit), co powoduje problemy.

    4\/3!!
  • #30
    Anonymous
    Anonymous