Forum: Mikrocontroller und Digitale Elektronik UART LPC2148


von Random .. (thorstendb) Benutzerseite


Lesenswert?

Moin & guten morgen,

wer kennt sich mit dem UART des LPC aus ?

Ich habe mir mit Hilfe einer Beispiel-Routine und dem User-Manual
folgende uart_init zusammeggestrickt:


void init_uart(int baud)
{
  int baud_tmp=0;

    //switch ON RxD and TxD with PinSelect (see Manual Page 75)
    bit_on(PINSEL0, 0);
  bit_off(PINSEL0, 1);
  bit_on(PINSEL0, 2);
  bit_off(PINSEL0, 3);

  // fract. baud off ??
  U0FDR = (0 << DIVADDVAL);
  U0FDR = (1 << MULVAL);

    // Divisor Latch Access Bit setzen (DLAB)
    // damit erhalten wir zugriff auf den Baudraten-Teiler
    bit_on(U0LCR, DLAB);

  baud_tmp = CLK / (16 * baud) * 1.3;

  U0DLL = baud_tmp % 256;
  U0DLM = baud_tmp / 256;

  bit_on(U0LCR, 0);  // 8 bit data
  bit_on(U0LCR, 1);

  bit_off(U0LCR, 2);  // 1 stop

  bit_off(U0LCR, 3);  // parity disable
  bit_off(U0LCR, 4);  // parity select (odd)
  bit_off(U0LCR, 5);  // parity select
  bit_off(U0LCR, 6);  // Break Control
  bit_off(U0LCR, 7);  // Divisor Latch Access Bit

  bit_on(U0TER, 7);  // TX enable
}


Allerdings läuft die nicht ohne diesen "Korrekturfaktor" von 1.3:

baud_tmp = CLK / (16 * baud) * 1.3;


Weiss jemand, was ich in der Berechnung oder grundsätzlich falsch mache
?

CLK ist der Quarz im System mit 12MHz, Baud-Rate ist 57600.

Diese Routine ist nur zum Senden per UART, der RX-INT kommt noch
hinzu.


Greetz,
/th

von A.K. (Gast)


Lesenswert?

Wert von CLK falsch?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

#define CLK 12000000 ...

oder muss da das berücksichtigt werden, was die pll draus macht ?

Ich stecke - was ARM betrifft - leider noch ziemlich in den
Kinderschuhen ...

greetz,
/th

von Random .. (thorstendb) Benutzerseite


Lesenswert?

PLL wird lt. Keil Compiler Startup folgendermassen eingestellt:

MSEL: 5
PSEL: 2

Greetz,
/th

von A.K. (Gast)


Lesenswert?

Passt so nicht:

MSEL=5: M=6
PSEL=2: P=4

Fcco = Fosc  2  M * P = 12MHz  2  6 * 4 = 576MHz
(erlaubt: 156-320MHz)

CCLK = Fcco / (2 * P) = 576MHz / 8 = 72MHz

Dazu kommt dann noch der VPB Divider, den aus dem Prozessortakt CCLK
den I/O-Takt PCLK macht. Die UART Baudrate leitet sich aus PCLK ab.

Die ARM Taktung ist ein ziemlich komplexes Kapitel.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi,

danke für den Tip!

Die o.g. Werte sind aus dem Keil Startup-Wizzard übernommen, und von
Kile automatisch eingestellt worden.

Dies ist der Auszug aus der zugehörigen startup.s:

; VPBDIV definitions
VPBDIV          EQU     0xE01FC100      ; VPBDIV Address

;// <e> VPBDIV Setup
;// <i> Peripheral Bus Clock Rate
;//   <o1.0..1>   VPBDIV: VPB Clock
;//               <0=> VPB Clock = CPU Clock / 4
;//               <1=> VPB Clock = CPU Clock
;//               <2=> VPB Clock = CPU Clock / 2
;//   <o1.4..5>   XCLKDIV: XCLK Pin
;//               <0=> XCLK Pin = CPU Clock / 4
;//               <1=> XCLK Pin = CPU Clock
;//               <2=> XCLK Pin = CPU Clock / 2
;// </e>
VPBDIV_SETUP    EQU     0
VPBDIV_Val      EQU     0x00000000


