- Tipus d’interrupcions i ISR
- Sintaxi per a interrupcions a STM32
- Components necessaris
- Diagrama de circuits i connexions
- Programació STM32F103C8 per a interrupcions
Les interrupcions són un mecanisme mitjançant el qual una E / S o una instrucció poden suspendre l'execució normal del processador i obtenir un servei com si tingués la màxima prioritat. Com per exemple, un processador que realitza una execució normal també pot controlar contínuament si es produeix algun tipus d'esdeveniment o si es produeix una interrupció. És llavors quan es produeix una interrupció externa (com des d’un sensor), el processador posa en pausa la seva execució normal i primer serveix la interrupció i després continua la seva execució normal.
Aquí, en aquest projecte, per entendre les interrupcions a STM32F103C8, farem servir el polsador com a interrupció externa. Aquí incrementarem un número de 0 i el mostrarem a la pantalla LCD de 16x2 i, sempre que es prem el botó, el led s’encén i la pantalla LCD mostra INTERRUPT El LED s'apaga tan bon punt es deixa anar el botó.
Tipus d’interrupcions i ISR
Les interrupcions es poden classificar generalment en dos tipus:
Interrupcions de maquinari: si el senyal del processador prové d'un dispositiu extern com ara un botó o un sensor o d'un altre dispositiu de maquinari que genera un senyal i li indica al processador que faci una tasca particular present a ISR, es coneix com a interrupcions de maquinari.
Interrupcions de programari: les interrupcions generades per les instruccions del programari.
Interrompre la rutina de servei
La rutina de servei d’interrupció o un controlador d’interrupcions és un esdeveniment que conté un petit conjunt d’instruccions i, quan es produeix una interrupció, el processador executa primer aquest codi present a ISR i després continua amb la tasca que estava fent abans de la interrupció.
Sintaxi per a interrupcions a STM32
ISR té la següent sintaxi attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) a Arduino i el mateix també es pot utilitzar a STM32, ja que fem servir IDE arduino per pujar codi.
- digitalPinToInterrupt (pin): igual que a la placa Arduino Uno, tenim pins 2,3 i en mega tenim 2,3,18,19,20,21 per a interrupcions. A STM32F103C8 també tenim pins d’interrupció que es poden utilitzar amb qualsevol pin GPIO per a interrupcions. Només cal especificar el pin d’entrada que estem utilitzant per a la interrupció. Però mentre fem servir més d'una interrupció al mateix temps, és possible que hàgim de seguir algunes restriccions.
- ISR: és una funció de control d’interrupcions que s’anomena quan es produeix una interrupció externa. No té arguments i no proporciona cap tipus de retorn.
- Mode: tipus de transició per activar la interrupció
- RISING: per provocar una interrupció quan el passador passa de BAIX a ALT.
- CAU: Per provocar una interrupció quan el passador passa de HIGH a LOW.
- CANVI: per provocar una interrupció quan el pin transita de BAIX a ALT o ALT a BAIX (és a dir, quan canvia el pin).
Algunes condicions mentre s'utilitza la interrupció
- La funció de rutina de servei d’interrupció (ISR) ha de ser el més curta possible.
- La funció Delay () no funciona dins d’ISR i s’ha d’evitar.
Components necessaris
- STM32F103C8
- Polsador
- LED
- Resistència (10 K)
- LCD (16x2)
Diagrama de circuits i connexions

Un costat del pin del polsador està connectat a 3,3 V de STM32 i l’altre costat està connectat al pin d’entrada (PA0) de STM32 mitjançant una resistència de desplegament.
La resistència Pull Down s'utilitza de manera que el microcontrolador només obtingui ALTA o BAIXA a la seva entrada quan es prem o es deixa anar el botó. En cas contrari, sense resistència de baixada, l'MCU pot confondre's i alimentar alguns valors flotants aleatoris a l'entrada.

