- Rodzaje przerwań i ISR
- Składnia przerwania w STM32
- Wymagane składniki
- Schemat obwodu i połączenia
- Programowanie STM32F103C8 na przerwania
Przerwania to mechanizm, za pomocą którego I / O lub instrukcja może zawiesić normalne działanie procesora i zostać obsłużona tak, jakby miała najwyższy priorytet. Na przykład procesor wykonujący normalne wykonanie może również stale monitorować, czy wystąpi jakieś zdarzenie lub przerwanie. To jest, gdy następuje zewnętrzne przerwanie (jak z jakiegoś czujnika), wtedy procesor wstrzymuje swoje normalne wykonanie i najpierw obsługuje przerwanie, a następnie kontynuuje normalne wykonywanie.
W tym projekcie, aby zrozumieć Przerwania w STM32F103C8, użyjemy przycisku jako zewnętrznego przerwania. Tutaj będziemy zwiększać liczbę od 0 i wyświetlać ją na wyświetlaczu LCD 16x2, a po każdym naciśnięciu przycisku dioda zaświeci się, a na wyświetlaczu LCD pojawi się INTERRUPT. Dioda gaśnie, gdy tylko przycisk zostanie zwolniony.
Rodzaje przerwań i ISR
Przerwania można ogólnie podzielić na dwa typy:
Przerwania sprzętowe: Jeśli sygnał do procesora pochodzi z jakiegoś zewnętrznego urządzenia, takiego jak przycisk lub czujnik, lub z innego urządzenia sprzętowego, które generuje sygnał i nakazuje procesorowi wykonanie określonego zadania obecnego w ISR, nazywa się przerwaniami sprzętowymi.
Przerwania oprogramowania: Przerwania generowane przez instrukcje oprogramowania.
Procedura obsługi przerwania
Procedura obsługi przerwania lub procedura obsługi przerwania to zdarzenie, które zawiera mały zestaw instrukcji, a gdy wystąpi przerwanie, procesor najpierw wykonuje kod obecny w ISR, a następnie kontynuuje zadanie, które wykonywał przed przerwaniem.
Składnia przerwania w STM32
ISR ma następującą składnię attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) w Arduino i to samo może być również użyte w STM32, ponieważ używamy arduino IDE do przesyłania kodu.
- digitalPinToInterrupt (pin): Podobnie jak w płytce Arduino Uno mamy piny 2,3, aw mega mamy 2,3,18,19,20,21 na przerwania. W STM32F103C8 mamy również piny przerwań, które mogą być użyte do przerwań. Po prostu określamy pin wejściowy, którego używamy do przerwania. Ale podczas używania więcej niż jednego przerwań w tym samym czasie może być konieczne przestrzeganie pewnych ograniczeń.
- ISR: Jest to funkcja obsługi przerwań, która jest wywoływana, gdy wystąpi zewnętrzne przerwanie. Nie ma argumentów i void return type.
- Tryb: rodzaj przejścia do wyzwolenia przerwania
- RISING: Aby wyzwolić przerwanie, gdy pin przechodzi z LOW do HIGH.
- FALLING: Aby wywołać przerwanie, gdy pin przechodzi z WYSOKI do NISKI.
- CHANGE: Aby wywołać przerwanie, gdy pin przechodzi z LOW do HIGH lub HIGH do LOW (tj., Gdy pin się zmienia).
Niektóre warunki podczas używania przerwania
- Funkcja Interrupt Service Routine (ISR) musi być jak najkrótsza.
- Funkcja Delay () nie działa wewnątrz ISR i należy jej unikać.
Wymagane składniki
- STM32F103C8
- Naciśnij przycisk
- DOPROWADZIŁO
- Rezystor (10 K)
- LCD (16x2)
Schemat obwodu i połączenia
Jedna strona pinu przycisku jest podłączona do 3,3 V STM32, a druga strona jest podłączona do styku wejściowego (PA0) STM32 poprzez rezystor obniżający.
Zastosowano rezystor obniżający, dzięki czemu mikrokontroler otrzyma WYSOKI lub NISKI na wejściu tylko po naciśnięciu lub zwolnieniu przycisku. W przeciwnym razie bez rezystora obniżającego MCU może się pomylić i podać losowe wartości zmiennoprzecinkowe na wejście.
Połączenie między STM32F103C8 a LCD
Poniższa tabela przedstawia połączenie pinów między wyświetlaczem LCD (16X2) a mikrokontrolerem STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Do środka PIN potencjometru |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
mi |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
ZA |
GND |
K. |
Programowanie STM32F103C8 na przerwania
Program do tego samouczka jest prosty i podany na końcu tego samouczka. Nie potrzebujemy programatora FTDI do programowania STM32, wystarczy podłączyć komputer do portu USB STM32 i rozpocząć programowanie za pomocą Arduino IDE. Dowiedz się więcej o programowaniu STM32 przez port USB.
Jak powiedzieliśmy, w tym samouczku będziemy zwiększać liczbę od 0 i wyświetlać ją na wyświetlaczu LCD 16x2 i po każdym naciśnięciu przycisku dioda zapali się, a na wyświetlaczu LCD pojawi się napis „INTERRUPT”.
Najpierw zdefiniuj połączenia pinów LCD z STM32. Możesz go zmodyfikować zgodnie ze swoimi wymaganiami.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Następnie dołączamy plik nagłówkowy wyświetlacza LCD. To wywołuje bibliotekę, która zawiera kod, w jaki sposób STM32 powinien komunikować się z LCD. Upewnij się również, że funkcja LiquidCrystal jest wywoływana z nazwami pinów, które właśnie zdefiniowaliśmy powyżej.
zawierać
Zmienne globalne służą do przekazywania danych między ISR a głównym programem. Deklarujemy zmienną ledOn jako zmienną, a także jako wartość logiczną, aby określić wartość True lub False.
volatile boolean ledOn = false;
Wewnątrz funkcji void setup () wyświetlimy komunikat wprowadzający i usuniemy go po 2 sekundach.
lcd.begin (16,2); lcd.print ("PRZEGLĄD OBWODU"); opóźnienie (2000); lcd.clear ();
Ponownie w tej samej funkcji void setup () musimy określić piny wejściowe i wyjściowe. Ustawiamy pin PA1 jako wyjście na LED i PA0 na wejście z przycisku.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Będziemy również zwiększać liczbę, więc zadeklaruj zmienną o wartości zero.
int i = 0;
Teraz ważną częścią kodu jest funkcja attachInterrupt () , jest ona również zawarta w konfiguracji void ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Określiliśmy pin PA0 dla zewnętrznego przerwania, a przyciskPressed jest funkcją, która ma być wywołana, gdy w pinie PA0 jest CHANGE (LOW na HIGH lub HIGH na LOW). Możesz również użyć dowolnej innej nazwy funkcji, kodu PIN i trybu zgodnie z wymaganiami.
Wewnątrz void loop () zwiększamy liczbę (i) od zera i wypisujemy liczbę na LCD (16x2).
lcd.clear (); lcd.print ("LICZBA:"); lcd.print (i); ++ i; opóźnienie (1000);
Najważniejszą częścią jest utworzenie funkcji obsługi przerwań zgodnie z nazwą, której użyliśmy w funkcji attachInterrupt () . Użyliśmy buttonPressed, więc utworzyliśmy tutaj funkcję void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Przerwanie"); } }
Działanie tego przyciskuPressed () ISR:
Zgodnie z wartością zmiennej ledOn dioda LED włącza się i wyłącza.
STAN PRZYCISKU |
ledOn (wartość) |
LED (czerwony) |
LCD (16x2) |
NIEWYCIŚLONE |
Fałszywy |
POZA |
- |
PRASOWANY |
Prawdziwe |
NA |
Pokazuje „INTERRUPT” |
Jeśli wartość ledOn jest fałszywa, dioda LED pozostaje wyłączona, a jeśli wartość ledOn ma wartość True, to dioda LED zapala się, a wyświetlacz LCD pokazuje „Przerwanie”.
UWAGA: Czasami może występować efekt odbicia przełącznika i może liczyć wielokrotne wyzwolenie po naciśnięciu przycisku, jest to spowodowane kilkoma skokami napięcia z powodu mechanicznego powodu przełączania przycisku. Można to zmniejszyć, wprowadzając filtr RC.
Pełne działanie przerwań w STM32F103C8 pokazano na poniższym filmie.