Интернет журныл о промышленности в Украине

Все що потрібно знати про Fuse- і Lock-бітах AVR мікроконтролерів

Установка Fuse- і Lock-бітів (бітів конфігурації і блокування) мікроконтролерів (МК) сімейства Atmel AVR, особливо для початківців, є досить складним завданням і не рідко може викликати плутанину при налаштуванні і програмуванні МК. Якщо ви якийсь біт пропустили або встановили невірно, це може привести до неправильної роботи програми або, що ще гірше, до неможливості запрограмувати МК внутрісхемний по послідовному інтерфейсу.

Незважаючи на те, що в технічній документації на кожен МК дається вичерпна інформація по Fuse- і Lock-бітам, новачки часто відчувають себе дещо невпевнено перед виконанням команди записи бітів конфігурації і блокування. У статті ми розглянемо основні особливості бітів конфігурації МК сімейства AVR.

Fuse- і Lock-біти

Перед тим як ми приступимо до докладного розбору бітів конфігурації, потрібно усвідомити і запам'ятати один момент:

  • Fuse-біт = 1, означає, що він незапрограммирован (скинутий, неактивний);
  • Fuse-біт = 0, означає, що він запрограмований (встановлений, активний).

Це один з основних джерел виникає плутанини в процесі програмування Fuse- і Lock-бітів. Ми звикли думати, що встановити значення будь-якого параметра означає записати 1, вірно? З Fuse-битами AVR - навпаки, установка будь-якого біта означає запис 0, і це потрібно пам'ятати.

Біти конфігурації розташовані в окремій області незалежної пам'яті. Наприклад, МК ATmega328P має чотири конфігураційних байта, які необхідно запрограмувати для коректного функціонування. Один з цих байтів містить біти блокування, що залишилися три (що їх називають старший, молодший і розширений) - містять конфігураційні біти. Цей набір бітів встановлює початкові настройки МК: джерело тактового сигналу, область завантажувача, функціонування апаратного скидання, сторожового таймера тощо. Спочатку ми розглянемо біти блокування (Малюнок 1).

Залежно від типу мікроконтролера AVR кількість Lock-бітів може бути різним, але два молодших біта завжди присутні. Біти LB1 і LB2 використовуються для блокування доступу до вбудованої Flash-пам'яті. Ви, напевно, знаєте, що розробники будь-яких пристроїв практично завжди блокують читання прошивки МК, щоб захистити свою інтелектуальну власність і запобігти створенню дублікатів і підробок. Читання заблокованого мікроконтролера - це як цукерка для апаратних хакерів, але це окрема тема. Так, якщо потрібно захистити свою прошивку від копіювання, необхідно заблокувати вміст пам'яті мікроконтролера, в іншому випадку залиште біти без зміни. Інші біти блокування (BLB01, BLB02, BLB11 і BLB11) можуть використовуватися для блокування запису / читання в / з Flash-пам'яті, як з галузі застосування, так і з секції завантажувача. Біти блокування досить рідко програмуються (залежить від специфіки додатку), ми не будемо на них загострювати увагу. Навіть якщо ви запрограмуєте будь-який з них - біти блокування скидаються (встановлюються в 1) під час виконання команди повного стирання кристала (Chip Erase).

Найбільше нас цікавлять біти конфігурації, з ними вам доведеться мати справу дуже часто, хочете ви цього чи ні. Розташування певних Fuse-бітів в трьох байтах конфігурації відрізняється в залежності від використовуваного МК. Для прикладу, ми розглянемо ATmega328P, що має три байта конфігурації (Малюнок 2).

Для прикладу, ми розглянемо ATmega328P, що має три байта конфігурації (Малюнок 2)

Малюнок 2.Склад конфігураційних байтів і початкові значення Fuse-бітів мікроконтролера ATmega328P.

Подивіться на склад молодшого байта. Ви бачите групу з 4 однакових бітів CKSEL0, CKSEL1, CKSEL2, CKSEL3. Вони використовуються для вибору типу джерела тактових сигналів для мікроконтролера МК. За замовчуванням (заводські установки) мікроконтролер налаштований на роботу від внутрішнього RC осцилятора 8 МГц. Логічно це найбезпечніший варіант роботи з мікро контролером. Але, як відомо, прилади сімейства AVR можуть працювати від різних джерел тактової частоти:

  • калібрований внутрішній RC осцилятор (за замовчуванням 8 МГц);
  • зовнішній RC осцилятор;
  • зовнішній керамічний або кварцовий резонатор;
  • зовнішній низькочастотний кварц;
  • зовнішнє джерело тактового сигналу.

Для кожного з представлених режимів тактирования є діапазон установок Fuse-бітів CKSEL0..3, які використовуються для управління частотою тактового генератора і часом виходу мікроконтролера на робочий режим з режиму зниженого енергоспоживання. Ці біти тісно пов'язані з битами SUT0 і SUT1, фактично керують часом запуску мікроконтролера після подачі живлення. Затримка запуску необхідна для стабілізації генерації керамічних резонаторів і кварців. Точні значення часу виходу мікроконтролера на робочий режим наводяться в технічній документації.

Конфігураційний біт CKOUT дозволяє / забороняє висновок тактової частоти на один з висновків МК; для ATmega328P на висновок PORTB0 (для тактирования інших пристроїв), причому незалежно від того, який використовується джерело тактирования МК. Якщо біт запрограмований, то для призначеного для користувача додатки основна і альтернативні функції порту PB0 недоступні.

Останній біт в молодшому байті - CKDIV8. За замовчуванням цей біт встановлений, що означає підключення до внутрішнього RC осцилятора 8 МГц подільника частоти з коефіцієнтом 8, тому системна тактова частота МК в цьому випадку буде дорівнює 1 МГц. Якщо вам потрібна тактова частота 8 МГц, біт CKDIV8 потрібно скинути.