; Phase Locked Loop (PLL) definitions
PLL_BASE        EQU     0xE01FC080      ; PLL Base Address
PLLCON_OFS      EQU     0x00            ; PLL Control Offset
PLLCFG_OFS      EQU     0x04            ; PLL Configuration Offset
PLLSTAT_OFS     EQU     0x08            ; PLL Status Offset
PLLFEED_OFS     EQU     0x0C            ; PLL Feed Offset
PLLCON_PLLE     EQU     (1<<0)          ; PLL Enable
PLLCON_PLLC     EQU     (1<<1)          ; PLL Connect
PLLCFG_MSEL     EQU     (0x1F<<0)       ; PLL Multiplier
PLLCFG_PSEL     EQU     (0x03<<5)       ; PLL Divider
PLLSTAT_PLOCK   EQU     (1<<10)         ; PLL Lock Status

;// <e> PLL Setup
;//   <o1.0..4>   MSEL: PLL Multiplier Selection
;//               <1-32><#-1>
;//               <i> M Value
;//   <o1.5..6>   PSEL: PLL Divider Selection
;//               <0=> 1   <1=> 2   <2=> 4   <3=> 8
;//               <i> P Value
;// </e>
PLL_SETUP       EQU     1
PLLCFG_Val      EQU     0x00000024


Kannst Du mir ein Tutorial empfehlen, welches ARM startup sowie die
Taktungsgeschichte gut erklärt ?


Greetz,
/th

von A.K. (Gast)


Lesenswert?

Ok, wenn man annimmt, dass mit Keils "MSEL" eigentlich M und mit
"PSEL" eigentlich P gemeint ist, kommt CCLK=60MHz raus. Der VPB
Divider steht von Haus aus auf 4, d.h. PCLK=15MHz. Dazu passt auch
deine Beobachtung.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

I forgot ...
(schade, dass man seine Beiträge hier nicht editieren kann g)

Ich würde gerne vom startup.s weggehen, und keine vorkonfigurierten
Sachen nutzen, d.h. den Controller in der Main selber aufsetzen
(ähnlich wie man das bei den AVRs macht)

a) geht das ?
b) wenn ja, dann ziele ich darauf mit der obigen Frage nach einem
Tutorial ab ;-)


THX & Greetz,
/th

von A.K. (Gast)


Lesenswert?

Sicherlich kann man die Startup selber definieren, wobei mir nur die GCC
Varianten WINARM/GNUARM vertraut sind, nicht Keil. Macht da über kurz
oder lang wohl jeder, weil anders als bei AVR keine wirklich
universelle Version dabei ist.

Allerdings wurde schon berichtet, dass bei falscher Konfiguration die
PLL abrauchen kann (wenn Fcco zu hoch).

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Ist das denn von compiler zu compiler so dermassen unterschiedlich ?

Bei AVR setze ich ja am anfang über die Synonyme der Register die
Grundparameter (z.B. Portzugriff etc.)
Das lässt sich dann auch überall compilieren ...

Sieht das bei den ARM-Compilern immer anders aus ? Es muss doch auch
die Möglichkeit geben, eine allgemeine Lösung zu schreiben, die
compilerunabhängig ist.

Beim AVR finde ich es sehr schön, am Anfang der Main eine gut
dokumentierte Abfolge von bit_on/off sowie REGISTER=0xff usw. zu haben,
das ist übersichtlich und leicht zu konfigurieren.


So etwas in der Art schwebt mir auch für den LPC bzw. andere ARMs vor,
da es compilerunabhängig ist und somit leicht zu portieren.


Noch mal die Frage nach einem Tutorial: Kennst Du eins, in dem der
Start-UP eines ARM erklärt wird, und an welchem man sich
"langhangeln" kann, um die Initialisierung zu erstellen (in C) ?


Greetz,
/th



