Génération d'une interruption par l'appui du bouton B2 (bleu)

Nous allons faire en sorte que l'appui sur le bouton poussoir B2 (le bleu, relié à la broche PC13) génère une interruption qui fera changer d'état la LED verte.

Dans le STM32L475, les GPIO ne sont pas reliées directement au NVIC. Elles passent d'abord par un bloc appelé EXTI (cf ref manual page 400), capable de générer des interruptions sur état (haut ou bas), sur front (montant ou descendant), ou des "événements" (sortes d'interruptions spéciales dont on ne s'occupera pas dans cette UE). Il va donc falloir programmer l'EXTI pour qu'il génère une interruption sur front descendant de la broche PC13. Pour cela, lisez les sections 14.3 et 14.4, sachant que les GPIO sont des "lignes d'IRQ configurables".

Une fois que l'interruption est déclenchée, elle reste active jusqu'à que vous l'acquittiez en écrivant ce qu'il faut dans le registre EXTI_PRn. Le pending register du NVIC est remis à zéro (cleared) automatiquement lors de l'appel du handler d'interruption (page 225), il n'y a donc rien à faire de ce côté-là.

❎ Créez dans un fichier buttons.c la fonction void button_init(void) qui

  • active l'horloge du port C,
  • configure la broche PC13 en GPIO et en entrée,
  • sélectionne la broche PC13 comme source d'IRQ pour EXTI13 (registre SYSCFG_EXTICRn, cf page 403),
  • configure l'EXTI selon la procédure décrite en 14.3.4.

❎ Compilez, et testez en appuyant sur B2 que le handler par défaut des GPIO du PORTC est bien appelé.

❎ Rajoutez maintenant dans buttons.c un handler spécifique, qui primera sur le handler par défaut. Ce handler fera les choses suivantes :

  • acquittement de l'interruption dans l'EXTI (registre EXTI_PR1)
  • toggle de la LED verte

❎ Compilez et testez : à chaque appui sur B2 la LED verte doit "toggler", et ce sans que cela perturbe votre programme habituel (affichage d'une l'image sur le color shield).