Перейти к содержанию

Калькулятор фьюзов AVR

Выберите микроконтроллер и настройте тактирование, загрузчик, детектор питания и остальные фьюзы — калькулятор пересчитает байты, составит команду avrdude и предупредит о настройках, после которых МК перестанет отвечать программатору.

Исходные данные

LOW (lfuse)
по умолчанию 0x62

Внутренний RC-генератор 8 МГц; запуск из Power-down / после сброса: 6 CK/14 CK + 65 мс · 100010

HIGH (hfuse)
по умолчанию 0xD9

2048 слов, начало $3800 · 00

EXTENDED (efuse)
по умолчанию 0xFF

BOD выключен · 111

Не используются: биты 7–3 — читаются как 1.

Lock-биты (защита памяти)
LOCKBIT (lock)
по умолчанию 0xFF

Без ограничений · 11

Без ограничений · 11

Защиты нет · 11

Не используются: биты 7–6 — читаются как 1.

Результат

Фьюзы
L 0x62 · H 0xD9 · E 0xFF
заводские значения
Lock-байт
0xFFзащиты нет, не записывается
Сигнатура
1E 95 0Favrdude проверяет её перед записью
Интерфейсы
ISP, HVPP, debugWIRE
avrdude -c usbasp -p m328p -U lfuse:w:0x62:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m

CKDIV8 запрограммирован: после сброса частота делится на 8 (8 МГц → 1 МГц). Программа может снять делитель через регистр CLKPR; частоту SCK программатора выбирайте по поделенной частоте.

Фьюзы — несколько байтов энергонезависимой памяти, которые настраивают микроконтроллер до запуска программы: источник тактирования, загрузчик, детектор пониженного питания, доступность вывода RESET и программирования по ISP. Программа их не меняет, их записывает программатор. Ошибка в одном бите может «запереть» МК — поэтому перед записью полезно увидеть расшифровку каждого бита и предупреждения.

Как пользоваться

  1. Выберите микроконтроллер. В списке 168 устройств ATmega, ATtiny и AT90 с классическим ядром — все, что есть в паках описаний Microchip.
  2. Меняйте биты флажками и выпадающими списками или впишите байт целиком — например, прочитанный из МК. Флажок стоит у запрограммированного бита (0).
  3. Справа — получившиеся байты, команда avrdude для выбранного программатора и предупреждения. Кнопка «Заводские значения» возвращает фьюзы с завода.

Настройки сохраняются в адресе страницы: ссылкой можно поделиться, и у получателя откроются те же фьюзы.

Как устроены фьюзы

У большинства ATmega три фьюз-байта: low (lfuse), high (hfuse) и extended (efuse), у ATmega8, ATmega16 и ATtiny13 — два, у самых маленьких ATtiny — один. Логика инверсная: запрограммированный бит читается как 0, незапрограммированный — как 1.

Что важно знать до записи (по даташитам ATmega328P, ATmega8 и ATtiny85):

  • Стирание кристалла фьюзы не меняет. Команда chip erase (avrdude -e) очищает флеш, EEPROM и lock-биты, а фьюзы остаются прежними.
  • Новые значения вступают в силу после выхода из режима программирования. Фьюзы защёлкиваются при входе в него и при включении питания; исключение — EESAVE, он действует сразу.
  • Lock-бит LB1 блокирует и фьюзы. Поэтому сначала записывают фьюзы, потом lock-байт.
  • Неиспользуемые биты читаются как 1. У ATmega328P в extended-байте заняты только три младших бита, остальные калькулятор оставляет единицами.

Тактирование: CKSEL, SUT и CKDIV8

Биты CKSEL выбирают источник тактовой частоты, SUT — задержку запуска после включения и выхода из сна. В калькуляторе они объединены в один список, как в описании Microchip.

ATmega328P и ATtiny85 приходят с завода с внутренним RC-генератором 8 МГц и запрограммированным CKDIV8, поэтому работают на 1 МГц (low-фьюз 0x62). ATmega8 и ATmega16 настроены на внутренний генератор 1 МГц (0xE1). Задержка запуска на заводе выбрана самая долгая.

Чтобы перейти на кварц, выберите режим кварцевого генератора с подходящим диапазоном частот. Для ATmega328P с кварцем 16 МГц это 0xFF — как у Arduino Uno. У ATmega8, ATmega16, ATmega32 есть отдельный бит CKOPT: без него генератор работает с малым размахом, и у ATmega8 кварц допускается только до 8 МГц, а для 16 МГц CKOPT программируют — у Arduino NG на ATmega8 стоят фьюзы 0xDF и 0xCA.

