Stm урок 74

Ось нарешті і настав час нам спробувати попрацювати з зовнішніми переривань. Даний урок, по-перше, був дуже затребуваний, хоча він і здається на перший погляд нескладним. Дуже багато було прохань і я не міг не відгукнутися. По-друге, ми зараз працюємо з модулем LAN ENC28J60. у которго є вихід, за яким ми можемо отримати переривання після закінчення певних операцій, які я і хотів обробити. Також, якщо у мене вийде, я хотів цим поділитися і з вами, але без початкового уявлення про зовнішні переривання в контролері STM32, це зрозуміти, я вважаю, буде, м'яко кажучи, нелегко. Ось тому і дозрів даний урок.

Як мікроконтролера ми візьмемо той же самий STM32F103RCT6. розташований на недорогий плати, з якої ми і займаємося в процесі програмування модуля LAN, а в якості програматора також недорогий маленький ST-Link V2.

Коротко про зовнішні переривання. Зовнішні переривання - це такі переривання, які обробляються внаслідок виникнення деяких подій на певній ніжці порту мікроконтролера. Таких подій може бути кілька не дивлячись на все 2 логічних стану. Різноманітність цих подій легко побачити, розкривши їх список в Cube MX в налаштуванні ніжок портів

Можна розділити дані типи на 2 групи навпіл. перша група - External Interrupt - це обробка зовнішніх переривань. А другий - обробка подій. Різниця тут лише в тому, що в першому випадку викликається обробник переривань, а в другому тільки піднімається відповідний прапор. Кожна група вже ділиться на три види подій:

1. Виявлено висхідний фронт (зміна рівня 0 на 1),

2. Виявлено спадний фронт (зміна рівня 1 на 0),

3. Виявлено усі вказані фронтів.

Також ще є програмні типи переривань, але нам з вами вони точно не знадобляться.

Ось і все за типами переривань.

Існує кілька регістрів для обробки зовнішніх переривань:

EXTI_IMR. Регістр масок переривань,

EXTI_EMR. Регістр масок подій,

EXTI_RTSR. Регістр спрацьовування по висхідному фронту,

EXTI_FTSR: Регістр спрацьовування по низхідному фронту,

EXTI_SWIER. Регістр софтверного запуску переривання,

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

Детально всі ці регістри розписані в технічній документації Reference Manual до всіх контролерам STM. Ми їх детально розглядати не будемо, залишимо це на совісті бібліотеки HAL.

Ось логічна схема обробника переривань в контролері

Stm урок 74

Тут ми бачимо наші всі регістри і яка між ними логічний зв'язок.

Також можна подивитися схему організації лінії зовнішніх переривань

Stm урок 74

Тут ми бачимо 16 ліній, підключених через мультиплексори до однойменних пінам всіх портів. Тобто одночасно ми можемо обробити 16 ніжок контролера, але, як видно з мультіплексівной організації, що всі вони повинні бути з різними номерами. Тобто ми можемо обробити одночасно ніжки PA1 і PC2, але не можемо обробити PA1 і PC1.

Також існують ще 4 лінії, які підключені ні до портів загального призначення, а до певних видів периферії

The four other EXTI lines are connected as follows:

• EXTI line 16 is connected to the PVD output

• EXTI line 17 is connected to the RTC Alarm event

• EXTI line 18 is connected to the USB Wakeup event

• EXTI line 19 is connected to the Ethernet Wakeup event (available only in connectivity line devices)

Тобто ми можемо ще обробити зовнішні події від програмованого детектора напруг, від будильника RTC, від "пробуджень" USB і Ethernet.

Ось скільки всього по перериваннях, і це ще не все. На дану тему в технічній документації написано цілих 18 сторінок, так що кому цікаво - обов'язково почитайте.

Наше завдання - грамотно ці переривання обробити в нашому коді, використовуючи функції бібліотеки HAL.

Створимо в генераторі проектів Cube MX новий проект, вибравши наш контролер

Включимо кварцовий резонатор

Виберемо програматор по інтерфейсу SWD

Задіємо ніжку, що відповідає за світлодіод

Stm урок 74

Включимо зовнішні переривання на ніжці PA1

Налаштуємо подільники та помножувачі на максимальну продуктивність в розділі "Clock Configuration" (натисніть на картинку для збільшення зображення)

