- Typer af afbrydelser og ISR
- Syntaks til afbrydelse i STM32
- Komponenter, der kræves
- Kredsløbsdiagram og forbindelser
- Programmering STM32F103C8 til afbrydelser
Interrupts er en mekanisme, hvormed en I / O eller en instruktion kan suspendere den normale udførelse af processoren og får sig selv serviceret, som om den har højeste prioritet. Som for eksempel kan en processor, der udfører en normal udførelse, også kontinuerligt overvåge, om der sker en slags begivenhed eller en afbrydelse. Det er, når der sker en ekstern afbrydelse (som fra en eller anden sensor), så stopper processoren sin normale udførelse og serverer først afbrydelsen og fortsætter derefter sin normale udførelse.
Her i dette projekt bruger vi trykknap som ekstern afbrydelse for at forstå Interrupts i STM32F103C8. Her vil vi øge et tal fra 0 og vise det på 16x2 LCD, og når der trykkes på trykknappen, tændes lysdioden, og LCD-displayet viser INTERRUPT. LED slukkes, så snart knappen slippes.
Typer af afbrydelser og ISR
Afbrydelser kan stort set klassificeres i to typer:
Hardwareafbrydelser: Hvis signalet til processoren kommer fra en ekstern enhed, såsom en knap eller en sensor eller fra en anden hardwareenhed, der genererer et signal og beder processoren om at udføre en bestemt opgave, der er til stede i ISR, kaldes hardwareafbrydelser.
Software Interrupts: De interrupts, der genereres af softwareinstruktionerne.
Afbryd servicerutine
Interrupt Service Routine eller en Interrupt handler er en begivenhed, der indeholder et lille sæt instruktioner, og når der opstår et afbrydelse, udfører processoren først denne kode, der er til stede i ISR, og fortsætter derefter med den opgave, som den udførte før afbrydelsen.
Syntaks til afbrydelse i STM32
ISR har følgende syntaks attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) i Arduino, og det samme kan også bruges i STM32, da vi bruger arduino IDE til at uploade kode.
- digitalPinToInterrupt (pin): Som i Arduino-kort Uno har vi pins 2,3 og i mega har vi 2,3,18,19,20,21 til afbrydelser. I STM32F103C8 har vi også afbrydestifter, alle GPIO-stifter kan bruges til afbrydelser. Vi skal bare specificere den input pin, som vi bruger til afbrydelse. Men mens du bruger mere end en afbryder på samme tid, kan det være nødvendigt at følge nogle begrænsninger.
- ISR: Det er en Interrupt handler-funktion, der kaldes, når der opstår en ekstern afbrydelse. Det har ingen argumenter og ugyldig returneringstype.
- Mode: Overgangstype for at udløse afbrydelsen
- RISING: At udløse et afbrydelse, når stiften går fra LAV til HØJ.
- FALLING: At udløse et afbrydelse, når stiften går fra HIGH til LOW.
- ÆNDRING: At udløse et afbrydelse, når stiften går enten fra LAV til HØJ eller HØJ til LAV (dvs. når stiften skifter).
Nogle forhold under afbrydelse
- Interrupt Service Routine-funktionen (ISR) skal være så kort som muligt.
- Funktionen Delay () fungerer ikke inden for ISR og bør undgås.
Komponenter, der kræves
- STM32F103C8
- Trykknap
- LED
- Modstand (10K)
- LCD (16x2)
Kredsløbsdiagram og forbindelser
Den ene side af trykknapstiften er forbundet til 3,3 V på STM32, og den anden side er forbundet til indgangsstiften (PA0) på STM32 via en pull-down-modstand.
Pull Down-modstand bruges, så mikrocontroller kun får enten HIGH eller LOW ved sin indgang, når der trykkes på eller slippes på knappen. Ellers kan MCU uden forstyrrelsesmodstand blive forvirret og føde nogle tilfældige flydende værdier til input.
Forbindelse mellem STM32F103C8 og LCD
Følgende tabel viser stiftforbindelsen mellem LCD (16X2) og STM32F103C8 mikrokontroller.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Til Potentiometer Center PIN |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
EN |
GND |
K |
Programmering STM32F103C8 til afbrydelser
Programmet til denne tutorial er simpelt og gives i slutningen af denne tutorial. Vi har ikke brug for FTDI-programmør for at programmere STM32, du skal bare slutte din pc til USB-porten på STM32 og starte programmeringen med Arduino IDE. Lær mere om programmering af STM32 via USB-port.
Som vi sagde, at her i denne tutorial vil vi øge et tal fra 0 og vise det på 16x2 LCD, og når der trykkes på en trykknap, tændes lysdioden, og LCD-displayet viser 'INTERRUPT'.
Definér først forbindelser til LCD-stifter med STM32. Du kan ændre det efter dine behov.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Dernæst inkluderer vi headerfilen til LCD-skærmen. Dette kalder biblioteket, som indeholder koden til, hvordan STM32 skal kommunikere med LCD'et. Sørg også for, at funktionen LiquidCrystal kaldes med de pinnavne, som vi lige har defineret ovenfor.
omfatte
Globale variabler bruges til at overføre data mellem ISR og hovedprogrammet. Vi erklærer variablen ledOn som flygtig og også som boolsk for at specificere Sand eller Falsk.
flygtige boolske ledOn = falske;
Inde i funktionen tomrumsopsætning () viser vi en introbesked og rydder den efter 2 sekunder.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); forsinkelse (2000); lcd.clear ();
Igen i samme ugyldige opsætningsfunktion () skal vi specificere input- og outputpindene. Vi indstiller pin PA1 til output til LED og PA0 til input fra trykknap.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Vi vil også øge et tal, så erklær en variabel med værdien nul.
int i = 0;
Nu er den vigtige del af koden attachInterrupt () -funktionen, den er også inkluderet i tomrumsopsætningen ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Vi specificerede pin PA0 til ekstern afbrydelse, og buttonPressed er den funktion, der skal kaldes, når der er CHANGE (LOW to HIGH eller HIGH to LOW) i PA0 pin. Du kan også bruge ethvert andet funktionsnavn, pin og mode i henhold til krav.
Inde i hulrummet () forøger vi et tal (i) fra nul og udskriver tallet i LCD (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; forsinkelse (1000);
Den vigtigste del er at oprette en interrupt handler- funktion i henhold til det navn, vi brugte i attachInterrupt () -funktionen. Vi brugte buttonPressed, så her har vi oprettet en funktion ugyldig buttonPressed ()
ugyldig knapTryk på () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } andet { ledOn = sandt; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interrupt"); } }
Funktion af denne knap Tryk på () ISR:
I henhold til værdien af ledOn- variablen tænder og slukker LED'en.
KNAPPETILSTAND |
ledOn (værdi) |
LED (rød) |
LCD (16x2) |
UTRYKTET |
Falsk |
AF |
- |
TRYKTET |
Rigtigt |
PÅ |
Viser '' INTERRUPT '' |
Hvis ledOn- værdien er falsk, forbliver LED slukket, og hvis ledOn- værdien er sand, tændes LED, og LCD-displayet viser 'Interrupt' på den.
BEMÆRK: Der kan være afbrydelsesafbrydelseseffekt undertiden, og det kan tælle flere udløsere, når der trykkes på trykknappen, dette skyldes, at flere spidser i spænding på grund af mekanisk grund til at skifte trykknap. Dette kan reduceres ved at indføre RC-filter.
Den komplette bearbejdning af afbrydelser i STM32F103C8 vises i nedenstående video.