Программирование STM32. Часть 4. Внешние прерывания EXTI. Раздел: STM32 Cortex M3.

Eugene's MCU

Воскресенье, 13.07.2014, 17:41

Главная | | Мой профиль | Выход | RSS
Меню сайта
Категории каталога
Рекламный блок





Рекомендовать этот сайт:

Главная » Статьи » » STM32 Cortex M3


Программирование STM32. Часть 4. Внешние прерывания EXTI
§ > Общие сведения
 
     Микроконтроллеры STM32 способны генерировать прерывание по состоянию вывода x = {0, 1, 2, .... 15} порта,  назначенного пользователем для данного номера вывода. Так, например прерывание EXTI3 может быть назначено на выводы PA3 или PB3 или PC3… и так далее для одного из портов доступных в данном корпусе микроконтроллера.

     При возникновении условий, назначенных прерыванию x (фронт и/или срез внешнего сигнала) для выводов 0…4 генерируется запрос на прерывание по раздельным каналам EXTI0_IRQn … EXTI4_IRQn, для выводов 5…9 и 10…15 по групповым каналам EXTI9_5_IRQn и EXTI15_10_IRQn соответственно.

       Прерывание будет вызвано при разрешении соответствующего канала NVIC и установленном бите маски разрешения прерываний регистра "Interrupt mask register” (EXTI_IMR). 
  
     В процессе обработки прерывания в регистре EXTI_PR записью единицы необходимо сбросить флаг события вызвавшего данное прерывание. При этом для групповых источников, если маской EXTI_IMR разрешён более чем один из группы выводов, по флагам регистра EXTI_PR необходимо определить какой из них послужил причиной прерывания.

§ > Назначение порта внешнего прерывания
 
     Выбор порта, назначенного прерыванию EXTI(x), осуществляется записью комбинации четырёх битов EXTI(x)[3:0] в одном из регистров AFIO_EXTICR1 … AFIO_EXTICR4:
 
     EXTI(n)[3:0] = 0000: Вывод (x) назначен на PORTA;
     EXTI(n)[3:0] = 0001: PORTB(x);
     EXTI(n)[3:0] = 0010: PORTC(x); 
     EXTI(n)[3:0] = 0011: PORTD(x); 
     EXTI(n)[3:0] = 0100: PORTE(x); 
     EXTI(n)[3:0] = 0101: PORTF(x); 
     EXTI(n)[3:0] = 0110: PORTG(x);
  
     В стандартном файле определений для периферии "stm32F10x.h" указанные регистры объявлены как массив из четырёх элементов-регистров AFIO->EXTICR []. Так как в каждом из регистров EXTICR хранятся комбинации для четырёх выводов, делением номера на четыре можно выбрать нужный элемент массива:
   
 
 AFIO->EXTICR [3>>0x02] |= AFIO_EXTICR1_EXTI3_PA; // Прерывание INT3 на PORTA.
 AFIO->EXTICR [7>>0x02] |= AFIO_EXTICR2_EXTI7_PC; // Прерывание INT7 на PORTC.
  

§ > Разрешение запросов и задание условий вызова внешних прерываний
 
     Разрешение запроса на прерывание по состоянию вывода x осуществляется установкой соответствующего бита MR(x) в регистре EXTI_IMR.

     EXTI_IMR - маска запросов внешних прерываний:
     

     Условия формирования запросов на прерывание EXTI(x) определяются состоянием битов TR(x) в регистрах "Rising trigger selection register” (EXTI_RTSR) и "Falling trigger selection register" (EXTI_FTSR).
 
     EXTI_RTSR – прерывание по фронту "Rising Edge”
     
     EXTI_FTSR – прерывание по срезу "Falling Edge”
     

     При установленных битах регистров RTSR и FTSR соответствующие прерывания будут вызываться или по фронту внешнего сигнала или по срезу, или по обоим событиям вместе, например:
  
 
 EXTI->IMR |= (1<<7); // Разрешить запрос от EXTI7.
 EXTI->FTSR |= (1<<7); // Прерывание от EXTI7 по срезу.
 NVIC_EnableIRQ (EXTI9_5_IRQn); // Разрешить EXTI9_5 в NVIC. 
  

 

§ > Обработка прерываний
 
     После настройки выбранного прерывания достаточно разместить в тексте программы функцию его обработки с именем, указанным в файле startup – "EXTI(x)_IRQHandler”.
  
     Возникшие прерывания вызывают установку флагов событий PR(x) регистра EXTI_PR, которые должны быть сброшены записью в них единичных битов.

void EXTI9_5_IRQHandler (void)
{
      if (EXTI->PR & (1<<5)) // Прерывание от EXTI5?
      {  EXTI->PR |= (1<<5); // Сбросить флаг EXTI5.  
            // Обработка события EXTI5
      }
      if (EXTI->PR & (1<<7)) // Прерывание от EXTI7?
      {  EXTI->PR |= (1<<7); // Сбросить флаг  EXTI7.  
            // Обработка события EXTI7
     
      ...

     

      Ну вот... как-то так. Удачных Вам программ! 


При использовании материалов сайта ссылка на данный источник обязательна.

Категория: STM32 Cortex M3 | Добавил: eugenemcu (04.11.2011) | Автор:

Просмотров: 17478 | Комментарии: 3 | Рейтинг: 4.9/9 |
Всего комментариев: 3
0 Спам
* 1 (27.11.2011 22:27) [Материал]
Благодарю! Весьма признателен за столь популярное объяснение.

0 Спам
* 2 (10.01.2012 17:20) [Материал]
Не забудьте добавить в проект RCC->APB2ENR|= RCC_APB2ENR_AFIOEN; // Тактирование альтернативных функций (NVIC).

0 Спам
* 3 (31.01.2012 14:47) [Материал]
Спасибо за пример. У меня вопрос. С какой максимальной частотой можно вызывать это прерывание???

Статистика

Наш магазин




Какую среду разработки Вы используете?

[ Результаты · Архив опросов ]
Всего ответов: 1556



Им нужна Ваша помощь: