- Последователна комуникация на STM8S103F3P6
- Серийни комуникационни щифтове на STM8S103F3P6
- Електрическа схема за серийна комуникация STM8S
- Настройване на STVD за серийна комуникация
- Програмиране на STM8S за последователна комуникация
- Контрол на светодиода от сериен монитор
- STM8S Serial Library Deeper Look
Програмирането на нов микроконтролер често отнема повече време поради новите методи за обработка на регистрите и незнанието кой бит прави точно какво. Същото важи и за отстраняване на грешки, без да се казва. Ето защо програмистите доста често използват точки на прекъсване в своя код и преминават през него с помощта на дебъгер. Но използването на дебъгер може да се нуждае от допълнителен хардуер (най-много пъти скъп), както и от допълнително време. Като момче фен на Arduino, едно нещо, за което всички можем да се съгласим, е да използваме серийни отпечатъци за отстраняване на грешки и разбирането на нашия код много улеснява живота. Какво можем да репликираме същото на STM8s с космически C компилатор и SPL библиотеки? Е, много е възможно и точно това ще направим в този трети урок от нашата серия уроци.Също така проверявате как да започнете с STM8S (урок 1) и STM8S GPIO контрол (урок 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 на серийния монитор и също чете char от серийния монитор. В края на този урок ще можете да управлявате светодиод от серийния монитор и да получавате обратна информация за състоянието на светодиода. Заглавният файл, споменат по-горе, зависи от SPL библиотеките, така че се уверете, че сте следвали начинаещия урок.
Серийни комуникационни щифтове на STM8S103F3P6
Нека започнем от хардуерната страна. Разглеждайки набързо пинотите на микроконтролера STM8S103F3P6, дадени по-долу, можем да видим, че щифтове 1, 2 и 3 ще бъдат използвани за UART комуникация.
Сред трите, пин 1 е UART пинов часовник, който ще се използва само по време на синхронна UART комуникация, така че няма да имаме нужда от него тук. ПИН 2 е ПИН на предавателя UART, а ПИН 3 е ПИН на приемника на UART. Имайте предвид, че тези щифтове също могат да се удвоят като аналогов или нормален GPIO щифт.
Електрическа схема за серийна комуникация STM8S
Схемата на веригата е много проста тук, трябва да свържем нашия ST-LINK 2 за програмиране и USB към TTL конвертор за четене на серийни данни. Имайте предвид, че нашият STM8S контролер работи на 3.3V логическо ниво, така че се уверете, че вашият USB към TTL конвертор също поддържа 3.3V логика. Пълната електрическа схема е показана по-долу.
Трябва да свържете вашата ST-връзка в един USB порт и USB към TTL конвертор в друг USB порт на вашия лаптоп, за да можете едновременно да програмирате и наблюдавате данни. UART връзката е проста, просто свържете заземяването и Rx / Tx щифта на вашия STM8S микроконтролер към Tx / Rx щифтовете на USB към TTL конвертора. Тук захранвах контролера с Vcc щифт на ST-Link и оставих отворен vss щифт на TTL конвертора, можете да го направите и обратното. На пазара има много видове USB към TTL конвертор, просто се уверете, че може да работи с 3.3V логически сигнали и просто търсете Tx, Rx и GND щифтове и направете връзката, показана по-горе. Моята хардуерна настройка е показана по-долу.
За да направим начин за серийна комуникация, предоставихме заглавния файл STM8S_Serial.h . Използвайки този заглавен файл, можете да изпълнявате прости функции като Arduino за серийна комуникация.
Можете да намерите всички необходими файлове за този проект на нашата страница STM8S103F3_SPL Github. Ако имате нужда само от този конкретен заглавен файл, можете да го изтеглите от връзката по-долу.
Изтеглете STM8S_Serial.h
Настройване на STVD за серийна комуникация
За да работим със серийна комуникация, ще използваме много от тях, използвайки заглавната файлова функция STM8S_Serial.h , която обсъдихме по-рано. Но библиотеката има и други зависимости, много SPL UART и Clock свързани заглавни и C файлове. Така че от този момент е по-добре да включите всички заглавни и C файлове в нашия проект, за да избегнем грешка при компилацията. Моята работна среда за STVD изглежда така.
Уверете се, че сте включили всички изходни файлове на SPL и включете файла, както направихме в първия ни урок. И също така се уверете, че сте добавили заглавния файл 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 ("Enter command"); // отпечатвам низ 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); // LED ИЗКЛЮЧЕН, ако (ch == '1') GPIO_WriteLow (test_LED); // LED ВКЛ.}
С това програмирането на този урок е завършено, просто качете кода, даден в долната част на тази страница, и трябва да можете да контролирате светодиода от серийния монитор.
Контрол на светодиода от сериен монитор
След като качите кода, можете да отворите всеки сериен монитор при 9600 скорости на предаване. Използвал съм самия сериен монитор Arduino за лесното му използване. Натиснете бутона за нулиране и трябва да видите съобщението „Въведете команда“. След това, ако въведете 1 и натиснете enter, вграденият светодиод трябва да се включи, подобно на 0, той трябва да се изключи.
Цялата работа може да бъде намерена във видеото, свързано в долната част на тази страница. Ако имате някакви въпроси, моля, оставете ги в раздела за коментари. Можете също да използвате нашите форуми, за да публикувате други технически въпроси.
STM8S Serial Library Deeper Look
За тези любопитни умове, които искат да знаят какво всъщност се случва в заглавния файл STM8S103F3_Serial, прочетете на….
Този заглавен файл работи добре за програмиране на ниво начинаещи, но ако използвате различна версия на контролера STM8S или търсите някои разширени опции, може да искате да промените малко този заглавие или директно да работите с SPL библиотеки. Написах този заглавен файл точно като узрял от заглавния файл UART1, обяснението на моя заглавен файл е както следва.
Четене на знак от Serial Monitor
Тази функция помага да се прочете един знак, който е изпратен на микроконтролера от серийния монитор.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); връщане (UART1_ReceiveData8 ()); }
Изчакваме, докато флагът RXE е SET, за да завършим приемането и след това изчистваме флага, за да потвърдим приемането. Накрая изпращаме получените 8-битови данни в резултат на тази функция.
Отпечатване на знак в Serial Monitor
Тази функция предава един знак от микроконтролер към серийния монитор.
void Serial_print_char (стойност на символа) {UART1_SendData8 (стойност); докато (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 (baud_rate, 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 номер) // Функция за отпечатване на int стойност към сериен монитор {char count = 0; char цифра = ""; while (число! = 0) // разделяме int на char масив {цифра = число% 10; преброяване ++; число = брой / 10; } while (count! = 0) // отпечатваме масива от символи в правилната посока {UART1_SendData8 (цифра + 0x30); докато (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // изчакваме изпращане count--; }}
Той приема целочислена стойност и го преобразува в масив от символи в първия цикъл while, след това във втория цикъл while ще изпратим всеки от символите, подобен на нашата функция за печат char.
Отпечатване на нов ред
Това е проста функция за отпечатване на нов ред. Шестнадесетичната стойност за това е „0x0a“, ние просто я изпращаме с помощта на 8-битовата команда за предаване.
void Serial_newline (void) {UART1_SendData8 (0x0a); докато (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // изчакайте изпращането}
Отпечатване на низ на сериен монитор
Друга полезна функция е всъщност да отпечатва низове на серийния монитор.
void Serial_print_string (символен низ) {. char i = 0; докато (низ! = 0x00) {UART1_SendData8 (низ); докато (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Отново, тази функция също преобразува низа в масив char и изпраща всеки символ. Както знаем, всички низове end ще бъдат null. Така че просто трябва да продължим да обхождаме и предаваме символите, докато достигнем нулата 0x00.
Проверка дали серийните данни са достъпни за четене
Тази функция проверява дали в буфера има серийни данни, готови за четене.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) return TRUE; в противен случай върнете FALSE; }
Проверява за флаг UART1_FLAG_RXNE , ако е вярно, връща true и ако не е, връща false.