Фьюзы микроконтроллеров AVR – как и с чем их едят
Что же такое FUSE биты? Слова вроде бы знакомые, но многие толком и не знают их предназначение, ставят галочки и прошивают, работает устройство да и ладно. Я вам хочу рассказать немного про эти FUSE биты. FUSE биты (фьюзы) – ну если по простому, то они настраивают определенные параметры микроконтроллеров, это некий инструмент для их тонкой настройки Фьюзы включают или настраивают такие параметры как:
— частота генератора, внешний или внутренний генератор
— запрет на чтение прошивки микроконтроллера
— включение или выключение таймеров
— деление частоты кварцевого генератора
— защита EEPROOM от стирания
…и так далее. У каждого микроконтроллера выставляются свои фьюзы, у разных микроконтроллеров разный список фьюзов, например в ATmega8 нет фьюза CKOUT, но он присутствует в ATtiny2313. В даташитах к микроконтроллерам все эти фьюзы расписаны. Главное правило при работе с фьюзами – не торопиться их выставлять, если вы точно не уверены в правильности своих действий. Теперь распишем названия некоторых фьюзов, их обозначения и то, на что они влияют. Вообще, есть фьюзы для защиты программы от копирования (лок-биты), фьюзы, устанавливающие определенные функции, а так же так называемые «старшие» и «младшие» байты. Самый популярный фьюз, который выставляется практически всегда, это: CKSEL , таких фьюзов с разными буквами всего четыре, это группа CKSEL 0, CKSEL 1, CKSEL 2 и CKSEL 3 , определяют частоту тактового генератора, и его тип, тактовые импульсы необходимы для работы практически любого микроконтроллера. Во многих микроконтроллерах есть внутренний генератор, но мы можем подключить внешний и фьюзы выставить для работы от внешнего генератора. Внешний кварцевый резонатор подключается на выводы XTAL 1 и XTAL 2 , кроме того припаивается пара конденсаторов ~20пф одним концом на кварц, другим на минус. Если допустить ошибку при установке этих фьюзов, то микроконтроллер может «заблокироваться» для того чтобы восстановить контроллер, подают тактовый сигнал на ногу XTAL1, на данный момент придумано не мало схем для восстановления контроллеров, залоченных таким образом. Этот генератор можно сделать практически из любой логики или даже из таймера 555.
Есть простые схемы, с использованием 1 транзистора, пары резисторов и кварцевого резонатора, и более сложные, на микросхемах типа К155ЛА3. Данные способы 100% оживляют контроллеры с таким дефектом Группа фьюзов SUT1 и SUT0 — fuse биты, управляющие режимом запуска тактовых генераторов МК, а так же задают скорость старта МК после подачи питания. Связаны с фьюзами CKSEL, а именно CKSEL0. CKOPT — бит, определяет работу встроенного генератора для работы с кварцевыми резонаторами, устанавливает «амплитуду» колебаний тактового сигнала на кварце. Данный бит программируется достаточно часто. RSTDISBL – очень опасный фьюз, ошибочная установка может отключить вывод RESET, после чего пропадет возможность программирования ISP программатором. Бит RSTDISBL превращает вывод RESET в порт ввода-вывода. SPIEN – фьюз, который разрешает работу МК по интерфейсу SPI. Все микроконтроллеры выпускаются с уже установленным битом SPIEN. Считается опасным фьюзом. EESAVE — Удобно читать как EEPROOM SAVE, дословно означает «сохранить EEPROOM», данный фьюз защищает EEPROM от стирания. Например когда в очередной раз заливаете прошивку в контроллер, можно поставить EESAVE = 0, и при стирании МК EEPROOM останется не тронутым. BOOTSZ , состоит из группы битов BOOTSZ1 и BOOTSZ0, определяют размер области памяти записываемых программ, связан с битом BOOTRST. BOOTRST, определяет адрес, с которого и будет начато исполнение программы. Если бит установлен т.е. если BOOTRST = 0, то начало программы будет с адреса области загрузчика (Boot Loader). BODEN — бит, который при выставлении (BODEN=0), будет контролировать за питающим напряжением, на предельно низких напряжениях микроконтроллер может перезапускаться, глючить и так далее. Связан с BODLEVEL. BODLEVEL . — определяет момент срабатывания детектора уровня питающего напряжения, при снижении напряжения питания ниже уровня, произойдет «перезагрузка» контроллера. SELFPRGEN — бит, который разрешает (SELFPRGEN=0) или запрещает (SELFPRGEN =1) программе производить запись в память. OCDEN – данный фьюз разрешает или запрещает чтение программы из памяти контроллера. Я как то упоминал в своих статьях про то, что в некоторых программах фьюзы выставляются зеркально. Запомните, запрограммированный фьюз=0 , а не запрограммированный=1. В программах Algorithm Builder, UniProf фьюзы выставляются одним образом, а в программах PonyProg, CodeVisionAVR, AVR Studio, SinaProg и некоторых других, фьюзы нужно выставлять зеркально по сравнению с предыдущим списком программ. Уже давно на просторах Интернета появились так называемые «калькуляторы фьюзов», это специальные приложения, призванные помочь в конфигурировании микроконтроллера. Приложение интуитивно понятное, думаю разберетесь, в списке контроллеров выбираем нужный нам МК, далее выбираем необходимые функции, а ниже выставляются галочки фьюзов, все очень просто.
Данные приложения очень удобны, т.к. например в последнее время очень часто авторы своих проектов значения фьюзов пишут непонятными буквами или цифрами, или же словами, новичку не понятно, что это значит и какие фьюзы при этом нужно выставлять, (часто можно встретить комментарий к статье «а какие фьюзы выставлять?»). Калькулятор фьюзов нам в этом плане очень сильно помогает.
Думаю что теперь, если у вас спросят «что такое фьюзы, и зачем они нужны?», вы сможете объяснить человеку их назначение, а пока, на этом все!
Теги:
Романов. А.С.
Опубликована: 2012 г.
0
3
Вознаградить Я собрал 0 1
Оценить статью
- Техническая грамотность
Оценить Сбросить
Средний балл статьи: 5 Проголосовало: 1 чел.
Биты защиты. Разбираем способы защиты микроконтроллеров

