- Tipuri de întreruperi și ISR
- Sintaxa pentru întreruperea în STM32
- Componente necesare
- Diagrama circuitului și conexiunile
- Programarea STM32F103C8 pentru întreruperi
Întreruperile este un mecanism prin care o I / O sau o instrucțiune poate suspenda execuția normală a procesorului și poate fi întreținută ca și cum ar avea cea mai mare prioritate. De exemplu, un procesor care execută o execuție normală poate monitoriza continuu dacă există un fel de eveniment sau o întrerupere. Atunci se întâmplă o întrerupere externă (ca de la un senzor), atunci procesorul întrerupe execuția normală și servește mai întâi întreruperea și apoi își continuă execuția normală.
Aici, în acest proiect, pentru a înțelege întreruperile din STM32F103C8, vom utiliza butonul de apăsare ca întrerupere externă. Aici vom incrementa un număr de la 0 și îl vom afișa pe ecranul LCD 16x2, iar ori de câte ori este apăsat butonul, ledul se aprinde, iar afișajul LCD arată INTERRUPT. LED-ul se stinge imediat ce butonul este eliberat.
Tipuri de întreruperi și ISR
Întreruperile pot fi clasificate în două tipuri:
Întreruperi hardware: dacă semnalul către procesor este de la un dispozitiv extern, cum ar fi butonul sau senzorul sau de la un alt dispozitiv hardware care generează un semnal și îi spune procesorului să facă o anumită sarcină prezentă în ISR, este cunoscut sub numele de întreruperi hardware.
Întreruperi software: întreruperile generate de instrucțiunile software.
Rutina de întrerupere a serviciului
Rutina de servicii de întrerupere sau un manipulator de întrerupere este un eveniment care are un set mic de instrucțiuni și atunci când are loc o întrerupere, procesorul execută mai întâi acest cod care este prezent în ISR și apoi continuă cu sarcina pe care o făcea înainte de întrerupere.
Sintaxa pentru întreruperea în STM32
ISR are următoarea sintaxă attachInterrupt (digitalPinToInterrupt (pin), ISR, mod) în Arduino și același lucru poate fi folosit și în STM32, deoarece folosim IDE arduino pentru a încărca codul.
- digitalPinToInterrupt (pin): La fel ca în placa Arduino Uno avem pinii 2,3 și în mega avem 2,3,18,19,20,21 pentru întreruperi. În STM32F103C8 avem și pini de întrerupere, orice pini GPIO pot fi folosiți pentru întreruperi. Trebuie doar să specificăm pinul de intrare pe care îl folosim pentru întrerupere. Dar, în timp ce folosim mai multe întreruperi în același timp, este posibil să trebuiască să respectăm unele restricții.
- ISR: Este o funcție de gestionare a întreruperii care este apelată atunci când are loc o întrerupere externă. Nu are argumente și nu are niciun tip de returnare.
- Mod: Tipul de tranziție pentru a declanșa întreruperea
- RISING: Pentru a declanșa o întrerupere atunci când pinul tranzitează de la LOW la HIGH.
- FALLING: Pentru a declanșa o întrerupere atunci când pinul trece de la HIGH la LOW.
- SCHIMBARE: Pentru a declanșa o întrerupere atunci când pinul tranzitează fie de la LOW la HIGH, fie la HIGH la LOW (adică atunci când pinul se schimbă).
Unele condiții în timpul utilizării întreruperii
- Funcția de rutină de întrerupere a serviciului (ISR) trebuie să fie cât mai scurtă posibil.
- Funcția Delay () nu funcționează în interiorul ISR și ar trebui evitată.
Componente necesare
- STM32F103C8
- Apasa butonul
- LED
- Rezistor (10K)
- LCD (16x2)
Diagrama circuitului și conexiunile
O parte a pinului butonului este conectată la 3,3V STM32, iar cealaltă parte este conectată la pinul de intrare (PA0) al STM32 printr-un rezistor de tragere.
Rezistorul Pull Down este utilizat astfel încât microcontrolerul să obțină fie HIGH, fie LOW la intrarea sa doar când butonul este apăsat sau eliberat. În caz contrar, fără rezistență de tragere, MCU poate confunda și alimenta unele valori aleatorii plutitoare la intrare.
Conexiune între STM32F103C8 și LCD
Următorul tabel prezintă conexiunea pin între LCD (16X2) și microcontrolerul STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
La codul PIN al centrului potențiometrului |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
Programarea STM32F103C8 pentru întreruperi
Programul pentru acest tutorial este simplu și este oferit la sfârșitul acestui tutorial. Nu avem nevoie de programator FTDI pentru a programa STM32, pur și simplu conectați computerul la portul USB al STM32 și începeți programarea cu Arduino IDE. Aflați mai multe despre programarea STM32 prin portul USB.
După cum am spus că aici, în acest tutorial, vom crește un număr de la 0 și îl vom afișa pe ecranul LCD 16x2 și ori de câte ori este apăsat un buton, ledul se aprinde, iar afișajul LCD arată „INTERRUPT”.
Mai întâi definiți conexiunile pinilor LCD cu STM32. Îl puteți modifica conform cerințelor dvs.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Apoi, includem fișierul antet pentru afișajul LCD. Aceasta apelează biblioteca care conține codul pentru modul în care STM32 ar trebui să comunice cu ecranul LCD. De asemenea, asigurați-vă că funcția LiquidCrystal este apelată cu numele pinilor pe care tocmai le-am definit mai sus.
include
Variabilele globale sunt folosite pentru a transmite date între ISR și programul principal. Declarăm variabila ledOn ca fiind volatilă și, de asemenea, ca Boolean pentru a specifica True sau False.
led boolean volatil = fals;
În interiorul funcției de configurare nulă () , vom afișa un mesaj introductiv și îl vom șterge după 2 secunde.
lcd.inceput (16,2); lcd.print ("CIRCUIT DIGEST"); întârziere (2000); lcd.clear ();
Din nou, în aceeași funcție de setare nulă () , trebuie să specificăm pinii de intrare și de ieșire. Am setat pinul PA1 pentru ieșire la LED și PA0 pentru intrarea de la buton.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
De asemenea, vom incrementa un număr, deci declarăm o variabilă cu valoarea zero.
int i = 0;
Acum partea importantă a codului este funcția attachInterrupt () , este inclusă și în setarea void ()
attachInterrupt (digitalPinToInterrupt (PA0), buton apăsat, CHANGE)
Am specificat pinul PA0 pentru întrerupere externă, iar butonul apăsat este funcția care trebuie apelată atunci când există CHANGE (LOW la HIGH sau HIGH la LOW) în pinul PA0. Puteți utiliza, de asemenea, orice altă funcție, nume și pin, în funcție de cerință.
În interiorul buclei de gol () creștem un număr (i) de la zero și imprimăm numărul în LCD (16x2).
lcd.clear (); lcd.print ("NUMĂR:"); lcd.print (i); ++ i; întârziere (1000);
Cea mai importantă parte este crearea unei funcții de gestionare a întreruperilor în funcție de numele pe care l-am folosit în funcția attachInterrupt () . Am folosit butonul Apăsat, așa că aici am creat o funcție butonul gol Apăsat ()
buton nul Apăsat () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print („Întrerupere”); } }
Funcționarea acestui buton Apăsat () ISR:
În funcție de valoarea variabilei ledOn , LED-ul se aprinde și se stinge.
BUTTON STATE |
ledOn (Valoare) |
LED (roșu) |
LCD (16x2) |
NEPRIMAT |
Fals |
OPRIT |
- |
PRESAT |
Adevărat |
PE |
Afișează „INTERRUPT” |
Dacă valoarea ledOn este falsă, LED-ul rămâne oprit și dacă valoarea ledOn este True, LED-ul se aprinde și afișajul LCD afișează „Întrerupere” pe el.
NOTĂ: Este posibil să existe uneori un efect de deconectare a comutatorului și poate conta declanșatorul multiplu atunci când butonul este apăsat, acest lucru se datorează faptului că mai multe vârfuri de tensiune datorită motivului mecanic al comutării butonului. Acest lucru poate fi redus prin introducerea unui filtru RC.
Funcționarea completă a întreruperilor în STM32F103C8 este prezentată în videoclipul de mai jos.