Как и защо да четем даташитове, когато микроконтролерите са вашето хоби

Как и защо да четем даташитове, когато микроконтролерите са вашето хоби

Микроелектрониката е модно увлечение в последните години благодарение на вълшебното Arduino. Но ето и проблемът: при достатъчен интерес, лесно се прераства в DigitalWrite(), а какво да се прави след това - не е съвсем ясно. Разработчиците на Arduino положиха много усилия, за да намалят прага на влизане в своята екосистема, но извън нея все още се разпростира тъмен лес от сурова схемотехника, който е труднодостъпен за любителите.

Например, даташитове. Изглежда, че в тях има всичко, просто вземи и ползвай. Но авторите им явно не поставят за цел популяризирането на микроконтролерите; понякога изглежда, че те умишлено злоупотребяват с неясни термини и съкращения при описването на прости неща, за да максимално объркат непосветените. Но не всичко е толкова лошо, ако наистина желаеш, рачето се отваря.

В тази статия ще споделя опита си от комуникацията на хуманитарист с даташитове за хобийни цели. Текстът е предназначен за любители, които са израснали от штанишките на Arduino, и предполага известно разбиране за принципите на работа на микроконтролерите.

Ще започна с традиционното

Мигаем с LED на Ардуино

И веднага кода:

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

«Какво е това? – ще попита опитният читател. – Защо пишеш нещо в входния регистър PINB? Той е само за четене!» Наистина, документацията на Arduino, като повечето учебни статии в интернет, твърди, че този регистър е само за четене. И аз самият така мислех, докато не прегледах datasheet на Atmega328p, подготвяйки тази статия. А там:

Как и защо да четем даташитове, когато микроконтролерите са вашето хоби

Това е относително нова функционалност, която я нямаше на Atmega8, за която не всички знаят или не споменават от съображения за обратна съвместимост. Но е напълно подходяща за демонстриране на идеята, че даташитове струва да се четат, за да се използват всички възможности на чипа, включително малко известни. И това не е единствената причина.

Защо е още важно да четем даташитове

Обикновено ардуинците, след като поиграят със светодиоди и AnalogWrite’и, започват да свързват всякакви модули и чипове към платката, за които вече има написани библиотеки. Рано или късно се появява библиотека, която не работи както трябва. Тогава любителят започва да я разглежда, за да я ремонтира, а там…

Там се случва нещо напълно неразбираемо, затова се налага да отидеш в Гугъл, да прочетеш многобройни сtutorialи, да извлечеш част от нечий подходящ код и накрая да постигнеш целта си. Това дава мощно усещане за постижение, но всъщност процесът напомня на изобретяването на велосипед чрез обратно инженерство на мотоциклет. И всъщност не се придобива разбиране как работи този велосипед. Знам, защото сам съм се занимавал с това доста дълго.

Ако вместо това увлекателно занимание бях прекарал няколко дни в изучаване на документацията на Atmega328, щях да спестя огромно количество време. В крайна сметка, това е доста прост микроконтролер.

Следователно, трябва да се четат даташитове, поне за да си представяме как изобщо работи микроконтролерът и какво може да прави. И още:

  • за да проверяваме и оптимизираме чужди библиотеки. Често ги пишат същите любители, които изобретяват велосипеда; или пък, обратно, авторите умишлено внасят излишна защита срещу глупаци. Нека е три пъти повече и по-бавно, но поне със сигурност ще работи;

  • за да имам възможност да използвам чипове, за които никой не е написал библиотека;

  • за да си улесня задачата при мигриране от една линия микроконтролери на друга;

  • за да оптимизирам стария си код, който по никакъв начин не се побираше в Ардуино;

  • за да науча как да управлявам всеки чип директно чрез неговите регистри, без да се занимавам с изучаването на устройството на неговите библиотеки, ако изобщо съществуват.

Защо да пишем в регистрите директно, когато има HAL и LL?

