- Послідовний зв’язок на STM8S103F3P6
- Виводи послідовного зв'язку на STM8S103F3P6
- Електрична схема послідовного зв'язку STM8S
- Налаштування STVD для послідовного зв'язку
- Програмування STM8S для послідовного зв'язку
- Керування світлодіодом від послідовного монітора
- Поглиблений вигляд серійної бібліотеки STM8S
Програмування нового мікроконтролера часто займає більше часу завдяки новим методам обробки регістрів і невідомості, який біт саме що робить. Те саме стосується і налагодження, не кажучи про це. Ось чому програмісти досить часто використовують точки коду в своєму коді і проходять через нього за допомогою налагоджувача. Але для використання налагоджувача може знадобитися додаткове обладнання (найчастіше дорожче), а також додатковий час. Будучи шанувальником Arduino, ми можемо погодитися лише з тим, що для налагодження використовуємо послідовні оператори друку та розуміння нашого коду значно полегшує життя. Що ми можемо повторити те саме на STM8 з космічним компілятором C та бібліотеками SPL? Ну, це дуже можливо, і це саме те, що ми будемо робити в цьому третьому підручнику нашої серії підручників.Ви також перевіряєте початок роботи з STM8S (підручник 1) та STM8S GPIO control (підручник 2), якщо ви тут зовсім нові. Крім того, ми також вивчили можливість програмування STM8S з Arduino для швидких початківців. Все сказане давайте зайдемо у підручник.
Послідовний зв’язок на STM8S103F3P6
З таблиці даних STM8S103F3P6 ми бачимо, що наш 8-бітний контролер підтримує UART-зв'язок у багатьох різних режимах. Контролер також має вихідний вивід для синхронного зв'язку UART, а також може підтримувати SmarCard, IrDA та LIN. Але ми не досліджуватимемо нічого з цього в цьому посібнику, щоб не триматися складності. Ми навчимося робити просте читання та писання UART.
Підручник також надає файл заголовка, який називається stm8s103 serial.h, за допомогою якого ви можете виконувати прості команди UART, такі як Serial begin, Serial read, serial print тощо. В основному ви зможете надрукувати char, int та string на послідовному моніторі а також читати символ із послідовного монітора. Наприкінці цього підручника ви зможете керувати світлодіодом із послідовного монітора та отримувати відгук про стан світлодіода. Згаданий вище файл заголовка залежить від бібліотек SPL, тому переконайтеся, що ви дотримувались навчального посібника.
Виводи послідовного зв'язку на STM8S103F3P6
Почнемо з апаратного боку. Швидко подивившись розпіновки мікроконтролера STM8S103F3P6, наведені нижче, ми можемо побачити, що виводи 1, 2 та 3 будуть використовуватися для зв'язку UART.
Серед трьох, висновком 1 є вивід годинника UART, який буде використовуватися лише під час синхронного зв'язку UART, тому він нам тут не знадобиться. Контакт 2 - штифт передавача UART, а контакт 3 - штифт приймача UART. Зверніть увагу, що ці штифти також можуть подвоїтися як аналоговий штифт або звичайний штифт GPIO.
Електрична схема послідовного зв'язку STM8S
Тут принципова схема дуже проста, нам потрібно підключити наш ST-LINK 2 для програмування та перетворювач USB в TTL для зчитування послідовних даних. Зверніть увагу, що наш контролер STM8S працює на логічному рівні 3,3 В, тому переконайтеся, що ваш перетворювач USB в TTL також підтримує логіку 3,3 В. Повна електрична схема показана нижче.
Вам потрібно підключити ST-link в одному порту USB, а перетворювач USB в TTL - в інший USB-порт вашого ноутбука, щоб ви могли одночасно програмувати та контролювати дані. Підключення UART просте, просто підключіть заземлення та штифт Rx / Tx мікроконтролера STM8S до штифтів Tx / Rx конвертера USB в TTL. Тут я підключив контролер до штифта Vcc ST-Link і залишив штифт vss конвертера TTL відкритим, ви також можете зробити це навпаки. На ринку існує безліч типів перетворювачів USB в TTL, просто переконайтеся, що він може працювати на логічних сигналах 3,3 В, а також просто шукайте штифти Tx, Rx та GND та виконуйте з’єднання, показано вище. Налаштування мого обладнання показано нижче.
Для послідовного зв'язку ми надали заголовочний файл STM8S_Serial.h . За допомогою цього заголовного файлу ви можете виконувати прості функції, подібні до Arduino, для послідовного зв'язку.
Ви можете знайти всі необхідні файли для цього проекту на нашій сторінці STM8S103F3_SPL Github. Якщо вам потрібен лише цей конкретний файл заголовка, ви можете завантажити його за посиланням нижче.
Завантажте STM8S_Serial.h
Налаштування STVD для послідовного зв'язку
Для роботи з послідовним зв’язком ми будемо використовувати багато з них, використовуючи функцію файлу заголовка STM8S_Serial.h, про яку ми вже говорили раніше. Але бібліотека має й інші залежності, багато файлів заголовка SPL UART та Clock та файлів C. Тож з цього моменту краще включати всі заголовки та C-файли до нашого проекту, щоб уникнути помилки компіляції. Моє робоче середовище СТВД виглядає так.
Переконайтеся, що ви включили всі вихідні файли SPL та Include, як це було зроблено в нашому першому навчальному посібнику. А також переконайтеся, що ви додали файл заголовка stm8s103_serial.h . Для цього заголовка немає файлу C.
Програмування STM8S для послідовного зв'язку
Після того, як налаштування проекту STVD буде готове, ми можемо почати писати наш код у файлі main.c. Повний код цього підручника можна знайти внизу цієї сторінки. Пояснення полягає в наступному.
Першим кроком є включення необхідних файлів заголовків, тут я додав головний файл заголовка (stm8s) та файл заголовка stm8s_103_serial, який ми щойно завантажили.
// Обов’язкові заголовки #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Далі, ми використовуємо макроси проектування, щоб вказати вхідні та вихідні штифти. Тут буде лише керування вбудованим світлодіодом, який підключений до pin5 порту B, тому ми даємо йому назву test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // тестовий світлодіод підключений до PB5
Переходячи всередину основної функції, ми визначимо штифт як вихід. Якщо ви не знайомі з основними функціями GPIO, поверніться до підручника STM8S GPIO.
// Визначення штифтів // Оголосити PB5 як висувний вивідний штифт GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Потім ми ініціалізуємо наші послідовні порти зв'язку зі швидкістю 9600 бод. Для тих, хто новачок, 9600 - це швидкість, з якою біти даних будуть передаватися під час зв'язку. Якщо ви встановили тут 9600, ви також повинні встановити те ж саме в програмному забезпеченні для моніторингу. Потім ми також друкуємо рядок “Enter command” і переходимо до наступного рядка.
Serial_begin (9600); // Ініціалізація послідовного зв'язку зі швидкістю передачі даних 9600 бод. Serial_print_string ("команда введення"); // друк рядка Serial_newline (); // перехід до наступного рядка
Переходячи до нескінченного циклу while, ми використовуємо функцію Serial_available, щоб перевірити, чи немає вхідних послідовних даних. Якщо так, ми читаємо та зберігаємо його у змінній під назвою ch, а також друкуємо те саме за допомогою Serial_print . Тоді, якщо отримане значення дорівнює 0, ми вимкнемо світлодіод, а якщо воно буде 1, ми увімкнемо світлодіод
if (Serial_available ()) {Serial_print_string ("Ви натиснули:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); якщо (ch == '0') GPIO_WriteHigh (test_LED); // Світлодіод вимкнений if (ch == '1') GPIO_WriteLow (test_LED); // Світлодіод увімкнено}
На цьому програмування цього підручника завершено, просто завантажте код, наведений внизу цієї сторінки, і ви зможете керувати світлодіодом із послідовного монітора.
Керування світлодіодом від послідовного монітора
Завантаживши код, ви можете відкрити будь-який послідовний монітор із швидкістю передачі 9600 бод. Я використовував сам послідовний монітор Arduino для зручності його використання. Натисніть кнопку скидання, і ви побачите повідомлення “Введіть команду”. Потім, якщо ви введете 1 і натиснете enter, вбудований світлодіод повинен увімкнутись, аналогічно 0, він повинен вимкнутись.
Повну роботу можна знайти у відео, на яке посилається внизу цієї сторінки. Якщо у вас виникли запитання, залиште їх у розділі коментарів. Ви також можете використовувати наші форуми для розміщення інших технічних питань.
Поглиблений вигляд серійної бібліотеки STM8S
Для тих допитливих людей, які хочуть знати, що насправді відбувається всередині заголовного файлу STM8S103F3_Serial, читайте далі…
Цей файл заголовка добре працює для програмування на початковому рівні, але якщо ви використовуєте іншу версію контролера STM8S або шукаєте деякі розширені опції, можливо, вам доведеться трохи налаштувати цей заголовок або безпосередньо працювати з бібліотеками SPL. Я написав цей файл заголовка так само, як дозрівав із файлу заголовка UART1, пояснення мого файлу заголовка таке.
Читання символу з послідовного монітора
Ця функція допомагає зчитувати один символ, який було надіслано на мікроконтролер із послідовного монітора.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); повернення (UART1_ReceiveData8 ()); }
Ми чекаємо, поки прапорець RXE встановлений, щоб завершити прийом, а потім очистіть прапор, щоб підтвердити прийом. Нарешті, ми надсилаємо отримані 8-бітові дані як результат цієї функції.
Друк символу на послідовному моніторі
Ця функція передає один символ із мікроконтролера на послідовний монітор.
void Serial_print_char (значення char) {UART1_SendData8 (значення); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // чекаємо відправки}
Функція просто записує 8-бітове значення і чекає, поки передача завершиться, перевіривши UART1_FLAG_TXE на SET
Ініціалізація послідовного зв'язку
Ця функція ініціалізує послідовний зв'язок із необхідною швидкістю передачі даних.
void Serial_begin (uint32_t baud_rate) {GPIO_Init (GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init (GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); UART1_DeInit (); // Деініціалізація периферійних пристроїв UART UART1_Init (швидкість передачі даних, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // (BaudRate, Wordlegth, StopBits, Parity, SyncMode, Mode) UART1_Cmd (ENABLE); }
Окрім швидкості передачі даних, для послідовного зв'язку необхідно встановити інші параметри, наприклад кількість бітів даних, кількість стопових бітів, паритет тощо. Найбільш поширеним (подібним до Arduino) є 8-бітні дані з одним стоповим бітом і без паритету, і, отже, це буде настройкою за замовчуванням. Ви можете змінити його, якщо потрібно.
Друк цілого числа на послідовний монітор
Найчастіше, якщо ми використовуємо послідовний монітор для налагодження чи моніторингу, ми можемо захотіти надрукувати змінну типу int на послідовному моніторі. Ця функція робить саме це
void Serial_print_int (int number) // Функція для друку значення int на послідовний монітор {char count = 0; цифра символу = ""; while (число! = 0) // розбиваємо int на масив char {цифра = число% 10; рахувати ++; число = число / 10; } while (count! = 0) // вивести масив char у правильному напрямку {UART1_SendData8 (цифра + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // чекаємо відправки count--; }}
Він приймає ціле значення і перетворює його в масив символів у першому циклі while, потім у другому циклі while ми надішлемо кожен із символів, подібних до нашої функції char char.
Друк нового рядка
Це проста функція для друку нового рядка. Шістнадцяткове значення для цього - "0x0a", ми просто передаємо його за допомогою 8-бітової команди передачі.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // чекаємо відправки}
Друк рядка на послідовному моніторі
Ще одна корисна функція - це насправді друк рядків на послідовному моніторі.
void Serial_print_string (рядок char) {. char i = 0; while (рядок! = 0x00) {UART1_SendData8 (рядок); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Знову ж таки, ця функція також перетворює рядок у масив char і надсилає кожен символ. Як ми знаємо, усі рядки end будуть нульовими. Отже, нам просто потрібно продовжувати обходити та передавати символи, поки не досягнемо нульового значення 0x00.
Перевірка, чи доступні послідовні дані для читання
Ця функція перевіряє, чи є в буфері послідовні дані, готові до читання.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) повернути TRUE; інакше повернути FALSE; }
Він перевіряє прапорець UART1_FLAG_RXNE , якщо він істинний, повертає істину, а якщо ні, повертає false.