Przerwania obsługi GPIO oszczędzają pracę mikrokontrolera i wywoływane są tylko, gdy na porcie GPIO pojawi się zmiana stanu (0 lub 1).
Można je wykorzystać do obsługi urządzeń wejścia zewnętrznych takich, jak
- buttony
- czujnik ruchu
- czujnik dźwięku
- czujnik światła
- czujnik wilgoci
- inne podobne działające na zasadzie 0/1
Konfiguracja STM32CubeMX
- Pionout & Configuration
- Włączamy pin wejściowy w trybie GPIO_EXTIx (x-numer)
- Po prawej stronie SYSTEM VIEW
- Kolumna System Core – GPIO
- Na środku w tabelce wybieramy podpięty pin GPIO i dokładamy mu przerwanie (klikamy np. PC13)
- Dla pinu PC13 u dołu zmieniamy GPIO MODE na External Interrupt Mode With Rising/Falling Edge trigger
- WAŻNE! Wybieramy zakładkę NVIC i zaznaczamy Enabled przy linii przerwania, która nas interesuje (EXTI Line[9:5] interrupts), spowoduje to wygenerowanie funkcji np.
1void EXTI9_5_IRQHandler(void)
w pliku stm32fxx_it.c
Rising – stan wysoki (1, płynie prąd przez przełącznik GPIO), Falling – stan niski – brak prądu. Można załączyć przerwanie np. tylko przy włączaniu przełącznika.
Typy C
W programowaniu mikrokontrolerów raczej nie używa się zmienny logicznych (bool), char na oznaczenie 1 bajtu itp. Używa się typów postaci
1 | uint8_t zmienna; |
uint – unsigned int
8- liczba bitów (8,16,…)
int8_t zastępuje zmienną bool( 0 =false, 1=true);
CubeMX
Aktywować trzeba też przerwanie dla przycisku w CubeMX.
System Core po lewej -> GPIO -> w tabelce wybieramy button (np. B1) i włączamy przerwanie -> GPIO MODE: External GPIO mode: raising/falling edge trigger detection (tj. na wciśnięcie i wyciśnięcie pojawia się przerwanie).
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* USER CODE BEGIN PFP */ int8_t greenLedStatus = 0; //FX: Green led status 0 or 1 (switching when lighting) void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); //Prototype of interrupt function /* USER CODE END PFP */ //........ // pod main() w sekcji: /* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ //FX: Interrupt function. Light the greenLed when button is pressed, changing the status HAL_GPIO_WritePin(greenLed_GPIO_Port, greenLed_Pin, greenLedStatus ? GPIO_PIN_RESET : GPIO_PIN_SET); greenLedStatus = !greenLedStatus; //remember the state } /* USER CODE END 4 */ |
Pierwszy blok doodajemy przed main() jest tam zmienna greenLedStatus – przechowująca stan diody
Po main piszemy funkcję obsługi przerwania, wywołuje ją dowolny pin GPIO:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
Zmienna Pin przełącza Pin przerwania. W tym czasie w main nic nie dodajemy.
Rozpoznajemy który pin
Parametr GPIO_Pin można wykorzystać do rozpoznawania, który pin wywołał przerwanie, nazwy (RAINDROP, KONTAKTRON) zostały nadane w programie CubeMX (prawy myszy na pinie: Enter User Label) np.
1 2 3 4 5 6 7 8 9 10 11 12 | void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ switch(GPIO_Pin) { case RAINDROP_Pin: raindropRequest = 1; break; case KONTAKTRON_Pin: kontaktronRequest = 1; break; } } |