btw:
gibt es für den LPC2148 - ähnlich wie für die AVRs - eine header-datei,
in der alle Symbole, Strukturen, Bits usw. definiert sind ?
Die meisten hab ich jetzt über das Phillips-lpc214x.h (allerdings
stimmen die Namen nicht immer mit denen im Manual überein), bei kile
fehlten sehr viele register-defines (die ich mir selber schreiben
musste), und Bit-defines gibtz gar keine.

von A.K. (Gast)


Lesenswert?

Wenn du den kompletten Startup ersetzen willst, kommt nicht nur die
Maschine ins Spiel, sondern auch Compiler+Linker. Immerhin müssen
Datensegmente initialisiert und C++ Konstruktoren aufgerufen werden.
Und das ist hochgradig abhängig vom Linker.

Siehe auch http://www.mikrocontroller.net/forum/read-2-343634.html.

Tutorial kenne ich keines. Das Philips Manual ist speziell bei der PLL
zwar etwas "hinten rum" weil eher an der Hardware als am Ergebnis
orientiert, aber wenn man Mathe nicht völlig verpennt hat sollte man
damit klarkommen.

Die Includes scheint auch jeder selber zu backen.

von A.K. (Gast)


Lesenswert?

PS: Die Stacks nicht zu vergessen. Mindestens soweit kommst du um
Assembler nicht herum. Und um eine Entscheidung, wie die Stacks
auszusehen haben, in welchem Modus das Hauptprogramm läuft
(User/System), ob und wie Interrupts verschachtelt sein dürfen, ...

von Random .. (thorstendb) Benutzerseite


Lesenswert?

das ding ist reichlich komplex ...
ich beschäftige mich nun seit ca. 4 Jahren mit den AVRs (und ein halbes
Jahr mit M16C), und versuche mich seit ca. 2Wochen mit dem ARM.
Irgendwie komme ich mir vor, als hätt ich noch nie nen uC in der Hand
gehabt geschweige denn programmiert ;-)

Mit Kile ist zwar alles gut und schön und läuft einigermassen, aber
irgendwie ist mir das zu quick&dirty.
Solange es funktioniert, ist alles i.O.
Wenn was nicht geht, sitzt man ganz schön aufm Trockenen.

Ich finde, dass man einen Controller erst dann kennenlernt, wenn man
mit den gnu-tools arbeitet, die einem keine configs abnehmen.
Wenn man nach so einem Einstieg auf Tools wie Kile zurückgreifen kann,
nehmen die einem dann sicher ne Menge Arbeit ab...

Ich werd mich dann mal weiter durch tutorials und codefragmente wälzen
;-)


Greetz,
/th


btw:
Ich such gerade ... aber hast Du ein "blinky" zur Hand, welches im
gnu-compiler läuft ?
Vllt kann ich mir da ja mehr abgucken...

Die Beisiele von Phillips sind erst mal auch etwas hilfreich,
allerdings lassen die sich nicht ohne weiteres in eigenen Code
integrieren :-(

von A.K. (Gast)


Lesenswert?

Was ist ein "blinky"?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

ein progrämmchen, was einfach nu ne led blinken lässt o.ä. grins

geht mir darum, ein vollständiges programm im source zu haben, wo ich
die startup-geschichte nachvollziehen kann.
etwas, das nicht aus einem project-maker entstanden ist.

Ein mal hab ich mir durch die PINSEL den JTAG abgeschossen.
Leider hab ich den anhand des Datenblattes nciht wieder hinbekommen (In
der Reg-Beschreibung zu PINSELx steht gar nix von JTAG :-(.
Aus 3 verschiedenen codes hab ich mir dann Werte für PINSEL0,1,2
zusammengesucht und nu läufts wieder.

Aber mich nervt das fürchterlich, dass ich einen Controller hab, den
ich nicht frei programmieren kann, weil ich (warscheinlich) zu blöd bin
(sry), mit dem User-manual von Phillips klarzukommen.

Daher versuche ich nun, mir ein paar Grundinformationen
zusammenzusuchen, um nachher mit den Datenblättern arbeiten zu können.



greetz,
/th

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.