Як і навошта чытаць даташыты, калі мікракантролеры - ваша хобі

Як і навошта чытаць даташыты, калі мікракантролеры - ваша хобі

Мікраэлектроніка - моднае захапленне апошніх гадоў дзякуючы чароўнаму Arduino. Але вось бяда: пры належнай цікавасці перарасці DigitalWrite() атрымліваецца хутка, а што рабіць далей - не зусім ясна. Распрацоўнікі Arduino прыклалі нямала намаганняў для зніжэння парога ўваходжання ў сваю экасістэму, але за яе межамі па-ранейшаму калыхаецца цёмны лес суровай схематэхнікі, маладаступны аматару.

Напрыклад, даташыты. Быццам бы ў іх ёсць усё, бяры і карыстайся. Але толькі іх аўтары відавочна не ставяць перад сабой задачу папулярызацыі мікракантролераў; часам здаецца, што яны спецыяльна злоўжываюць незразумелымі тэрмінамі і абрэвіятурамі пры апісанні простых рэчаў, каб максімальна заблытаць недасведчанага. Але не ўсё так дрэнна, пры жаданні куфэрак адчыняецца.

У гэтым артыкуле я падзялюся вопытам зносін гуманітарыя з даташытамі ў хобі-мэтах. Тэкст прызначаны для якія выраслі з штоніц Arduino аматараў, ён мяркуе некаторае ўяўленне аб прынцыпах працы мікракантролераў.

Пачну з традыцыйнага

Міргаем святлодыёдам на Ардуіна

І адразу код:

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

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

"Што гэта? - Спытае спрактыкаваны чытач. - Навошта ты нешта пішаш ва ўваходны рэгістр PINB? Ён жа толькі для чытання! Сапраўды, дакументацыя Arduino, як і большасць навучальных артыкулаў у інтэрнэце, сцвярджае, што гэты рэгістр read-only. Я і сам так думаў, пакуль не перачытаў тэхнічны ліст да Atmega328p, рыхтуючы гэты артыкул. А там:

Як і навошта чытаць даташыты, калі мікракантролеры - ваша хобі

Гэта адносна новы функцыянал, яго не было на Atmega8, аб ім не ўсё ведаюць ці не згадваюць з меркаванняў зваротнай сумяшчальнасці. Але цалкам прыдатны для дэманстрацыі думкі, што даташыты варта чытаць, каб выкарыстоўваць усе магчымасці чыпа, уключаючы малавядомыя. І гэта не адзіная прычына.

Навошта яшчэ чытаць даташыты

Звычайна ардуіншчыкі, найграўшыся са святлодыёдамі і AnalogWrite'амі, пачынаюць падлучаць да платы ўсякія модулі і чыпы, для якіх ёсць ужо напісаныя бібліятэкі. Рана ці позна з'яўляецца бібліятэка, якая працуе не так, як трэба. Тады аматар пачынае яе калупаць, каб паправіць, а там…

А там адбываецца нешта катэгарычна незразумелае, таму даводзіцца адпраўляцца ў гугл, чытаць шматлікія цьютарыялы, тузаць па частках нечы прыдатны код і нарэшце дамагацца свайго. Гэта дае магутнае адчуванне здзяйснення, але насамрэч працэс нагадвае вынаходства ровара шляхам рэверс-інжынірынгу матацыкла. Прычым разумення, як працуе гэты веласіпед, не дадаецца. Ведаю, бо сам гэтым займаўся даволі доўга.

Калі б я замест гэтага займальнага занятку выдаткаваў пару дзён на вывучэнне дакументацыі да 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

Так, я выкарыстоўваю асаблівасць падключэння святлодыёда на канкрэтнай плаце, міргаць будзе вельмі павольна, але будзе ж!

Якія бываюць даташыты

У артыкулах і на форумах, і руска-, і англамоўных, пад «даташытамі» разумеюць любую тэхнічную дакументацыю да чыпаў, гэтак жа раблю і я ў гэтым тэксце. Фармальна яны - толькі адзін з відаў такой дакументацыі:

тэхнічны пашпарт - ТТХ, тактыка-тэхнічныя характарыстыкі. Абавязкова ёсць у любога электроннага кампанента. Даведачная інфармацыя, карысна трымаць пад рукой, але ўдумліва чытаць у ім асабліва няма чаго. Зрэшты, чыпы прасцей часта абмяжоўваюцца дататытам, каб не пладзіць лішніх дакументаў; у гэтым выпадку Даведачнае кіраўніцтва уключаецца сюды ж.

Даведачнае кіраўніцтва - уласна інструкцыя, здаровая кніжка на 1000 + старонак. Падрабязна распісваецца праца ўсяго, што панапіхана ў чып. Галоўны дакумент для засваення мікракантролера. У адрозненне ад дадзеныя, інструкцыі пішуць для шырокай лінейкі МК, у іх змяшчаецца шмат інфармацыі аб перыферыі, якая адсутнічае ў вашай канкрэтнай мадэлі.

Кіраўніцтва па праграмаванні або Instruction Set Manual - інструкцыя па унікальным камандам мікракантролера. Прызначана для тых, хто праграмуе на Асэмблеры. Аўтары кампілятараў актыўна яе выкарыстоўваюць для аптымізацыі кода, таму ў агульным выпадку нам яна не запатрабуецца. Але зазіраць сюды карысна для агульнага разумення, за некаторымі спецыфічнымі камандамі кшталту выхаду з перапынення, а таксама пры актыўным выкарыстанні дэбагера.

Заўвага прыкладання - карысныя парады па рашэнні канкрэтных задач, часта з прыкладамі кода.

Бланк выпраўленняў - апісанне выпадкаў нестандартных паводзін чыпа з варыянтамі абыходу, калі ёсць.

Што ёсць у даташытах

Непасрэдна ў тэхнічны пашпарт нам могуць спатрэбіцца такія раздзелы:

Рэзюмэ прылады – першая старонка даташыта сцісла распавядае пра прыладу. Вельмі карысная ў сітуацыях, калі вы недзе знайшлі чып (убачылі ў краме, выпаялі, сустрэлі згадку) і хочаце зразумець, што гэта.

Агульнае апісанне - Больш падрабязнае апісанне магчымасцяў чыпаў з лінейкі.

Распіноўкі – схемы распіноўкі для ўсіх магчымых карпусоў чыпа (на якой назе які пін).

Апісанне шпількі – апісанне прызначэння і магчымасцей кожнага піна.

Карта памяці - карта адрасоў у памяці нам ці наўрад запатрабуецца, але часам у яе ўключаецца таксама табліца адрасоў блокаў рэгістраў.

Рэгістрацыя Карта – табліца адрасоў блокаў рэгістраў, як правіла, знаходзіцца менавіта ў даташыце, а ў Ref Manual – толькі зрухі (address offsets).

Электрычныя характарыстыкі – у гэтым раздзеле нас у першую чаргу цікавяць absolute maximum ratings, Якія пералічваюць максімальныя нагрузкі на чып. У адрозненне ад няўбільнай Atmega328p, большасць МК не дазваляе падлучаць да пін сур'ёзныя нагрузкі, што становіцца непрыемным сюрпрызам для ардуіншчыкаў.

Інфармацыя пра пакет - чарцяжы даступных карпусоў, карысныя пры праектаванні сваіх поплаткаў.

Даведачнае кіраўніцтва структурна складаецца з раздзелаў, прысвечаных канкрэтнай перыферыі, указанай у іх загалоўку. Кожны раздзел можна ўмоўна падзяліць на тры часткі:

агляд, Увядзенне, Асаблівасці - агляд магчымасцяў перыферыі;

Функцыянальнае апісанне, Кіраўніцтва па выкарыстанні ці проста асноўны блок часткі - падрабязнае тэкставае апісанне прынцыпаў прылады перыферыі і спосабаў яе выкарыстання;

Рэестры - апісанне кіраўнікоў рэгістраў. У простых выпадках тыпу GPIO або SPI гэтага можа быць цалкам дастаткова, каб пачаць выкарыстоўваць перыферыю, але часта даводзіцца ўсё ж такі чытаць і папярэднія часткі.

Як чытаць даташыты

Даташыты з нязвычкі адпужваюць сваім аб'ёмам і багаццем незразумелых слоў. Насамрэч усё не так страшна, калі ведаць некалькі лайфхакаў.

Усталюйце добрую PDF-чыталку. Даташыты пішуцца ў слаўных традыцыях папяровых інструкцый, іх выдатна раздрукаваць, пракласці пластыкавымі закладкамі і пашыць. Гіпертэкст у іх назіраецца ў следавых колькасцях. На шчасце, хаця б структуру дакумента афармляюць закладкамі, таму прыдатная чыталка са зручнай навігацыяй вельмі патрэбная.

Даташыт - не падручнік Страўструпа, у ім не трэба чытаць усё запар. Калі скарысталіся папярэдняй радай – проста знайдзіце ў панэлі закладак патрэбную частку.

Даташыты, асабліва Даведачныя дапаможнікі, могуць апісваць магчымасці не канкрэтнага чыпа, а усёй лінейкі. Гэта значыць, што палова, а то і дзве траціны інфармацыі не мае дачынення да вашага чыпа. Перш чым вывучаць рэгістры TIM7, праверце ў Агульнае апісанне, ці ёсць ён у вас.

ведаць англійская дастаткова на базавым узроўні. Даташыты напалову складаюцца з тэрмінаў, незнаёмых сярэднестатыстычнаму носьбіту мовы, і напалову – з простых злучных канструкцый. Яшчэ бываюць выдатныя кітайскія даташыты на кітайскай англійскай, дзе палова таксама тэрміны, а другая палова - рандомны набор слоў.

Калі сустракаеце незнаёмае слова, не спрабуйце перавесці яго з дапамогай англа-рускага слоўніка. Калі вас ставіць у тупік гістэрэзіс, то ад перакладу «гістарэзіс» цяплей вам не стане. Карыстайцеся Гуглам, Stack Overflow, Вікіпедыяй, форумамі, дзе патрэбнае паняцце будзе растлумачана простымі словамі з прыкладамі.

