16 клавіатури stm32 arduino підключення. Підключення матричної клавіатури до Arduino. Підключення клавіатури до Arduino та керуюча дія

03.11.2021

Налагоджувальна плата F103C8T6 на базі STM32 за параметрами значно випереджає аналогові за розміром Arduino Nano або Leonardo, а за швидкістю близька до Arduino DUE. Є інтерес спробувати, але у новачка можуть виникнути труднощі з першим запуском та програмуванням цієї плати. Тепер можна заливати скетчі через Arduino IDE. Подробиці далі...

  1. Відмінності STM32F103C8T6 від Arduino Nano v3.0
  2. Підготовка заліза
  3. Підготовка ПЗ
  4. Завантаження скетчу (blink) в оплату

1. Відмінності STM32F103C8T6 від Arduino Nano v3.0

2. Підготовка заліза

Для роботи нам знадобиться:

  • Сама плата STM32F103C8T6
  • З'єднувальні дроти Dupont мама-мама

Для активації режиму програмування на платі STM слід переставити перемички: перша на 1, друга на 0.

Конвертер FTDI переключити на живлення 3.3 Вольта (перемичкою/джампером)

З'єднати проводами плату (П) та конвертер (К):

П(A9) -> K(RX)

П(А10) -> К(TX)

П(GND) -> K(GND)

П(3.3) -> K(VCC)

3. Підготовка ПЗ

  1. Завантажити додаток для Arduino IDE, який підтримуватиме плати STM32
  2. Розпакувати архів у папку HARDWARE, яку можна знайти у папці вашої Arduino IDE
  3. Запустити Arduino IDE (або перезапустити якщо була відкрита) і перевірити чи з'явився розділ STM32 Boardsу списку Плат

4. Закачування скетчу (blink) у плату

У папці яку ми розпакували в п.3.б заходимо наступним шляхом: Arduino_STM32\examples\Digital\Blink\ і через Arduino IDE відкриваємо файл blink.ino або можете взяти текст звідси:

void setup() ( // Initialize digital pin PB1 як output. pinMode (PC13, OUTPUT); ) // the loop function runs over and over again forever void loop () (digitalWrite (PC13, HIGH); // turn the LED on (HIGH is the voltage level) delay (1000); // wait for a second digitalWrite (PC13, LOW); // turn the LED off by making the voltage LOW delay (1000); // wait for a second)
  • Вибрати плату Generic STM32F103C series
  • Вибрати Variant: (20k RAM. 64k Flash)
  • Вибрати Upload method: "Serial"
  • Вибрати Порт:(порт відповідний FTDI конвертеру)

Тиснемо кнопку Ввантажитиі результат одразу має бути видно.

«. Сьогодні підключаємо матричну клавіатуру до плати Arduino, а також розглядаємо цікаві схеми з нею. Зробити таку клавіатуру можна і самому з кнопок та друкованої плати. У статті відео-інструкція, лістинги програм, схеми підключення та необхідні компоненти.

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

Зробити таку клавіатуру можна й самому. Для цього знадобиться друкована плата, 12 або 16 звичайних кнопок та з'єднувальні дроти. Я ж використовуватиму готову.

Навіщо потрібна матрична клавіатура?

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

Для цього і вигадали таку клавіатуру, щоб спростити підключення більшого числа кнопок. Такі пристрої зустрічаються скрізь — у клавіатурах комп'ютерів, калькуляторах тощо.

Підключати її до плати слід 8 висновками, кожен з них зчитує значення з певних рядків та стовпців. Підключати їх слід до висновків на панелі Digital. Я підключу, наприклад, висновків від 2 до 9 включно. Нульовий і перший чіпати не бажано, оскільки вони призначені для інтерфейсу UART (наприклад, для підключення блютуз-модуля). Раціональніше залишити їх вільними.

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

Після того, як ви встановили в бібліотеку, можна зайти в IDE Ардуїно (програма з сайту Arduino) і подивитися приклади скетчів.

Візьмемо найпростіший скетч для ознайомлення. Він дозволяє зчитувати значення з клавіатури при натисканні певної кнопки і виводити їх у порт. Це монітор порту на комп'ютері.

#include // Підключаємо нашу бібліотеку




{"2","5","8","0"},
{"3","6","9","#"},
("A", "B", "C", "D")
};




void setup()(
Serial.begin(9600);
}
void loop()(

if (customKey)(
Serial.println(customKey);
}
}

