mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART -Code für ARM7 (LPC vom Philips)


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI
ich muss jetzt einen UART bei einem ARM7 (LPC von Philips ´)
programmieren und bevor ich das RAd neu erfinde habe ich etwas im Netz
nach Beispiel Code gesucht den cih verwenden kann.
Da ich aber nichts gefunden habe meine Frage ob das hier schon mal
jemand gemacht hat und den COde hier posten könnte?
Oder aber was auch hilfreich ist einem guten Tip oder eine Anleitung.
Gruß
Jan

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab doch noch was gefunden bei Hitex.co.uk:
lpc-ARM-book_srn.pdf
dadran werde ich mich jetzt erstmal orientieren

Autor: Ppp Mmm (sanic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal:

http://www.mikrocontroller.net/articles/ARM-elf-GC...

Dann noch mein eigener Code (wird noch verbessert):
uart.c:
#include <arch/philips/lpc2114.h>
#include "config.h" // Config-File with System Defines
#include <string.h>
#include <stdlib.h>
#include "uart.h"

char uart0_rx_buffer;
char uart0_buf_len=0;

void uart_init(int baud, char num){
  unsigned int UART_DIVISOR=0;
  if(num==0){
    UART0_IER = 0x00;             // disable all interrupts
    UART0_IIR = 0x00;             // clear interrupt ID register
    UART0_LSR = 0x00;             // clear line status register
    //Setting the UART Divisor Latch
    UART0_LCR = (1<<7);
    UART_DIVISOR = (((FOSC*PLL_M/VPBDIV_VAL) / ((baud) * 16.0)) + 0.5);
//Calculate UART Divisor Latch
    UART0_DLL = (char)UART_DIVISOR; // Setting lower Byte of the Latch
Divisor
    UART0_DLM = (char)(UART_DIVISOR >> 8); // Setting upper Byte of the
Latch Divisor
    
    UART0_LCR = (3<<0); // 8bit Char Length
    UART0_FCR = (1<<0) | (2<<6); // FIFO Enable (Bit0 = 1) + Trigger
level 2 = 8 Characters (at Bit6 = 2 )
  
    UART0_IER = (1<<0); // Receive Data Available Interrupt enablen
  }else{
    UART1_IER = 0x00;             // disable all interrupts
    UART1_IIR = 0x00;             // clear interrupt ID register
    UART1_LSR = 0x00;             // clear line status register
    //Setting the UART Divisor Latch
    UART1_LCR = (1<<7);
    UART_DIVISOR = (((FOSC*PLL_M/VPBDIV_VAL) / ((baud) * 16.0)) + 0.5);
//Calculate UART Divisor Latch
    UART1_DLL = (char)UART_DIVISOR; // Setting lower Byte of the Latch
Divisor
    UART1_DLM = (char)(UART_DIVISOR >> 8); // Setting upper Byte of the
Latch Divisor
    
    UART1_LCR = (3<<0); // 8bit Char Length
    UART1_FCR = (1<<0) | (2<<6); // FIFO Enable (Bit0 = 1) + Trigger
level 2 = 8 Characters (at Bit6 = 2 )
  
    UART1_IER = (1<<0); // Receive Data Available Interrupt enablen
  }
}
void uart_putc(char c,char num){
  char ULSR_THRE;
  ULSR_THRE=(1 << 5);
  while (!(UART0_LSR & ULSR_THRE))          // wait for TX buffer to
empty
    continue;                           // also either WDOG() or
swap()
  
  UART0_THR = c;  // put char to Transmit Holding Register
}

void uart_puts(char *s,char num){
  while(*s){
    uart_putc(*s,num);
  s++;
  }
}

int uart_getcW(int num){
  char ULSR_RDR;
    ULSR_RDR=(1 << 0);
  while ( !(UART0_LSR & ULSR_RDR) ); // wait for character 
  return UART0_RBR;                // return character
}


uart.h
#ifndef UART_H_
#define UART_H_
#include <arch/philips/lpc2114.h>
#include "config.h" // Config-File with System Defines
#include <stdlib.h>

#define UIIR_MASK 7; // 00000111

char uart0_rx_buffer;
char uart0_buf_len;

/* Init UART */
void uart_init(int baud, char num);

/* Put Char to UART */
void uart_putc(char c,char num);

/* Put String to UART */
void uart_puts(char *s,char num);

/* Get Character from UART(num) with Wait
The function waits for an appearing character in the recieve register
and will continue then
*/
int uart_getcW(int num);
#endif

Es sind einige schwachsinnige Includes drin und außerdem gibt´s diese
"num" Variable.
Damit wollte ich später mehrere Uarts mit einer Bibliothek abdecken.
Ist aber erstmal ein Anfang für dich.

Grüße,
Patrick

Autor: jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Dank für das Beispiel
Jan

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in deinem code fehlt aber noch die Aktivierung im pin connect block
(PINSEL0 register) :P

Autor: Ppp Mmm (sanic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, das mach ich im Main Part :)

Grüße

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.