STM32–Контроллер внешних прерываний(событий)
18 Мая 2011
К комментариям
Сегодня попробуем поработать с контроллером внешних прерываний (событий) External interrupt/event controller (EXTI).
Функциональная схема
Как видим контроллер имеет 18 линий прерывания (событий), из них 16 линий можно подключить к линиям ввода-вывода. Генерирование прерываний (событий) возможно по нарастающему и спадающему фронту входного сигнала, так же возможно принудительно (программно) сформировать прерывания (событие) путем записи соответствующего бита регистра EXTI_SWIER:
Подключение линий ввода-вывода производится посредством 16 мультиплексоров, по одному семиканальному мультиплексору на одну линию прерывания:
К оставшимся двум линия прерывания подключены:
- линия 17 (EXTI16) – к выходу программируемого детектора напряжения (PVD)
- линия 18 (EXTI17) – к часам реального времени (RTC) (“будильник”) </ul> Все выше сказанное относиться к семейству STM32F100xx (RM0041 - Reference manual). Поэтому перейдем к представителю семейства STM32F100RB (STM32VLDISCOVERY). У данного микроконтроллера 51 линия ввода-вывода. В таблице векторов прерываний следующее распределение векторов:
- EXTI0 – индивидуальный для линии 0
- EXTI1 – индивидуальный для линии 1
- EXTI2 – индивидуальный для линии 2
- EXTI3 – индивидуальный для линии 3
- EXTI4 – индивидуальный для линии 4
- EXTI5-9 – общий для линий с 5 по 9
- EXTI10-15 – общий для линий с 10 по 15 </ul>
Пример Попробуем рассмотреть на примере работу с контроллером внешних прерываний без использования стандартных библиотек от STM. Для примера выберем линию ввода-вывода PA0, так как к ней подключена кнопка установленная на плате:

#define BUTTON A, 0, HIGH, INPUT_FLOATING,
PIN_CONFIGURATION(BUTTON);

AFIO->EXTICR[0] &= ~AFIO_EXTICR1_EXTI0;
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
EXTI->RTSR |= EXTI_RTSR_TR0;
EXTI->FTSR |= EXTI_FTSR_TR0;
EXTI->IMR |= EXTI_IMR_MR0;
//-----------------------------------------------------------------------------
int main(void)
{
PIN_CONFIGURATION(LED_GREEN);
PIN_CONFIGURATION(LED_BLUE);
PIN_CONFIGURATION(BUTTON);
PIN_OFF(LED_BLUE);
PIN_ON(LED_GREEN);
interrupt_init();
EXTI->IMR &= ~EXTI_IMR_MR0;
EXTI->EMR &= ~EXTI_EMR_MR0;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->EXTICR[0] &= ~AFIO_EXTICR1_EXTI0;
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
EXTI->RTSR |= EXTI_RTSR_TR0;
EXTI->FTSR |= EXTI_FTSR_TR0;
EXTI->IMR |= EXTI_IMR_MR0;
while (1)
{
}
return 0;
}
//-----------------------------------------------------------------------------
void interrupt_init(void)
{
NVIC_SetPriority(EXTI0_IRQn, 15);
NVIC_EnableIRQ(EXTI0_IRQn);
}
//-----------------------------------------------------------------------------
void handler_exti0(void)
{
if (PIN_SIGNAL(BUTTON))
{
PIN_OFF(LED_GREEN);
}
else
{
PIN_ON(LED_GREEN);
}
EXTI->PR = EXTI_PR_PR0;
}
make all
-----------------------------------------------------------
Compiling: mcu/startup.c
Compiling: main.c
Compiling: mcu/interrupt.c
Linking: target.elf
-----------------------------------------------------------
text data bss dec hex filename
664 0 200 864 360 target/target.elf
comments powered by Disqus