Forum: Mikrocontroller und Digitale Elektronik LPC1113/302 debugging


von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich versuche mich aktuell an einem LPC1113/302 und habe mir dafür ein 
LPCXpresso als Debugger geholt.
Ich möchte allerdings nicht den auf dem Board sitzenden Controller, 
sondern einen externen (auf meinem eigenen Board) befindlichen 
Controller als Target verwenden und habe deshalb den Debugger 
(LPC-Link)abgetrennt.

Die Verbindungen zwischen LPCLink und LPC113/302 habe ich so wie im 
UM10398 S.441 hergestellt(siehe Bild). Als Taktquelle soll der 
integrierte RC-Oszillator (12MHz) verwendet werden (Default) und über 
die PLL auf 48MHz erhöht werden.
Ein heruntergeteilter Takt von 8MHz soll am CLKOUTPin zu sehen sein.
Der prinzipielle Aufbau ist im Bild Aufbau.png zu sehen.

Als IDE verwende ich LPCXpresso v4.2.0 [Build 264] von CodeRed.

Als erstes Programm habe ich nur ein neues Projekt erstellt (ohne CMSIS) 
mit einer While(1) und habe versucht es zu debuggen. Die Optimierung ist 
dabei auf off (-O0) das Debugglevel auf Maximum (-g3).
Der Code ist im File main.c zu sehen.

Wenn ich nun aber mit dem Oszi an CLKOUT messe bekomme ich nicht die 
erwarteten 8MHz sondern um die 15MHz heraus. Des weiteren hängt sich 
nach einem Run der Debuger auf indem er sagt "No source available for "" 
" bzw. nach einem Singlestep kommt die Fehlermeldung "Target request 
failed: Cannot find bounds of current function".

Hat jemand eine Ahnung woran es liegen könnte, oder sieht jemand einen 
groben Fehler den ich gemacht habe?
Für konstruktive Kritik bin ich immer zu haben.

Grüße und vielen Dank
Mani

von N. M. (mani)


Lesenswert?

Ich verstehe es nicht...egal was ich in das Register SYSPLLCTRL versuche 
hineinzuschreiben, es landet immer eine 0x27 drin!
Ist das Register irgendwie Schreibgeschützt durch ein Flag oder so?

Grüße
Mani

von Scotty (Gast)


Lesenswert?

Mit einem Multi = 16 -> 16 *12 MHz = 192 MHz bist du aber auch deutlich 
über den max. 100 MHz. Versuch doch mal kleinere Multi, siehe auch Table 
46.

von N. M. (mani)


Lesenswert?

Danke für Deine Antwort.
Wie gesagt, ich habe auch schon mit verschiedenen Werten experementiert.
Von 1 bis 16, aber jedesmal steht eine 27h drin.

Grüße

von Scotty (Gast)


Lesenswert?

Keine Ursache. Würde mich auch interessieren, wie das funktioniert.
Ich habe die PLL selber noch nie benutzt, da ich aus Stromspargründen 
immer so niedrig wie nötig takte.
In einem Startup Code habe ich gefunden, daß die das Register zuerst 
lesen:
1
uint32_t regVal;
2
3
    regVal = LPC_SYSCON->SYSPLLCTRL;
4
    regVal &= ~0x1FF;
5
    LPC_SYSCON->SYSPLLCTRL = (regVal | (MAIN_PLL_P_Val<<5) | MAIN_PLL_M_Val);

Vielleicht ist das notwendig.

von Michael G. (let)


Lesenswert?

Der Bereich für FCCO geht von 156MHz bis 320MHz. Die 192MHz sind also 
ok. FCCO wird allerdings durch 2*P geteilt. Mit 0x4f für SYSPLLCTRL 
sollten also 24MHz rauskommen.

Auffällig ist an dem Code dass die PLL aktiviert wird noch bevor die 
Register gesetzt werden.

Eigentlich(tm) ist das Schema wie folgt:

1. Auswahl der Taktquelle für die PLL (SYSPLLCLKSEL), warten
2. Teiler einstellen (SYSPLLCTRL)
3. Waitstate für Flash einstellen (FLASHCFG)
4. PLL aktivieren (PDRUNCFG), warten
5. Quelle für Main clock auf PLL Ausgang, warten

Die Konfiguration für Clockout (P0.1) müsste so passen.

von N. M. (mani)


Lesenswert?

Danke euch 2. Das werde ich gleich mal testen.

>Scotty schrieb:
Das Read Modify Write werde ich gleich mal ausprobieren.

M. G. schrieb:
> Auffällig ist an dem Code dass die PLL aktiviert wird noch bevor die
> Register gesetzt werden.

Ja, das habe ich mittlerweile auch gelesen dass es ansonsten zu 
unerwarteten Spikes kommen kann. Aber auch das nachträgliche einschalten 
hatte daran nichts geändert dass in dem Register nicht das Richtige 
steht.
Ich werde es dennoch mal so ausprobieren wie Du es geschrieben hast.


Sobald ich es getestet habe melde ich mich nochmal.

Grüße und vielen Dank.
Mani

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Ok, zumindest kommt jetzt schon mal das Richtige aus dem CLKOUT.
Aber ich verstehe nicht warum!?

Im wesentlichen habe ich nur die Flashtimings eingestellt (ganz am 
Anfang) wie von M.G. geschrieben (lt. Datenblatt bei 50MHz 
3-Wait-States).
Dann habe ich ein Read-Modify-Write des SYSPLLCTRL Registers gemacht 
(wie von Scotty geschrieben).
Habe am Anfang den Wert aus dem LPCXpresso-Code genommen mit 0x23.
Der läuft zwar mit einem externen Quarz, hat aber auch 12MHz. In meinen 
Augen müsste da aber ein 0x03 oder besser ein 0x2F rein (siehe 
SYSPLLCTRL.png). Begründet durch die Datenblattangabe dass der Current 
Controlled Oszillator im Bereich von 156MHz bis 320MHz liegen soll.

Das merkwürdige ist, 0x03 und 0x23 führen zu dem selben Ausgangstakt von 
um die 8MHz!
Wie kann das sein?

Grüße
Mani

von N. M. (mani)


Lesenswert?

Das Bild oben ist FALSCH. Sorry.
Das Bit in PSEL müsste 1 weiter nach links.
Dann wäre der Wert 2 und somit der Teiler 4.
Der Hex-Wert wäre dann 0x4F.

Da Locked dann aber die PLL nicht mehr!?

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Achso, hier mal noch der Code.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.