Речник
HAL, High Abstraction Layer – библиотека за управление на микроконтролера с висок ниво на абстракция. Ако трябва да използваме интерфейса SPI1, просто го настройваме и активираме SPI1, без да се замисляме какви регистри за какво отговарят.
LL, Low Level API – библиотека, която съдържа макроси или структури с адреси на регистри, позволяваща да се обръщаме към тях по име. DDRx, PORTx, PINx на Атмега – това е LL.

Споровете относно "HAL, LL или регистри" редовно се случват в коментарите на Хабра. Не претендирам за достъп до астрални знания, просто ще споделя своя любителски опит и размишления.

След като се запознах по-добре с Атмега и прочетох статии за прекрасностите на STM32, купих полдюжина различни платки – и Discovery, и „Сини таблети“, даже и просто чипове за моите самоделки. Те два години се прахосваха в кутията. Понякога си казвах: „всичко, от тези почивни дни усвоявам STM“, стартирах CubeMX, генерирах сетъп за SPI, гледах стената текст, щедро подправена с авторски права на STM, и решавах, че това е просто прекалено.

Как и защо да четем даташитове, когато микроконтролерите са вашето хоби

Разбира се, може да се разбере какво е написала CubeMX. Но едновременно е ясно, че е нереално да запомня всичките формулировки, за да ги пиша на ръка след това. А какво ще стане с дебъгването, ако случайно забравя да сложа отметка в Куба – това е съвсем друга работа.

Минали са две години, а аз все още се интересувам от ST MCU Finder и различни вкусни, но недостъпни за моето разбиране чипове, и случайно попаднах на прекрасна статия, макар и за STM8. И внезапно разбрах, че през цялото време съм хлопал на отворена врата: регистрите на STM са устроени по същия начин, както при всички останали МК и за работа с тях Кубът не е задължителен. Какво, така е било възможно?..

HAL и конкретно STM32CubeMX – инструмент за професионални инженери, които тясно работят с чиповете STM32. Основната особеност – високото ниво на абстракция, възможността бързо да мигрирате от един МК на друг и дори от едно ядро на друго в рамките на серията STM32. Любителите се сблъскват с такива задачи рядко – нашият избор на МК обикновено е ограничен до асортимента на AliExpress и по-често мигрираме между коренно различни чипове – преминаваме от Атмега на STM, от STM на ESP, или каквото ново ни предложат китайските приятели. HAL тук няма да помогне, а времето за изучаването му е доста.

Остава LL – но от него до регистрите е само една крачка. Лично аз намирам, че писането на свои макроси с адреси на регистрите е полезно: по-внимателно изучавам даташита, мисля какво ще ми трябва в бъдеще, а какво определено не, по-добре структурирам програмите си и въобще преодоляването способства за запомняне.

Освен това, има нюанс с популярния STM32F103 – за него съществуват две несъвместими версии на LL, едната официална от STM, а другата – от Leaf Labs, използвана в проекта STM32duino. Ако пишете open-source библиотека (а аз имах именно такава задача), трябват или две версии, или да се обръщате директно към регистрите.

Накрая, отказът от LL опростява миграцията, особено ако бъде планирана още в началото на работата по проекта. Паране пример: ще напишем ардуиновски blink в Atmel Studio без LL:

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

За да накарате този код да закачи светодиода на китайската платка с STM8 (от ST Visual Desktop), е достатъчно да смените два адреса:

#define DDR_B 0x5007
#define OUT_B 0x5005

Да, използвам специфичността на свързването на светодиода на конкретната платка, ще мига много бавно, но все пак ще мига!

Какви има даташити

В статии и форуми, както на руски, така и на английски, под „даташити“ разбират всяка техническа документация за чиповете, така постъпвам и аз в този текст. Формално те са само един от видовете такава документация:

Datasheet – Технически характеристики. Задължително присъства при всеки електронен компонент. Справочна информация, полезно е да е под ръка, но да се чете внимателно в него особено няма какво. Въпреки това, по-простите чипове често се ограничават до даташита, за да не се натрупват излишни документи; в този случай Reference Manual се включва тук.

Reference Manual – собствено ръководство, обемиста книга на 1000+ страници. В него подробно се описва работата на всичко, което е поставено в чипа. Основният документ за усвояване на микроконтролера. За разлика от datasheet, инструкциите са написани за широка гама от МК, включват много информация за периферията, отсъстваща в конкретния ви модел.