Если ты занимался микроконтроллерами, то, конечно, слышал о битах конфигурации. Для разных семейств они называются по‑разному: в AVR это фьюзы, а в PIC — конфигурационное слово. Сегодня мы разберемся с ними поподробнее, а еще рассмотрим их применение для защиты прошивки в контроллере. И это не был бы «Хакер», если бы мы не показали способы обхода такой защиты. Поехали!
info
Рекомендую ознакомиться с моей прошлой статьей, в которой более подробно описаны микроконтроллеры, о которых говорится ниже.
AVR
В семействе AVR для настройки применяются фьюзы. Фьюзы (от англ. fuse — предохранитель) — это особые биты в микроконтроллере, которые, как и все биты, хранят информацию. Их основные особенности следующие:
- они хранятся и прошиваются отдельно от остальной памяти;
- изменяются только извне;
- управляют работой микроконтроллера на самом низком уровне.
Лучше всего их можно объяснить на примере дозиметра РКСБ-104.

Основная настройка его выполнялась одним переключателем на передней панели. А вот более тонкие настройки требовали снять защитную крышку с задней стенки и воспользоваться маленькими переключателями (белые посередине).

В AVR эти биты для удобства соединяются в байты: старший, младший, защитный и дополнительный. К каждому биту можно получить доступ по принципу байт → бит. Младший байт обычно отвечает за тактирование, а старший — за плюшки. Биты отличаются от чипа к чипу, поэтому с каждым чипом в идеале стоит разбираться отдельно с помощью документации.
Значение битов в этом семействе инвертировано: 1 значит, что бит стерт, а 0 — что установлен. Но вот программы для прошивки МК работают по‑разному. Для разных программ нужно уточнять логику работы с фьюзами.
Что могут фьюзы в этом семействе МК:
- управление тактированием (частота генератора, внешний или внутренний генератор);
- разрешение на чтение прошивки микроконтроллера (самое интересное, но об этом позже);
- управление таймерами;
- защита EEPROM;
- более специфичные функции, их надо уточнять к конкретному чипу.
Самые «популярные» биты:
- CKSEL — их четыре, и они отвечают за тактирование;
- SUT — их два, и они управляют режимом запуска тактирования;
- CKOPT — конфигурирует внутренний генератор;
- RSTDISBL — режим работы ножки RESET МК;
- SPIEN — разрешение SPI;
- EESAVE — защита EEPROM;
- BOOTRST — адрес, откуда начать исполнять код;
- BODEN — контроль питания;
- SELFPRGEN — разрешение записи в память изнутри;
- OCDEN — вот он, бит, разрешающий чтение прошивки.
Считывают фьюзы обычно не вручную, а с помощью специальных калькуляторов. Вот один из них — Fusecalc.
Софт
warning
При работе с фьюзами будь предельно внимателен. Неправильно выставленный бит может превратить чип в «кирпич». Перед прошивкой уточняй логику работы с фьюзами в твоей программе.
Linux
Я обычно работал с программой avrdude. Приведу пару команд без дополнительных параметров (чип, программатор). Считывание прошивки из чипа в файл:
$ avrdude -U flash: r: flash_ dump. hex: i
Считывание энергонезависимой памяти в файл:
$ avrdude -U eeprom: r: eeprom_ dump. raw: r
Запись прошивки из файла в чип:
$ avrdude -U flash: w: flash_ dump. hex
Запись энергонезависимой памяти из файла:
$ avrdude -U eeprom: w: eeprom_ dump. raw
Запись фьюзов ( 0xc3 -> lfuse ; 0x99 -> hfuse ):
$ avrdude -U lfuse: w: 0xc3: m -U hfuse: w: 0x99: m
Чтение фьюзов в файлы:
$ avrdude -U hfuse: r: hfuse. txt: h -U lfuse: r: lfuse. txt: h
Есть дополнительные параметры -с и -p . Первый отвечает за программатор, а второй — за чип. В качестве примера — команда для прошивки контроллера ATmega328p с помощью USBASP:
$ avrdude -U flash: w: flash_ dump. hex -c usbasp -p m328p
В командах есть странные строки вида flash: w: flash_dump. hex . Это строки в специальном формате для avrdude . Для чего такое решение — не знаю ни я, ни кто‑либо еще.
Части этих строк разделены двоеточиями:
- первая часть — область памяти в МК (например, flash или lfuse );
- вторая — направление ( w — write или r — read);
- третья — файл на локальном устройстве (например, файл с прошивкой);
- последняя (опциональная) — формат файла (например, r — raw или i — ihex, интеловский шестнадцатеричный).
Более специфичные случаи применения этой строки выходят за рамки данной статьи.
Windows
Оконщики обычно пользуются программами с GUI. Например, AvrDude GUI.

