- Tipi di interrupt e ISR
- Sintassi per Interrupt in STM32
- Componenti richiesti
- Schema elettrico e collegamenti
- Programmazione STM32F103C8 per interrupt
Gli interrupt sono un meccanismo mediante il quale un I / O o un'istruzione possono sospendere la normale esecuzione del processore e vengono serviti come se avesse la massima priorità. Ad esempio, un processore che esegue un'esecuzione normale può anche monitorare continuamente il verificarsi di qualche tipo di evento o interruzione. Cioè quando si verifica un interrupt esterno (come da qualche sensore), il processore sospende la sua normale esecuzione e prima serve l'interrupt e quindi continua la sua normale esecuzione.
Qui in questo progetto, per comprendere gli interrupt in STM32F103C8, useremo il pulsante come interrupt esterno. Qui incrementeremo un numero da 0 e lo visualizzeremo sul display LCD 16x2, e ogni volta che si preme il pulsante il led si accende e il display LCD mostra INTERRUPT. Il LED si spegne non appena il pulsante viene rilasciato.
Tipi di interrupt e ISR
Gli interrupt possono essere classificati a grandi linee in due tipi:
Interruzioni hardware: se il segnale al processore proviene da un dispositivo esterno come un pulsante o un sensore o da un altro dispositivo hardware che genera un segnale e comunica al processore di svolgere un compito particolare presente in ISR, si parla di interruzioni hardware.
Interrupt software: gli interrupt generati dalle istruzioni del software.
Routine di servizio di interruzione
La routine del servizio di interrupt o un gestore di interrupt è un evento che contiene un piccolo insieme di istruzioni e quando si verifica un interrupt il processore esegue prima il codice presente in ISR e quindi continua con l'attività che stava eseguendo prima dell'interrupt.
Sintassi per Interrupt in STM32
ISR ha la seguente sintassi attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) in Arduino e la stessa può essere utilizzata anche in STM32 poiché utilizziamo l'IDE di arduino per caricare il codice.
- digitalPinToInterrupt (pin): Come nella scheda Uno di Arduino abbiamo i pin 2,3 e in mega abbiamo 2,3,18,19,20,21 per gli interrupt. In STM32F103C8 abbiamo anche pin di interrupt, qualsiasi pin GPIO può essere utilizzato per gli interrupt. Dobbiamo solo specificare il pin di input che stiamo usando per l'interrupt. Ma mentre si usano più di un interrupt allo stesso tempo, potrebbe essere necessario seguire alcune restrizioni.
- ISR: è una funzione di gestione degli interrupt che viene chiamata quando si verifica un interrupt esterno. Non ha argomenti e tipo restituito void.
- Modalità: tipo di transizione per attivare l'interrupt
- SALITA: per attivare un interrupt quando il pin transita da BASSO ad ALTO.
- FALLING: per attivare un interrupt quando il pin transita da HIGH a LOW.
- CHANGE: per attivare un interrupt quando il pin transita da LOW a HIGH o da HIGH a LOW (cioè, quando il pin cambia).
Alcune condizioni durante l'utilizzo di interrupt
- La funzione Interrupt Service Routine (ISR) deve essere il più breve possibile.
- La funzione Delay () non funziona all'interno di ISR e dovrebbe essere evitata.
Componenti richiesti
- STM32F103C8
- Premi il bottone
- GUIDATO
- Resistenza (10K)
- LCD (16x2)
Schema elettrico e collegamenti
Un lato del pin del pulsante è collegato a 3,3 V di STM32 e l'altro lato è collegato al pin di ingresso (PA0) di STM32 tramite una resistenza pull down.
La resistenza di pull down viene utilizzata in modo che il microcontrollore ottenga solo HIGH o LOW al suo ingresso quando il pulsante viene premuto o rilasciato. Altrimenti, senza il resistore di pull down, l'MCU potrebbe confondersi e fornire alcuni valori variabili casuali all'ingresso.
Collegamento tra STM32F103C8 e LCD
La tabella seguente mostra la connessione dei pin tra LCD (16X2) e il microcontrollore STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Al potenziometro PIN centrale |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
UN |
GND |
K |
Programmazione STM32F103C8 per interrupt
Il programma per questo tutorial è semplice e viene fornito alla fine di questo tutorial. Non abbiamo bisogno del programmatore FTDI per programmare STM32, collega semplicemente il tuo PC alla porta USB di STM32 e inizia a programmare con Arduino IDE. Ulteriori informazioni sulla programmazione di STM32 tramite la porta USB.
Come abbiamo detto, qui in questo tutorial incrementeremo un numero da 0 e lo visualizzeremo sul display LCD 16x2 e ogni volta che si preme un pulsante il led si accende e il display LCD mostra 'INTERRUPT'.
Definire prima le connessioni dei pin LCD con STM32. Puoi modificarlo secondo le tue esigenze.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Successivamente, includiamo il file di intestazione per il display LCD. Ciò chiama la libreria che contiene il codice per come l'STM32 dovrebbe comunicare con l'LCD. Assicurati anche che la funzione LiquidCrystal sia chiamata con i nomi dei pin che abbiamo appena definito sopra.
includere
Le variabili globali vengono utilizzate per trasferire i dati tra ISR e il programma principale. Dichiariamo la variabile ledOn come volatile e anche come Boolean per specificare True o False.
volatile booleano ledOn = false;
All'interno della funzione void setup () , visualizzeremo un messaggio di introduzione e lo cancelleremo dopo 2 secondi.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); ritardo (2000); lcd.clear ();
Sempre nella stessa funzione void setup () , dobbiamo specificare i pin di input e output. Impostiamo il pin PA1 per l'uscita sul LED e PA0 per l'ingresso dal pulsante.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Incrementeremo anche un numero, quindi dichiareremo una variabile con valore zero.
int i = 0;
Ora la parte importante del codice è la funzione attachInterrupt () , che è anche inclusa all'interno di void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Abbiamo specificato il pin PA0 per l'interrupt esterno, e buttonPressed è la funzione che deve essere chiamata quando c'è CHANGE (da LOW a HIGH o da HIGH a LOW) nel pin PA0. È inoltre possibile utilizzare qualsiasi altro nome di funzione, pin e modalità in base alle esigenze.
All'interno di void loop () incrementiamo un numero (i) da zero e stampiamo il numero in LCD (16x2).
lcd.clear (); lcd.print ("NUMERO:"); lcd.print (i); ++ i; ritardo (1000);
La parte più importante è creare una funzione di gestione degli interrupt in base al nome che abbiamo usato nella funzione attachInterrupt () . Abbiamo usato buttonPressed quindi qui abbiamo creato una funzione void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interruzione"); } }
Funzionamento di questo pulsante Premuto () ISR:
In base al valore della variabile ledOn , il LED si accende e si spegne.
STATO DEL PULSANTE |
ledOn (valore) |
LED (rosso) |
LCD (16x2) |
NON PRESSATO |
Falso |
OFF |
- |
PREMUTO |
Vero |
SOPRA |
Spettacoli '' INTERRUPT ' |
Se il valore di ledOn è falso, il LED rimane spento e se il valore di ledOn è Vero, il LED si accende e il display LCD mostra "Interruzione".
NOTA: a volte può esserci un effetto antirimbalzo dell'interruttore e può contare più trigger quando viene premuto il pulsante, questo perché diversi picchi di tensione dovuti a ragioni meccaniche di commutazione del pulsante. Questo può essere ridotto introducendo il filtro RC.
Il funzionamento completo degli interrupt in STM32F103C8 è mostrato nel video sottostante.