Штурмуємо STM32, Переривання, події та NVIC

Допустимо, у вашій програмі є затримка на 5 секунд, і вам необхідно при цьому відстежувати стан якогось порту на появу сигналу (припустимо, це буде кнопка). Поки ви перебуваєте у функції delay(5000) , ніякі дії, крім марних обчислень, не відбуватимуться, і змінити стан світлодіода у вас не вийде. Іншими словами, поки програма не завершить виконання коду з функції delay і не перейде до рядка, де зчитується значенняInput Data Register, – визначити, що кнопка була натиснута, ви не зможете, а значить, і обробити це натискання не вийде. Більше того, ви можете просто пропустити цей момент. Що робити, як бути? Є таке поняття, як переривання (англ. interrupt). Що це таке? Для обробки подій, що відбуваються асинхронно стосовно виконання програми, необхідно використовувати механізм переривань. Переривання можна розглядати як деяку особливу подію, яка потребує моментальної реакції.

штурмуємо

Кожне переривання викликається подією, але з кожна подія викликає переривання. Event – ​​апаратна подія. Наприклад, таймер досягнув якогось значення – це подія. Ця подія може викликати переривання, а може запустити будь-яку периферію, наприклад, запустить UART для надсилання повідомлення.

Залежно від джерела переривання можна розділити на три типи.

Програмні (приватний випадок внутрішнього переривання) – переривання може бути викликане безпосередньо в коді програми, що виконується.

Усі можливі переривання (а точніше, всі імена існуючих векторів переривань) можна знайти у файлі startup_.s. Ми вже їх бачили, коли розглядали бібліотеку CMSIS. За замовчуванням усі обробники – це затички, які роблять «нічого». Якщо щось викличе переривання, а обробник неописаний, то станеться - нічого, камінь просто застрягне у перериванні (т. до. затичка - це просто нескінченний цикл). До речі, слід писати код так, щоб обробник відпрацьовував максимально швидко, повертаючи керування основною програмою.

Для керування перериваннями існує спеціальний модуль - NVIC, який є частиною ядра.

штурмуємо

Якщо переривання внутрішнє, т. е. походить від частин ядра, воно дозволено за умовчанням. Якщо переривання зовнішнє (кнопка, таймер, АЦП тощо) його необхідно налаштувати окремо. У випадку алгоритм буде наступним:

  1. дозволити глобальні переривання в NVIC;
  2. налаштувати і дозволити конкретні переривання безпосередньо на периферії – т. е. налаштувати потрібні events на переривання;
  3. описати обробник переривання.

Дозвіл або заборона переривання по вектору виконується функціями (core_.h):

Усі можливі переривання перераховані в IRQn_Type.

За роботу з перериваннями у NVIC відповідають кілька регістрів.

Розглянемо їх по порядку:

  • ISER(Interrupt Set Enable Register) – запис біта в потрібну позицію включає переривання;
  • ICER(Interrupt Clear Enable Register) – запис сюди, навпаки, вимикає переривання;
  • ISPR(Interrupt Set Pending Register) – поставити переривання в очікування;
  • ISPR(Interrupt Clear Pending Register) – скинути переривання з очікування;
  • IPR(Interrupt priority register) – скидає переривання.

Останній регістр особливий – мікроконтролеру необхідно повідомити, що обробник переривання завершив свою роботу, інакше він працюватиме нескінченно. Пов'язано це з тим, що наодин вектор можна повісити кілька виняткових ситуацій, а значить, яка ситуація сталася, і час його роботи ви повинні відстежувати самі. Наприклад:

Це те що нам потрібно. Описавши функцію обробника (у відповідному файлі – stm32f10x_it.c), ми починаємо робити щось корисне!

Останнє, що варто згадати, – це пріоритет переривань. NVIC може відстежувати пріоритет (число від 0 до 15). Чим менший номер рівня, тим він головніший. Якщо переривання мають однакові пріоритети, то вони йдуть один за одним. Якщо пріоритети різні, то NVIC зупинить менш пріоритетне переривання і запустить пріоритетніше. За замовчуванням усі переривання мають однаковий ранг, однак ви можете задати свій (пріоритет «0» краще не вказувати):

– та функції, що відповідають за встановлення в чергу або видалення з черги переривання:

В курсі ми їх не будемо використовувати, тут вони наведені для загального розуміння роботи МК і системи NVIC зокрема.