Фьюзы AVR
Фьюзы — несколько байтов энергонезависимой конфигурации микроконтроллера AVR. Они хранятся отдельно от программы и задают то, что должно быть известно до её запуска: источник тактовой частоты, размер загрузчика, порог детектора питания, работу вывода сброса.
Обновлено Редакция GAW
Фьюзы (fuse bits) — биты энергонезависимой конфигурации микроконтроллеров AVR, которые хранятся отдельно от флеш-памяти программы. У ATmega328P их три байта: low, high и extended (в avrdude — lfuse, hfuse, efuse). Фьюзы определяют то, что должно быть задано до запуска программы и не может меняться ею самой. Стёртая ячейка читается как 1, поэтому запрограммированный, то есть включённый, бит — это 0, а 0xFF в байте фьюзов означает, что не включено ничего.
Что задают фьюзы ATmega328P
- CKSEL и SUT — источник тактовой частоты (внутренний RC-генератор, кварц, внешний сигнал) и задержку запуска.
- CKDIV8 — деление тактовой частоты на 8 после сброса; с завода включён, поэтому новый ATmega328P работает на 1 МГц.
- BOOTSZ и BOOTRST — размер загрузочной области и переход в неё после сброса.
- BODLEVEL — порог детектора пониженного питания.
- SPIEN, RSTDISBL, DWEN — последовательное программирование, вывод сброса и отладка debugWIRE.
Опасные биты
Неудачные фьюзы — частая причина «окирпиченного» микроконтроллера. Если выбран кварц, которого нет на плате, микроконтроллер не запустится, пока на XTAL1 не подать внешний тактовый сигнал. Если частота стала очень низкой, программатор нужно замедлить. А после записи RSTDISBL или DWEN вывод сброса перестаёт работать как сброс, и вернуть доступ можно только высоковольтным программатором. Перед записью фьюзы стоит проверить в калькуляторе фьюзов AVR, а при переходе на кварц убедиться, что на плате стоят кварц и конденсаторы с правильной нагрузочной ёмкостью.
Как прочитать и записать
Фьюзы читают и записывают программатором через ISP, например утилитой avrdude: ключи -U lfuse:r:-:h читают байт, -U lfuse:w:0xFF:m записывают. У новых серий tinyAVR 0/1/2 и megaAVR 0 фьюзы записываются через UPDI и называются иначе. Способы программирования AVR разобраны в статье о прошивке AVR.
Частые вопросы
Почему запрограммированный фьюз — это 0?
Так устроена энергонезависимая память AVR: стёртая ячейка читается как 1, запрограммированная — как 0. Поэтому «включить» SPIEN или CKDIV8 значит записать в бит ноль, а байт 0xFF означает, что не запрограммировано ничего.
Какие фьюзы у Arduino Uno?
В файле boards.txt ядра Arduino для Uno указаны low 0xFF, high 0xDE и extended 0xFD: кварц от 8 МГц с самым долгим запуском, загрузчик на 256 слов с переходом на него после сброса и детектор питания на 2,7 В.
Сотрёт ли полное стирание кристалла неудачные фьюзы?
Нет. Команда стирания очищает флеш-память, EEPROM (если не запрограммирован EESAVE) и lock-биты, а фьюзы не трогает. Неудачные фьюзы исправляют только перезаписью, а если отключены вывод сброса или последовательное программирование — высоковольтным программатором.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B), раздел 28 Memory Programming — таблицы 28-5…28-9: фьюзы и значения по умолчанию, SPIEN недоступен при последовательном программировании
- Atmel. ATtiny25/45/85 datasheet, 2586Q–AVR–08/2013 — раздел 20: после RSTDISBL и DWEN — только высоковольтное программирование
- Microchip. ATmega Series Device Support (ATmega_DFP) 3.6.299, файлы описания устройств atdf — назначение битов фьюзов и заводские значения
- Arduino. ArduinoCore-avr: boards.txt — фьюзы Arduino Uno: low 0xFF, high 0xDE, extended 0xFD
Нашли ошибку?