Программирование STM32. Часть 3. Система прерываний. Раздел: STM32 Cortex M3.

Eugene's MCU

Четверг, 31.07.2014, 07:06

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





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

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


Программирование STM32. Часть 3. Система прерываний
  
§ > NVIC. Общие сведения.
  
     Контроллер вложенных векторизированных прерываний STM32 (Nested vectored interrupt controller (NVIC)), в зависимости от модели микроконтроллера, способен обслуживать до 68 источников прерываний IRQ от периферийных модулей микроконтроллера и осуществлять:

     - разрешение и запрет вызова прерываний;
     - назначение и динамическое изменение приоритета прерываний (16 уровней от 0 (максимального) до 15);
     - автоматическое сохранение и восстановление контекста данных при обработке одиночных и вложенных прерываний;
     - при одновременном вызове, механизм отложенных прерываний позволяет отложить обработку менее приоритетного прерывания, без возврата в фон и восстановления контекста данных.
 
  
§ > Источники прерываний IRQ.
 
     Определённым событиям, связанным с работой периферийных модулей STM32, назначены отдельные источники прерываний с соответствующими порядковыми номерами. Номера прерываний IRQn для микроконтроллеров определённой подгруппы объявлены в разделе "STM32 specific Interrupt Numbers” заголовочного файла "stm32F10x.h":

 WWDG_IRQn = 0, // Window WatchDog Interrupt.
  ...
 TIM7_IRQn = 55, // TIM7 Interrupt. 
     >> stm32F10x.h

     Стандартный файл startup в виде заголовков функций-обработчиков задаёт адреса переходов при вызове соответствующих прерываний:
  
 DCD WWDG_IRQHandler ; Window Watchdog.
 ...
 DCD TIM7_IRQHandler ; TIM7. 
     startup подсемейства "Medium density value line” для IAR>> startup_stm32f10x_md_vl.s
 
§ > События, генерирующие запросы на перывания 

      Большинству источников прерываний IRQ сопоставлены несколько событий, связанных с работой конкретного периферийного блока. Так, например, прерывание по каналу USART может быть вызвано при переносе принятого байта в приёмный буфер (флаг RXNE=1), по готовности передающего буфера к приёму нового байта для отправки (TXE=1) и так далее. При этом должны быть установлены флаги разрешения запросов на прерывания по выбранным событиям, а какое из них стало причиной вызова по данному источнику можно определить в обработчике по состоянию соответствующих флагов.

      Например, разрешение запросов на прерывание по завершению приёма и передачи кадра USART1:  
  
 USART1->CR1 |=USART_CR1_TCIE | USART_CR1_RXNEIE; // Разрешить запросы по флагам TC и RXNE.
 
  
      При возникновении события и установленном флаге разрешения запроса на прерывание, соответствующий обработчик будет вызван сразу, если данный источник уже разрешён, или непосредственно после его разрешения в NVIC.

§ > Разрешение и запрет вызова прерываний.
 
      Модуль NVIC, как часть архитектуры Cortex M3, описан в документе:
  
      Регистры разрешения прерываний (Interrupt set-enable registers) NVIC_ISER0, NVIC_ISER1 и NVIC_ISER2 в стандартном файле определений для периферии "stm32F10x.h" объявлены как массив из трёх элементов ISER[3]. Таким образом для разрешения конкретного прерывания необходимо установить соответствующий ему бит в одном из элементов-регистров указанного массива.

      Регистры разрешения прерываний NVIC_ISERx
  
      Аналогичная структура и принцип управления применим для регистров запрета прерываний NVIC_ICERx - установка конкретного бита в регистрах массива ICER[] запрещает вызов соответствующего прерывания.
 
      Функции  CMSIS для разрешения и запрета вызова IRQ в NVIC:  
 NVIC_EnableIRQ (RTC_IRQn); // Разрешить прерывания от RTC в NVIC.
 NVIC_DisableIRQ (RTC_IRQn);  // Запретить прерывания от RTC в NVIC.

      Глобальный запрет и разрешение векторизированных прерываний осуществляется вызовом функций:
  __disable_irq (); // Запретить прерывания IRQ.
  __enable_irq ();  // Разрешить прерывания IRQ.