Скетч дуже простий. Варто відзначити перші рядки коду. Спочатку підключаємо бібліотеку, потім вказуємо скільки рядків і стовпців біля клавіатури, а потім потрібно правильно розташувати назви клавіш, щоб було зручніше працювати.

Якщо це зробити неправильно, наприклад, при натисканні цифри 4, в порт вийде цифра 6 або будь-який інший символ. Це можна визначити досвідченим шляхом та розмістити символи, як вони розташовані на клавіатурі.

У функції void setupвказуємо швидкість послідовного з'єднання з монітором порту 9600 бод. Функція потрібна лише для живлення на модулі. У функції Void Loopпрописуємо умову. Змінна Charвикористовується для зберігання лише одного символу, наприклад, 1, А або 5, що підходить до ситуації. Якщо натискання зафіксовано, виводиться символ у монітор порту за допомогою функції Serial Print.У дужках потрібно вказувати, яку змінну виводимо до порту. Якщо все зроблено правильно, на моніторі порту отримаємо символ, на який натискали. Не забудьте в моніторі порту праворуч вказати швидкість передачі даних таку ж, як у скетчі.

Схема з дисплеєм та матричною клавіатурою

Давайте виведемо дані на екран.

Я використовую дисплей, пов'язаний із модулем I2C, який спрощує підключення. Для роботи з дисплеєм із шиною I2C необхідно встановити ще одну бібліотеку. Завантажити її можна.

Далі потрібно зазначити розмірність дисплея. Використовуваний у прикладі екран вміщує по 16 знаків у кожному з двох рядків, це я і вказую. У функції Void Setupпотрібно подати живлення на дисплей і увімкнути підсвічування. Робиться це за допомогою двох функцій: lcd.beginі lcd.backlight.

#include // Підключаємо нашу бібліотеку
#include
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte ROWS = 4; //кількість рядків у нашої клавіатури
const byte COLS = 4; //кількість стовпців у нашої клавіатури
char hexaKeys = (
("S","4","7","*"), // тут ми маємо назви наших клавіш, як на клавіатурі,для зручності користування
("O", "5", "8", "0"),
("S", "6", "9", "#"),
("I", "B", "C", "D")
};
byte rowPins = (5, 4, 3, 2); //до яких висновків підключаємо управління рядками
byte colPins = (9, 8, 7, 6); //до яких висновків підключаємо управління стовпцями
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup()(
Serial.begin(9600);
lcd.begin(); // Ініціалізуємо екран
lcd.backlight();
}
void loop()(
char customKey = customKeypad.getKey();
if (customKey)(
Serial.println(customKey);
lcd.setCursor(1,4); //встановлюємо курсор
lcd.print(customKey);
}
}

У функції Voil Loopпотрібно в самій умові прописати рядок lcd.printдля виведення даних на екран. І ще потрібно заздалегідь встановити положення курсору. У дужках йдуть дві цифри: перша — це номер символу, а друга — номер рядка. Потрібно пам'ятати, що цей дисплей відлік рядків і стовпців починається не з одиниці, а з нуля. Тобто тут є рядки під номерами 0 та 1, а не 1 та 2, як може здатися спочатку. Потім завантажимо код у плату та подивимося, що буде.

Оскільки дисплей працює за інтерфейсом I2C, підключаємо до аналогових висновків. Виходи SDA та SCL відповідно підключаємо до А4 та А5, а решта два – це вже живлення та «земля».

Як бачимо, натискаючи будь-який символ, бачимо його відображення на дисплеї.

Щоб стерти рядок, згадаймо калькулятор. Коли потрібно було видалити значення, ми натискали кнопку скидання. Натиснемо на таку кнопку в платі і можемо знову набирати символи.

Підключення клавіатури до Arduino та керуюча дія

Остання схема в уроці – виконання заданої дії при натисканні певної кнопки. Це основна мета підключення матричної клавіатури Arduino. З цієї теми будуть дві окремі статті та відео, що описують складніші та цікавіші схеми. А зараз знайомимося з цим модулем та запам'ятовуємо побудову коду з його використанням.

Спробуємо при натисканні певної кнопки вмикати або вимикати світлодіод. Додаємо його до схеми.

Підключення світлодіоду

Я використовуватиму макетну плату і резистор (бажано використовувати від 150 до 220 Ом). Двома перемичками замкну схему, підключивши їх до пін живлення та землі на платі Ардуїно.