Первая вкладка предназначена для загрузки прошивки. Мы видим и можем выбрать целевое устройство, формат файлов прошивки и пути к самим файлам. Один предназначен для программы, другой — для энергонезависимой памяти.

Вторая вкладка конфигурирует программатор: какая используется модель и на каком порте она сидит.

Вкладка управления защитными битами.

А вот наконец и фьюзы. Задаются они как байты.
Как видишь, все просто, и использовать фьюзы можно, даже не открывая терминал!
info
На Arduino можно конфигурировать МК, не задумываясь о работе фьюзов. Этим занимается Arduino IDE в автоматическом режиме.
STM
В семействе STM для задания конфигурации используются биты в специальных регистрах. Информацию об этих регистрах и их назначении ищи в документации. Менять значения этих регистров можно и нужно на ходу, но, в отличие от AVR, конфигурируется тут не только самое низкоуровневое (тактирование, например), но и всякая мелкая периферия.
Настраивать надо много, даже если проект в духе Hello world, поэтому обычно это делается не ручной записью регистров, а с помощью красивого и мощного софта.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Начинающим О Фьюзах (Fuse Bits)
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.
Поделиться
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
- Ответов 374
- Создана 14 г
- Последний ответ 30 июль
Топ авторов темы
Популярные посты
Berg
не не, ATMega328, ATMega168, ATMega88 и ряд других «мег» имеет CLKDIV8 (Divide clock by 8) , при чем установленный по умолчанию.
Zheka
Что же такое FUSE биты? Слова вроде бы знакомые, но многие толком и не знают их предназначение, ставят галочки и прошивают, работает устройство да и ладно. Я вам хочу рассказать немного про эти FUSE б
Jozik
можешь собрать сам генератор.. или просто к программатору кварц прицепи. если сам паял «программка» в каком смысле? там на ножку должны приходить импульсы. разьве только на другом мк напиши себе г
Изображения в теме
Сообщения
А вы уверены что это были автоматы, а не рубильники?
![]()
Можно не на фоне монитора фото?
![]()
Почему на 3 такой шум? С6 смотрите.
![]()
Хотя звучит неплохо. Ну, хорошо. Согласен. Уговорил. А какая самая «прямая» из выходных? Вообще-то все они «кривые». Ну, то такое.
Малина, это одноплатный компьютер Raspberry )))) Он запитан через эту плату, и я думал, что задержка будет начинать отсчет после размыкания контактов переключателя. Тут же она стартует сразу, но пока переключатель замкнут не отключает реле пока контакт замкнут
Про Ардуино и не только