§ > Приоритеты прерываний IRQ.
 
      По-умолчанию, при сброшенных битах группировки приоритетов прерываний AIRCR[10:8] (состояние после перезагрузки), каждому из прерываний может быть назначен собственный приоритет от 0 до 15. При этом прерывания будут обрабатываться по следующим правилам:

     - вызов прерывания с более высоким приоритетом приостанавливает выполнение текущего обработчика;
     - выполнение функции обработки прерывания не может быть прервано вызовом с тем же или более низким уровнем приоритета.
     - при одновременном вызове, несколько прерываний будут обработаны в порядке приоритета, при одинаковом приоритете по возрастанию номера прерывания.
 
      Функция CMSIS (из core_cm3.h) для задания приоритета без назначения групп приоритетности:  
  NVIC_SetPriority (USART1_IRQn, 15); // Назначить прерываниям от USART1 самый низкий проритет.

      Для задания приоритета источника прерывания STM32 предназначены двадцать 32-х разрядных регистров NVIC__IPRx, где каждый из байтов соответствует конкретному источнику. Стандарт CMSIS определяет байты внутри указанных регистров как элементы массива от IP[0] до IP[80].
      Значение приоритета задаётся комбинацией битов [7:4] байтов IP[IRQn].  
 
      По состоянию после сброса для всех прерываний IRQ назначен наивысший приоритет (0).

§ > Группы и подгруппы приоритетов прерываний.
 
      Ненулевое значение битов [10:8] регистра AIRCR позволяет определить группы приоритетов и задать их количество, при этом значение:
  
      AIRCR[10:8] = 3 (011) - битами G задаёт 16 групп приоритетов: GGGG;
      AIRCR[10:8] = 4 (100) - битами G и S определяет 8 групп и 2 подгруппы приоритетов SGGG;
      AIRCR[10:8] = 5 (101) - 4 группы с 4 подгруппами SSGG;
      AIRCR[10:8] = 6 (110) - 2 группы с 8 подгруппами SSSG;
      AIRCR[10:8] = 7 (111) - 16 подгрупп SSSS.
  
      здесь: G и S -биты [7:4] регистров приоритетов IP[IRQn], определяющие принадлежность к группе и подгруппе.
 
      При инициализации системы приоритетов с делением на группы изменяются правила обработки прерываний:
  
      - только приоритет группы определяет последовательность обработки прерываний; когда процессор выполняет обработку прерывания, то другое прерывание с этим же приоритетом группы не прервет обработку первоначального обработчика. 
      - при множественном возникновении прерываний имеющих одинаковый приоритет группы, подприоритеты определяют последовательность их обработки. 
      - при множественном возникновении прерываний с одинаковым приоритетом группы и подприоритетом первым обрабатывается прерывание с меньшим номером.


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

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

Просмотров: 32041 | Комментарии: 8 | Рейтинг: 4.7/6 |
Всего комментариев: 8
0 Спам
* 1 (23.05.2011 21:10) [Материал]
Спасибо большое. Очень подробно и доходчиво. Мы тут дружно переходим на cortex M3. Хотелось бы иметь настольную книгу по программированию М3, вы не задумывались об этом?

0 Спам
* 2 eugenemcu (23.05.2011 22:02) [Материал]
Конечно задумывался.
Мне тоже очень бы хотелось иметь такую книгу

0 Спам
* 3 (25.05.2011 23:01) [Материал]
Простите, что не совсем в тему - а про внешние прерывания для STM8 можете написать?

0 Спам
* 4 eugenemcu (25.05.2011 23:07) [Материал]
Работы много времени мало. В ближайшее время только про STM32.

0 Спам
* 5 (19.06.2011 19:27) [Материал]
помимо выставления прерываний в NVIC, требуется еще разрешение прерыаний в регистрах переферии? для spi я что-то ничего похожего не увидел

0 Спам
* 6 eugenemcu (19.06.2011 23:34) [Материал]
Требуется. Для SPI это флаги TXEIE, RXNEIE и ERRIE регистра SPI_CR2.

0 Спам
* 7 (02.02.2013 21:53) [Материал]
А где в SPL или CMSIS описываются базы для регистров NVIC_ISERx и NVIC_ICERx ??

0 Спам
* 8 eugenemcu (02.02.2013 22:38) [Материал]
Откройте  ...\STM32F10x_StdPeriph_Examples\NVIC там лежат примеры работы с NVIC из которых видно, что его настройка сводится к изменению элементов структуры NVIC_InitStructure и вызову функции NVIC_Init(&NVIC_InitStructure);

А функция NVIC_Init() которая прописана в misc.c обращается к NVIC_ISERx и NVIC_ICERx как и написано в здесь, ибо использует всё тот же stm32F10x.h. То есть вычисляет номер массива в NVIC->ISER по номеру канала прерывания:
NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel
>> 0x05]

Статистика

Наш магазин




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

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



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