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.
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.cpp
Ich kann in Ihrem BMPTK
nicht finden . Eine Suche nach LPC_UART
hat nichts ergeben. Eine andere Frage, könnten Sie mir zeigen, wo im Benutzerhandbuch angegeben ist, wo IOCON
aktiviert werden muss?
Jancovici
Farcaller
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.Benutzer76350
bzeaman
system_LPC11xx.h
können Sie auchSystemCoreClock
nach dem AufrufenSystemInit
und verwendenSystemCoreClockUpdate
. Es enthält die Kerntaktfrequenz (obwohl mit einer Standardeinstellung wahrscheinlich 12000000).