Сегодня я хочу рассказать о том, что такое фьюзы, за что они отвечают и как их можно прочитать и записать в Ардуино. Рекомендую также заглянуть в предыдущую публикацию, т.к. работа с фьюзами возможна только через программатор.
Фьюзы (от английского Fuse bits) — это конфигурационные биты микроконтроллера, отвечающие за его предварительную настройку. Эти биты расположены в отдельном адресном пространстве, доступном только при программировании. Биты объединяются в конфигурационные байты и их состав зависит от конкретной модели микроконтроллера.
При работе с конфигурационными битами нужно помнить один важный момент: если бит содержит логическую единицу, то это означает что он не запрограммирован, соответственно, запрограммированный конфигурационный бит содержит логический ноль. Такая логика основана на принципе хранения данных в EEPROM: чистая микросхема памяти содержит во всех ячейках единицы, а термин запрограммирована по отношению к такой ячейке означает, что в нее записали ноль.
Фьюзы ATmega328 / ATmega328p
Микроконтроллеры ATmega328 и ATmega328p, на базе которых построено большинство плат семейства Ардуино, имеют 3 байта конфигурации: младший, старший и дополнительный. Их описание приведено ниже в таблицах.
Младший конфигурационный байт ATmega328/P
| Номер бита | Навание | Описание | Значение по умолчанию |
|---|---|---|---|
| 7 | CKDIV8 | Divide clock by 8 | 0 (запрограммирован) |
| 6 | CKOUT | Clock output | 1 (не запрограммирован) |
| 5 | SUT1 | Select start-up time | 1 (не запрограммирован) |
| 4 | SUT0 | Select start-up time | 0 (запрограммирован) |
| 3 | CKSEL3 | Select Clock source | 0 (запрограммирован) |
| 2 | CKSEL2 | Select Clock source | 0 (запрограммирован) |
| 1 | CKSEL1 | Select Clock source | 1 (не запрограммирован) |
| 0 | CKSEL0 | Select Clock source | 0 (запрограммирован) |
Старший конфигурационный байт ATmega328/P
| Номер бита | Навание | Описание | Значение по умолчанию |
|---|---|---|---|
| 7 | RSTDISBL | External Reset Disable | 1 (не запрограммирован) |
| 6 | DWEN | debugWIRE Enable | 1 (не запрограммирован) |
| 5 | SPIEN | Enable Serial Program and Data Downloading | 0 (запрограммирован) |
| 4 | WDTON | Watchdog Timer Always On | 1 (не запрограммирован) |
| 3 | EESAVE | EEPROM memory is preserved through the Chip Erase | 1 (не запрограммирован) |
| 2 | BOOTSZ1 | Select Boot Size | 0 (запрограммирован) |
| 1 | BOOTSZ0 | Select Boot Size | 0 (запрограммирован) |
| 0 | BOOTRST | Select Reset Vector | 0 (запрограммирован) |
Дополнительный конфигурационный байт ATmega328/P
| Номер бита | Навание | Описание | Значение по умолчанию |
|---|---|---|---|
| 7 | — | — | 1 |
| 6 | — | — | 1 |
| 5 | — | — | 1 |
| 4 | — | — | 1 |
| 3 | — | — | 1 |
| 2 | BODLEVEL2 | Brown-out Detector trigger level | 1 (не запрограммирован) |
| 1 | BODLEVEL1 | Brown-out Detector trigger level | 1 (не запрограммирован) |
| 0 | BODLEVEL0 | Brown-out Detector trigger level | 1 (не запрограммирован) |
Таким образом, значения конфигурационных байтов в ATmega328/P по умолчанию: Low: 0x62, High: 0xD9, Extended: 0xFF. Обратите внимание, это значения именно для «чистого» микроконтроллера ATmega328/P , а не для Ардуино. Значения фьюзов для Ардуино можно найти в файле Arduino_dir\hardware\arduino\avr\Boards.txt, где Arduino_dir — это путь к IDE Arduino. Откройте файл в текстовом редакторе и найдите интересующую плату по названию, чуть ниже будет информация о фьюзах:
uno.name=Arduino/Genuino Uno
.
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0x05
Для расшифровки шестнадцатеричных значений конфигурационных байтов удобно использовать онлайн калькулятор Engbedded Atmel AVR® Fuse Calculator:

