Forum: Mikrocontroller und Digitale Elektronik ARM Cortex M3 (LPC1768) und UART Setup


von Florian M. (florian_m)


Lesenswert?

Hallo zusammen,

ich versuche bei einem mbed LPC 1768 Board (ARM Cortex-M3) die initiale 
Konfiguration für die UART-Schnittstelle hinzubekommen. Ich will die 
Schnittstelle später als serielle Konsole (9600 Baud) für Ausgaben 
verwenden.

Das Kommunikation soll über die Pins 48/49 bzw. p28 und p27 laufen. 
Siehe auch folgender Link:

http://mbed.org/users/Lerche/notebook/lpc1768-pin-functions/

Allerdings setzt es bei mir bei Schritt 3 vom Verständnis komplett aus 
:( Kann mir evtl. jemand weiterhelfen?

Anbei noch ein Auszug aus dem Handbuch zum MCU und meine Versuche die 
Schritte hinzubekommen:

--- snip ---

The UART0/2/3 peripherals are configured using the following registers:

1. Power: In the PCONP register (Table 46), set bits PCUART0/2/3.
Remark: On reset, UART0 is enabled (PCUART0 = 1), and UART2/3 are 
disabled (PCUART2/3 = 0).
1
// UART2 aktivieren
2
LPC_SC->PCONP |= (1 << 24)

2. Peripheral clock: In the PCLKSEL0 register (Table 40), select 
PCLK_UART0; in the PCLKSEL1 register (Table 41), select PCLK_UART2/3.
1
// Clock für UART2 aktivieren
2
// Defaultclock 4 MHz, fixed CCLK/8 ~ 0.5 MHz  
3
LPC_SC->PCLSEL1 |= ( 1 << 17) (1 << 16)
4
// Clock nun bei 2 MHz?
5
LPC_SC->PCLK_peripheral |= (1 << 2)

3. Baud rate: In register U0/2/3LCR (Table 279), set bit DLAB =1. This 
enables access to registers DLL (Table 273) and DLM (Table 274) for 
setting the baud rate. Also, if needed, set the fractional baud rate in 
the fractional divider register (Table 285).

--- snap ---

- Florian

: Bearbeitet durch User
von Oliver (Gast)


Lesenswert?

Ich hatte letzthins den UART auf einem LPC11xx programmiert. Der scheint 
ein ähnliches Registerset zu verwendern. Es half mir ganz gut in der 
Register-Struct-Deklaration nachzulesen. Für den LPC11xx sieht das etwa 
so aus:
typedef struct
{
  union {
  __I  uint32_t  RBR;                   /*!< Offset: 0x000 Receiver 
Buffer  Register (R/ ) */
  __O  uint32_t  THR;                   /*!< Offset: 0x000 Transmit 
Holding Register ( /W) */
  __IO uint32_t  DLL;                   /*!< Offset: 0x000 Divisor Latch 
LSB (R/W) */
  };
  union {
  __IO uint32_t  DLM;                   /*!< Offset: 0x004 Divisor Latch 
MSB (R/W) */
  __IO uint32_t  IER;                   /*!< Offset: 0x004 Interrupt 
Enable Register (R/W) */
  };
  union {
  __I  uint32_t  IIR;                   /*!< Offset: 0x008 Interrupt ID 
Register (R/ ) */
  __O  uint32_t  FCR;                   /*!< Offset: 0x008 FIFO Control 
Register ( /W) */
  };
  __IO uint32_t  LCR;                   /*!< Offset: 0x00C Line Control 
Register (R/W) */
  __IO uint32_t  MCR;                   /*!< Offset: 0x010 Modem control 
Register (R/W) */
  __I  uint32_t  LSR;                   /*!< Offset: 0x014 Line Status 
Register (R/ ) */
...

Man sieht hier also, dass beispielsweise DLM und IER an der gleichen 
Adresse liegen. Wenn man also DLM oder IER ansprechen will, muss eine 
zusätzliche Information an den Controller übergeben werden. Das ist eben 
das angesprochene DLAB Bit.

Konkret sah dann das so aus (9600 Baud @ 12 Mhz):
  LPC_UART->LCR = 3 | 128;    /* 8 data bits, one stop bit, enable 
divider register */
  LPC_UART->DLL = 71 /* dll */;
  LPC_UART->DLM = 0;
  LPC_UART->LCR = 3;      /* 8 data bits, one stop bit, disable divider 
register */
  LPC_UART->FDR  = (10 /* mulval */ << 4) | 1 /* divaddval */;
  LPC_UART->IER = 0;      /* no interrupts */
  LPC_UART->FCR = 1;      /* FIFO enable */
  LPC_UART->MCR = 0;
  LPC_UART->TER = 1<<7;      /* enable transmit */

Vielleicht hilfts,
Oliver

von obscurity (Gast)


Lesenswert?


von Florian M. (florian_m)


Lesenswert?

Danke für Eure Hinweise, es klappt! :)

Florian

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.