Самый частый способ «запереть» МК — выбрать внешний тактовый сигнал (External Clock) вместо кварца. Тогда без генератора на входе XTAL1 микроконтроллер не запускается и не отвечает программатору. Помогает подать на XTAL1 тактовый сигнал от генератора или другого МК и переписать фьюзы.

Бит CKOUT выводит тактовую частоту на отдельную ножку (у ATmega328P — PB0), чтобы её можно было измерить или раздать другим микросхемам.

Загрузчик: BOOTSZ и BOOTRST

У ATmega с загрузчиком биты BOOTSZ задают размер загрузочной области в конце флеш-памяти, а запрограммированный BOOTRST переносит вектор сброса в её начало: после сброса стартует загрузчик, а не программа. Размер указывается в словах (слово = 2 байта); калькулятор показывает и адрес начала области — тоже в словах, как в даташите.

У Arduino Uno загрузчик Optiboot стоит в области на 256 слов: high-фьюз 0xDE означает BOOTSZ = 11 и запрограммированный BOOTRST. На заводе у ATmega328P выбран самый большой размер области — 2048 слов, а BOOTRST не запрограммирован.

Детектор пониженного питания: BODLEVEL

BOD сбрасывает микроконтроллер, когда напряжение питания падает ниже порога, и не даёт ему работать в зоне, где возможны сбои и порча EEPROM. У ATmega328P порог выбирается из 1,8, 2,7 и 4,3 В, на заводе детектор выключен. У ATmega8 два бита: BODEN включает детектор, BODLEVEL выбирает порог 2,7 или 4,0 В. Порог выбирают ниже рабочего напряжения, но выше минимального для выбранной частоты.

Опасные фьюзы

ФьюзЧто происходитКак вернуть
RSTDISBL = 0RESET становится обычной линией порта, ISP и debugWIRE не работаюттолько высоковольтным программатором
DWEN = 0вывод RESET занимает debugWIRE, ISP не работаетотладчиком с debugWIRE или высоковольтным программатором
SPIEN = 1ISP выключенчерез ISP этот бит не записывается, только высоковольтным программатором
External Clockбез внешнего генератора МК не запускаетсяподать тактовый сигнал на XTAL1
CKDIV8, генератор 128 кГцМК работает, но программатор слишком быстрзамедлить программатор: avrdude -B

SPIEN через ISP изменить нельзя: по даташиту этот бит недоступен в режиме последовательного программирования, и случайно выключить ISP через USBasp не получится — avrdude лишь сообщит о расхождении при проверке. А вот RSTDISBL записывается через ISP, и после этого вернуть доступ можно только высоковольтным программированием: параллельным (HVPP) у ATmega в 28-выводных и больших корпусах, последовательным (HVSP) у восьми- и четырнадцативыводных ATtiny.

Частота SCK программатора должна быть меньше четверти тактовой частоты МК, а от 12 МГц — меньше шестой части. Заводской ATmega328P работает на 1 МГц, поэтому SCK должен быть ниже 250 кГц; у USBasp и avrdude скорость задаёт опция -B.

Lock-биты

Lock-байт защищает память. Биты LB запрещают программатору запись (режим 2) или запись и чтение (режим 3) флеш-памяти и EEPROM. Биты BLB0 и BLB1 ограничивают команды LPM и SPM для области приложения и загрузочной области — так загрузчик защищают от перезаписи самой программой. Arduino Uno после записи загрузчика ставит lock-байт 0x0F: BLB1 = 00 — программа не может записывать загрузочную область командой SPM и читать её командой LPM из области приложения. Снимаются lock-биты только полным стиранием кристалла вместе с программой.

Команда avrdude

Калькулятор составляет команду записи всех фьюз-байтов в режиме m (значения в командной строке):

avrdude -c usbasp -p m328p -U lfuse:w:0xff:m -U hfuse:w:0xde:m -U efuse:w:0xfd:m

Опция -c задаёт программатор, -p — микроконтроллер по обозначению avrdude (m328p, t13a, t85). Для однобайтовых ATtiny память называется fuse, для lock-байта — lock. Прочитать фьюзы перед изменением: -U lfuse:r:-:h — байт выводится на экран. Если программатор не видит МК с низкой тактовой частотой, добавьте -B 32 (период SCK 32 мкс).

Откуда данные

Назначение битов, списки значений, заводские фьюзы и сигнатуры взяты из файлов описания устройств (ATDF), которые Microchip выпускает для своих сред разработки: пак ATmega_DFP 3.6.299 и ATtiny_DFP 3.4.278, лицензия Apache-2.0. Заводские значения сверены с даташитами ATmega8, ATmega16, ATmega128, ATmega328P, ATmega2560, ATtiny13A, ATtiny85 и ATtiny2313. Обозначения МК для avrdude — по файлу avrdude.conf.in. Описания значений переведены с английского; если перевод вызывает сомнение, сверьтесь с таблицей фьюзов в даташите своего МК.