Connexió entre STM32F103C8 i LCD
La taula següent mostra la connexió de pin entre LCD (16X2) i el microcontrolador STM32F103C8.
|
STM32F103C8 |
LCD |
|
GND |
VSS |
|
+ 5V |
VDD |
|
Al PIN del Potentiometer Center |
V0 |
|
PB0 |
RS |
|
GND |
RW |
|
PB1 |
E |
|
PB10 |
D4 |
|
PB11 |
D5 |
|
PC13 |
D6 |
|
PC14 |
D7 |
|
+ 5V |
A |
|
GND |
K |

Programació STM32F103C8 per a interrupcions
El programa d’aquest tutorial és senzill i es dóna al final d’aquest tutorial. No necessitem programador FTDI per programar STM32, simplement connecteu el vostre PC al port USB de STM32 i comenceu a programar amb Arduino IDE. Obteniu més informació sobre la programació de STM32 a través del port USB.
Com hem dit que aquí en aquest tutorial augmentarem un número de 0 i el mostrarem a la pantalla LCD de 16x2 i, sempre que es prem un botó, el led s'encén i la pantalla LCD mostra "INTERRUPT".
Primer definiu les connexions de pins LCD amb STM32. Podeu modificar-lo segons els vostres requisits.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
A continuació, incloem el fitxer de capçalera de la pantalla LCD. Es truca a la biblioteca que conté el codi de com s'ha de comunicar l'STM32 amb la pantalla LCD. Assegureu-vos també que la funció LiquidCrystal es crida amb els noms dels pins que acabem de definir més amunt.
incloure
Les variables globals s’utilitzen per passar dades entre ISR i el programa principal. Declarem la variable ledOn com a volàtil i també com a booleana per especificar True o False.
ledOn booleà volàtil = fals;
Dins de la funció void setup () , mostrarem un missatge introductori i l’esborrarem al cap de 2 segons.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); endarreriment (2000); lcd.clear ();
De nou en la mateixa funció de configuració de buit () , hem d’especificar els pins d’entrada i sortida. Establim el pin PA1 per a la sortida a LED i PA0 per a l'entrada des del polsador.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
També augmentarem un nombre, de manera que declarem una variable amb un valor zero.
int i = 0;
Ara, la part important del codi és la funció attachInterrupt () , també s’inclou dins de la configuració nul·la ()
attachInterrupt (digitalPinToInterrupt (PA0), botó premut, CANVI)
Hem especificat el pin PA0 per a una interrupció externa i el botó Pressed és la funció que s'ha de cridar quan hi ha CANVI (BAIX a ALT o ALT a BAIX) al pin PA0. També podeu utilitzar qualsevol altre nom de funció, pin i mode segons el requisit.
Dins del bucle buit () incrementem un número (i) des de zero i imprimim el número en pantalla LCD (16x2).
lcd.clear (); lcd.print ("NOMBRE:"); lcd.print (i); ++ i; retard (1000);
La part més important és crear una funció de control d’interrupcions segons el nom que hem utilitzat a la funció attachInterrupt () . Hem utilitzat buttonPressed, de manera que aquí hem creat una funció void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, BAIX); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interrompre"); } }
Funcionament d'aquest botó Pressed () ISR:
Segons el valor de la variable ledOn , el LED s'encén i s'apaga.
|
BUTTON STATE |
ledOn (Valor) |
LED (vermell) |
LCD (16x2) |
|
IMPRESSIÓ |
Fals |
DESACTIVAT |
- |
|
PRESSAT |
És cert |
ACTIVAT |
Espectacles "INTERRUPT" |
Si el valor ledOn és fals, el LED continua apagat i si el valor ledOn és True, el LED s'encén i la pantalla LCD mostra "Interromp".
NOTA: De vegades pot haver-hi un efecte de rebut de commutador i pot comptar un disparador múltiple quan es prem el polsador, això es deu a que hi ha diverses pujades de tensió a causa del motiu mecànic del canvi de polsador. Això es pot reduir introduint un filtre RC.
El funcionament complet de les interrupcions a STM32F103C8 es mostra al següent vídeo.
