- Soorten onderbrekingen en ISR
- Syntaxis voor onderbreking in STM32
- Componenten vereist
- Schakelschema en aansluitingen
- Programmering STM32F103C8 voor interrupts
Interrupts is een mechanisme waarmee een I / O of een instructie de normale uitvoering van de processor kan opschorten en zichzelf kan laten onderhouden alsof deze de hoogste prioriteit heeft. Net als bijvoorbeeld een processor die een normale uitvoering uitvoert, kan deze ook continu controleren of er een gebeurtenis of een onderbreking plaatsvindt. Dat is wanneer een externe onderbreking plaatsvindt (zoals van een sensor), dan pauzeert de processor de normale uitvoering en bedient eerst de onderbreking en gaat dan verder met de normale uitvoering.
Hier in dit project zullen we, om de onderbrekingen in STM32F103C8 te begrijpen, de drukknop gebruiken als externe onderbreking. Hier zullen we een getal vanaf 0 ophogen en weergeven op 16x2 LCD, en wanneer de drukknop wordt ingedrukt, gaat de led AAN en het LCD-scherm toont ONDERBREKING. LED gaat uit zodra de knop wordt losgelaten.
Soorten onderbrekingen en ISR
Onderbrekingen kunnen grofweg in twee typen worden ingedeeld:
Hardware-onderbrekingen: als het signaal naar de processor afkomstig is van een extern apparaat, zoals een knop of sensor, of van een ander hardwareapparaat dat een signaal genereert en de processor vertelt om een bepaalde taak uit te voeren die aanwezig is in ISR, staat bekend als hardware-onderbrekingen.
Software Interrupts: De interrupts die worden gegenereerd door de software-instructies.
Onderhoudsroutine onderbreken
Interrupt Service Routine of een Interrupt-handler is een gebeurtenis die een kleine set instructies bevat en wanneer er een interrupt optreedt, voert de processor eerst deze code uit die aanwezig is in ISR en gaat vervolgens verder met de taak die hij aan het doen was vóór de interrupt.
Syntaxis voor onderbreking in STM32
ISR heeft de volgende syntaxis attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) in Arduino en hetzelfde kan ook worden gebruikt in STM32 omdat we arduino IDE gebruiken om code te uploaden.
- digitalPinToInterrupt (pin): Net als in Arduino board Uno hebben we pinnen 2,3 en in mega hebben we 2,3,18,19,20,21 voor interrupts. In STM32F103C8 hebben we ook interrupt-pinnen, alle GPIO-pinnen kunnen worden gebruikt voor interrupts. We hoeven alleen de invoerpin te specificeren die we gebruiken voor interrupt. Maar als u meer dan één interrupts tegelijkertijd gebruikt, moeten we mogelijk enkele beperkingen volgen.
- ISR: het is een Interrupt-handlerfunctie die wordt aangeroepen wanneer een externe interrupt optreedt. Het heeft geen argumenten en ongeldig retourtype.
- Modus: Type overgang om de onderbreking te activeren
- RISING: Om een onderbreking te activeren wanneer de pin overgaat van LAAG naar HOOG.
- FALLING: Om een onderbreking te activeren wanneer de pin overgaat van HOOG naar LAAG.
- CHANGE: Om een interrupt te activeren wanneer de pin overgaat van LOW naar HIGH of HIGH naar LOW (dwz wanneer de pin verandert).
Enkele voorwaarden tijdens het gebruik van interrupt
- De functie Interrupt Service Routine (ISR) moet zo kort mogelijk zijn.
- De functie Delay () werkt niet binnen ISR en moet worden vermeden.
Componenten vereist
- STM32F103C8
- Druk op de knop
- LED
- Weerstand (10K)
- LCD (16x2)
Schakelschema en aansluitingen
De ene kant van de drukknoppen is verbonden met 3.3V van STM32 en de andere kant is verbonden met de ingangspen (PA0) van STM32 via een pull-down weerstand.
Pull Down-weerstand wordt gebruikt zodat de microcontroller alleen HIGH of LOW krijgt bij zijn ingang wanneer de knop wordt ingedrukt of losgelaten. Anders kan de MCU, zonder pull-down-weerstand, in de war raken en enkele willekeurige zwevende waarden naar de ingang sturen.
Verbinding tussen STM32F103C8 en LCD
De volgende tabel toont de pinverbinding tussen LCD (16X2) en de STM32F103C8-microcontroller.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Naar Potentiometer Center PIN |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E. |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
EEN |
GND |
K |
Programmering STM32F103C8 voor interrupts
Het programma voor deze tutorial is eenvoudig en wordt aan het einde van deze tutorial gegeven. We hebben geen FTDI-programmeur nodig om STM32 te programmeren, sluit gewoon uw pc aan op de USB-poort van STM32 en begin met programmeren met Arduino IDE. Lees meer over het programmeren van STM32 via de USB-poort.
Zoals we al zeiden, gaan we hier in deze tutorial een getal vanaf 0 verhogen en weergeven op een 16x2 LCD-scherm en telkens wanneer een drukknop wordt ingedrukt, gaat de led branden en wordt op het LCD-scherm 'INTERRUPT' weergegeven.
Eerste definiëren LCD-pins aansluitingen met STM32. U kunt het aanpassen aan uw vereisten.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Vervolgens voegen we het headerbestand voor het LCD-scherm toe. Dit roept de bibliotheek op die de code bevat voor hoe de STM32 moet communiceren met het LCD-scherm. Zorg er ook voor dat de functie LiquidCrystal wordt aangeroepen met de pinnamen die we zojuist hierboven hebben gedefinieerd.
omvatten
Globale variabelen worden gebruikt om gegevens tussen ISR en het hoofdprogramma door te geven. We verklaren de variabele ledOn als vluchtig en ook als Boolean om True of False op te geven.
vluchtige boolean ledOn = false;
In de void setup () -functie zullen we een intro-bericht weergeven en dit na 2 seconden wissen.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); vertraging (2000); lcd.clear ();
Wederom in dezelfde void setup () -functie, moeten we de invoer- en uitvoerpinnen specificeren. We stellen pin PA1 in voor output naar LED en PA0 voor input van drukknop.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
We gaan ook een getal verhogen, dus declareer een variabele met waarde nul.
int i = 0;
Nu is het belangrijkste deel van de code de functie attachInterrupt () , deze is ook opgenomen in de void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
We hebben de pin PA0 gespecificeerd voor externe onderbreking, en buttonPressed is de functie die moet worden aangeroepen wanneer er VERANDERING is (LOW naar HIGH of HOOG naar LOW) in PA0 pin. U kunt naar behoefte ook elke andere functienaam, pin en modus gebruiken.
Binnen de lege lus () verhogen we een getal (i) vanaf nul en printen we het getal in LCD (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; vertraging (1000);
Het belangrijkste onderdeel is het maken van een interrupt-handlerfunctie volgens de naam die we hebben gebruikt in de functie attachInterrupt () . We gebruikten buttonPressed, dus hier hebben we een functie gemaakt void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Onderbreken"); } }
Werking van deze knop Pressed () ISR:
Volgens de waarde van ledOn- variabele gaat de led AAN en UIT.
KNOP STAAT |
ledOn (Waarde) |
LED (rood) |
LCD (16x2) |
ONGEDRUKT |
Vals |
UIT |
- |
INGEDRUKT |
Klopt |
AAN |
Toont '' ONDERBREKEN ' |
Als de ledOn- waarde onwaar is, blijft de led uitgeschakeld en als de ledOn- waarde Waar is, gaat de led aan en wordt op het LCD-scherm 'Interrupt' weergegeven.
OPMERKING: Er kan soms een debounce-effect van de schakelaar zijn en het kan meerdere triggers tellen wanneer de drukknop wordt ingedrukt, dit komt doordat er verschillende spanningspieken zijn vanwege de mechanische reden van het schakelen van de drukknop. Dit kan worden verminderd door een RC-filter te introduceren.
De volledige werking van interrupts in STM32F103C8 wordt getoond in de onderstaande video.