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

  1. buttony
  2. czujnik ruchu
  3. czujnik dźwięku
  4. czujnik światła
  5. czujnik wilgoci
  6. 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.
    1
    void 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;
                }
}
C, STM32