NXP LPC1114 UART funktioniert nach dem Zurücksetzen nicht

Ich baue eine einfache Schaltung mit LPC1114 , um eine "Hallo Welt" -Anwendung mit UART zu erstellen. Der Versuch, den gesamten Code von Grund auf neu zu schreiben, um besser zu verstehen, was passiert.

Mein Problem ist, dass UART nur nach dem Flashen funktioniert (dh wenn lpc21isp die MCU auffordert, den Code auszuführen). Derselbe Code funktioniert nicht, wenn die MCU zurückgesetzt wird.

Hier ist der Code, den ich verwende:

void platform_uart_setup(uint32_t baud_rate) // 9600
{
  // Make sure UART IRQ is disabled
  NVIC_DisableIRQ(UART_IRQn);

  // Setup pin 1_6 as RXD
  LPC_IOCON->PIO1_6 &= ~0x07;
  LPC_IOCON->PIO1_6 |= 0x01;

  // Setup pin 1_7 as TXD
  LPC_IOCON->PIO1_7 &= ~0x07;
  LPC_IOCON->PIO1_7 |= 0x01;

  // Enable & configure UART clock
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
  LPC_SYSCON->UARTCLKDIV = 0x1;

  // Setup format: 8N1, enable access to divisor latches
  LPC_UART->LCR = 0x83;

  // Setup baud rate, which is based on system clock
  uint32_t Fdiv = platform_clock // take cpu clock (12000000 in this case)
      / LPC_SYSCON->SYSAHBCLKDIV // divide by ABH clock
      / LPC_SYSCON->UARTCLKDIV // divide further by UART clock
      / 16 // divisor latch is 16x the desired baud rate
      / baud_rate;

  LPC_UART->DLM = Fdiv / 256;
  LPC_UART->DLL = Fdiv % 256;

  LPC_UART->FDR = 0x00 | (1 << 4) | 0;

  // Enable and reset FIFOs
  LPC_UART->FCR = 0x07;

  // Disable access to divisor latches
  LPC_UART->LCR = 0x03;

  // Read to reset LSR
  volatile uint32_t unused = LPC_UART->LSR;

  // Make sure there's no data
  while(( LPC_UART->LSR & (0x20|0x40)) != (0x20|0x40) )
    ;
  while( LPC_UART->LSR & 0x01 ) {
    unused = LPC_UART->RBR;
  }

  // Enable UART IRQ
  NVIC_EnableIRQ(UART_IRQn);

  // We don't care about interrupts for now
  LPC_UART->IER = 0;
}

void platform_uart_putc(const char c)
{
  while( !(LPC_UART->LSR & 0x20) )
    ;
  LPC_UART->THR = c;
}

Nach dem Reset gibt es absolut keine Signaländerungen am TXD-Pin.

Kannst du die Schaltung zeigen? Dies kann an einem Jumper liegen, der beim Booten von 'x' gesetzt wurde , im Gegensatz zum Booten von 'y'
Nun, wenn ich ein paar LEDs addiere und sie blinken lasse, blinkt es platform_uart_putc, also wird der Code ausgeführt. Die Schaltung ist ziemlich einfach, es ist nur RXD/TXD zu FTDI und zwei Tasten zum Zurücksetzen und 1.1 Bootloader-Eingabe-Pin.
Vielen Dank. Ich weiß nicht wie, aber by-Projekte funktionierten nach einiger Zeit nicht mehr. UART hat einfach nichts gesendet. Ich weiß nicht, warum IOCON für alles deaktiviert wurde. Ich habe es bei der Systeminitialisierung hinzugefügt und alles war behoben!
Wenn Sie verwenden, system_LPC11xx.hkönnen Sie auch SystemCoreClocknach dem Aufrufen SystemInitund verwenden SystemCoreClockUpdate. Es enthält die Kerntaktfrequenz (obwohl mit einer Standardeinstellung wahrscheinlich 12000000).

Antworten (1)

Ich glaube, Sie haben vergessen, die Uhr für IOCON zu aktivieren, bevor Sie die Pins für die UART-Verwendung konfigurieren, daher haben diese Zuweisungen keine Auswirkung. Aber nach einem Bootload sind die Pins bereits für UART konfiguriert, also funktioniert es.

Einfügung

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // enable IOCON

nach der IRQ-Einstellung, vor der Konfiguration der Pins.

PS meine bmptk- Bibliothek unterstützt den LPC1114. Es ist in C++, aber Sie können sich die Konfiguration der GPIO-Pins (und die UART-Initialisierung!) ansehen, targert/cortex/lpc1114fn28.h und die Timer-Initialisierung intargets/cortex/lpc1114.cpp überprüfen

lpc1114.cppIch kann in Ihrem BMPTK nicht finden . Eine Suche nach LPC_UARThat nichts ergeben. Eine andere Frage, könnten Sie mir zeigen, wo im Benutzerhandbuch angegeben ist, wo IOCONaktiviert werden muss?
IIRC, das in der Beschreibung der Peripheriegeräte selbst nicht erwähnt wird, nur in der Beschreibung des SYSCON-Registers.