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
#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
PLL wird lt. Keil Compiler Startup folgendermassen eingestellt: MSEL: 5 PSEL: 2 Greetz, /th
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.
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
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.
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
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).
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.
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.
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, ...
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 :-(
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.