Utilisation du Bootloader HID de Microchip

Bootloader

Il permet d'importer un programme Utilisateur dans le microcontroleur en utilisant une simple liaison USB sans avoir à utiliser de module de programmation.

Microchip propose deux bootloaders :

  • un modèle HID qui repose sur un pilote générique (Human Interface Device) disponible par défaut sur tout PC (c'est le même pilote qui est utilisé pour la souris ou le clavier par exemple),
  • un modèle PICDEM FS USB, spécifique au PIC18F4550 et au Kit de développement PICDEM FS USB dont l'utilisation n'est pas recommandée pour les nouveaux projets et qui nécessite un pilote spécifique.

La suite de cette présentation se base sur l'utilisation du Bootloader HID.

Chargement du Bootloader dans une carte

Il nécessite l'emploi d'un module de programmation. La vidéo présentée ci-dessous propose le chargement du Bootloader avec un module économique de type PIC Kit 2.

 

 

Adaptation du programme pour l'utilisation du Bootloader - Importer un programme utilisateur avec le Bootloader HID

L'utilisation du Bootloader HID nécessite d'adapter le projet du programme utilisateur.

Le Bootloader HID occupe l'espace mémoire 0x0000 à 0x0FFF. Les vecteurs de RESET et d'interruption de bas et haut niveau sur les PIC18 sont situés respectivement aux adresses 0x0000, 0x0008 et 0x0018. Par conséquent, le programme utilisateur devra être placé à partir de l'adresse 0x1000 qui constituera son adresse de RESET. Les traitements associés à ses interruptions seront également déplacés aux adresses 0x1008 et 0x1018.

Cela nécessite donc une configuration spécifique pour le traitement des différentes interruptions qui se matérialise par l'intégration des lignes de code suivantes :

/** Réallocation d'adresse pour les vecteurs d'interruption avec ***/
// le bootloader USB_HID
#define REMAPPED_RESET_VECTOR_ADDRESS 0x1000
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x1008
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x1018extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void)
{
    _asm goto _startup _endasm
}

#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void)
{
    _asm goto YourHighPriorityISRCode _endasm
}

#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR (void)
{
    _asm goto YourLowPriorityISRCode _endasm
}

/*
Si le bootloader n'est pas chargé dans le fichier HEX, il faut au moins
mettre en place des vecteurs d'interruption normalement pris en charge par
le bootloader pour lancer le traitement d'interruptions logées après
le bootloader
*/

#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void High_ISR (void)
{
    _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
}

#pragma code LOW_INTERRUPT_VECTOR = 0x18
void Low_ISR (void)
{
    _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
}

#pragma code

//These are your actual interrupt handling routines.
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
    //Check which interrupt flag caused the interrupt.
    //Service the interrupt
    //Clear the interrupt flag
    //Etc.
} //This return will be a "retfie fast", since this is in a #pragma interrupt section

#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode()
{
    //Check which interrupt flag caused the interrupt.
    //Service the interrupt
    //Clear the interrupt flag
    //Etc.
} //This return will be a "retfie", since this is in a #pragma interruptlow section

Pour que le code généré par le compilateur MPLab C18 soit placé à partir de l'adresse 0x1000 afin de laisser libre l'espace 0x0000 - 0x0FFF au Bootloader, il est nécessaire d'intégrer au projet un script d'édition de lien (LinkScript). Dans le cas du PIC18F4550, le fichier associé proposé par Microchip prossède généralement le nom suivant : rm18f4550 - MCHPUSB Bootload.lkr

Au moment de la mise sous tension, le Bootloader est exécuté. Si le bouton poussoir BP1 est maintenu relâché, le programme utilisateur est lancé. Si le bouton poussoir est pressé au moment de la mise sous tension, le Bootloader conserve la main et attend le chargement d'un nouveau programme utilisateur via la liaison USB. La vidéo suivante montre les modifications à apporter au projet utilisateur et le chargement d'un programme utilisateur en utilisant le Bootloader (Rappel : pour lancer le Bootloader, penser à maintenir BP1 appuyé pendant la mise sous tension de la carte !).