UART till stdio i C i ARM?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Diger_s
Inlägg: 56
Blev medlem: 5 juli 2006, 22:47:06
Ort: Norrköping
Kontakt:

UART till stdio i C i ARM?

Inlägg av Diger_s »

Hallå.
Jag har köpt ett olimex utvecklingskort för LPC2184 och håller på och leker som mest. Nu har jag däremot kört fast. Det är så att min tanke var att peka serieporten till stdin och stdout i C. Men efter många olika sökord på google och försök till RTFS har jag fortfarande inte lyckats hitta en lösning.

Jag använder gcc och arm-elf som target. Jag har lyckats bygga ett projekt och få lamporna att blinka på kortet. men innan jag börjar med andra periferier skulle jag vilja få igång serieporten och även förstå mig på Cs FILE

Är det någon som hållt på med det innan eller vet någon guide/exempel/källkodsfil som på någolunda bra sätt beskriver UART->FILE->stdin,stdout?
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

det är väl bara att göra de två funktionerna fputc och fgetc och låta tecknen gå till/från uarten. Då ska printf använda dom.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Nja.... för standard stdout så används fdevopen() (för att ansluta "stdout" )som i sin tur anväderer malloc().

Efter som du kör utan OS (antar jag) så finns inget malloc implementerad.

AVR har en egen hack som göra att man inte behöver använda fdevopen, länk

annars kan du alltid göra en egen fprintf... (vilket inte är så krångligt) ^^
Användarvisningsbild
m77311
Inlägg: 17
Blev medlem: 12 mars 2008, 12:02:42
Ort: Mölnlycke

Inlägg av m77311 »

Jag kör IAR C för ARM och det som jag har gjort är att göra en egen putchar() och getchar() som ersätter den i biblioteken.

Putchar ser ut så här:

först en initiering av UART0 som körs en gång

void DebugSetup(void)
{
LONG tmp;

U0IER = 0x00; // disable all interrups of port
tmp=U0IIR; // clear interrupt id
tmp=U0RBR; // clear receive reg. (to reset possibly intr)
tmp=U0LSR; // clear linestatus (to reset possibly intr)
tmp=tmp;

U0LCR=0x80; // select divisor latches
U0DLL=0x60; // set for 9600 Baud
U0DLM=0x00; // set for 9600 Baud
U0FCR=0x01; // Uart 0 fifo enabled
U0TER=0x80; // Uart 0 tx enabled
U0LCR=0x03; // 8 bit character length, 1 stop bit, no parity generation or checking, Disable break transmission;
}

///////////////////////////////////////////////////////////////////////////////
// Overrida putchar. Används vid felutskrifter om DEBUG är definierat
__INTRINSIC int putchar(int tkn)
{
static LONG setup=1;


if(setup)
{
setup=0;
DebugSetup();
}
// Vänta ut alla tidigare tecken
while(!(U0LSR&0x20));
U0THR=tkn;

return tkn;
}

sedan är det bara att anropa printf() i koden

getchar() har jag inte implementaerat utan använder en helt egenskriven monitor som pollar UART0
data=U0RBR;
och tolkar detta som en-teckens kommandon.
Skriv svar