- Typer av avbrudd og ISR
- Syntaks for avbrudd i STM32
- Komponenter kreves
- Kretsdiagram og tilkoblinger
- Programmering STM32F103C8 for avbrudd
Interrupts er en mekanisme der en I / O eller en instruksjon kan stanse den normale kjøringen av prosessoren og få betjent seg selv som den har høyeste prioritet. Som for eksempel kan en prosessor som utfører en normal utførelse også kontinuerlig overvåke for at det skal skje en slags hendelse eller et avbrudd. Det er når et eksternt avbrudd har skjedd (som fra en hvilken som helst sensor), så stopper prosessoren sin normale utførelse og serverer først avbruddet og fortsetter deretter sin normale utførelse.
Her i dette prosjektet, for å forstå Interrupts i STM32F103C8, vil vi bruke trykknapp som ekstern avbrytelse. Her vil vi øke et tall fra 0 og vise det på 16x2 LCD, og når trykknappen trykkes, slås lysdioden PÅ og LCD-skjermen viser INTERRUPT. LED slås av så snart knappen slippes.
Typer av avbrudd og ISR
Avbrudd kan i stor grad klassifiseres i to typer:
Maskinvareavbrudd: Hvis signalet til prosessoren kommer fra en ekstern enhet, for eksempel knapp eller sensor, eller fra en annen maskinvareenhet som genererer et signal og ber prosessoren om å utføre en spesiell oppgave i ISR, kalles maskinvareavbrudd.
Programvareavbrudd: Avbruddene som genereres av programvareinstruksjonene.
Avbryt servicerutinen
Interrupt Service Routine eller en Interrupt handler er en hendelse som har et lite sett med instruksjoner, og når det oppstår et avbrudd, utfører prosessoren først denne koden som er tilstede i ISR, og fortsetter deretter med oppgaven den gjorde før avbruddet.
Syntaks for avbrudd i STM32
ISR har følgende syntaks attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) i Arduino og det samme kan også brukes i STM32 da vi bruker arduino IDE for å laste opp kode.
- digitalPinToInterrupt (pin): Som i Arduino-bord Uno har vi pins 2,3 og i mega har vi 2,3,18,19,20,21 for avbrudd. I STM32F103C8 har vi også avbruddspinner, alle GPIO-pinner kan brukes til avbrudd. Vi bare for å spesifisere inngangspinnen vi bruker for avbrudd. Men mens du bruker mer enn en avbryter samtidig, kan det hende vi må følge noen begrensninger.
- ISR: Det er en Interrupt handler-funksjon som kalles når det oppstår en ekstern avbrytelse. Det har ingen argumenter og ugyldig returtype.
- Mode: Type overgang for å utløse avbruddet
- RISING: Å utløse et avbrudd når pinnen går fra LAV til HØY.
- FALLING: Å utløse et avbrudd når pinnen går fra HØY til LAV.
- ENDRE: Å utløse et avbrudd når pinnen går enten fra LAV til HØY eller HØY til LAV (dvs. når pinnen skifter).
Noen forhold mens du bruker avbryter
- Interrupt Service Routine function (ISR) må være så kort som mulig.
- Delay () -funksjonen fungerer ikke i ISR og bør unngås.
Komponenter kreves
- STM32F103C8
- Trykknapp
- LED
- Motstand (10K)
- LCD (16x2)
Kretsdiagram og tilkoblinger
Den ene siden av trykknappstiften er koblet til 3,3 V på STM32, og den andre siden er koblet til inngangstappen (PA0) på STM32 via en nedtrekkbar motstand.
Pull Down-motstand brukes slik at mikrokontroller bare får enten HIGH eller LOW ved inngangen når knappen trykkes eller slippes. Ellers, uten å trekke ned motstand, kan MCU bli forvirret og mate noen tilfeldige flytende verdier til inngangen.
Forbindelse mellom STM32F103C8 og LCD
Tabellen nedenfor viser stiftforbindelsen mellom 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 for avbrudd
Programmet for denne opplæringen er enkelt og gis på slutten av denne opplæringen. Vi trenger ikke FTDI-programmerer for å programmere STM32, bare koble PC-en din til USB-porten på STM32 og begynne å programmere med Arduino IDE. Lær mer om programmering av STM32 via USB-port.
Som vi sa at her i denne opplæringen skal vi øke et tall fra 0 og vise det inn på 16x2 LCD og når en trykknapp trykkes, lyser LED-lampen og LCD-skjermen viser 'INTERRUPT'.
Først definere LCD-pins forbindelser med STM32. Du kan endre det i henhold til dine behov.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Deretter inkluderer vi toppteksten for LCD-skjermen. Dette kaller biblioteket som inneholder koden for hvordan STM32 skal kommunisere med LCD-skjermen. Forsikre deg også om at funksjonen LiquidCrystal kalles med pin-navnene vi nettopp definerte ovenfor.
inkludere
Globale variabler brukes til å overføre data mellom ISR og hovedprogrammet. Vi erklærer variabelen ledOn som ustabil og også som boolsk for å spesifisere sant eller usant.
flyktige boolske ledOn = falske;
Inne i void setup () -funksjonen, vil vi vise en intro-melding og slette den etter 2 sekunder.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); forsinkelse (2000); lcd.clear ();
Igjen i samme ugyldige oppsett () -funksjon, må vi spesifisere inngangs- og utgangspinnene. Vi setter pin PA1 for utgang til LED og PA0 for inngang fra trykknapp.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Vi skal også øke et tall, så erklær en variabel med verdien null.
int i = 0;
Nå er den viktige delen av koden attachInterrupt () -funksjonen, den er også inkludert i tomrumsoppsettet ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Vi spesifiserte pin PA0 for ekstern avbrudd, og buttonPressed er funksjonen som skal kalles når det er ENDRE (LAV til HØY eller HØY til LAV) i PA0-pin. Du kan også bruke hvilket som helst annet funksjonsnavn, pin og modus i henhold til krav.
Inne i tomrummet () øker vi et tall (i) fra null og skriver ut tallet i LCD (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; forsinkelse (1000);
Den viktigste delen er å lage en avbruddshåndteringsfunksjon i henhold til navnet vi brukte i attachInterrupt () -funksjonen. Vi brukte buttonPressed så her har vi opprettet en funksjon void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } annet { ledOn = sant; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interrupt"); } }
Arbeid med denne knappen Trykk på () ISR:
I henhold til verdien av ledOn- variabelen slås LED-lampen PÅ og AV.
KNAPPSSTATUS |
ledOn (verdi) |
LED (rød) |
LCD (16x2) |
UTRYKKET |
Falsk |
AV |
- |
TRYKKET |
ekte |
PÅ |
Viser '' INTERRUPT '' |
Hvis ledOn- verdien er falsk, forblir LED slått av, og hvis ledOn- verdien er sann, slås LED på og LCD-skjermen viser 'Interrupt' på den.
MERKNAD: Det kan forekomme bryteravstengningseffekt noen ganger, og det kan telle flere utløsere når trykknappen trykkes, dette er fordi flere spenningsspisser på grunn av mekanisk grunn til å bytte trykknapp. Dette kan reduseres ved å innføre RC-filter.
Fullstendig bearbeiding av avbrudd i STM32F103C8 er vist i videoen nedenfor.