Схема працюватиме так: при натисканні на 1 вмикається світлодіод, при натисканні на 2 вимикається.

Світлодіод у прикладі підключений до піна 8 на платі Ардуїн.

#include
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns
char keys = ( // Define the Keymap
("1","4","7","*"), // тут ми маємо назви наших клавіш, як на клавіатурі,для зручності користування
{"2","5","8","0"},
{"3","6","9","#"},
("A", "B", "C", "D")
};
byte rowPins = ( 5, 4, 3, 2 );
byte colPins = (9, 8, 7, 6); // Connect keypad COL0, COL1 і COL2 до цих Arduino pins.
Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Create the Keypad
#define ledpin 8
void setup()
{
pinMode(ledpin,OUTPUT);
Serial.begin(9600);
}
void loop()
{
char key = kpd.getKey();
if(key) // Check for a valid key.
{
switch (key)
{
case "1":
digitalWrite(ledpin, HIGH);
break;
case "2":
digitalWrite(ledpin, LOW);
break;
}
}
}

Давайте розберемо скетч.

Візьмемо перший скетч уроку і його доповнимо. Спочатку за допомогою корисної функції Defineназвемо підключеному до піну 8 світлодіоду ledpin. У функції Void setupвказуємо сигнал зі світлодіода як вихід.

Якби не бібліотека Кейпаддля клавіатури, довелося б прописувати те саме для 8 пінів, з якими пов'язана клавіатура. У функції void loopумова. Натискання певної кнопки «прирівнюється» до значення змінної key.Оператор Switch порівнює значення змінної keyта «дає» певні команди в залежності від цього значення. Складається він із двох допоміжних операторів Caseі Break. Простіше кажучи, якщо буде знайдено значення змінної, що дорівнює 1, то виконуватиметься дія. Оператор breakслужить командою виходу з оператора Case.

Відповідно при натисканні на 1 виконуватиметься максимальна подача напруги на світлодіод і він горітиме. При натисканні на 2 він не горітиме. Це вказується у функції Digitat write, де в дужках задається назва змінної та «вказівка» їй. Таким чином можна написати певні команди для кожної кнопки та керувати великою кількістю світлодіодів або створити команду для включення всіх світлодіодів відразу.

Лінійка мікроконтролерів STM32 є досить цікавим об'єктом для вивчення. Часто можна почути думку, що робота з ним складна для початківця і краще братися за що - більш просте. У цій статті ми постараємося показати, що мікроконтролери STM32 не такі страшні.

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

При роботі, описаній у цій статті, використовувалася налагоджувальна плата STM32F4Discovery та матрична клавіатура, у нашому випадку, має 7 висновків. Середовище розробки CoIDE 1.7.6.

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

Перед тим, як розпочинати написання програми, визначимося з умовними позначеннями:

  1. Висновки, до яких підключається клавіатура, поділені на дві групи: скануючі та живильні (рисунок 1). Скануючі висновки працюють на вхід. Всі живильні висновки за умовчанням встановлені в нульовий стан, але після першого скидання таймера TIM2 на виводі PA3 буде встановлено напругу логічної «1», тому з деяким наближенням можна сказати, що на висновках живлення в момент часу, близький до початкового, виставлена ​​комбінація «1 -0-0-0».
  2. За текстом програми позначення висновків відповідатимуть малюнку 1, тобто. значення висновків PA0, PA1, PA2 при їх опитуванні записуються в змінні a, b, c відповідно для подальших операцій з ними.
  3. Виводи PA3 – РА4 мають позначення від 1 до 4, саме під такими номерами вони згадуються в тексті програми.

Рисунок 1 – Підключення клавіатури

Перейдемо до опису алгоритму дії програми. Після включення живлення запускаються два таймери (TIM2 і TIM3), які працюють циклічно, тобто. при завершенні рахунку виконуються деякі дії (ці дії прописані у функціях обробників переривань від таймерів TIM2 та TIM3) та відлік починається заново. Після закінчення першого відліку таймера TIM2 на виведенні РА3 з'являється рівень логічної «1», який щоразу, після закінчення цього таймера, зміщується однією позицію вниз. При цьому мікроконтролер завжди "знає", на якому висновку в даний момент знаходиться рівень логічної напруги "1", ця інформація зберігається в змінній out_state. Операцію зі «зсуву» логічного «1» виконує функція TIM2_IRQHandler (обробник переривання від таймера 2).

