Ten post chciałbym poświęcić na opisanie sposobu generacji przerwań zewnętrznych w mikrokontrolerze STM32F7.
Piny względem przerwań grupowane są w następujący sposób:
- Przerwanie dla pinu 0;
- Przerwanie dla pinu 1;
- Przerwanie dla pinu 2;
- Przerwanie dla pinu 3;
- Przerwanie dla pinu 4;
- Przerwanie dla pinów od 5 do 9 ;
- Przerwanie dla pinów od 10 do 15;
Można je wyzwolić na trzy sposoby: zboczem opadającym (GPIO_MODE_IT_FALLING), rosnącym (GPIO_MODE_IT_RISING) lub wywołanie na oba zbocza (GPIO_MODE_IT_RISING_FALLING).
Poniżej przejdę przez wszystkie funkcje.
Inicjalizacja:
- #define Inter_Pin GPIO_PIN_8
- #define Inter_Port GPIOA
- #define Inter_Pull GPIO_NOPULL //GPIO_PULLUP //GPIO_PULLDOWN
- #define Inter_Pin_Speed GPIO_SPEED_HIGH //GPIO_SPEED_FREQ_LOW //GPIO_SPEED_FREQ_MEDIUM //GPIO_SPEED_FREQ_VERY_HIGH
- #define Inter_Trig_Mode GPIO_MODE_IT_RISING_FALLING
- #define Inter_Port_Clock __HAL_RCC_GPIOA_CLK_ENABLE()
- #define Inter_Irq EXTI9_5_IRQn
- void Init_Ext_INT5TO9_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- Inter_Port_Clock;
- GPIO_InitStruct.Pin = Inter_Pin;
- GPIO_InitStruct.Mode = Inter_Trig_Mode;
- GPIO_InitStruct.Pull = Inter_Pull;
- GPIO_InitStruct.Speed = Inter_Pin_Speed;
- HAL_GPIO_Init(Inter_Port, &GPIO_InitStruct);
- // NVIC config
- HAL_NVIC_SetPriority(Inter_Irq, 2, 0);
- HAL_NVIC_EnableIRQ(Inter_Irq);
- }
Obsługa przerwania:
- void EXTI9_5_IRQHandler(void)
- {
- if(__HAL_GPIO_EXTI_GET_IT(Inter_Pin) != RESET)
- {
- __HAL_GPIO_EXTI_CLEAR_IT(Inter_Pin);
- if(HAL_GPIO_ReadPin(Inter_Port, Inter_Pin)==GPIO_PIN_RESET)
- {
- /* Do stuff for low state on pin */
- }
- else
- {
- /* Do stuff for high state on pin */
- }
- break;
- }
- }
Sprawa wygląda tak samo dla każdej obsługi przerwania od pinu. Najpierw zostaje sprawdzony który pin wywołał przerwanie, następnie czyścimy flagę, po to aby żadne następne wywołane przerwanie nie zostało przeoczone. Po tych operacjach można sprawdzić stan pinu i na tej podstawie wykonać operacje.
Dostępne są następujące funkcje obsługujące przerwanie:
Każdy pin o tym samym numerze (np. PA0, PB0) nie może być obsługiwany przez przerwanie 0. Jeden pin należy podłączać pod jedno przerwanie.
Dla funkcji obsługującej wywołane przerwanie należy pamiętać aby odbywała się ona możliwie najszybciej, należy odpuścić sobie opóźnienia, zwłaszcza dłuższe. Trzeba wykonywać tylko operacje, które w danym wywołaniu są niezbędne do wykonania.
Dostępne są następujące funkcje obsługujące przerwanie:
- void EXTI0_IRQHandler(void);
- void EXTI1_IRQHandler(void);
- void EXTI2_IRQHandler(void);
- void EXTI3_IRQHandler(void);
- void EXTI4_IRQHandler(void);
- void EXTI9_5_IRQHandler(void);
- void EXTI10_15_IRQHandler(void);
Każdy pin o tym samym numerze (np. PA0, PB0) nie może być obsługiwany przez przerwanie 0. Jeden pin należy podłączać pod jedno przerwanie.
Dla funkcji obsługującej wywołane przerwanie należy pamiętać aby odbywała się ona możliwie najszybciej, należy odpuścić sobie opóźnienia, zwłaszcza dłuższe. Trzeba wykonywać tylko operacje, które w danym wywołaniu są niezbędne do wykonania.