Programming Manual или Instruction Set Manual – инструкция за уникалните команди на микроконтролера. Предназначена е за тези, които програмират на Ассемблер. Авторите на компилаторите активно я използват за оптимизиране на кода, затова в общия случай не би ни била нужна. Но е полезно да се загледате тук за общо разбиране, за някои специфични команди като изхода от прекъсване, а също и при активно използване на дебъгера.

Application Note – полезни съвети за решаване на конкретни задачи, често с примери за код.

Errata Sheet – описание на случаи на нестандартно поведение на чипа с варианти за заобикаляне, ако такива имат.

Какво има в даташитите

Непосредствено в Datasheet може да са ни нужни такива раздели:

Device Summary – първата страница на даташита накратко разказва за устройството. Много полезно в ситуации, когато сте намерили чип (видели сте го в магазина, извадили сте го, срещнали сте упоминание) и искате да разберете какво е.

General Description – по-подробно описание възможностите на чиповете от серията.

Pinouts – схеми на разпиновка за всички възможни корпуси на чипа (на кой пин коя крак).

Pin Description – описание на предназначението и възможностите на всеки пин.

Memory Map – карта на адресите в паметта вероятно няма да ни е необходима, но понякога тя включва и таблица на адресите на блоковете регистри.

Register Map – таблица на адресите на блоковете регистри, обикновено се намира именно в даташита, а в Ref Manual – само сдвижения (address offsets).

Electrical Characteristics – в този раздел ни интересуват най-вече absolute maximum ratings, изброяващи максималните натоварвания на чипа. В отличие от неунищожимата Atmega328p, повечето МК не позволяват свързването на сериозни натоварвания към пиновете, което става неприятна изненада за ардуинците.

Package Information – чертежи на наличните корпуси, полезни при проектиране на собствените платки.

Reference Manual структурно се състои от раздели, посветени на конкретни периферии, посочени в заглавието им. Всяка глава може условно да се раздели на три части:

Overview, Introduction, Features – преглед на възможностите на периферията;

Functional Description, Usage Guide или просто основният блок на раздела – подробно текстово описание на принципите на работа на периферията и начините за нейното използване;

Registers – описание на управляващите регистри. В простите случаи като GPIO или SPI това може да е напълно достатъчно, за да започнете да използвате периферията, но често все пак се налага да прочетете и предишните части.

Как да четем даташити

Даташитите с непривичка плашат със своето обемисто съдържание и множество непознати думи. Всъщност, всичко не е толкова страшно, ако знаете няколко трика.

Установете добър PDF-ченето. Даташитите се пишат в славните традиции на хартиените инструкции, те са чудесни за печат, маркирани с пластмасови разделители и прешити. Хипертекстът в тях се среща в следови количества. За щастие, поне структурата на документа е оформена с разделители, така че качествена читалка с удобна навигация е много нужна.

Даташитът – не учебник на Страуструп, в него не трябва да четете всичко последователно. Ако сте се възползвали от предишния съвет – просто намерете нужния раздел в таблото с раздели.

Даташитите, особено Reference Manuals, могат да описват възможностите не на конкретен чип, а на цяла серияТова означава, че половината, а може би двете трети от информацията не се отнасят към вашия чип. Преди да изследвате регистрите TIM7, проверете дали General Descriptionго имате.

Да знаете английски достатъчно на основно ниво.Техническите спецификации наполовина се състоят от термини, незнакоми на средностатистическия носител на езика, и наполовина - от прости свързващи конструкции. Има и чудесни китайски технически спецификации на китайски английски, където половината също са термини, а другата половина - произволен набор от думи.

Ако срещнете непозната дума, не се опитвайте да я преведете с английско-български речник. Ако ви озадачи hysteresis, преводът "гистерезис" няма да ви помогне. Използвайте Google, Stack Overflow, Уикипедия, форуми, където необходимият концепт ще бъде обяснен с прости думи и примери..

