Як штатними налаштуваннями вбити мікроконтролер

enter image description here
Не можу назвати себе дуже акуратним і уважним, але тим не менш, за більш ніж 10 років розробки ПО для вбудованих пристроїв мені толком нічого не вдалося спалити або зіпсувати. З одного боку, варто за це сказати "дякую" моїм колегам — схемотехнікам. З іншого боку, сучасна "розумна" мікроелектроніка має досить серйозну "захист від дурня". Але пару днів тому стався один цікавий випадок. Мені вдалося перетворити в "цегла" мікроконтролер Atmel SAMD21G18AU, виконуючи звичайні маніпуляції, описані в user manual.
Як-то так вийшло, що ще зі студентських часів мене вчили, що "з Atmel працюють одні дилетанти", тому використовувати його не варто. Аргумент вельми сумнівний, але за принципом "не читав, але засуджую", нелюбов до Atmel передалася і мені.
Однак в один прекрасний момент до нас прийшов черговий замовник і приніс проект пристрою, який потрібно доопрацювати і для якого потрібно написати "прошивку". Ядром цього пристрою є мікроконтролер Atmel SAMD21G18AU. Так мені довелося відкинути свої забобони і почати вивчати даний кристал.
enter image description here
Мікроконтролер виявився досить відомим і поширеним завдяки ArduinoZero.
enter image description here
Після вивчення загальних параметрів я був дуже вражений. Контролер має мало спільного зі старими атмеловскими сімействами, що працює на ядрі Cortex-M0 і використовує мудровану систему конфігурації периферії, якої у нього дуже багато.
enter image description here
Ця система дозволяє гнучко налаштовувати кристал під широке коло завдань, але вона ж і підвищує його "складність" і негативно впливає на криву навчання роботи з ним (Arduino IDE я в розрахунок не беру :).
При цьому Atmel має власну програмну бібліотеку для роботи зі своїми мікроконтролерами Atmel Software Framework. Справа хороша, до тих пір, поки не починаєш їй користуватися :) Бібліотека розрахована для роботи в IAR і Atmel Studio і містить величезну кількість драйверів, модулів і прикладів майже для всіх контролерів Atmel… Але спроектована та задокументована вона, на мій погляд, досить погано (спробуйте розібратися з ній самі)
Архітектура бібліотеки спроектовані так, що всі "зав'язано" на налагодження плати:
enter image description here
тобто щоб використовувати бібліотеку для своєї власної плати, що вам потрібно зробити її "опис" у певному форматі (досить невиразно документованому) і поправити пару файлів (зокрема, board.h). При цьому, якщо ви хочете просто взяти конкретний драйвер і використовувати його в своєму проекті, ви зіткнетеся з серйозними труднощами. Особливо якщо ваш проект зроблений не в IAR або Atmel Studio. Доведеться довго розгрібати залежності модулів і виділяти необхідні файли.
Цей процес і згубив мій екземпляр контролера. Мені потрібен був драйвер Watchdog. Він в свою чергу тягне кілька інших драйверів, серед яких драйвер Clock, який займається налаштуванням тактових генераторів для ядра, так і для периферії. Ну а Clock використовує спеціальний .h файл, що містить конфігурацію генераторів для конкретного пристрою. І мені так "пощастило", що мені попався не той файл, який в підсумку відключив мені тактовий генератор ядра, а заодно і модуля для роботи з SWD.
SAMD21G18AU має два вбудованих генератора тактових і дозволяє використовувати два зовнішніх. Модуль GENERIC CLOCK CONTROLLER має в своєму складі кілька внутрішніх генераторів. Перший з них тактує ядро, інші використовуються для тактирования периферії. Для кожного внутрішнього генератора можна задати джерело (внутрішній або зовнішній), множник і інші параметри, серед яких є "OnDemand". Він дозволяє запускати генератор "на вимогу", тим самим зменшуючи споживання системи.
enter image description here
Після перезавантаження SAMD21G18AU за замовчуванням налаштовує роботу ядра від внутрішнього генератора на 8 МГц, а інші генератори відключає.
Файл, який попався мені, змушує драйвер Clock налаштувати тактування ядра на внутрішній 8 МГц'овий генератор, але при цьому переводить його в режим "OnDemand". Але цей режим чомусь не спрацьовує і генератор не заводиться. Виходить, що як тільки контролер починає виконувати код, він відключає собі тактування.
При цьому модуль роботи з SWD теж перестає тактуватися, а значить і перестає відповідати при спробі з'єднання. І ніякі хитрощі не допомагають зловити момент, коли процесор вже включився, але ще не встиг відпрацювати криву настроювання модуля GENERIC CLOCK CONTROLLER.
Можна було б скористатися перепрошиванням через завантажувач. Зазвичай в мікроконтролерах є "зашитий" завантажувач, що дозволяє програмувати його як мінімум через COM-порт. Але не тут-то було! Atmel перехитрив сам себе. Хоча використання bootloadr'а і предусмотреноале із-за "гнучкості" у налаштуваннях місце, зарезервоване під нього, може бути використано для зберігання виконуваного коду. І, схоже, це є налаштуваннями за замовчуванням.
тобто, щоб працювати з bootloader'ом, його потрібно спочатку "зашити" в контролер. І звичайно, в моєму випадку це зроблено не було.
Найцікавіше, що хоча на платі розпаяні обидва зовнішніх кварцу, в результаті жоден не працює. Підступитися до контролера не виходить ні через SWD, ні через Завантажувач.
У висновку історії хочу сказати, що я все-таки не володію глибокими навичками роботи з даними мікроконтролером, тому, можливо, є спосіб його "оживити". Може бути, хтось мені підкаже рішення проблеми, поки ми не отпаяли "цегла" і не припаяли новий SAMD21G18AU?
p.s. Ну а моя нелюбов до Atmel отримала перший аргумент у свою користь. Контролер, що дозволяє загнати себе у глухий кут комбінацією параметрів, при цьому не має штатних засобів відновлення — це якось не солідно...
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.