STM32–Контроллер внешних прерываний(событий)

Сегодня попробуем поработать с контроллером внешних прерываний (событий) External interrupt/event controller (EXTI).

Функциональная схема

image

Как видим контроллер имеет 18 линий прерывания (событий), из них 16 линий можно подключить к линиям ввода-вывода. Генерирование прерываний (событий) возможно по нарастающему и спадающему фронту входного сигнала, так же возможно принудительно (программно) сформировать прерывания (событие) путем записи соответствующего бита регистра EXTI_SWIER:

image

Подключение линий ввода-вывода производится посредством 16 мультиплексоров, по одному семиканальному мультиплексору на одну линию прерывания:

image

К оставшимся двум линия прерывания подключены:

  • линия 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, так как к ней подключена кнопка установленная на плате: image Конфигурируем линию как вход:
      #define BUTTON	A, 0, HIGH, INPUT_FLOATING,
      
      PIN_CONFIGURATION(BUTTON);
      Далее согласно документации необходимо разрешить тактирование AFIO (альтернативные функции линий ввода-вывода), так как регистры управления мультиплексорами находится в данном модуле: RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; далее выбираем необходимый нам вход: image
      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;
      }
      При включении будет гореть зеленый светодиод на плате. При нажатии на кнопку гаснуть, а при отпускании снова загораться. Проект целиком: 2011-05-18-stm32-exti-demo
      	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