Выберите модель микроконтроллера и введите значения фьюзов в соответствующие поля внизу страницы в разделе Current settings — введенные значения будут моментально расшифрованы и представлены в удобном виде. И, наоборот, можно изменить конфигурацию битов в разделах Manual fuse bits configuration и Feature configuration и получить значения конфигурационных байтов для записи в микроконтроллер.
Рассмотрим назначение конфигурационных битов более подробно.
CKDIV8
Данный бит отвечает за деление тактовой частоты на 8. Он определяет начальное значение регистра делителя частоты: если бит не запрограммирован, то регистр делителя будет сброшен в «0000»; если бит CKDIV8 запрограммирован, то в регистре будет установлено значение «0011», что обеспечит деление тактовой частоты на 8. Однако вне зависимости от значения фьюза CKDIV8 значение делителя может быть изменено программой в любой момент.
CKOUT
ATmega328/p позволяет выводить тактовую частоту на цифровой вывод CLKO (digital pin 8 на Ардуино Уно). Для этого конфигурационный бит CKOUT должен быть запрограммирован. Данная функция может быть полезна при использовании таковой частоты микроконтроллера внешними устройствами. При использовании делителя системной частоты на вывод CLKO также будет поступать пониженная частота.
SUT
Конфигурационные биты SUT совместно с битами CKSEL определяют длительность задержки при старте микроконтроллера. Задержка необходима для того, чтобы источник тактовой частоты стабилизировался после подачи питания и вошел в свой рабочий режим. Величина задержки зависит от выбранного источника и составляет от 0 до 65мс. Конкретные значения можно найти в даташите.
CKSEL
Современные микроконтроллеры способны работать с различными источниками тактового сигнала. Выбор источника осуществляется установкой конфигурационных битов CKSEL. В таблице ниже приведены источники тактового сигнала, поддерживаемые микроконтроллерами ATmega328 / ATmega328P, и соответствующие им значения CKSEL.
| Источник тактового сигнала | Значение CKSEL3..0 |
|---|---|
| Экономичный кварцевый генератор | 1111-1000 |
| Кварцевый генератор | 0111-0110 |
| Низкочастотный кварцевый генератор | 0101-0100 |
| Внутренний RC-генератор на 128кГц | 0011 |
| Внутренний калиброванный RC-генератор | 0010 |
| Внешний сигнал синхронизации | 0000 |
| Зарезервировано | 0001 |
RSTDISBL
Фьюз RSTDISBL управляет работой цифрового вывода микроконтроллера, совмещенного с входом внешнего сброса. Если RSTDISBL запрограммирован, то вывод может быть использован как обычный цифровой пин ввода/вывода. Если фьюз RSTDISBL не запрограммирован, то вывод используется для внешнего сигнала сброса: низкий уровень напряжения на нем приводит к генерации сигнала сброса микроконтроллера. Отключение внешнего сброса может быть оправдано при работе с микроконтроллерами, имеющими небольшое количество выводов, в других случаях лучше не трогать этот фьюз.
DWEN
Бит DWEN разрешает/запрещает работу отладочного интерфейса debugWire.
SPIEN
Данный бит разрешает/запрещает программирование по интерфейсу SPI. По умолчанию он запрограммирован и лучше не менять значение данного фьюза, как и значение RSTDISBL.
WDTON
Если запрограммировать конфигурационный бит WDTON, то сторожевой таймер начнет свою работу сразу после подачи питания на микроконтроллер. Работу таймера нельзя будет запретить программно и при его переполнении будет генерироваться сигнал сброса. Если данный фьюз не запрограммирован, то работой сторожевого таймера можно управлять программно, в том числе настроить его на генерацию прерывания, сигнала сброса или того и другого.
EESAVE
Данный бит определяет влияние команды «Стирание кристалла» на EEPROM-память: если бит запрограммирован, то при выполнении команды Chip Erase будут очищены Flash, SRAM и Lock-биты, а содержимое EEPROM затронуто не будет. В противном случае содержимое EEPROM также будет стерто.
BOOTSZ
Конфигурационные биты BOOTSZ определяют размер FLASH памяти микроконтроллера, резервируемой для загрузчика. Значения битов BOOTSZ и соответствующие им размеры указаны в таблице ниже. По умолчанию резервируется максимальный размер — 2048 слов.
| Начало секции загрузчика | Размер секции (слов) | Значение BOOTSZ1..0 |
|---|---|---|
| 0x3F00 | 256 | 11 |
| 0x3E00 | 512 | 10 |
| 0x3C00 | 1024 | 01 |
| 0x3800 | 2048 | 00 |
BOOTRST
Определяет положение вектора сброса. Если бит не запрограммирован, то вектор сброса располагается по адресу 0x0000, выполнение программы начнется именно с этого адреса. Если бит BOOTRST запрограммирован, то выполнение программы начнется с адреса начала секции загрузчика.
BODLEVEL
Конфигурационные биты BODLEVEL определяют порог срабатывания схемы BOD (Brown-Out Detection), которая отслеживает уровень напряжения источника питания. Если работа схемы BOD разрешена, то при снижении напряжения питания ниже установленного порога она переводит микроконтроллер в состояние сброса. Когда напряжение питания вновь увеличивается до порогового значения (данный порог чуть выше предыдущего за счет наличия гистерезиса), сигнал сброса снимается и происходит запуск микроконтроллера. Комбинации битов BODLEVEL и соответствующие им пороговые значения приведены в таблице:
| Порог срабатывания схемы BOD (В) | Значение BODLEVEL2..0 |
|---|---|
| Схема BOD выключена | 111 |
| Vcc = 1.8 | 110 |
| Vcc = 2.7 | 101 |
| Vcc = 4.3 | 100 |
Теперь можно понять начальное состояние микроконтроллеров ATmega328/P, в каком они поставляются с завода: микроконтроллер сконфигурирован на работу с внутренним RC генератором на 8МГц, при этом прошитый бит CKDIV8 обеспечивает деление частоты генератора на 8; внешний сброс (по низкому уровню на выводе Reset) не запрещен; разрешено программирование по интерфейсу SPI; для загрузчика отведена область памяти 2048 слов; стартовый адрес программы 0x0000; схема контроля питания отключена.
В Ардуино Уно фьюзы микроконтроллера изменены таким образом, чтобы он был настроен на работу с экономичным кварцевым генератором без делителя частоты; для загрузчика отводится 256 слов; прошитый бит BOOTRST назначает стартовым адресом адрес начала секции загрузчика; порог срабатывания схемы BOD составляет 2.7В.
Разобравшись с назначением фьюзов можно перейти от теории к практике: попробуем прочитать и записать фьюзы Ардуино.
Чтение фьюзов Ардуино
В предыдущей публикации я рассказал о том, как превратить Ардуино в ISP программатор. И сейчас он нам пригодится для работы с фьюзами. Поэтому готовим программатор и подключаем к нему плату, из которой будем считывать фьюзы.
В среде разработки Ардуино нет инструментов для чтения/записи фьюзов. Разве что процедура записи загрузчика включает в себя установку фьюзов, значения которых берутся из упомянутого ранее файла Boards.txt. Но в состав IDE входит программа Avrdude, предназначенная для прошивки AVR микроконтроллеров, ей-то мы и воспользуемся. Avrdude — консольная программа, работать мы с ней будем через командную строку, поэтому запускаем проводник и переходим в папку с программой. У меня IDE Arduino расположена на диске D и путь к Avrdude выглядит следующим образом: D:\Arduino\arduino-1.6.12\hardware\tools\avr\bin.

Находясь в этой папке нужно поместить курсор в адресную строку, удалить из нее путь, ввести cmd и нажать Enter. Откроется окно интерпретатора командной строки:

После этого подключаем программатор к компьютеру и вводим в командной строке следующую команду:
avrdude -C ../etc/avrdude.conf -c arduino -p m328p -P com26 -b 19200 -U lfuse:r:-:h
- -c — в качестве указываем псевдоним используемого программатора, в нашем случае arduino.
- -p — указывает тип микроконтроллера, m328p — это ATmega328p.
- -P — указывает используемый программатором порт.
- -b — позволяет переопределить указанную для программатора в конфигурации программы скорость подключения по интерфейсу RS-232.
- -U :r|w|v:[:format] — комплексная опция для указания производимой с памятью операции (чтение. запись, проверка). -U lfuse:r:-:h означает, что мы хотим прочитать содержимое младшего байта конфигурации, считанное значение выводим на экран в шестнадцатеричном виде.
Более подробную информацию о параметрах запусках avrdude можно найти по ссылке https://ph0en1x.net/77-avrdude-full-howto-samples-options-gui-linux.html
Ниже приведен мой результат выполнения данной команды:

Как видно из скриншота, младший конфигурационный байт моей Arduino Uno содержит значение 0xFF. Кроме запрошенного значения avrdude показал также значения всех трех конфигурационных байт. Это произошло потому, что мы не отключили safemode, это можно сделать, добавив в команду параметр -u. Остальные два конфигурационных байта также соответствуют значениям, приведенным в файле Boards.txt. Если у кого-то возникнут сомнения по поводу соответствия дополнительного конфигурационного байта, то загляните в его описание выше — биты с 3 по 7 не используются и содержат «1», поэтому вместо 0x05 мы считываем значение 0xFD.
Запись фьюзов Ардуино
Полагаю, из приведенного выше описания фьюзов должно быть понятно, что при работе с ними нужно быть очень осторожным. В противном случае вы рискуете «залочить» микроконтроллер, т.е. привести в такое состояние, когда его уже нельзя будет перепрограммировать (без дополнительного оборудования). Поэтому будьте внимательны, изменяя фьюзы микроконтроллера.
Давайте в качестве примера попробуем запретить работу схемы BOD в Ардуино Уно. Обратившись к приведенному выше описанию конфигурационных байтов или к онлайн калькулятору Engbedded Atmel AVR® Fuse Calculator, мы видим, что за работу схемы BOD в ATmega328/P отвечают фьюзы BODLEVEL и для ее запрета нужно записать в дополнительный конфигурационный байт значение 0xFF. Это можно сделать следующей командой avrdude:
avrdude -C ../etc/avrdude.conf -c arduino -p m328p -P com26 -b 19200 -U efuse:w:0xFF:m

Из скриншота видно, что avrdude сначала выполняет запись байта efuse, после чего производит контрольное считывание и сообщает об успешном выполнении операции.
В принципе нет ничего сложного в работе с конфигурационными битами. Главное быть внимательным при их изменении, чтобы не залочить микроконтроллер.