Новые серии с ядром AVR8X — megaAVR 0 (ATmega4809), tinyAVR 0/1/2 (ATtiny1614 и другие), AVR Dx — устроены иначе: у них другой набор фьюз-регистров, а программируются они через UPDI. Их в калькуляторе пока нет.

Частые вопросы

Почему запрограммированный фьюз — это 0?

Так устроена энергонезависимая память AVR: стёртая ячейка читается как 1, запрограммированная — как 0. Поэтому «включить» SPIEN или CKDIV8 значит записать в бит ноль, а байт 0xFF означает, что не запрограммировано ничего. В калькуляторе флажок стоит у запрограммированного бита.

Какие фьюзы у Arduino Uno?

В файле boards.txt ядра Arduino для Uno указаны low 0xFF, high 0xDE и extended 0xFD: кварц от 8 МГц с самым долгим запуском, загрузчик на 256 слов со стартом с него (BOOTRST) и детектор питания на 2,7 В. Lock-байт 0x0F запрещает программе перезаписывать загрузочную область.

Как перевести ATmega328P с внутреннего генератора на кварц 16 МГц?

Запишите low-фьюз 0xFF: CKSEL = 1111 выбирает кварцевый генератор для частот от 8 МГц, SUT = 11 даёт самую долгую задержку запуска, CKDIV8 снят. Перед записью кварц и конденсаторы уже должны стоять на XTAL1 и XTAL2, иначе МК не запустится и не ответит программатору.

МК перестал отвечать программатору после записи фьюзов. Что делать?

Если выбран внешний тактовый сигнал или кварц, которого нет на плате, подайте на XTAL1 сигнал от генератора и перепишите фьюзы. Если частота стала низкой (CKDIV8, генератор 128 кГц), замедлите программатор опцией avrdude -B, например -B 32. После RSTDISBL, DWEN или записи SPIEN = 1 высоковольтным программатором нужен высоковольтный программатор (HVPP или HVSP).

Как прочитать фьюзы командой avrdude?

Команда avrdude -c usbasp -p m328p -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h выводит байты на экран в шестнадцатеричном виде. Прочитанные значения можно ввести в калькулятор и посмотреть расшифровку каждого бита.

Сотрёт ли команда avrdude -e фьюзы?

Нет. Полное стирание кристалла очищает флеш, EEPROM (если не запрограммирован EESAVE) и lock-биты, а фьюзы не трогает — это прямо сказано в даташитах. Поэтому защиту памяти снимают стиранием, а неудачные фьюзы — только перезаписью.

Источники

  1. Microchip. ATmega Series Device Support (ATmega_DFP) 3.6.299, файлы описания устройств atdf — фьюзы и lock-биты, назначение битов, заводские значения, сигнатуры; лицензия Apache-2.0
  2. Microchip. ATtiny Series Device Support (ATtiny_DFP) 3.4.278 — то же для ATtiny; лицензия Apache-2.0
  3. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B), раздел 28 Memory Programming — таблицы 28-5…28-9: фьюзы и значения по умолчанию, SPIEN недоступен при последовательном программировании
  4. Atmel. ATmega8(L) datasheet, 2486AA–AVR–02/2013 — Crystal Oscillator: фьюз CKOPT; таблицы 87 и 88 — фьюзы и значения по умолчанию
  5. Atmel. ATtiny25/45/85 datasheet, 2586Q–AVR–08/2013 — раздел 20: фьюзы, после RSTDISBL и DWEN — только высоковольтное программирование; частота SCK
  6. Atmel. Даташиты ATmega16 (2466T–AVR–07/10), ATmega128 (2467X–AVR–06/11), ATmega640/1280/1281/2560/2561 (2549Q–AVR–02/2014), ATtiny2313 (2543M–AVR–10/16); Microchip. ATtiny13A (DS40002307A) — таблицы фьюзов: заводские значения, по которым проверены данные калькулятора
  7. AVRDUDE — руководство (avrdude.1) — опции -U (форматы m и h), -B, -e; avrdude.conf.in — обозначения МК
  8. Arduino. ArduinoCore-avr, boards.txt — фьюзы и lock-байт загрузчика Arduino Uno, Nano и NG
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/avr-fuses/" title="Калькулятор фьюзов AVR" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/avr-fuses/">Калькулятор фьюзов AVR</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено . Нашли ошибку в расчёте? Напишите нам.