- Підготовка обладнання
- Розуміння розпіновки GPIO на STM8S103F
- Опис і підказки щодо вибірки STM8S103F GPIO
- Програмування STM8S для введення та виведення GPIO за допомогою SPL
- Завантаження та тестування програми
Для мікроконтролерів програма, що блимає світлодіодами, еквівалентна програмі «привіт світ». У нашому попередньому навчальному посібнику ми дізналися, як розпочати роботу з платою розробки STM8S103F3 та як налаштувати IDE та компілятор для програмування наших контролерів STM8S. Ми також дізналися, як користуватися стандартними периферійними бібліотеками, а також компілювати та завантажувати код у наш мікроконтролер. Отримавши всі основи, давайте фактично почнемо писати код. У цьому підручнику ми дізнаємося, як виконувати загальні функції GPIO на контролерах STM8S. На платі вже є вбудований світлодіод, підключений до виводу 5 порту B, ми навчимося моргати цей світлодіод, а також додамо зовнішній світлодіод і керуватиме ним кнопкою. Якщо ви зовсім новачок, настійно рекомендуємо прочитати попередній підручник, перш ніж продовжувати далі.
Підготовка обладнання
Перш ніж заглибитися в програму, дозвольте підготувати апаратні підключення. Як уже згадувалося раніше, ми використовуватимемо тут два світлодіоди, один - це вбудований світлодіод, який буде блимати безперервно, а інший - зовнішній світлодіод, який буде перемикатися кнопкою. Ідея полягає в тому, щоб вивчити всю функціональність GPIO за допомогою простого налаштування. Вбудований Led вже підключений до PB5 (pin5 PORTB), тому я щойно підключив світлодіод до PA3 і кнопку до PA2, як ви можете бачити на схемі нижче.
Але, з усіх вихідних штифтів, доступних на нашому контрольованому, чому я вибрав PA3 для виходу та PA2 для введення? Запитання є дійсними, і я пояснитиму це далі в цій статті. Моє обладнання для цього підручника показано нижче. Як бачите, я також підключив свій програміст ST-link до програмних штифтів, які не тільки програмують нашу плату, але й будуть виконувати роль джерела живлення.
Розуміння розпіновки GPIO на STM8S103F
Тепер повертаємося до питання, чому PA2 для введення і чому PA3 для виводу? Щоб зрозуміти це, давайте ближче розглянемо розпірування мікроконтролера, яке показано нижче.
Відповідно до діаграми виведення, ми маємо чотири порти на нашому мікроконтролері, а саме PORT A, B, C та D, позначені PA, PB, PC та PD відповідно. Кожен штифт GPIO також поєднаний з якоюсь іншою спеціальною функціональністю. Наприклад, PB5 (вивід 5 PORT B) може працювати не тільки як вивід GPIO, але і як вивід SDA для зв'язку I2C та як вихідний вивід таймера 1. Отже, якщо ми використовуємо цей штифт для простих цілей GPIO, таких як підключення світлодіода, то ми не зможемо одночасно використовувати I2C та світлодіод. На жаль, вбудований світлодіод підключений до цього контакту, тому у нас тут немає великого вибору, і в цій програмі ми не збираємось використовувати I2C, тому це не становить особливої проблеми.
Опис і підказки щодо вибірки STM8S103F GPIO
Справді кажучи, не завадило б використовувати вхідний штифт PA1, і він просто працював би. Але я навмисно вигадав це, щоб надати мені можливість показати вам деякі загальні пастки, в які ви можете потрапити, вибираючи шпильки GPIO на новому мікроконтролері. Найкраще уникнути пасток - це прочитати деталі контактів та опис штифтів, наведені в таблиці даних STM8S103F3P6. Для опису мікроконтролера STM8S103F3P6 опис деталей опису, згаданих у таблиці даних, наведено під зображеннями.
Вхідні штифти на нашому мікроконтролері можуть бути як плаваючими, так і слабкими підтягуваннями, а вихідні штифти можуть бути або Open Drain або Push-pull. Різниця між виводами Open Drain та Push-Pull Output вже обговорюється, отже, ми не будемо вдаватися в подробиці цього. Якщо говорити простіше, вихідний штифт Open Drain може зробити вихід настільки низьким, а не таким високим, тоді як вихідний штифт push-pull може зробити вихід як високим, так і високим.
Окрім цього з наведеної таблиці, ви також можете помітити, що вихідним штифтом може бути швидкий вихід (10 МГц) або повільний вихід (2 МГц). Це визначає швидкість GPIO, якщо ви хочете дуже швидко перемикати штифти GPIO між високою та низькою, тоді ми можемо вибрати Швидкий вихід.
Деякі штифти GPIO на нашому контролері підтримують True Open Drain (T) і High Sink Current (HS), як зазначено на зображенні вище. Істотна різниця між відкритим зливом та справжнім відкритим зливом полягає в тому, що вихід, підключений до відкритого зливу, не може бути витягнутий вище, ніж робоча напруга мікроконтролера (Vdd), тоді як справжній вихідний штифт з відкритим зливом може бути витягнутий вище, ніж Vdd. Штифти з високою здатністю раковини означають, що вони можуть потокати більше струму. Джерело та струм поглинання будь-якого виводу GPIO HS становить 20 мА, тоді як лінія електроживлення може споживати до 100 мА.
Придивившись до зображення, наведеного вище, ви помітите, що майже всі штирі GPIO мають тип високого струму потоку (HS), за винятком PB4 та PB5, які мають тип відкритого стоку (T). Це означає, що ці штирі не можна робити високо, вони не зможуть забезпечити 3,3 В, навіть коли штифт зроблений високо. Ось чому бортовий світлодіод підключений до 3,3 В і заземлений через PB5 замість того, щоб живити його безпосередньо від штифта GPIO.
Детальний опис контактів див. На сторінці 28 у таблиці даних. Як згадувалося на зображенні вище, PA1 автоматично налаштовується як слабке підтягування і не рекомендується використовувати його як вихідний штифт. У будь-якому випадку його можна використовувати як вхідний штифт разом із кнопкою, але я вирішив використовувати PA2 лише для того, щоб спробувати дозволити витягування з програми. Це лише кілька основних речей, які будуть корисні, коли ми пишемо набагато складніші програми. Наразі це нормально, якщо багато речей відбиваються від вашої голови, ми опишемося в цьому шарі в інших навчальних посібниках.
Програмування STM8S для введення та виведення GPIO за допомогою SPL
Створіть робочу область та новий проект, про що ми вже говорили у нашому першому навчальному посібнику. Ви можете додати всі заголовки та вихідні файли, або додати лише файли gpio, config та stm8s. Відкрийте файл main.c і починайте писати програму.
Переконайтеся, що ви включили файли заголовків, як показано на зображенні вище. Відкрийте файл main.c та запустіть код. Повний код main.c можна знайти внизу цієї сторінки, і ви також зможете завантажити файл проекту звідти. Пояснення коду наведено нижче. Ви також можете звернутися до посібника користувача SPL або відео, на яке посилається внизу цієї сторінки, якщо вас бентежить частина кодування.
Деініціалізація необхідного порту
Ми розпочинаємо програму з Деініціалізації необхідних портів. Як ми вже обговорювали раніше, кожен пін GPIO буде мати багато інших функцій, пов'язаних з ним, крім простої роботи, як звичайний вхід і вихід. Якщо ці шпильки раніше використовувались для якихось інших програм, то їх слід деініціалізувати, перш ніж ми їх використовуємо. Це не є обов’язковим, проте це хороша практика. Наступні два рядки коду використовуються для деініціалізації портів А і портів В. Просто використовуйте синтаксис GPIO_DeInit (GPIOx); і згадайте назву порту замість x.
GPIO_DeInit (GPIOA); // підготувати порт A до працюючого GPIO_DeInit (GPIOB); // підготувати порт B до роботи
Декларація про вхід і вихід GPIO
Далі ми повинні оголосити, які штифти будуть використовуватися як вхідні, а які як вихідні. У нашому випадку в якості вхідного сигналу буде використовуватися контакт PA2, ми також оголосимо цей контакт із внутрішнім підтягуванням, щоб нам не довелося використовувати його зовні. Синтаксис - GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Де x - назва порту, y - номер контакту, z - режим GPIO-контакту.
// Оголосити PA2 як вхідний висувний штифт GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Далі ми повинні оголосити висновки PA3 та PB5 як вихідні. Знову ж таки, можливо багато типів вихідних оголошень, але ми будемо використовувати “GPIO_MODE_OUT_PP_LOW_SLOW”, що означає, що ми оголосимо це як вихідний штифт типу push-pull з повільною швидкістю. І за замовчуванням значення буде низьким. Синтаксис буде однаковим.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Оголосити PB5 як вивідний вихідний штифт GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
У наведеному нижче знімку з посібника користувача SPL згадуються всі можливі режими GPIO (z).
Нескінченна петля while
Після оголошення pin, нам потрібно створити нескінченний цикл, всередині якого ми будемо постійно блимати світлодіодом і відстежувати стан кнопки для перемикання світлодіода. Нескінченний цикл може створюватись з часом (1) або за допомогою for (;;) . Тут я використав while (1).
поки (1) {}
Перевірка стану вхідного штифта
Ми повинні перевірити статус вхідного виводу, синтаксис для цього - GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); де x - назва порту, а y - номер виводу. Якщо штифт високий, ми отримаємо "1", а якщо штифт низький, отримаємо "0". Ми звикли всередині циклу if перевіряти, високий чи низький штифт.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // якщо натиснута кнопка
Як зробити PIN-код GPIO високим або низьким
Щоб зробити штифт GPIO високим або низьким, ми можемо використовувати GPIO_WriteHigh (GPIOx, GPIO_PIN_y); та GPIO_WriteLow (GPIOx, GPIO_PIN_y); відповідно. Тут ми зробили світлодіод, який включається, якщо натиснута кнопка, і вимикається, якщо кнопка не натиснута.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // якщо натиснута кнопка GPIO_WriteLow (GPIOA, GPIO_PIN_3); // Світлодіод увімкнено ще GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // Світлодіод вимкнений
Перемикання штифта GPIO
Для перемикання штифта GPIO ми маємо GPIO_WriteReverse (GPIOx, GPIO_PIN_y); виклик цієї функції змінить стан вихідного виводу. Якщо штифт високий, він буде змінений на низький, а якщо він низький, він буде змінений на високий. Ми використовуємо цю функцію, щоб блимати вбудованим світлодіодом на PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Функція затримки
На відміну від Arduino, космічний компілятор не має заздалегідь визначеної функції затримки. Тож ми повинні створити його самостійно. Моя функція затримки наведена нижче. Значення doe затримки буде отримано у змінній ms, і ми використаємо два for для циклу для утримання або виконання програми. Подібно _asm (“nop”) - це інструкція з монтажу, яка означає відсутність операції. Це означає, що контролер буде виконувати цикл for, не виконуючи жодної операції, створюючи тим самим затримку.
void delay (int ms) // Визначення функції {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // Не виконувати жодної операції // код збірки}}
Завантаження та тестування програми
Тепер, коли наша програма готова, ми можемо завантажити її та протестувати. Після завантаження моє обладнання працювало належним чином. Вбудований червоний світлодіод блимав кожні 500 мілісекунд, а зовнішній зелений світлодіод вмикався кожного разу, коли я натискав на перемикач.
Повну роботу можна знайти у відео, наведеному нижче. Досягнувши цієї точки, ви можете спробувати підключити перемикач та світлодіод до різних штифтів і переписати код, щоб зрозуміти концепцію. Ви також можете пограти з часом затримки, щоб перевірити, чи чітко ви зрозуміли поняття.
Якщо у вас виникли запитання, залиште їх у розділі коментарів нижче, а для інших технічних питань ви можете скористатися нашими форумами. Дякуємо за те, що до нас підемо, до зустрічі у наступному уроці.