STM32. Урок 2. Порти введення-виводу
У другому уроці циклу, присвяченого роботі з мікроконтролерами STM32, йтиметься про порти вводу/виводу. Порти мікроконтролера дозволяють взаємодіяти із зовнішніми пристроями, починаючи від світлодіода та кнопки і закінчуючи більш складними пристроями: дисплеями, GPS та GSM модемами і так далі. Також порти дозволяють організувати зв'язок з іншими пристроями, наприклад комп'ютером.
General Purpose Input/Output (GPIO). GPIO основний і часто застосовується спосіб зв'язку із зовнішнім середовищем. Порти можуть працювати у двох режимах: вхід (прийом сигналу) та вихід (передача сигналу). Працюють вони лише з логічними рівнями 0 (низький рівень) чи 1 (високий рівень). Наприклад, якщо підключити до порту в режимі виходу світлодіод, то при подачі сигналу високого рівня світлодіод світиться, а при подачі низького - згасне. Якщо увімкнути виведення в режим входу та підключити до нього кнопку, то за допомогою мікроконтролера можна відстежувати її стан: натиснутий або відпущений. По суті GPIO найпростіший і найпримітивніший спосіб організації роботи із зовнішніми пристроями, але використання обробки переривань і таймерів значно розширює можливості. Мова про них піде трохи згодом.
Вирішимо перше практичне завдання: управління світлодіодами та зчитування стан кнопки. Слід зазначити дуже важливий момент - порти мікроконтролера можуть видати струм не більше 20 мА. Хоча видати він їх може, але один раз і ненадовго, до бавовни та сизого диму;). Для підключення потужніших навантажень слід використовувати силові ключі.
Тож почнемо. Для роботи візьмемо плату STM32F4 Discovery. На ній спочатку встановлена кнопка користувача, підключена до порту PA0 і 4 світлодіоди, підключені до портів PD12-PD15.
Схема підключення кнопки та світлодіодів показаніна малюнку.

Резистор R1 номіналом 10кОм – «підтяжка до землі» дозволяє уникнути ситуації, коли порт не підключений ні до «0», ні до «1» - цього необхідно уникати, а резистор вирішує цю проблему. Таку підтяжку можна увімкнути і програмно, але краще убезпечити себе так.
Резистори R2-R5 330Ом обмежують струм, що протікає через світлодіоди. Їх можна вибрати в діапазоні від 200Ом до 1ком, все залежить від необхідної яскравості.
Тепер перейдемо до написання програми. Як середовище розробки я використовую CooCox. Середовище безкоштовне і, на мій погляд, зручне. Як починати в ній працювати не розповідатиму – в інтернеті по ній достатньо інформації, для прошивки використовую STM32 ST-LINK Utility. Для початку включаємо тактування порту A, до якого підключена кнопка:
Тепер потрібно правильно налаштувати порт:
Існує кілька варіантів режиму роботи порту: GPIO_Mode_IN - цифровий вхід; GPIO_Mode_OUT – цифровий вихід; GPIO_Mode_AF – альтернативна функція (UART тощо); GPIO_Mode_AN – аналоговий режим.
Можливі наступні режими «підтяжки»: GPIO_PuPd_NOPULL – без підтяжки, висновок «бовтається у повітрі» GPIO_PuPd_UP – підтяжка до 3,3В GPIO_PuPd_DOWN – підтяжка до «землі»
Тепер налаштуємо висновки, до яких підключені світлодіоди:
Ось і все, порти налаштовані. Тепер напишемо обробку в основному циклі програми:
Тепер докладніше про використані функції: GPIO_ReadInputDataBit – читання стану вибраного порту. Синтаксис:
Де GPIOx – вибраний порт, GPIO_Pin – вибраний пін. Повертає 0 чи 1.
GPIO_SetBits та GPIO_ResetBits встановлюють або скидають біт вибраного порту. Синтаксис:
Де GPIOx – вибраний порт, GPIO_Pin – вибраний пін.