Forum: Mikrocontroller und Digitale Elektronik LPC1788: uart mit 921600 baud


von Michael (Gast)


Lesenswert?

Hallo,

ich habe das LPC1788 Board von Embedded Artists und spiele gerade mit 
dem Beispiel Code für die Ausgabe über UART herum (s_ob_uart_rs232). Die 
verwendeten Funktionen entsprechen denen von NXP 
(http://ics.nxp.com/support/documents/microcontrollers/zip/lpc177x.lpc178x.cmsis.driver.library.zip). 
Mit niedrigen Baudraten funktioniert die Sache auch problemlos, wenn ich 
die Baudrate aber auf 921600 erhöhe, kommt nur noch Buchstabensalat, 
wenn überhaupt an. Ich vermute, dass das irgendwie mit der eingestellten 
PCLK für den verwendeten UART2 und den berechneten Werten für DLM, DLL 
und FDR zusammenhängt, aber irgendwie finde ich keine Lösung, die tut. 
Hat vielleicht jemand schonmal die gleiche Erfahrung gemacht, oder kann 
mir helfen ?

Michael

von Werner P. (Gast)


Lesenswert?

Verwende einen LPC1768.

Ich habe da auch lang rumgemacht. So richtig funktioniert es bei hohen 
Baudraten wenn ich die Clock (CPU) durch 16 teile.

In meinem Beispiel verwende ich 100.000.000 / 16 = 625.000 Baud.

Das ist meine Initialisierung der UART.
1
uint32_t UARTInit( uint32_t baudrate )
2
{
3
  uint32_t Fdiv;
4
  uint32_t pclkdiv, pclk;
5
6
  LPC_PINCON->PINSEL0 &= ~0x000000F0;
7
  LPC_PINCON->PINSEL0 |= 0x00000050;  /* RxD0 is P0.3 and TxD0 is P0.2 */
8
  /* By default, the PCLKSELx value is zero, thus, the PCLK for
9
  all the peripherals is 1/4 of the SystemFrequency. */
10
  /* Bit 6~7 is for UART0 */
11
  pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03;
12
  LPC_SC->PCLKSEL0 |= (0x01 << 6);
13
  pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03;
14
15
  switch ( pclkdiv )
16
  {
17
  case 0x00:
18
  default:
19
    pclk = SystemCoreClock/4;
20
    break;
21
  case 0x01:
22
    pclk = SystemCoreClock;
23
    break;
24
  case 0x02:
25
    pclk = SystemCoreClock/2;
26
    break;
27
  case 0x03:
28
    pclk = SystemCoreClock/8;
29
    break;
30
  }
31
32
  LPC_UART0->LCR = 0x83;    /* 8 bits, no Parity, 1 Stop bit */
33
  Fdiv = ( pclk / 16 ) / baudrate ;  /*baud rate */
34
  LPC_UART0->DLM = Fdiv / 256;
35
  LPC_UART0->DLL = Fdiv % 256;
36
  LPC_UART0->LCR = 0x03;    /* DLAB = 0 */
37
  LPC_UART0->FCR = 0x07;    /* Enable and reset TX and RX FIFO. */
38
39
  NVIC_EnableIRQ(UART0_IRQn);
40
41
  LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS;  /* Enable UART0 interrupt */
42
  return (1);
43
}

Hoffe es hilft Dir weiter. Bin noch nicht so firm mit dem 1768.

von Jim M. (turboj)


Lesenswert?

> mit der eingestellten PCLK für den verwendeten UART2

Welche PCLK ist denn eingestellt? Wenn FDR benutzt wird, muss sie größer 
als 32*Baurate sein: "The value of the DLL register must be greater than 
2."

von Patrick B. (p51d)


Lesenswert?

Wofür willst du dann eine so hohe Baudrate?
Standartgrösse ist höchstens 115200. Und für die Kommunikation zwischen 
einem PC und einem MCU ist dies ebenfalls ungeeignet, da die Kabellänge 
sonst ein Problem wird.
Und MCU-Peripherie Kommunikation kann mann einfacher über I2C, CAN, SPI 
realisieren.

von henning (Gast)


Lesenswert?

ein max3232e schafft nur 250 kBit/s. kA was dort verbaut ist, im PC wird 
wahrscheinlich auch kein kracher drin sein.

von Werner P. (Gast)


Lesenswert?

@Patrick

> Wofür willst du dann eine so hohe Baudrate?

Ich brauche die für ein RN131 WLAN Modul welches via UART an den LPC 
angeschlossen ist.

Mit RTS/CTS funktionieren 625.000 Baud sehr gut.

von Wilhelm F. (Gast)


Lesenswert?

Patrick B. schrieb:

> Standartgrösse ist höchstens 115200.

Sogar am ollen Standard-8051 von vor 30 Jahren ist eine Baudrate von 
1MBAUD möglich. Die nutze ich hier an zwei Boards, die allerdings über 
LWL miteinander verdrahtet sind.

Über Draht auf kurzen Abständen geht das aber auch noch.

Jedoch kommt die Software unter Umständen nicht so schnell mit. Das ist 
aber auch kein Thema, da beide µC gleich schnell oder langsam sind. Die 
echte Datenrate ist dann kein Megabaud, nur physikalisch.

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.