Les exceptions sur processeurs à base de Cortex M

Introduction

Les exceptions sont des événements qui interrompent le cours normal d'exécution d'un programme. Lorsqu'une exception arrive, le programme en cours d'exécution est stoppé, et un bout de code spécifique à cette exception (appelé handler) est exécuté. Puis si l'exception n'était pas fatale, le programme reprend son cours comme si de rien n'était.

Les exceptions sont de deux types :

  • causées par un événement interne au processeur (Cortex M4) : reset, bus fault (quand on accède à une adresse non mappée en mémoire), division par 0, … Elles sont généralement graves et empêchent souvent la reprise du cours normal du programme interrompu.
  • causées par un événement externe au processeur : un périphérique qui a besoin de signaler quelque chose, un changement d'état d'une GPIO, ... On les appelle alors communément interruptions (interrupt request ou IRQ).

En pratique, on utilise souvent indifféremment le terme exception ou interruption…

Le microcontrôleur STM32L475 est composé d'un cœur d'ARM (Cortex M4) et de périphériques. Nous aurons donc deux types d'exceptions : celles propres au Cortex, et les IRQ dues aux périphériques.

Lorsqu'une exception est traitée, le processeur doit sauvegarder son état actuel. Cette sauvegarde peut être automatique (c'est le cas sur les Cortex M) ou manuelle (SPARC, ARM7TDMI, etc.).

Les exceptions peuvent avoir différentes priorités, permettant à une exception prioritaire d'interrompre le traitement d'une autre moins prioritaire. Ces priorités peuvent être réglées manuellement ou fixes. Ces priorités sont représentées par un nombre. Sur Cortex M, plus ce nombre est petit, plus l'exception est prioritaire.

En plus de ces priorités, la plupart des exceptions peuvent être désactivées ou activées logiciellement.

Les exceptions du STM32L275

Le STM32L275 intègre un contrôleur d'interruption très souple appelé NVIC (Nested Vectored Interrupt Controller) qui permet de gérer :

  • 82 sources d'IRQ externes au processeur,
  • 1 NMI (Non Maskable Interrupt) : une interruption externe non désactivable,
  • les exceptions internes au processeur.

Chaque exception a un numéro qui lui est propre :

  • les exceptions internes au processeur et la NMI sont numérotées de 1 à 15,
  • les 82 IRQ externes sont numérotées de 16 à 98. Elles ont en plus leur propre numéro d'IRQ externe, appelé position dans le "Reference Manual", qui vaut numéro d'exception - 16. Elles sont de priorités réglables et désactivables / activables à volonté. Il y a une par périphérique (UART0, UART1, SPI0, etc.).

Ces exceptions sont décrites en page 396 du manuel de référence : les exceptions internes en grisé (oui, il y en a bien 15 !), les IRQ en non grisé.