- Серијска комуникација на СТМ8С103Ф3П6
- Прибадаче за серијску комуникацију на СТМ8С103Ф3П6
- Кружни дијаграм за серијску комуникацију СТМ8С
- Постављање СТВД-а за серијску комуникацију
- Програмирање СТМ8С за серијску комуникацију
- Контролна ЛЕД диода са серијског монитора
- Дубљи изглед серијске библиотеке СТМ8С
Програмирање новог микроконтролера често траје дуже због нових метода руковања регистром и не знајући који бит тачно шта ради. Исто важи и за отклањање грешака, без речи. Због тога програмери често користе тачке прекида у свом коду и пролазе кроз њега помоћу програма за отклањање грешака. Али употреба програма за отклањање погрешака можда ће требати додатни хардвер (најчешће скупи) и такође додатно време. Будући да смо фан обожаватеља Ардуина, једна ствар око које се сви можемо сложити је да користимо серијске исписе за отклањање грешака, а разумевање нашег кода много олакшава живот. Шта је то што можемо исто да реплицирамо на СТМ8 са космичким Ц компајлером и СПЛ библиотекама? Па, то је врло могуће, а то је управо оно што ћемо урадити у овом трећем водичу наше серије туторијала.Такође проверавате почетак рада са СТМ8С (туториал 1) и СТМ8С ГПИО цонтрол (туториал 2) ако сте овде потпуно нови. Такође смо истражили могућност програмирања СТМ8С са Ардуином за брзе почетнике. Све то је речено, кренимо у туториал.
Серијска комуникација на СТМ8С103Ф3П6
Из техничког листа СТМ8С103Ф3П6 видимо да наш 8-битни контролер подржава УАРТ комуникацију у много различитих режима. Контролер такође има излазни пин такта за синхрону УАРТ комуникацију и такође може подржавати СмарЦард, ИрДА и ЛИН. Али у овом упутству нећемо истраживати ништа од тога само да бисмо се клонили сложености. Научићемо како се једноставно чита УАРТ и пише.
Водич такође нуди заглавну датотеку под називом стм8с103 сериал.х помоћу које можете изводити једноставне УАРТ наредбе попут Сериал старт , Сериал реад, сериал принт, итд. У основи, моћи ћете да штампате цхар, инт и стринг на серијски монитор а такође чита цхар са серијског монитора. На крају овог водича моћи ћете да контролишете ЛЕД са серијског монитора и добијете повратне информације о статусу ЛЕД-а. Датотека заглавља која је горе наведена зависи од СПЛ библиотека, зато проверите да ли сте следили водич за почетак.
Прибадаче за серијску комуникацију на СТМ8С103Ф3П6
Кренимо од хардверске стране. Имајући брз поглед на Дисплеј на СТМ8С103Ф3П6 микроконтролера датој испод, можемо видети да игле 1, 2, и 3 ће се користити за УАРТ комуникацију.
Међу три, пин 1 је УАРТ пин за сат који ће се користити само током синхроне УАРТ комуникације, тако да нам овде неће бити потребан. Пин 2 је пин УАРТ предајника, а Пин 3 је пин УАРТ пријемника. Имајте на уму да се ови пинови такође могу удвостручити као аналогни или уобичајени ГПИО пин.
Кружни дијаграм за серијску комуникацију СТМ8С
Шема кола је овде врло једноставна, морамо повезати наш СТ-ЛИНК 2 за програмирање и УСБ у ТТЛ претварач за читање серијских података. Имајте на уму да наш СТМ8С контролер ради на 3.3В логичком нивоу, па се уверите да ваш УСБ у ТТЛ претварач такође подржава 3.3В логику. Комплетна шема кола приказана је доле.
Морате повезати СТ-линк у један УСБ порт, а УСБ у ТТЛ претварач у други УСБ порт вашег лаптопа, тако да можете истовремено програмирати и надгледати податке. УАРТ веза је једноставна, само повежите уземљење и Рк / Тк пин вашег СТМ8С микроконтролера са Тк / Рк пиновима УСБ у ТТЛ претварач. Овде сам напајао контролер помоћу Вцц пина СТ-Линк-а и оставио отворен всс пин ТТЛ претварача, можете то учинити и обрнуто. На тржишту постоји много врста претварача УСБ у ТТЛ, само се побрините да може да ради на 3.3В логичким сигналима и да једноставно потражите Тк, Рк и ГНД пинове и успоставите везу приказану горе. Моје подешавање хардвера је приказано у наставку.
Да бисмо направили серијски начин комуникације, обезбедили смо датотеку заглавља СТМ8С_Сериал.х . Користећи ову датотеку заглавља можете да извршите једноставне функције попут серијске Ардуино за серијску комуникацију.
Све потребне датотеке за овај пројекат можете пронаћи на нашој СТМ8С103Ф3_СПЛ Гитхуб страници. Ако вам је потребна само ова одређена датотека заглавља, можете је преузети са доње везе.
Преузмите СТМ8С_Сериал.х
Постављање СТВД-а за серијску комуникацију
Да бисмо радили са серијском комуникацијом, користићемо многе који користе функцију датотеке заглавља СТМ8С_Сериал.х о којој смо раније разговарали. Али библиотека има и друге зависности, многе СПЛ УАРТ и Цлоцк повезане заглавље и Ц датотеке. Тако да је од ове тачке боље укључити све датотеке заглавља и Ц у наш пројекат како би се избегла грешка при компилацији. Моје радно окружење за СТВД изгледа овако.
Обавезно укључите све изворне датотеке СПЛ и датотеку Инцлуде као што смо то урадили у нашем првом упутству. Такође се уверите да сте додали датотеку заглавља стм8с103_сериал.х . Не постоји датотека Ц за ово заглавље.
Програмирање СТМ8С за серијску комуникацију
Једном када је подешавање СТВД пројекта спремно, можемо започети писање нашег кода у датотеку маин.ц. Комплетни код за овај водич налази се на дну ове странице. Објашњење је следеће.
Први корак је укључивање потребних датотека заглавља, овде сам додао главну датотеку заглавља (стм8с) и датотеку заглавља стм8с_103_сериал које смо управо преузели.
// Обавезна заглавља #инцлуде "СТМ8С.х" #инцлуде "стм8с103_сериал.х" //хттпс://гитхуб.цом/ЦирцуитДигест/СТМ8С103Ф3_СПЛ/блоб/мастер/стм8с103%20Либрариес/стм8с103_Сериал.х
Даље, помоћу макронаредби за дизајн одредимо улазне и излазне пинове. Овде ћемо контролисати само уграђену ЛЕД диоду која је повезана на пин5 порта Б, па му зато дамо име тест_ЛЕД .
#дефине тест_ЛЕД ГПИОБ, ГПИО_ПИН_5 // тест ЛЕД је повезан на ПБ5
Крећући се унутар главне функције, дефинисаћемо пин као излаз. Ако нисте упознати са основним ГПИО функцијама, вратите се на СТМ8С ГПИО водич.
// Дефиниције пин-а // Декларишите ПБ5 као пусх пулл Излазни пин ГПИО_Инит (тест_ЛЕД, ГПИО_МОДЕ_ОУТ_ПП_ЛОВ_СЛОВ);
Затим иницијализујемо своје серијске комуникационе портове брзином од 9600 бауд. За оне који су нови, 9600 је брзина којом ће се преносити битови података током комуникације. Ако овде подесите 9600, такође морате да подесите исто на софтверу за надзор. Затим такође исписујемо низ „Ентер цомманд“ и прелазимо на следећи ред.
Сериал_бегин (9600); // Иницијализација серијске комуникације брзином од 9600 бауд-ова Сериал_принт_стринг ("Ентер цомманд"); // исписати низ Сериал_невлине (); // прелазак на следећи ред
Прелазећи на бесконачну вхиле петљу, користимо функцију Сериал_аваилабле да бисмо проверили да ли постоје долазни серијски подаци. Ако је одговор да, читамо и меморишемо је у променљиву која се зове цх и такође је исписујемо помоћу Сериал_принт . Тада ако је примљена вредност 0, угасићемо ЛЕД, а ако је 1, укључићемо ЛЕД
иф (Сериал_аваилабле ()) {Сериал_принт_стринг ("Притиснули сте:"); цх = Сериал_реад_цхар (); Сериал_принт_цхар (цх); Сериал_невлине (); иф (цх == '0') ГПИО_ВритеХигх (тест_ЛЕД); // ЛЕД искључен иф (цх == '1') ГПИО_ВритеЛов (тест_ЛЕД); // ЛЕД УКЉУЧЕН}
Овим је програмирање овог упутства завршено, само отпремите код дат на дну ове странице и требали бисте моћи да контролишете ЛЕД са серијског монитора.
Контролна ЛЕД диода са серијског монитора
Након што отпремите код, можете отворити било који серијски монитор брзином од 9600 бауд-ова. Користио сам сам серијски монитор Ардуино ради лакшег коришћења. Притисните дугме за ресетовање и требало би да видите поруку „Унесите наредбу“. Тада ако унесете 1 и притиснете ентер, уграђена лед диода би се требала укључити, слично као 0, требало би се искључити.
Комплетан рад можете пронаћи у видео запису на дну ове странице. Ако имате питања, оставите их у одељку за коментаре. Наше форуме такође можете користити за постављање других техничких питања.
Дубљи изглед серијске библиотеке СТМ8С
За оне радознале умове који желе знати шта се заправо догађа у заглавној датотеци СТМ8С103Ф3_Сериал прочитајте даље…
Ова датотека заглавља добро функционише за програмирање на почетном нивоу, али ако користите другу верзију СТМ8С контролера или тражите неке напредне опције, можда ћете желети да мало прилагодите ово заглавље или директно радите са СПЛ библиотекама. Ову датотеку заглавља написао сам баш као зрелу датотеку заглавља УАРТ1, објашњење моје датотеке заглавља је следеће.
Читање карактера са серијског монитора
Ова функција помаже у читању једног карактера који је микроконтролеру послан са серијског монитора.
цхар Сериал_реад_цхар (воид) {вхиле (УАРТ1_ГетФлагСтатус (УАРТ1_ФЛАГ_РКСЕ) == РЕСЕТ); УАРТ1_ЦлеарФлаг (УАРТ1_ФЛАГ_РКСНЕ); ретурн (УАРТ1_РецеивеДата8 ()); }
Чекамо док је заставица РКСЕ постављена да довршимо пријем, а затим очистимо заставицу да потврдимо пријем. Коначно, примљене 8-битне податке шаљемо као резултат ове функције.
Штампање знака на Сериал Монитор
Ова функција преноси један знак са микроконтролера на серијски монитор.
воид Сериал_принт_цхар (вредност знака) {УАРТ1_СендДата8 (вредност); вхиле (УАРТ1_ГетФлагСтатус (УАРТ1_ФЛАГ_ТКСЕ) == РЕСЕТ); // сачекајте слање}
Функција једноставно уписује 8-битну вредност и чека док се пренос не доврши провером УАРТ1_ФЛАГ_ТКСЕ у СЕТ
Иницијализација серијске комуникације
Ова функција покреће серијску комуникацију потребном брзином пријеноса.
воид Сериал_бегин (уинт32_т бауд_рате) {ГПИО_Инит (ГПИОД, ГПИО_ПИН_5, ГПИО_МОДЕ_ОУТ_ПП_ХИГХ_ФАСТ); ГПИО_Инит (ГПИОД, ГПИО_ПИН_6, ГПИО_МОДЕ_ИН_ПУ_НО_ИТ); УАРТ1_ДеИнит (); // Деиницијализација УАРТ периферних уређаја УАРТ1_Инит (бауд_рате, УАРТ1_ВОРДЛЕНГТХ_8Д, УАРТ1_СТОПБИТС_1, УАРТ1_ПАРИТИ_НО, УАРТ1_СИНЦМОДЕ_ЦЛОЦК_ДИСАБЛЕ, УАРТ1_МОДЕ_ТКСРКС_ЕНАБЛЕ); // (БаудРате, Вордлегтх, СтопБитс, Парити, СинцМоде, Моде) УАРТ1_Цмд (ЕНАБЛЕ); }
Осим брзине пријеноса, постоје и други параметри који се морају поставити за серијску комуникацију, попут броја податковних битова, броја зауставних битова, паритета итд. Најчешћи (слично Ардуину) су 8-битни подаци са једним зауставним битом и без паритета, па ће то бити подразумевана поставка. Можете га променити ако је потребно.
Штампање целог броја на серијски монитор
Већину времена, ако користимо серијски монитор за отклањање грешака или надзор, можда бисмо желели да на серијски монитор одштампамо променљиву типа инт. Ова функција ради управо то
воид Сериал_принт_инт (инт нумбер) // Функција за штампање инт вредности на серијски монитор {цхар цоунт = 0; цхар цифра = ""; вхиле (нумбер! = 0) // раздвојимо инт на цхар низ {цифра = број% 10; цоунт ++; број = број / 10; } вхиле (цоунт! = 0) // исписати низ цхар у исправном смеру {УАРТ1_СендДата8 (цифра + 0к30); вхиле (УАРТ1_ГетФлагСтатус (УАРТ1_ФЛАГ_ТКСЕ) == РЕСЕТ); // сачекајте слање цоунт--; }}
Узима целобројну вредност и претвара је у низ знакова у првој вхиле петљи, а затим у другој вхиле петљи послаћемо сваки од знакова сличних нашој функцији принт цхар.
Штампање нове линије
Ово је једноставна функција за штампање нове линије. Хексвалуе за то је „0к0а“, ми га само шаљемо преко 8-битне команде за пренос.
воид Сериал_невлине (воид) {УАРТ1_СендДата8 (0к0а); вхиле (УАРТ1_ГетФлагСтатус (УАРТ1_ФЛАГ_ТКСЕ) == РЕСЕТ); // сачекајте слање}
Штампање низа на серијски монитор
Друга корисна функција је заправо штампање низова на серијском монитору.
воид Сериал_принт_стринг (цхар стринг) {. цхар и = 0; вхиле (стринг! = 0к00) {УАРТ1_СендДата8 (низ); вхиле (УАРТ1_ГетФлагСтатус (УАРТ1_ФЛАГ_ТКСЕ) == РЕСЕТ); и ++; }}
Опет, ова функција такође претвара низ у низ знакова и шаље сваки знак. Као што знамо, сви стрингови енд ће бити нули. Дакле, морамо само наставити са преласком и преносом знакова док не достигнемо нулу 0к00.
Провера да ли су серијски подаци доступни за читање
Ова функција проверава да ли у баферу постоје серијски подаци спремни за читање.
боол Сериал_аваилабле () {иф (УАРТ1_ГетФлагСтатус (УАРТ1_ФЛАГ_РКСНЕ) == ТРУЕ) ретурн ТРУЕ; иначе враћа ФАЛСЕ; }
Проверава заставицу УАРТ1_ФЛАГ_РКСНЕ , ако је тачна, враћа тачну , а ако није, враћа лажну.