Фьюзы — несколько байтов энергонезависимой памяти, которые настраивают микроконтроллер до запуска программы: источник тактирования, загрузчик, детектор пониженного питания, доступность вывода RESET и программирования по ISP. Программа их не меняет, их записывает программатор. Ошибка в одном бите может «запереть» МК — поэтому перед записью полезно увидеть расшифровку каждого бита и предупреждения.
Как пользоваться
- Выберите микроконтроллер. В списке 168 устройств ATmega, ATtiny и AT90 с классическим ядром — все, что есть в паках описаний Microchip.
- Меняйте биты флажками и выпадающими списками или впишите байт целиком — например, прочитанный из МК. Флажок стоит у запрограммированного бита (0).
- Справа — получившиеся байты, команда 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 = 0 | RESET становится обычной линией порта, ISP и debugWIRE не работают | только высоковольтным программатором |
| DWEN = 0 | вывод RESET занимает debugWIRE, ISP не работает | отладчиком с debugWIRE или высоковольтным программатором |
| SPIEN = 1 | ISP выключен | через 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-биты, а фьюзы не трогает — это прямо сказано в даташитах. Поэтому защиту памяти снимают стиранием, а неудачные фьюзы — только перезаписью.
Источники
- Microchip. ATmega Series Device Support (ATmega_DFP) 3.6.299, файлы описания устройств atdf — фьюзы и lock-биты, назначение битов, заводские значения, сигнатуры; лицензия Apache-2.0
- Microchip. ATtiny Series Device Support (ATtiny_DFP) 3.4.278 — то же для ATtiny; лицензия Apache-2.0
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B), раздел 28 Memory Programming — таблицы 28-5…28-9: фьюзы и значения по умолчанию, SPIEN недоступен при последовательном программировании
- Atmel. ATmega8(L) datasheet, 2486AA–AVR–02/2013 — Crystal Oscillator: фьюз CKOPT; таблицы 87 и 88 — фьюзы и значения по умолчанию
- Atmel. ATtiny25/45/85 datasheet, 2586Q–AVR–08/2013 — раздел 20: фьюзы, после RSTDISBL и DWEN — только высоковольтное программирование; частота SCK
- 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) — таблицы фьюзов: заводские значения, по которым проверены данные калькулятора
- AVRDUDE — руководство (avrdude.1) — опции -U (форматы m и h), -B, -e; avrdude.conf.in — обозначения МК
- 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>Обновлено . Нашли ошибку в расчёте? Напишите нам.