- Typer av avbrott och ISR
- Syntax för avbrott i STM32
- Komponenter krävs
- Kretsschema och anslutningar
- Programmering STM32F103C8 för avbrott
Interrupts är en mekanism genom vilken en I / O eller en instruktion kan stänga av den normala körningen av processorn och får service som den har högsta prioritet. Som till exempel kan en processor som utför en normal körning också kontinuerligt övervaka för att någon händelse eller avbrott ska inträffa. Det är när ett externt avbrott inträffar (som från någon sensor), så pausar processorn sin normala körning och serverar först avbrottet och fortsätter sedan sitt normala körning.
Här i detta projekt, för att förstå avbrotten i STM32F103C8, kommer vi att använda tryckknappen som extern avbrott. Här kommer vi att öka ett tal från 0 och visa det på 16x2 LCD, och när tryckknappen trycks in tänds lysdioden och LCD-skärmen visar INTERRUPT. Lysdioden släcks så snart knappen släpps.
Typer av avbrott och ISR
Avbrott kan i stort sett klassificeras i två typer:
Maskinvaruavbrott: Om signalen till processorn kommer från någon extern enhet som knapp eller sensor eller från någon annan hårdvaruenhet som genererar en signal och ber processorn att göra en viss uppgift som finns i ISR kallas hårdvaruavbrott.
Programavbrott: De avbrott som genereras av programvaruinstruktionerna.
Avbryt rutin för service
Interrupt Service Routine eller en Interrupt-hanterare är en händelse som innehåller en liten uppsättning instruktioner och när ett avbrott inträffar kör processorn först den här koden som finns i ISR och fortsätter sedan med den uppgift som den gjorde före avbrottet.
Syntax för avbrott i STM32
ISR har följande syntax attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) i Arduino och detsamma kan också användas i STM32 eftersom vi använder arduino IDE för att ladda upp kod.
- digitalPinToInterrupt (pin): Som i Arduino-kort Uno har vi pins 2,3 och i mega har vi 2,3,18,19,20,21 för avbrott. I STM32F103C8 har vi också avbrottsstift, alla GPIO-stift kan användas för avbrott. Vi bara för att specificera ingångsstiftet som vi använder för avbrott. Men när vi använder mer än en avbryter samtidigt kan vi behöva följa några begränsningar.
- ISR: Det är en Interrupt handler-funktion som anropas när ett externt avbrott inträffar. Den har inga argument och ogiltig returtyp.
- Läge: Typ av övergång för att utlösa avbrottet
- STIGANDE: Att utlösa ett avbrott när stiftet går från LÅG till HÖG.
- FALLING: Att utlösa ett avbrott när stiften övergår från HÖG till LÅG.
- ÄNDRING: Att utlösa ett avbrott när stiftet övergår antingen från LÅG till HÖG eller HÖG till LÅG (dvs när stiftet ändras).
Vissa förhållanden under avbrott
- Interrupt Service Routine function (ISR) måste vara så kort som möjligt.
- Delay () -funktionen fungerar inte i ISR och bör undvikas.
Komponenter krävs
- STM32F103C8
- Tryckknapp
- LED
- Motstånd (10K)
- LCD (16x2)
Kretsschema och anslutningar
Den ena sidan av tryckknappsstiftet är ansluten till 3,3 V på STM32 och den andra sidan är ansluten till ingångsstiftet (PA0) på STM32 via ett neddragningsmotstånd.
Pull Down-motstånd används så att mikrokontrollern bara får antingen HÖG eller LÅG vid sin ingång när knappen trycks ned eller släpps. Annars kan MCU bli förvirrande utan att dra ned motståndet och mata några slumpmässiga flytande värden till ingången.
Anslutning mellan STM32F103C8 och LCD
Följande tabell visar stiftanslutningen mellan LCD (16X2) och mikrokontrollern STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Till Potentiometer Center PIN |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
Programmering STM32F103C8 för avbrott
Programmet för denna handledning är enkelt och ges i slutet av denna handledning. Vi behöver inte FTDI-programmerare för att programmera STM32, bara anslut din dator till USB-porten på STM32 och börja programmera med Arduino IDE. Läs mer om programmering av STM32 via USB-port.
Som vi sa att här i den här handledningen kommer vi att öka ett tal från 0 och visa det på 16x2 LCD och när en tryckknapp trycks in tänds lysdioden och LCD-displayen visar 'INTERRUPT'.
Först definierar LCD pins kontakter med STM32. Du kan ändra det enligt dina krav.
konst int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Därefter inkluderar vi rubrikfilen för LCD-skärmen. Detta kallar biblioteket som innehåller koden för hur STM32 ska kommunicera med LCD-skärmen. Se också till att funktionen LiquidCrystal anropas med de stiftnamn som vi precis definierade ovan.
omfatta
Globala variabler används för att skicka data mellan ISR och huvudprogrammet. Vi förklarar variabeln ledOn som flyktig och även som boolean för att specificera True eller False.
flyktig boolesk ledOn = falsk;
Inuti funktionen tomrumsinställning () visar vi ett introduktionsmeddelande och rensar det efter 2 sekunder.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); fördröjning (2000); lcd.clear ();
Återigen i samma ogiltiga setup () -funktion, måste vi ange in- och utgångsstift. Vi ställer in stift PA1 för utgång till LED och PA0 för inmatning från tryckknapp.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Vi kommer också att öka ett tal, så förklara en variabel med värdet noll.
int i = 0;
Nu är den viktiga delen av koden attachInterrupt () -funktionen, den ingår också i tomrummet ()
attachInterrupt (digitalPinToInterrupt (PA0), knapptryckt, CHANGE)
Vi specificerade stift PA0 för extern avbrott, och knapptryckt är den funktion som ska kallas när det finns CHANGE (LOW to HIGH eller HIGH to LOW) i PA0-stiftet. Du kan också använda alla andra funktionsnamn, stift och läge enligt krav.
Inuti tomrumsslingan () ökar vi ett tal (i) från noll och skriver ut numret i LCD (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; fördröjning (1000);
Den viktigaste delen är att skapa en avbrottshanteringsfunktion enligt namnet som vi använde i attachInterrupt () -funktionen. Vi använde buttonPressed så här har vi skapat en funktion void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } annat { ledOn = sant; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interrupt"); } }
Arbeta med den här knappenTryckt () ISR:
Enligt värdet på ledOn- variabeln tänds och släcks lysdioden.
KNAPPSTATUS |
ledOn (värde) |
LED (röd) |
LCD (16x2) |
OTRYCKAD |
Falsk |
AV |
- |
NEDTRYCKT |
Sann |
PÅ |
Visar '' INTERRUPT '' |
Om ledOn- värdet är falskt förblir LED-lampan avstängd och om ledOn- värdet är sant tänds LED och LCD-skärmen visar 'Interrupt' på den.
OBS ! Ibland kan avbrytningsavstängningseffekt uppstå och det kan räknas med flera utlösare när tryckknappen trycks in, detta beror på att flera spikar i spänning på grund av mekanisk anledning att byta tryckknapp. Detta kan minskas genom att införa RC-filter.
Den kompletta bearbetning av avbrott i STM32F103C8 framgår av nedanstående video.