- Pārtraukumu veidi un ISR
- Sintakse pārtraukumam STM32
- Nepieciešamās sastāvdaļas
- Shēmas shēma un savienojumi
- STM32F103C8 programmēšana pārtraukumiem
Pārtraukumi ir mehānisms, ar kura palīdzību I / O vai instrukcija var apturēt procesora parasto izpildi un tiek apkalpota tāpat kā tai ir visaugstākā prioritāte. Tāpat kā, piemēram, procesors, kas veic normālu izpildi, var arī nepārtraukti uzraudzīt kāda veida notikumu vai pārtraukumu. Tas ir, kad notiek ārējs pārtraukums (piemēram, no kāda sensora), tad procesors pārtrauc normālu izpildi un vispirms apkalpo pārtraukumu un pēc tam turpina normālu izpildi.
Šajā projektā, lai izprastu STM32F103C8 pārtraukumus, mēs izmantosim spiedpogu kā ārēju pārtraukumu. Šeit mēs palielināsim skaitli no 0 un parādīsim to uz 16x2 LCD displeja, un ikreiz, kad tiek nospiesta spiedpoga, LED ieslēdzas un LCD displejā tiek rādīts INTERRUPT. Gaismas diode izslēdzas, tiklīdz poga tiek atlaista.
Pārtraukumu veidi un ISR
Pārtraukumus kopumā var iedalīt divos veidos:
Aparatūras traucējumi: ja signāls procesoram ir no kādas ārējas ierīces, piemēram, pogas vai sensora, vai no citas aparatūras ierīces, kas ģenerē signālu un liek procesoram veikt noteiktu ISR uzdevumu, sauc par aparatūras pārtraukumiem.
Programmatūras pārtraukumi: pārtraukumi, kurus ģenerē programmatūras instrukcijas.
Pārtraukt pakalpojumu kārtību
Pārtraucošā pakalpojuma kārtība vai pārtraucēju apstrādātājs ir notikums, kurā ir neliels instrukciju kopums, un, kad notiek pārtraukums, procesors vispirms izpilda šo kodu, kas atrodas ISR, un pēc tam turpina uzdevumu, ko tas darīja pirms pārtraukuma.
Sintakse pārtraukumam STM32
ISR ir šāda sintakse attachInterrupt (digitalPinToInterrupt (pin), ISR, režīms) Arduino, un to pašu var izmantot arī STM32, jo koda augšupielādei mēs izmantojam arduino IDE.
- digitalPinToInterrupt (piespraude): Tāpat kā Arduino dēlī Uno, mums ir 2,3 tapas, bet megā - 2,3,18,19,20,21 pārtraukumiem. STM32F103C8 mums ir arī pārtraukuma tapas, jebkuras GPIO tapas var izmantot pārtraukumiem. Mums vienkārši jānorāda ievades tapa, kuru izmantojam pārtraukumam. Bet, vienlaikus lietojot vairāk nekā vienu pārtraukumu, mums, iespējams, būs jāievēro daži ierobežojumi.
- ISR: tā ir pārtraukuma apstrādātāja funkcija, kas tiek izsaukta, kad notiek ārējs pārtraukums. Tam nav argumentu un anulēšanas veids nav derīgs.
- Režīms: pārejas veids, lai aktivizētu pārtraukumu
- RISING: lai aktivizētu pārtraukumu, kad tapa pāriet no LOW uz HIGH.
- KRITUMS: lai aktivizētu pārtraukumu, kad tapa pāriet no HIGH uz LOW.
- IZMAIŅAS: lai aktivizētu pārtraukumu, kad tapa pāriet no LOW uz HIGH vai HIGH uz LOW (ti, kad tapa mainās).
Daži nosacījumi, lietojot pārtraukt
- Pakalpojuma Pārtraukšanas rutīnas funkcijai (ISR) jābūt pēc iespējas īsākai.
- Delay () funkcija nedarbojas ISR iekšienē, un tā ir jāizvairās.
Nepieciešamās sastāvdaļas
- STM32F103C8
- Uzspied pogu
- LED
- Rezistors (10K)
- LCD (16x2)
Shēmas shēma un savienojumi
Spiedpogas tapas viena puse ir savienota ar STM32 3,3 V un otra puse ir savienota ar STM32 ieejas tapu (PA0), izmantojot nolaižamo rezistoru.
Tiek izmantots pievilkšanas rezistors, lai mikrokontrolleris ieejā iegūtu tikai HIGH vai LOW, kad tiek nospiesta vai atlaista poga. Pretējā gadījumā bez nolaižamā rezistora MCU var sajaukt un ievadīt ievadā dažas nejaušas peldošās vērtības.
Savienojums starp STM32F103C8 un LCD
Šajā tabulā parādīts kontaktu savienojums starp LCD (16X2) un STM32F103C8 mikrokontrolleru.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Uz potenciometra centra PIN |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
STM32F103C8 programmēšana pārtraukumiem
Šīs apmācības programma ir vienkārša un sniegta šīs apmācības beigās. Mums nav nepieciešams FTDI programmētājs, lai ieprogrammētu STM32, vienkārši pievienojiet savu datoru STM32 USB pieslēgvietai un sāciet programmēt, izmantojot Arduino IDE. Uzziniet vairāk par STM32 programmēšanu, izmantojot USB portu.
Tā kā mēs teicām, ka šajā apmācībā mēs palielināsim skaitli no 0 un parādīsim to 16x2 LCD ekrānā, un ikreiz, kad tiek nospiesta spiedpoga, LED ieslēdzas un LCD displejā redzams “PĀRTRAUKUMS”.
Vispirms definējiet LCD tapu savienojumus ar STM32. Jūs to varat modificēt atbilstoši savām prasībām.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Tālāk mēs iekļaujam galvenes failu LCD displejam. Tas izsauc bibliotēku, kurā ir kods, kā STM32 vajadzētu sazināties ar LCD. Pārliecinieties arī, vai funkcija LiquidCrystal tiek izsaukta ar tapu nosaukumiem, kurus mēs tikko definējām iepriekš.
iekļaut
Globālie mainīgie tiek izmantoti, lai pārsūtītu datus starp ISR un galveno programmu. Mēs deklarējam mainīgo ledOn kā nepastāvīgu un arī kā Būla vērtību, lai norādītu patiesu vai nepatiesu.
gaistošs Būla ledOn = nepatiesa;
Funkcijas void setup () iekšpusē mēs parādīsim ievadziņu un notīrīsim to pēc 2 sekundēm.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); kavēšanās (2000); lcd.clear ();
Atkal tajā pašā void setup () funkcijā mums jānorāda ievades un izvades tapas. Mēs iestatām tapu PA1 izejai uz LED un PA0 ievadei no spiedpogas.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Mēs arī palielināsim skaitli, tāpēc paziņojiet mainīgo ar nulles vērtību.
int i = 0;
Tagad svarīgā koda daļa ir funkcija attachInterrupt () , tā ir iekļauta arī void setup () iekšpusē
attachInterrupt (digitalPinToInterrupt (PA0), poga nospiesta, CHANGE)
Mēs norādījām tapu PA0 ārējam pārtraukumam, un buttonPressed ir funkcija, kas jāizsauc, kad PA0 tapā ir CHANGE (LOW to HIGH vai HIGH to LOW). Jūs varat arī izmantot jebkuru citu funkcijas nosaukumu, piespraudi un režīmu atbilstoši prasībām.
Tukšās cilpas () iekšpusē mēs palielinām skaitli (i) no nulles un izdrukājam numuru LCD (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; kavēšanās (1000);
Vissvarīgākā daļa ir pārtraukuma apdarinātāja funkcijas izveide atbilstoši nosaukumam, kuru izmantojām funkcijai attachInterrupt () . Mēs izmantojām buttonPressed, tāpēc šeit esam izveidojuši funkciju void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } cits { ledOn = patiess; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Pārtraukt"); } }
Šīs pogas darbība ir nospiesta () ISR:
Atbilstoši mainīgā ledOn vērtībai LED ieslēdzas un izslēdzas.
POGAS VALSTS |
ledOn (vērtība) |
LED (sarkans) |
LCD (16x2) |
NESPIESTS |
Nepatiesa |
IZSLĒGTS |
- |
Nospiež |
Patiesi |
ON |
Rāda '' INTERRUPT '' |
Ja ledOn vērtība ir nepatiesa, gaismas diode paliek izslēgta un, ja ledOn vērtība ir True, tad LED iedegas un LCD displejā ir redzams 'Interrupt'.
PIEZĪME: Dažreiz var būt slēdža atlēciena efekts, un, nospiežot pogu, tas var saskaitīt vairākus sprādzienus, jo spiediena pogas pārslēgšanas mehānisku iemeslu dēļ ir vairāki sprieguma lēcieni. To var samazināt, ieviešot RC filtru.
STM32F103C8 pārtraukumu pilnīga darbība ir parādīta zemāk esošajā video.