2009-07-19 6 views
1

Je savais qu'il y a un poste similaire: Steps to make a LED blink from a C/C++ program?Étapes permettant d'activer ou de désactiver une DEL à partir d'un programme C en utilisant le port série?

Mais maintenant, je travaille sur un conseil de développement basé sur le bras, et il semble avoir deux ports série que je pouvais l'utiliser pour faire une LED ou désactiver. Fondamentalement, je pense que le flux est, faire une broche en série "1" ou sur et la LED sera allumé et "0" pour le désactiver.

Existe-t-il un code de référence en langage C auquel je pourrais faire référence?

+0

Avez-vous eu de la chance avec ça? Vous êtes-vous connecté pour vérifier cela? – NoMoreZealots

Répondre

2

Cela, je le crains, dépendra fortement des spécifications du tableau de développement d'armement que vous utilisez.

Vous devez trouver la documentation spécifique à cette carte.

4

De manière générale, la carte doit être livrée avec un module de support de carte (BSP) qui vous permet de contrôler les E/S intégrées. Recherchez une bibliothèque série si vous voulez vraiment utiliser les signaux de contrôle de flux matériel.

Je vous recommande de rechercher des GPIO (E/S à usage général ou E/S numériques) sur la carte, ce qui vous permet généralement de les configurer comme une entrée ou une sortie. Vous devriez pouvoir connecter la LED via une résistance de limitation de courant entre une ligne d'E/S numérique et une broche de masse. Assurez-vous que la LED est orientée correctement si vous la connectez à l'envers, cela bloque le courant au lieu de l'allumer. Et comme toujours, assurez-vous de vérifier avec un voltmètre numérique avant de le connecter.

Même si vous n'avez pas de BSP pour les E/S numériques, la configuration est généralement assez simple. Réglez un bit dans un registre pour l'activer, réglez le bit dans un autre registre pour sélectionner l'entrée ou la sortie, ils seront normalement disposés dans des "ports" de 8 bits. Certains systèmes vous permettent de configurer des broches d'E/S individuelles, d'autres vous permettront seulement de configurer le port entier pour l'entrée ou la sortie. Ensuite, vous écrivez simplement 1 ou 0 au bit que vous voulez contrôler dans un registre d'écriture/sortie.

Les puces ARM disposent généralement d'une quantité considérable de périphériques intégrés. La plupart des cartes ne font que sortir les E/S des connecteurs physiques de la carte et vous devez lire la documentation du revendeur pour trouver la mémoire du registre. carte. Les meilleurs vendeurs de cartes fourniront de la documentation, une bibliothèque (BSP) et des exemples. Luminary Micro fournit même des puces avec des MAC et PHY Ethernet intégrés, il suffit d'ajouter un connecteur et Magnetics et vous avez un serveur Web à 1 puce.

0

J'avais l'habitude de faire ce genre de programmation auparavant.

Vous devez étudier la connexion du port série http://www.lammertbies.nl/comm/cable/RS-232.html http://www.beyondlogic.org/serial/serial.htm

Il a + 5v, -5v sur la sortie, je ne me souviens pas clairement maintenant. Toutes les broches ne sont pas nécessaires.

Je n'utilise jamais ARM auparavant, mais j'utilise un contrôleur PIC 8 bits pour le programmer. Je suppose que vous pouvez trouver beaucoup d'exemple en ligne.

0

L'alternative préférée pour contrôler un GPIO est via un BSP. Parce que ce BSP (package de support de carte) fait tout le travail pour vous en réglant tous les périphériques à de bonnes valeurs par défaut et vous permettant d'appeler une fonction. Peut-être que votre BSP de choix aura une fonction pour écrire un octet sur un port GPIO 8 bits; votre LED n'aura qu'un bit. Dans ce cas, votre code C pourrait ressembler à: (au moins: cela fonctionnera comme ceci sur les kits Luminary Micro).(Exemple de code, nécessite un peu de travail supplémentaire pour le faire compiler en particulier sur votre kit).

/* 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); 
} 

Bien sûr, tout est épelé; il peut être fait en une seule ligne comme celle-ci:

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

cela fera la même chose, mais n'a de sens que vous pouvez rêver des masques de bits, et que vous voulez pour passer des LED pour déboguer le programme réel ..

L'alternative: métal nu. Dans ce cas, vous devez tout configurer pour vous-même. Pour un système embarqué, vous devez être au courant de multiplexage des broches et gestion de l'alimentation (en supposant contrôleur de mémoire et horloges cpu sont déjà mis en place!)

    initialisation
  • : multiplexage broches réglé de telle manière que la fonction que vous souhaitez le contrôle est réellement mappé sur le paquet.
  • initialisation de pheripheral (dans ce cas, soit un UART, ou une fonction GPIO sur la même broche)
0

Vous ne pouvez pas le faire en utilisant les broches Rx ou Tx de port série. Pour cela, il vous suffit de contrôler les broches RTS ou CTS du port série. Il suffit de google pour "accéder au port COM dans le code VC++" et ensuite contrôler les broches d'état RTS et CTS pour allumer et éteindre tout périphérique externe.

Questions connexes