STM32 przerwanie od przycisku

Przerwania w mikrokontrolerach STM32 są bardzo mocno rozbudowane. W tej części opiszę jak skonfigurować przerwanie, aby obsłużyć przycisk. Wciśnięcie przycisku będzie zapalać i gasić diodę led.

 

Na płytce NUCLEO-F103RB znajduje się jeden przycisk (tact-switch) dostępny dla użytkowanika (PC13). Jest on koloru niebieskiego. Zerkając do schematu podłączenia przycisku widać, że zwiera on sygnał do masy. Dla nas oznacza to, że należy wykryć zbocze opadające. Tak też skonfigujemy przerwanie.

Zakładamy nowy projekt w STM32CubeMX z płytką Nucleo-F103RB. Dodajemy etykiety dla przycisku (BLUE_BUTTON) i diody LED (LED_GREEN).

Pin PC13 ustawiamy jako GPIO_EXTI13. Klikamy prawym przyciskiem myszy na pinie mikrokontrolera i z rozwiniętego menu wybieramy odpowiednią opcję.

Konfiguracja pinu STM32 do obsługi przerwania
Rys. 1 Konfiguracja pinu STM32 do obsługi przerwania

 

W następnym kroku należy przejść do zakładki "Configuration" i wybrać przycisk "GPIO".

Zakładka configuration
Rys. 2 Zakładka "Configuration"

 

W otworzonym menu należy wybrać tryb GPIO jako "External Interrupt Mode with Falling Edge trigger detection". Przerwanie będzie wywoływane gdy zostanie wykryte zbocze opadające (przycisk zostanie wciśnięty). W kolejnej pozycji wybieramy "No pull-up and no pull-down", rezystory podciągające nie są potrzebne. User label wypełniamy identycznie albo w kodzie programu należy zmienić etykiety przycisku na wpisane przez użytkownika.

Konfiguracja pinu
Rys. 3 Konfiguracja pinu

 

Wracamy do zakładki "Configuration" i wybieramy przycisk "NVIC". Tutaj włączymy przerwanie dla przycisku. Wcześniej zostało tylko skonfigurowane.

Konfiguracja pinu
Rys. 4 Wybranie NVIC

 

W otworzonym oknie należy odszukać linię "EXTI line [15:10] Interrupts" i zaznaczyć opcję "Enabled".

Konfiguracja NVIC
Rys. 5 Wybranie NVIC

 

Przerwanie zostało skonfigurowane i aktywowane. Można zapisać projekt i wygenerować kod wynikowy, gotowy do zaimportowania. Po zaimportowaniu projektu należy przejść do pliku "main.c" i dopisać funkcję odpowiedzialną za obsługę przerwania. Kod powinien znaleźć się między znacznikami:

/* USER CODE BEGIN 4 */ /* USER CODE END 4 */

Obsługa przerwania będzie wyglądała w ten sposób:

/* USER CODE BEGIN 4 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

  if(GPIO_Pin == BLUE_BUTTON_Pin)

  {

    HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);

  }

}

/* USER CODE END 4 */

Po wykryciu przerwania zostanie wywołana funkcja HAL_GPIO_EXTI_Callback(...), która jak argument otrzymuje numer pinu, na którym wykryto przerwanie. W ciele funkcji sprawdzam czy przerwanie zostało wywołane przez naciśnięcie przycisku. Jeżeli tak to stan diody LED zamieniony jest na przeciwny (zapalenie / gaszenie).

Program jest gotowy i można zaprogramować mikrokontroler. Dioda powinna zmieniać swój stan za każdym razem gdy niebieski przycisk zostanie wciśnięty.