Création d'une nouvelle application
Le processus de création d'une nouvelle application pour un des micro-contrôleurs supportés est simple.
Préparation
- Récupérez les sources correspondant au micro-contrôleur cible directement depuis le dépôt GIT correspondant.
- Créez un dossier pour le module (carte électronique) utilisé dans le dossier 'apps' si il n'existe pas déjà. (Le dossier 'apps/base' dans le code du lpc1224 (dépôt 'modules') correspond aux carte "ModGPIO-Démo" et "LPC1224-BO").
- Créez un sous-dossier pour votre application dans le dossier correspondant à votre module cible (celui que vous venez de créer). Vous pouvez aussi copier le dossier correspondant à une application existante pour disposer d'une base de code.
Création des fichiers nécessaires
- Copiez le Makefile depuis une autre application (par exemple 'apps/base/adc/Makefile") dans le dossier de votre nouvelle application. Ce Makefile est générique et vous ne devriez pas avoir de modifications à lui apporter.
- Créez éventuellement un fichier 'README' (ou modifiez celui que vous avez copié) indiquant ce que fait votre application.
- Créez un fichier pour la licence de votre code si vous désirez utiliser une licence différente de celle du reste du code. Cette licence devra être compatible avec la licence GPL utilisée pour le reste du code.
- Créez (au moins) un fichier C (.c) correspondant au code de votre application
Écriture du code et langages de programmation
Le code de votre application peut être organisé en un ou plusieurs fichiers de code source C (ou autre langage si vous disposez du cross-compilateur adapté).
Utilisation de l'API
Includes
Pour utiliser un driver ou une bibliothèque fournie par le code de support du module vous devrez inclure les fichier d'entête correspondants (header files) présents dans le dossier "include". Il ne faut pas remettre le chemin complet vers le fichier correspondant, uniquement la partie après le dossier 'include'. Par exemple pour le driver de la liaison série :
#include "drivers/serial.h"
Configuration et définition de l'affectation des entrées/sorties
- La configuration des entrées/sorties peut être faite de façon simplifiée en utilisant une ou plusieurs structures 'pio_config' et en faisant appel à la fonction set_pins() avec cette structure en paramètre (pour chacune des structures définies) pendant l'initialisation.
const struct pio_config common_pins[] = { /* UART 0 */ { LPC_UART0_RX_PIO_0_1, LPC_IO_DIGITAL }, { LPC_UART0_TX_PIO_0_2, LPC_IO_DIGITAL }, /* ADC */ { LPC_ADC_AD0_PIO_0_30, LPC_IO_ANALOG }, { LPC_ADC_AD1_PIO_0_31, LPC_IO_ANALOG }, /* ..... */ ARRAY_LAST_PIO, };
Initialisations
La première fonction de votre code qui sera appelée et qui constitue le point d'entrée de votre application est la fonction 'main()'.
Cette fonction devra faire appel à toutes les routines d'initialisation nécessaires au fonctionnement de votre programme, puis entrer dans une boucle infinie correspondant au corps de l'exécution de votre programme.
Les initialisations peuvent être indifféremment regroupées dans une fonction d'initialisation ou placées directement au début de la fonction main().
Attention: Certaines initialisations sont nécessaires et devront être réalisées au plus tôt, notamment l'initialisation du watchdog, la configuration de l'horloge : clock_config(), et la configuration du "timer système" : systick_timer_on() - utilisé pour les fonctions msleep() et usleep(). Ces configurations __doivent__ être effectuées dans cet ordre, même si certaines autres configurations peuvent être effectuées entre-temps.
Voir la page Utilisation de l'interface logicielle pour de lus amples informations sur l'initialisation et l'utilisation des fonctions évoquées ci-dessus.
Code de l'application
Le contenu du reste des initialisations et surtout le code inclu dans la boucle infinie correspondant au corps de l'exécution de votre programme est de votre ressort !
Options
La re-définition d'une fonction fault_info() est optionnelle. Si cela n'est pas fait, les exceptions feront appel à la fonction par défaut qui réalise un simple 'while (1);'