Таймер TIM3 при закінченні кожного циклу сканує стан висновків РА0-РА2, записуючи отримані результати змінні a, b і c. Потім мікроконтролер порівнює на якому з живильних висновків знаходиться напруга логічної «1» (змінна out_state) і який з висновків РА0 – РА2 має високий логічний рівень (змінні a, b, c). Ці дії виконує функція TIM3_IRQHandler (переробник переривання від таймера 3).

При натисканні, наприклад, кнопки «3», високий логічний рівень має бути встановлений на виводі РА3 та зареєстрований на виведенні PA0. При виконанні даного логічного виразу мікроконтролер «зрозуміє», що була натиснута клавіша «3» і при натисканні цієї кнопки виконає вказану йому дію, в нашому випадку погасить усі світлодіоди, а потім запалить зелений світлодіод.

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

У цьому прикладі, щоб зрозуміти правильно чи ні написана програма, використані різні комбінації світлодіодів, розташованих на платі, клавіша 5 – вимикає всі світлодіоди.

Дуже важливо розібратися, які висновки на клавіатурі відповідають натисканням клавіш. Необхідно виділити рядки і стовпці (розподіл на рядки і стовпці в даному випадку дуже умовно, так як це залежить від форми та положення клавіатури. Приймемо за умовчанням, що стовпці - це лінія 3-6-9-# і т.д.). , А рядки - "3-2-1" і т.д.), т.к. стовпці з'єднуються з висновками, що сканують, рядки - з висновками живлення. Для правильного визначення висновків на матричній клавіатурі необхідно підключити один із щупів мультиметра, що знаходиться в режимі продзвінки, до будь-якого крайнього контакту, а другий щуп підключати до інших контактів одночасно натискаючи на клавіші, розташовані в одному стовпці. Якщо при натисканні на будь-яку клавішу два виводи не продзвонюються - це означає, що вони обидва належать до однієї групи (рядкових або стовпчикових висновків). Після того, як усі висновки будуть розбиті на дві групи, можна переходити до визначення порядку їхнього розміщення всередині груп. При цьому, при фіксованому підключенні одного стовпчикового висновку, необхідно змінювати контакти з другої групи натискаючи одночасно з цим тільки клавіші, що належать до одного стовпця.

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

Тепер поговоримо про ініціалізацію периферії. У цьому проекті використовуються порти A і D, як порти вводу-виводу, а також таймери TIM2 та TIM3. Лістинг програми забезпечений докладними коментарями щодо пунктів налаштування периферії.

Іноді ми стикаємося з проблемою нестачі портів на Arduino. Найчастіше це стосується моделей з невеликою кількістю висновків. Для цього було придумано матричну клавіатуру. Така система працює у комп'ютерних клавіатурах, калькуляторах, телефонах та інших пристроях, у яких використовується велика кількість кнопок.

Для Arduino найчастіше використовуються такі клавіатури:

Найпоширенішими є 16 кнопкові клавіатури 4x4. Принцип їх роботи досить простий, Arduino по черзі подає логічну одиницю на кожен 4 стовпців, в цей момент 4 входи Arduino зчитують значення, і лише на один вхід подається високий рівень. Це досить просто, якщо знати можливості керування портами виведення в Arduino, а також портами входу/введення.

Для програмування можна використовувати спеціалізовану бібліотеку Keypad, але в цій статті ми не використовуватимемо її для більшого розуміння роботи з матричної клавіатури.

Підключаємо клавіатуру до будь-яких портів вводу/виводу.

На червоні порти подаватимемо сигнали, а з синіх будемо їх приймати. Найчастіше на сині дроти підводять резистори, що підтягують, але ми їх підключимо всередині мікроконтролера Arduino .

У програмі обчислюватимемо натиснуту кнопку і записуватимемо її в Serial порт.
У цьому методі є один значний недолік: контролер не може виконувати інших завдань стандартними методами. Ця проблема вирішується підключенням матричної клавіатури з використанням переривань.

Int PinOut (5, 4, 3, 2); // піни виходи int PinIn (9, 8, 7, 6); // піни входу int val = 0; const char value (("1", "4", "7", "*"), ("2", "5", "8", "0"), ("3", "6", " 9", "#"), ("A", "B", "C", "D") ); // подвійний масив, що означає кнопку int b = 0; // змінна, куди кладеться число з масиву(номер кнопки) void setup() ( pinMode (2, OUTPUT); // ініціалізуємо порти на вихід (подають нулі на стовпці) pinMode (3, OUTPUT); pinMode (4, OUTPUT) pinMode(5, OUTPUT);pinMode(6, INPUT);// ініціалізуємо порти на вхід з підтяжкою до плюсу (приймають нулі на рядках) digitalWrite(6, HIGH);pinMode(7, INPUT);digitalWrite(7, HIGH ), pinMode (8, INPUT); digitalWrite (8, HIGH); pinMode (9, INPUT); digitalWrite (9, HIGH); Serial.begin(9600); // відкриваємо Serial порт) функцію для читання кнопок ( for (int i = 1; i<= 4; i++) // цикл, передающий 0 по всем столбцам { digitalWrite(PinOut, LOW); // если i меньше 4 , то отправляем 0 на ножку for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам { if (digitalRead(PinIn) == LOW) // если один из указанных портов входа равен 0, то.. { Serial.println(value); // то b равно значению из двойного массива delay(175); } } digitalWrite(PinOut, HIGH); // подаём обратно высокий уровень } } void loop() { matrix(); // используем функцию опроса матричной клавиатуры }

З використанням бібліотеки зчитування даних із цифрової клавіатури спрощується.

#include const byte ROWS = 4; const byte COLS = 3; char keys = (("1","2","3"), ("4","5","6"), ("7","8","9"), ("#" ,"0","*"))); byte rowPins = (5, 4, 3, 2); byte colPins = (8, 7, 6); Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); void setup()( Serial.begin(9600); ) void loop()( char key = keypad.getKey(); if (key != NO_KEY)( Serial.println(key); ) )

  • Tutorial

Бажаєте прокачати ваші Arduino проекти? Змусити їх працювати швидше, вимірювання та регулювання зробити точніше, та й додати баги (з новими девайсами вони неминучі). Тоді ця стаття для Вас.

Arduino тема все більше захоплює уми людства, але рано чи пізно ми зустрічаємося з тим, що нам чогось не вистачає, наприклад бюджету/розмірів/пінів портів/розрядності/продуктивності... Як казав один мудрий чоловік - Хто хоче, той шукає можливості , хто не хоче – шукає причини».

Хороші люди це розуміють, і потихеньку починають долучати STM32 до ардуїно теми, бо восьмибітні AVR мікроконтролери, на яких засновано чимало ардуїно плат, не завжди можуть впоратися з поставленими завданнями.

Короткий виклад цієї статті у відео форматі:



Гаразд, менше лірики та ближче до теми. У цій статті, я розглядатиму дешеву налагоджувальну плату, яка заснована на базі мікроконтролера :

Для початку порівняємо основні параметри STM32 плати, та її аналога за ціною - Arduino Nano V3.0:

  • Робоча частота 72 МГц, проти 16 у ардуїно;
  • Об'єм Flash пам'яті 64 Кбайта, проти 32;
  • Оперативної пам'яті, вона ж RAM (де зберігаються змінні), у STM32 цілих 20 Кбайт, у ардуїнки лише 2;
  • Швидкий 12-бітний АЦП, в той час як у Arduino плат, що на базі AVR мікроконтролерів (це зазвичай більшість) використовується 10-бітний. Це означає, що у випадку STM32 функція analogRead(*); повертатиме 0..4095 проти 0..1023, що у першому випадку веде до точніших вимірів;
  • 16-бітний апаратний ШІМ, проти 8-ми у Arduino плат, тобто, функція analogWrite(*); pwmWrite(*); може набувати значення 0..65535, проти убогих 0..255. Це дозволить ще точніше керувати нашими двигунами, сервами та іншими девайсами, які керуються за допомогою ШІМ;
  • Апаратна робота з USB, чим не може похвалитися не одна Arduino плата вартістю менше 2 доларів;
  • Напруга живлення - від 2 до 3.6В(прямо таки заточено під 2 AA батарейки), проти 2.7...5В у ардуїно плат;
  • Ціни на момент написання статті – 1.9 долара проти 1.8 (аліекспрес).
Очевидно, що налагоджувальна плата на базі STM32 виграє за всіма параметрами у Arduino Nano, винятком є ​​хіба що вартість, але погодьтеся 10 центів - хороша ціна за велику продуктивність, а про периферію, якою нафаршировано STM32, то я взагалі мовчу, чого тільки варті DMA або інтегрований в мікроконтролер годинник реального часу.

Все це в сумі робить цю плату вкрай привабливою у всьому, крім одного - новачкові, як, наприклад, мені, тема STM32 здається занадто затратною за часом, є цілі сайти присвячені програмуванню цих мікроконтролерів. А от якщо потоваришувати STM32 з Arduino IDE, то поріг входження опускається до вкрай низького рівня. Хоча, як кажуть, «У кожній бочці меду є ложка дьогтю», але про це трохи нижче.

Приступимо до підготовки плати для роботи з Arduino IDE. Перше, що необхідно зробити - залити в мікроконтролер спеціальний завантажувач, який дозволить прошивати плату через апаратний USB, причому прямо з середовища розробки. Для цього необхідно перевести верхній джампер (він же "BOOT0"), в положення "1":

Для чого потрібні BOOT0 та BOOT1 джампери

Справа в тому, що в STM32 із заводу прошить, в так звану системну пам'ять (system memory), спеціальний завантажувач, який дозволяє прошивати плату через звичайнісінький USB to UART перехідник, не вдаючись до специфічних програматорів типу ST-Link V2.


Далі нам знадобиться перехідник із USB на UART. Варто пам'ятати, що STM32, це 3.3 У логіка, сумісність з 5-вольтової не гарантується, тому рекомендовано використовувати USB to UART, у якого є можливість вибору режимів роботи з 3.3/5В логікою. Я використовував дешевий перехідник на базі CH340G:


* Як видно, виробник не став загортатися зі змивкою флюсу, на роботу, звичайно, не впливає.

Плату підключив до USB to UART перехіднику таким чином:

G<->GND;
5V<->5V;
PA10<->TXD;
PA9<->RXD.


* PA10/PA9 на платі підписані просто як A10/A9 - ці порти є першим апаратним USART"ом, всього їх на платі 3, так само тут 2 апаратних I2C і 2 SPI.

Задля зручності запитав плату від 5 В, для харчування від 3.3 на платі є пін «3.3». Увага, 5 В може запросто вивести мікроконтролер з ладу, так що приділіть належну увагу підключення.

Качаємо, встановлюємо та запускаємо Flash Loader Demonstrator (є в архіві до статті):

Вибираємо номер COM-порту нашого перехідника, в моєму випадку це COM43, потім натискаємо "Next":

Так як у мене мікроконтролер новий, ще муха не сиділа на нього ніхто нічого не записував (зрозуміло, крім самого виробника), то тут за замовчуванням стоїть захист від читання, програма нас попереджає, що якщо натиснути кнопку «Remove protection», Flash пам'ять буде очищена , тобто якби там була якась прошивка - вона втече. У моєму випадку там нічого корисного немає, тож сміливо тисну. Далі бачу таке:

Тиснемо «OK»:

Так як моя налагоджувальна плата заснована на мікроконтролері STM32F103 C8- тут 64 Кбайт Flash пам'яті, є ще STM32F103 CBмікроконтролер, де вдвічі більше Flash.

Знову "Next", і бачимо наступне вікно:

Вибираємо "Download to device" і тиснемо на "...":

Змінюємо тип файлів на *.bin і відкриваємо файл "generic_boot20_pc13.bin" (теж присутній в архіві) який можна взяти з проекту STM32duino-bootloader.

Потім треба завантажити, для середовища розробки Arduino IDE, спеціальне ядро ​​STM32 (так само є в архіві до статті). Тут є один нюанс, на момент написання статті, ядро не працює на версіях середовища розробки понад 1.6.5, у мене коштує 1.6.5-r5 .
Перевірена працездатність ядра на .

У моєму випадку повний шлях виглядає ось так - «C:UsersRSKDocumentsArduinohardware»

Очевидно, що система пристрій визначити не зможе, тому потрібно ще встановити драйвера на плату. Заходимо в папку «Мої Документи Arduino hardware Arduino_STM32 drivers win» (або drivers win, у випадку архіву до статті), і запускаємо від імені адміністратора файл install_drivers.bat:

Після цього верхній джампер (тобто "BOOT0"), переводимо в положення "0" і підключаємо плату до комп'ютера через microUSB кабель:

Вона повинна в диспетчері пристроїв визначитися або як "Maple DFU" або "Maple Serial (COM*)":

Не зовсім зрозуміло, чому після першого підключення плата визначається по-різному, на різних комп'ютерах, але не суть, приступаємо до налаштування Arduino IDE.

Тут необхідно встановити ядро ​​для плати Arduino Due. Вибираємо останню версію та натискаємо «Install»:

Потім Інструменти -> Плата -> "Generic STM32F103C", далі Variant: "STM32F103C8 (20k RAM. 64k Flash)", Upload Method: "STM32duino bootloader", Порт - номер COM-порту плати, взагалі все як на скрині:

Все, плата готова до прошивки та програмування в середовищі розробки Arduino IDE. Давайте прохаємо якийсь скетч із прикладів, які «вшиті» в ядро, заходимо Файл -> Папка зі скетчами -> hardware -> Arduino_STM32 -> STM32F1 -> libraries -> A_STM32_Examples -> Digital -> Blink:

Класичний "Hello World" у світі мікроконтролерів. Змінюємо PB1 на PC13, оскільки світлодіод, що на платі, підключений до цього порту:


* До речі, загоряється він за низьким рівнем на ніжці PC13.

Натискаємо кнопку «Ввантажити», після прошивки середа розробки видасть щось таке:

«Done!
Resetting USB to switch back to runtime mode
error resetting after download: usb_reset: could not reset device, win error: Неможливо знайти вказаний файл.».

Але прошивка завантажилася успішно, хоча не завжди так, іноді Arduino IDE видає інші повідомлення.

Couldn't find the DFU device

Коли бачите, повідомлення типу:

dfu-util - © 2007-2008 by OpenMoko Inc.
Couldn't find the DFU device:
Цей програма є Free Software і має ABSOLUTELY NO WARRANTY»

Це означає, що плату прошити не вдалося.

Searching for DFU device ...

Коли середовище розробки видає:

«Searching for DFU device …
Обсяг board є в регулярній bootloader режимі і продовжує attempt dfu programming...»

І більше нічого не відбувається, спробуйте в цей момент перезавантажити плату, натиснувши кнопку ресет. За аналогією це як з Arduino Pro Mini.

А тепер про «ложку дьогтю», про яку я писав на початку статті, чомусь не завжди виходить прошити плату в середовищі розробки, навіть більше, вона не завжди визначається комп'ютером. Я для себе це вирішив наступним чином, перед тим як завантажити прошивку (перед натисканням кнопки "Ввантажити"), клацаю "Reset" на платі, і після прошивки, ще раз перезавантажую плату. У цьому випадку відсоток ймовірності, що плата пройдеться, дорівнює 99%. Незрозуміло, чому працює саме так, але факт. Думаю, що рано чи пізно цей одвірок виправлять, і все буде автоматично перезавантажуватися як треба. А щоб це швидше поправили, треба щоб комьюніті цієї чудової STM32 налагоджувальної плати зростала, тому поділіться цією статтею з друзями, особливо з друзями програмістами.

З приводу розпинання:

Клікабельно

Найкраще, що мені вдалося знайти, це розпинування самого мікроконтролера (відкривайте в новій вкладці):


(с) www.stm32duino.com/viewtopic.php?p=11137

До порту потрібно звертатися на повне ім'я, наприклад:

digitalWrite(PB0, LOW);
analogWrite(PA8, 65535); pwmWrite(PA8, 65535);
analogRead(PA0);
LiquidCrystal lcd(PB0, PA7, PA6, PA5, PA4, PA3);

Ще рекомендую зайти на сайт docs.leaflabs.com/docs.leaflabs.com/index.html є багато чого цікавого за темою програмування в Arduino IDE, правда англійською мовою.

Я порився у файлах ядра, і знайшов один цікавий файл:
Documents\Arduino\hardware\Arduino_STM32\STM32F1\variants\generic_stm32f103c\board.cpp

Там прописані всі порти, які підтримують:

  • ШИМ, тобто функція analogWrite(); pwmWrite(); - PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8, а це далеко не всі, які розмічені на розпинанні чіпа;
  • АЦП, але analogRead(); - PB0, PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0.

Тож майте це на увазі. Хоча цього більш ніж достатньо від плати, вартістю 1.9 долара.

Ще зауважив, що піни PA12/PA11 підключені до D+/D-USB, їх зайвий раз краще взагалі не чіпати, бо мало що на кону не 2-х доларовий шматок склотекстоліту з чіпом, а материнська плата комп'ютера.

Схема налагоджувальної плати:

Ну і наостанок: