- Types d'interruptions et ISR
- Syntaxe d'interruption dans STM32
- Composants requis
- Schéma de circuit et connexions
- Programmation STM32F103C8 pour les interruptions
Les interruptions sont un mécanisme par lequel une E / S ou une instruction peut suspendre l'exécution normale du processeur et se faire entretenir comme si elle avait la priorité la plus élevée. Comme par exemple, un processeur effectuant une exécution normale peut également surveiller en permanence un certain type d'événement ou une interruption. C'est-à-dire lorsqu'une interruption externe se produit (comme à partir d'un capteur), le processeur met alors en pause son exécution normale et sert d'abord l'interruption, puis continue son exécution normale.
Ici, dans ce projet, pour comprendre les interruptions dans STM32F103C8, nous utiliserons le bouton poussoir comme interruption externe. Ici, nous allons incrémenter un nombre à partir de 0 et l'afficher sur l'écran LCD 16x2, et chaque fois que le bouton-poussoir est enfoncé, la LED s'allume et l'écran LCD affiche INTERRUPT. La LED s'éteint dès que le bouton est relâché.
Types d'interruptions et ISR
Les interruptions peuvent être globalement classées en deux types:
Interruptions matérielles: Si le signal envoyé au processeur provient d'un périphérique externe tel qu'un bouton ou un capteur ou d'un autre périphérique matériel qui génère un signal et indique au processeur d'effectuer une tâche particulière présente dans ISR, on parle d'interruptions matérielles.
Interruptions du logiciel: les interruptions générées par les instructions du logiciel.
Routine de service d'interruption
La routine de service d'interruption ou un gestionnaire d'interruption est un événement qui contient un petit ensemble d'instructions et lorsqu'une interruption se produit, le processeur exécute d'abord ce code qui est présent dans ISR, puis continue avec la tâche qu'il effectuait avant l'interruption.
Syntaxe d'interruption dans STM32
ISR a la syntaxe suivante attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) dans Arduino et la même chose peut également être utilisée dans STM32 car nous utilisons l'IDE arduino pour télécharger du code.
- digitalPinToInterrupt (pin): Comme dans la carte Arduino Uno, nous avons des broches 2,3 et dans méga nous avons 2,3,18,19,20,21 pour les interruptions. Dans STM32F103C8, nous avons également des broches d'interruption, toutes les broches GPIO peuvent être utilisées pour les interruptions. Nous spécifions simplement la broche d'entrée que nous utilisons pour l'interruption. Mais en utilisant plusieurs interruptions en même temps, nous pouvons avoir besoin de suivre certaines restrictions.
- ISR: il s'agit d'une fonction de gestionnaire d'interruption qui est appelée lorsqu'une interruption externe se produit. Il n'a pas d'arguments et de type de retour void.
- Mode: Type de transition pour déclencher l'interruption
- RISING: Pour déclencher une interruption lorsque la broche passe de LOW à HIGH.
- FALLING: Pour déclencher une interruption lorsque la broche passe de HIGH à LOW.
- CHANGE: Pour déclencher une interruption lorsque la broche passe de LOW à HIGH ou HIGH à LOW (c'est-à-dire lorsque la broche change).
Certaines conditions lors de l'utilisation d'interruption
- La fonction de routine de service d'interruption (ISR) doit être aussi courte que possible.
- La fonction Delay () ne fonctionne pas dans ISR et doit être évitée.
Composants requis
- STM32F103C8
- Bouton poussoir
- LED
- Résistance (10K)
- Écran LCD (16x2)
Schéma de circuit et connexions
Un côté de la broche du bouton-poussoir est connecté à 3,3 V de STM32 et l'autre côté est connecté à la broche d'entrée (PA0) de STM32 via une résistance pull down.
La résistance Pull Down est utilisée de sorte que le microcontrôleur n'obtienne soit HIGH ou LOW à son entrée que lorsque le bouton est enfoncé ou relâché. Sinon, sans résistance de tirage vers le bas, le MCU peut devenir confus et transmettre des valeurs flottantes aléatoires à l'entrée.
Connexion entre STM32F103C8 et LCD
Le tableau suivant montre la connexion des broches entre l'écran LCD (16X2) et le microcontrôleur STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Vers le code PIN du centre du potentiomètre |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
UNE |
GND |
K |
Programmation STM32F103C8 pour les interruptions
Le programme de ce tutoriel est simple et donné à la fin de ce tutoriel. Nous n'avons pas besoin d'un programmeur FTDI pour programmer STM32, connectez simplement votre PC au port USB de STM32 et commencez à programmer avec Arduino IDE. En savoir plus sur la programmation du STM32 via le port USB.
Comme nous l'avons dit ici dans ce tutoriel, nous allons incrémenter un nombre à partir de 0 et l'afficher sur l'écran LCD 16x2 et chaque fois qu'un bouton-poussoir est enfoncé, la LED s'allume et l'écran LCD affiche `` INTERRUPT ''.
Définissez d' abord les connexions des broches LCD avec STM32. Vous pouvez le modifier selon vos besoins.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Ensuite, nous incluons le fichier d'en-tête de l'écran LCD. Cela appelle la bibliothèque qui contient le code de la façon dont le STM32 doit communiquer avec l'écran LCD. Assurez-vous également que la fonction LiquidCrystal est appelée avec les noms de broches que nous venons de définir ci-dessus.
comprendre
Les variables globales sont utilisées pour transmettre des données entre ISR et le programme principal. Nous déclarons la variable ledOn comme volatile et aussi comme booléenne pour spécifier True ou False.
volatile booléen ledOn = false;
Dans la fonction void setup () , nous afficherons un message d'introduction et l'effacerons au bout de 2 secondes.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); retard (2000); lcd.clear ();
Encore une fois, dans la même fonction void setup () , nous devons spécifier les broches d'entrée et de sortie. Nous définissons la broche PA1 pour la sortie vers la LED et PA0 pour l'entrée du bouton-poussoir.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Nous allons également incrémenter un nombre, alors déclarez une variable de valeur zéro.
int i = 0;
Maintenant, la partie importante du code est la fonction attachInterrupt () , elle est également incluse dans void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Nous avons spécifié la broche PA0 pour l'interruption externe, et buttonPressed est la fonction qui doit être appelée quand il y a CHANGE (LOW à HIGH ou HIGH à LOW) dans la broche PA0. Vous pouvez également utiliser tout autre nom de fonction, broche et mode selon les besoins.
À l'intérieur de la boucle vide (), nous incrémentons un nombre (i) à partir de zéro et imprimons le nombre sur l'écran LCD (16x2).
lcd.clear (); lcd.print ("NUMÉRO:"); lcd.print (i); ++ i; retard (1000);
La partie la plus importante est la création d'une fonction de gestionnaire d'interruption en fonction du nom que nous avons utilisé dans la fonction attachInterrupt () . Nous avons utilisé buttonPressed donc ici nous avons créé une fonction void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; DigitalWrite (PA1, LOW); } else { ledOn = true; DigitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interruption"); } }
Fonctionnement de ce bouton Pressé () ISR:
Selon la valeur de la variable ledOn , la LED s'allume et s'éteint.
ÉTAT DU BOUTON |
ledOn (valeur) |
LED (rouge) |
Écran LCD (16x2) |
Non pressé |
Faux |
DE |
- |
PRESSÉ |
Vrai |
SUR |
Affiche '' INTERRUPT '' |
Si la valeur de ledOn est fausse, la LED reste éteinte et si la valeur de ledOn est True, la LED s'allume et l'écran LCD affiche «Interruption».
REMARQUE: Il peut parfois y avoir un effet anti-rebond du commutateur et il peut compter plusieurs déclenchements lorsque le bouton-poussoir est enfoncé, c'est parce que plusieurs pics de tension dus à la raison mécanique de la commutation du bouton-poussoir. Cela peut être réduit en introduisant un filtre RC.
Le fonctionnement complet des interruptions dans STM32F103C8 est illustré dans la vidéo ci - dessous.