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?
UART till stdio i C i ARM?
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) ^^
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) ^^
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.
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.