Най-добрият начин да разберете прочетеното е да го проверите в действие.Затова дръжте под ръка отладъчна платка, с която се запознавате, а по-добре две - в случай, че нещо не сте разбрали и видите магически дим.

Полезно е да имате под ръка техническия лист, когато четете нечий урок или изучавате чужда библиотека. Напълно е възможно в него да намерите по-оптимално решение на задачата си. И обратно - ако от техническия лист не можете да разберете как всъщност работи регистърът, потърсете го в Google: най-вероятно някой вече е описал всичко с прости думи или е оставил ясен код в GitHub.

Речник

Няколко полезни думи и обозначения, които помагат да се ориентирате по-бързо в техническите спецификации. Това, което се сетих в последните два дни, допълнения и корекции са добре дошли.

Електричество
Vcc, Vdd – „плюс“, захранване
Vss, Vee – „минус“, земя
current – ток
voltage – напрежение
to sink current – да работи "земя" за външно натоварване
to source current – да захранва външно натоварване
high sink/source pin – пин с повишена "търпимост" към натоварването

IO
H, High – на пина Vcc
L, Low – на пина Vss
High Impedance, Hi-Z, floating – на пина няма нищо, "високо съпротивление", той фактически е невидим за външния свят.
weak pull up, weak pull down – вграден подтягващ/стягващ резистор, примерен аналог 50 кОм (вижте техническия лист). Използва се, например, за да не "виси" входният пин във въздуха, предизвиквайки фалшиви сработвания. Weak – защото лесно може да бъде "превъзмогнат".
push pull – изходен режим на пина, в който той превключва между High и Low – стандартен OUTPUT с Arduino.
отворен дренаж – обозначава режим на изхода, при който пинът може да бъде Low, или Висока Импедансия / Плаващ. При това почти винаги това не е "истински" отворен дренаж, има защитни диоди, резистори и други. Това просто обозначава режим земя/нищо.
истински отворен дренаж – а това вече е истински отворен дренаж: пинът директно отива към земята, ако е отворен, или е в плаващо състояние, ако е затворен. Това означава, че през него при необходимост може да протече напрежение по-голямо от Vcc, но максимумът пак е определен в даташита в раздела Абсолютни Максимални Рейтинги / Напрежение.

Интерфейси
в серия – свързани последователно
към верига – свързване на чипове в верига чрез последователно свързване, увеличавайки броя на изходите.
смести – смяна, обикновено обозначава смяна на битове. Следователно, да сменим в и да сменим извън – приемане и предаване на данни по битове.
превключвател – блокировка, която прикрива буфера, докато през него се сменят битовете. Когато предаването приключи, блокировката се отваря и битовете започват да работят.
да синхронизираме в – да извършим побитно предаване, да преместим всички битове на необходимите места.
двойно буфериране, сенчест регистър, регистър за предварително зареждане – обозначава история, когато регистърът трябва да може да приема нови данни, но да ги задържа до определен момент. Например, за правилната работа на PWM неговите параметри (дължина на импулса, честота) не трябва да се променят, докато не приключи текущият цикъл, но нови параметри вече могат да бъдат предадени. Следователно, текущите се задържат в сенчест регистър, а новите отиват в регистър за предварително зареждане, като са записани в съответния регистър на чипа.

Всичко
предделител – предделител на честотата
да зададем бит – да зададем бит на 1
да изчистим/нулираме бит – да сбросим бит на 0 (нулиране – функция на даташитите на STM)

Какво следва

Всъщност тук беше предвидена практически част с демонстрация на три проекта на STM32 и STM8, извършени специално за тази статия с помощта на даташити, с лампички, SPI, таймери, PWM и прекъсвания:

Как и защо да четем даташитове, когато микроконтролерите са вашето хоби

Но текстът става доста много, така че проектите ще бъдат изпратени за втората част.

Умението да четете даташити ще ви помогне с вашето хоби, но малко вероятно да замени живото взаимодействие с колеги на форуми и в чатове. За него все пак трябва да се подобри английският. А за тези, които дочетоха – специална награда: два безплатни урока в Skyeng при първо плащане с код HABR2.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster