Як і навіщо читати даташити, якщо мікроконтролери – ваше хобі

Як і навіщо читати даташити, якщо мікроконтролери – ваше хобі

Мікроелектроніка - модне захоплення останніх років завдяки чарівному 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
Високий імпеданс, Привіт-З, плаваючий – на піні нічого немає, «високий опір», він фактично невидимий до зовнішнього світу.
weak pull up, weak pull down – вбудований підтягуючий/стягуючий резистор, зразковий аналог 50 кОм (див. даташит). Використовується, наприклад, щоб вхідний пін не бовтався у повітрі, викликаючи помилкові спрацьовування. Слабкий - Бо його легко «перебити».
двотактний – вихідний режим піна, в якому він перемикається між Високий и низький - Звичайний OUTPUT з Arduino.
open drain – позначення вихідного режиму, в якому пін може бути або низький, або High Impedance / Floating. При цьому майже завжди це не справжній відкритий стік, є захисні діоди, резистори, ще що. Це просто позначення режиму земля/нічого.
true open drain - А ось це вже справжній відкритий стік: пін безпосередньо веде в землю, якщо відкритий, або перебуває у підвішеному стані, якщо закритий. Це означає, що через нього при необхідності можна пускати напругу більше Vcc, але максимум все одно обговорюється в датасіті в розділі Absolute Maximum Ratings / Voltage.

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

Будь-яке
попередній дільник - Предділювач частоти
to set a bit - Встановити біт в 1
to clear/reset a bit - Скинути біт в 0 (скидання – фішка датташитів STM)

Що далі

Взагалі тут планувалася практична частина з демонстрацією трьох проектів на STM32 та STM8, виконаних спеціально для цієї статті за допомогою датішитів, з лампочками, SPI, таймерами, ШИМом та перериваннями:

Як і навіщо читати даташити, якщо мікроконтролери – ваше хобі

Але тексту виходить забагато, тому проекти вирушають у другу частину.

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

Джерело: habr.com

Додати коментар або відгук