Лепшы спосаб зразумець прачытанае - праверыць у справе. Таму трымайце пад рукой адладкавы поплатак, з якой знаёміцеся, а лепш дзве - на выпадак, калі ўсёткі штосьці недаразумелі і ўбачылі чароўны дымок.

Карысная звычка трымаць пад рукой даташыць, калі вы чытаеце чыйсьці цьютарыял ці вывучаеце чужую бібліятэку. Цалкам магчыма, у ім вы знойдзеце больш аптымальнае вырашэнне сваёй задачы. І наадварот - калі з дататыту ніяк не атрымоўваецца зразумець, як жа ўсёткі працуе рэгістр, загугліце яго: хутчэй за ўсё, хтосьці ўжо ўсё апісаў простымі словамі або пакінуў зразумелы код на ГітХабе.

слоўнічак

Трохі карысных слоў і пазначэнняў, якія дапамагаюць хутчэй асвоіцца з даташытамі. Тое, што ўспомнілася ў апошнія пару дзён, дапаўненні і выпраўленні вітаюцца.

электрычнасць
VDC, Праўда - "плюс", харчаванне
Vss, Vee – «мінус», зямля
ток - ток
напружанне - напружанне
to sink current працаваць "зямлёй" для знешняй нагрузкі
to source current - сілкаваць знешнюю нагрузку
high sink/source pin - пін з падвышанай «цярпімасцю» да нагрузкі

IO
H, High - На піне Vcc
L, Low - На піне Vss
Высокі імпеданс, Прывітанне-Z, плавае – на піне нічога няма, «высокі супраціў», ён фактычна нябачны знешняму свету.
weak pull up, weak pull down - убудаваны падцягвальны / сцягвальны рэзістар, прыкладны аналаг 50 кім (гл. Даташ). Выкарыстоўваецца, напрыклад, каб уваходны пін не боўтаўся ў паветры, выклікаючы ілжывыя спрацоўванні. Слабы - таму што яго лёгка «перабіць».
штуршок цягнуць – выходны рэжым піна, у якім ён перамыкаецца паміж высокая и Нізкі - Звычайны OUTPUT з Arduino.
open drain – абазначэнне выходнага рэжыму, у якім пін можа быць альбо Нізкі, Альбо High Impedance / Floating. Пры гэтым амаль заўсёды гэта не "сапраўдны" адкрыты сцёк, ёсць ахоўныя дыёды, рэзістары, яшчэ што. Гэта проста абазначэнне рэжыму зямля/нічога.
true open drain - а вось гэта ўжо сапраўдны адкрыты сцёк: пін напрамую вядзе ў зямлю, калі адкрыты, ці знаходзіцца ў падвешаным стане, калі зачынены. Гэта значыць, што праз яго пры неабходнасці можна пускаць напругу больш Vcc, але максімум усё роўна агаворваецца ў даташыце ў раздзеле Absolute Maximum Ratings / Voltage.

Інтэрфейсы
in series – падлучаныя паслядоўна
ланцугом - збіраць чыпы ў ланцужок паслядоўным падключэннем, павялічваючы колькасць выхадаў.
зрух – зрух, звычайна абазначае зрух бітаў. Адпаведна, да shift in и to shift out – прымаць і перадаваць дадзеныя пабітна.
зашчапка - засаўка, якая затуляе буфер, пакуль праз яго зрушваюцца біты. Калі перадача скончаная, засаўка адчыняецца, біты пачынаюць працаваць.
to clock in - выканаць пабітную перадачу, ссунуць усе біты на патрэбныя месцы.
double buffer, shadow register, preload register - абазначэння гісторыі, калі рэгістр павінен умець прымаць новыя дадзеныя, але прытрымваць іх да нейкага моманту. Напрыклад, для карэктнай працы ШІМ яго параметры (скважнасць, частата) не павінны мяняцца, пакуль не скончыцца бягучы цыкл, але новыя параметры ўжо могуць быць перададзены. Адпаведна, бягучыя трымаюцца ў shadow register, а новыя трапляюць у preload register, будучы запісанымі ў адпаведны рэгістр чыпа.

Усякае
prescaler - прадделитель частаты
to set a bit - усталяваць біт у 1
да clear/reset a bit - скінуць біт у 0 (скід – фішка даташытаў STM)

Што далей

Наогул тут планавалася практычная частка з дэманстрацыяй трох праектаў на STM32 і STM8, выкананых спецыяльна для гэтага артыкула пры дапамозе даташытаў, з лямпачкамі, SPI, таймерамі, Шымам і перапыненнямі:

Як і навошта чытаць даташыты, калі мікракантролеры - ваша хобі

Але тэксту атрымліваецца зашмат, таму праекты адпраўляюцца ў другую частку.

Навык чытання даташытаў дапаможа вам з вашым хобі, але наўрад ці заменіць жывыя зносіны з калегамі па захапленні на форумах і ў чатах. Для яго трэба ўсё ж у першую чаргу падцягваць англійскую мову. А таму дачытаўшым – спецыяльны прыз: два бясплатныя ўрокі ў Skyeng пры першай аплаце па кодзе. HABR2.

Крыніца: habr.com

Дадаць каментар