2009-07-19 7 views
1

Ich wusste, dass es ein ähnlicher Beitrag ist: Steps to make a LED blink from a C/C++ program?Schritte, um eine LED über ein C-Programm mit dem seriellen Anschluss ein- oder auszuschalten?

Aber jetzt auf einer ARM-basierten Entwicklungs-Board arbeite ich, und es scheint, zwei serielle Ports zu haben, dass ich es eine LED ein- oder ausgeschaltet machen nutzen könnte.

Grundsätzlich denke ich, die Strömung ist, einen Stift in Serie „1“ oder auf und die LED auf und „0“ gedreht werden, um es zu machen aus.

Gibt es einen Referenzcode in C-Sprache, auf den ich verweisen könnte?

+0

Hattest du Glück dabei? Hast du dich eingeloggt, um das zu überprüfen? – NoMoreZealots

Antwort

2

Dies wird, fürchte ich, werden stark abhängig von den Spezifikationen des jeweiligen Arm-basierten Entwicklungsboard Sie verwenden.

Sie müssen eine Dokumentation zu diesem Board finden.

4

Generell ist die Platine mit einigen Board Support Package (BSP) kommen sollte, die Sie die E/A errichtet wird, lässt steuern. Suchen Sie nach einer seriellen Bibliothek, wenn Sie die Hardware-Flusssteuerungssignale wirklich verwenden möchten.

Ich würde empfehlen, für einige GPIO (General Purpose I/O oder digial I/O) auf dem Board suchen, die in der Regel können Sie es als Eingang oder Ausgang konfiguriert werden. Sie sollten in der Lage sein, die LED über einen Strombegrenzungswiderstand zwischen einer digitalen E/A-Leitung und einem Erdungsstift anzuschließen. Stellen Sie sicher, dass Sie die LED korrekt ausgerichtet haben, wenn Sie sie nach hinten anschließen, wird der Strom statt der Beleuchtung blockiert. Und wie immer sollten Sie es mit einem digitalen Spannungsmesser überprüfen, bevor Sie es anschließen.

Auch wenn Sie/keine BSP für digital Ich haben O die Konfiguration ist in der Regel recht einfach. Setzen Sie ein Bit in ein Register, um es zu aktivieren, setzen Sie Bit in einem anderen Register, um Eingabe oder Ausgabe auszuwählen, die normalerweise in 8-Bit-Ports angeordnet werden. Bei einigen Systemen können Sie einzelne E/A-Pins konfigurieren, bei anderen können Sie nur den gesamten Port für die Eingabe oder Ausgabe konfigurieren. Dann schreiben Sie einfach eine 1 oder 0 in das Bit, das Sie in einem Schreib-/Ausgangsregister steuern wollen.

ARM-Chips haben heute eine beträchtliche Menge an eingebauten Peripheriegeräten, so dass die meisten Boards nur die I/O-Ausgänge zu den physischen Anschlüssen auf der Platine bringen und Sie müssen die Dokumentation des Chip-Vendors lesen, um den Registerspeicher zu finden Karte. Bessere Board-Verkäufer liefern Dokumentation, eine Bibliothek (BSP) und Beispiele. Luminary Micro liefert sogar Chips mit integrierten Ethernet-MACs und PHYs, fügen Sie einfach einen Stecker und Magnetics hinzu und Sie haben einen 1-Chip-Webserver.

0

Die bevorzugte Alternative zur Steuerung eines GPIO ist über ein BSP. Weil dieses BSP (Board Support Package) alle Arbeit für Sie erledigt, indem es alle Peripheriegeräte auf gute Standardwerte setzt und Ihnen erlaubt, eine Funktion aufzurufen. Möglicherweise hat Ihr BSP eine Funktion, um ein Byte in einen 8-Bit-GPIO-Port zu schreiben; Ihre LED wird nur ein Bit haben. In diesem Fall könnte Ihr C-Code wie folgt aussehen: (zumindest wird es so funktionieren auf Luminary Micro Kits).(Beispielcode; erfordert etwas zusätzliche Arbeit, um es speziell auf Ihrem Kit kompilieren zu lassen).

/* each LED is addressed by an address (byte) and a bit-within-this-byte */ 
struct { 
    address, // address of IO register for LED port 
    bit  // bit of LED 
} LEDConfigPair; 

struct LEDConfigPair LEDConfig[NUMBER_OF_LEDS] = { 
    {GPIO_PORTB_BASE,0}, // LED_0 is at port B0 
    {GPIO_PORTB_BASE,1}  // LED_1 is at port B1 
} ; 



/* function LED_init configures the GPIOs where LEDs are connected as output */ 
led_init(void) 
{ 
    U32 i; 
    for(i=0;i<NUMBER_OF_LEDS;i++) 
    { 
     GPIODirModeSet(LEDConfig[i][0], LEDConfig[i][1], GPIO_DIR_MODE_OUT); 
    } 
} 


/* my LED function 
    set_led_state makes use of the BSP of Luminary Micro to access a GPIO function 

    Implementation: this BSP requires setting 8 port wide IO, so the function will calculate a mask (

*/ 
set_led_state(U8 led,bool state) 
{ 
    U8 andmask; 
    U8 setmask; 

    andmask = ~(1 << LEDConfig[led].bit);// a bitmask with all 1's except bit of LED 

    if (true == state) 
    { 
     setmask = (1 << LEDConfig[led].bit); // set bit for LED 
    } else 
    { 
     setmask = 0; 
    } 
    GPIOPinWrite(LEDConfig[led].address, andmask, setmask); 
} 

Natürlich ist das alles buchstabiert; es kann in einer einzelnen Zeilen wie diese geschehen:

#DEFINE SETLEDSTATE(led,state) GPIOPinWrite(LEDConfig[led].address, ~(1<<LEDConfig[led].bit),(state<<LEDConfig[led].bit)) 

dies das gleiche tun, aber nur dann sinnvoll, wenn Sie Bitmasken träumen können, und Sie wollen nur ein paar LED wechseln, das reale Programm zu debuggen ..

Die Alternative: blankes Metall. In diesem Fall müssen Sie alles für sich selbst einrichten. Für ein eingebettetes System, müssen Sie (sind bereits eingerichtet unter der Annahme, Speicher-Controller und CPU-Takte!) Bewusst Pin Multiplexing und Power-Management sein

  • Initialisierung: set Pin Multiplexing derart, dass die gewünschte Funktion zu Steuerelement ist tatsächlich auf dem Paket zugeordnet. Rx oder Tx unter Verwendung von Stiften von der seriellen Schnittstelle
  • Initialisierung von pheripheral (in diesem Fall entweder ein UART oder eine GPIO-Funktion auf dem gleichen Stift)
0

Sie können es nicht tun. Dazu müssen Sie nur die RTS- oder CTS-Pins der seriellen Schnittstelle steuern. Klicken Sie einfach auf "Zugriff auf COM-Port in VC++ Code" und steuern Sie dann die RTS- und CTS-Status-Pins, um alle externen Geräte ein- und auszuschalten.