Тепер акцентуємо увагу на старшому конфигурационном байті.

Перший біт - BOOTRST, який за замовчуванням скинутий. Якщо цей біт встановити, то після подачі живлення на мікроконтролер або після скидання мікроконтролер почне виконання програми з завантажувального сектора. Простіше кажучи, якщо в додатку потрібно виконання функцій завантажувача з Flash-пам'яті, то цей біт потрібно запрограмувати. Якщо необхідно просто запрограмувати мікроконтролер по внутрісхемний інтерфейсу, то можна залишити цей біт недоторканим.

При використанні завантажувача важливе значення набувають біти BOOTSZ0 і BOOTSZ1. Вони задають область Flash-пам'яті для завантажувача. Якщо програмний код завантажувача вашої програми має маленький обсяг, то за допомогою бітів конфігурації можна виділити область Flash-пам'яті меншого розміру для завантажувача, а інше залишити для додатка.

Наступний біт EESAVE. Якщо його запрограмувати (0), то вміст незалежної пам'яті даних EEPROM залишиться недоторканим під час процедури стирання кристала (Chip Erase). У більшості випадків це корисна функція, наприклад, коли в EEPROM зберігаються важливі дані або калібрувальні параметри і потрібно оновити програмне забезпечення прошивки, то перед заміною прошивки запрограмуйте біт EESAVE.

Після установки біта WDTON сторожовий таймер мікроконтролера включається відразу після подачі живлення, і вимкнути програмно його неможливо. В цьому випадку сторожовий таймер буде постійно виконувати свою функцію періодичного скидання мікроконтролера, якщо в коді програми не виконувати спеціальну команду скидання сторожового таймера. Якщо біт WDTON не встановлено, то включення / відключення сторожового таймера здійснюється програмно.

Біт SPIEN призначений для відключення послідовного інтерфейсу програмування мікроконтролера. Насправді ви не зможете змінити стан цього біта використовуючи послідовний інтерфейс (МК AVR підтримують ще два режими паралельного програмування), але відомі випадки зміни стану біта SPIEN при некоректній роботі або збої внутрисхемного програматора.

Аналогічна ситуація з бітом RSTDSBL - він використовується для відключення функції апаратного скидання, іншими словами висновок скидання МК використовується як порт введення / виводу. У деяких ситуаціях (МК з малим числом ліній введення / виводу) це дуже зручно, але в цілому не рекомендується. Помилкова установка біта RSTDSBL може позбавити вас можливості програмувати мікроконтролер по SPI, т. К. Наявність сигналу скидання - обов'язкова умова включення режиму програмування.

Біт DWEN використовується для включення спеціального отладочного інтерфейсу DebugWire мікроконтролерів AVR. Змінити стан бітів SPIEN, RSTDSBL і DWEN по послідовному інтерфейсу неможливо, для цього буде потрібно паралельний програматор з підтримкою високовольтного режиму програмування або підключення по інтерфейсу DebugWire.

Слід зазначити ще біт CKOPT в старшому байті конфігурації (в ATmega328P він відсутній, але є в інших МК AVR), керуючий режимом роботи підсилювача тактового генератора. Якщо біт запрограмований (0), то вихідний сигнал тактового генератора має розмах (амплітуду), рівний напрузі харчування. Використовувати цю опцію можна, коли мікроконтролер буде працювати в обстановці з високим рівнем перешкод, а також коли планується підключити ще один мікроконтролер до висновку XTAL2. В інших випадках цей режим потрібно відключити (CKOPT = 1), оскільки збільшується енергоспоживання мікроконтролера, а це не вітається в пристроях з батарейним харчуванням.

Останній конфігураційний байт (розширений). Для мікроконтролера Atmega328P в ньому містяться три біта: BODLEVEL0, BODLEVEL1, BODLEVEL2. Ці біти призначені для установки порога спрацьовування схеми детектора напруги харчування: коли напруги харчування досягне встановленого рівня, стається збій мікроконтролера.

Калькулятор значень Fuse-бітів

Коли вам буде потрібно запрограмувати новий МК, для установки Fuse-бітів ви можете скористатися технічним описом на мікроконтролер. Але є більш зручний і простий спосіб - калькулятор Fuse-бітів - онлайн інструмент, розроблений Марком Хаммерлінгом (Малюнок 3). Ви самостійно вибираєте тип мікроконтролера і включаєте / виключаєте необхідні опції, а конфігурація Fuse-бітів буде оновлюватися автоматично.

Крім того, ви можете індивідуально встановлювати Fuse-біти в окремій формі, значення молодшого, старшого і розширеного байта конфігурації також будуть оновлюватися автоматично (Малюнок 4), одночасно генеруються команди для вибору програм AVRDude.

Якщо у вас є мобільний телефон або планшетний ПК з ОС Android, можна скористатися безкоштовним додатком AVR Fuse Calculator , Яке виконує ті ж функції і генерує команди для вибору програм AVRDude. У базі даних програми 144 МК AVR.

Основні правила для новачків:

  • Ніколи не змінюйте стан бітів DWEN, SPIEN і RSTDSBL. Фактично, по послідовному інтерфейсу програмування до них немає доступу;
  • Двічі перевірте біти CKSEL. Неправильна установка типу тактового генератора викликає безліч проблем;
  • Якщо ви не робите комерційні продукти, не міняєте стан Lock-бітів;
  • Якщо не впевнені в правильності установки Fuse-бітів, краще зверніться до технічної документації або задайте питання на форумі фахівцям.

embedds.com

Ми звикли думати, що встановити значення будь-якого параметра означає записати 1, вірно?