Stm урок 74

Перейдемо в "Configuration" і в розділі GPIO налаштуємо ніжку PC13 на середню швидкість

Stm урок 74

Для ніжки PA1 застосуємо підтягуючий регістр до загальної шині, щоб вона не бовталася в повітрі, так як переривання ми будемо ловити від кнопки, а сама кнопка нікуди у нас не притягнута, інакше стан буде невизначений. Тип зовнішнього переривання залишимо за замовчуванням - висхідний фронт

Stm урок 74

Застосуємо настройки портів і перейдемо в налаштування глобальних переривань по кнопці "NVIC", включимо там переривання EXTI1

Stm урок 74

Також можна застосувати ці налаштування.

Налаштуємо проект, присвоївши ім'я EXTI01 і вибравши середу розробки SW4STM32

Stm урок 74

Згенеруємо проект, відкриємо його в System Workbench. як завжди і видалимо в налаштуваннях відладчика файл налагодження.

Зберемо проект, спробуємо його запустити, але скоріше за все у нас нічого не вийде і ми побачимо в консолі ось таке повідомлення, що прошити контролер не вдалося через те, що його не вдалося перезавантажити

Звичайно, можна вчасно тримати і відпускати на платі кнопку RESEТ. Але ми підемо іншим шляхом. Я почитав кілька форумів і нічого там не знайшов, за винятком виправлення конфігураційних файлів. Відкриємо наш файл налагодження у властивостях проекту

Stm урок 74

У діалозі зайдемо в закладку "Debugger" і натиснемо там кнопку "Show generator options"

Stm урок 74

У відкритому внизу поле "Reset mode" виберемо пункт "Software System reset"

Stm урок 74

Збережемо настройки, тепер має все прошу.

Відкриємо main.c і відключимо наш світлодіод в функції main (). так як ми знаємо, що він підключений инверсно (можна звичайно це зробити і в Cube MX, але так наочніше)

/ * USER CODE BEGIN 2 * /

HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

/ * USER CODE END 2 * /

Далі в main.c додамо обробник зовнішніх переривань

/ * USER CODE BEGIN 4 * /

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

/ * USER CODE END 4 * /

Потім ми тут відстежимо переривання саме від 1 лінії і запалимо світлодіод

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

/ * USER CODE END 4 * /

Підключимо кнопку між PA1 і проводом харчування (натисніть на картинку для збільшення зображення)

Stm урок 74

Зберемо проект, прошьyoм контролер. Потім натиснемо на кнопку - світлодіод повинен буде засвітитися (натисніть на картинку для збільшення зображення)

Stm урок 74

Давайте разнообразим трохи наш проект, щоб він не був таким нудним. Для цього зайдемо в Cube MX, і, так як у нас не Keil, проект закривати не треба, і включимо зовнішні переривання ще й на ніжці PA2

Причому включимо ми вже інший тип - спрацьовування переривання по нізходящая фронту, а резистор ми вже навпаки підтягнемо до джерела напруги. Для цього внесемо такі настройки в "Configuration" в GPIO для ніжки PA2

Stm урок 74

Застосуємо настройки, сгенерируем проект, повернемося в System Workbench і зробимо проекту Refresh.

Допишемо наступним чином наш обробник, щоб по перериванню на ніжці PA1 наш світлодіод запалювався, а в разі PA2 - згасав

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

if (GPIO_Pin == GPIO_PIN_1)

HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

> Else if (GPIO_Pin == GPIO_PIN_2)

HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

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

Stm урок 74

Тепер, якщо ми зберемо код і прошьyoм контролер, то перша кнопка буде у нас світлодіод запалювати, а друга гасити.

Здавалося б, що тут такого? А то, що відбувається це вже незалежно від ходу самої програми, не в нескінченному циклі, коли під час там написаного обробника після натискання кнопки ми можемо взагалі не перебувати і буде вже не ясно, буде опрацьовано чи наше подія. Тому, вивчивши зовнішні переривання, ми зробили великий крок вперед до незалежності обробки тих чи інших подій на ніжках портів мікроконтролера. Звичайно, з огляду на наш уже тепер дуже багатий досвід, нам було це зробити не надто важко.

Всім дякую за увагу!

Stm урок 74

Схожі статті