Что такое фьюзы в микроконтроллере

от admin

Все что нужно знать о Fuse- и Lock-битах AVR микроконтроллеров

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

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

Fuse- и Lock-биты

Перед тем как мы приступим к подробному разбору битов конфигурации, нужно уяснить и запомнить один момент:

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

Это один из основных источников возникающей путаницы в процессе программирования Fuse- и Lock-битов. Мы привыкли думать, что установить значение какого-либо параметра означает записать 1, верно? С Fuse-битами AVR – наоборот, установка какого-либо бита означает запись 0, и это нужно помнить.

Биты конфигурации расположены в отдельной области энергонезависимой памяти. К примеру, МК ATmega328P имеет четыре конфигурационных байта, которые необходимо запрограммировать для корректного функционирования. Один из этих байтов содержит биты блокировки, оставшиеся три (часто именуемые старший, младший и расширенный) – содержат конфигурационные биты. Этот набор битов устанавливает начальные настройки МК: источник тактового сигнала, область загрузчика, функционирование аппаратного сброса, сторожевого таймера и пр. Сначала мы рассмотрим биты блокировки (Рисунок 1).

Рисунок 1. Lock-биты микроконтроллеров AVR.

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

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

Младший байт конфигурации, расположение и наименование Fuse-битов микроконтроллера ATmega328P.

Младший байт конфигурации, расположение и наименование 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-битов будет обновляться автоматически.

Рисунок 3. В онлайн калькуляторе Fuse-битов МК AVR пользователь может самостоятельно выбирать необходимые опции.

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

Рисунок 4. При индивидуальной установке Fuse-битов значения байтов конфигурации обновляются автоматически.

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

Про Ардуино и не только

Что такое фьюзы

Сегодня я хочу рассказать о том, что такое фьюзы, за что они отвечают и как их можно прочитать и записать в Ардуино. Рекомендую также заглянуть в предыдущую публикацию, т.к. работа с фьюзами возможна только через программатор.

Фьюзы (от английского 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:

Engbedded Atmel AVR® Fuse Calculator

Выберите модель микроконтроллера и введите значения фьюзов в соответствующие поля внизу страницы в разделе Current settings — введенные значения будут моментально расшифрованы и представлены в удобном виде. И, наоборот, можно изменить конфигурацию битов в разделах Manual fuse bits configuration и Feature configuration и получить значения конфигурационных байтов для записи в микроконтроллер.

Рассмотрим назначение конфигурационных битов более подробно.

CKDIV8
CKOUT

Конфигурационные биты 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 не запрограммирован, то вывод используется для внешнего сигнала сброса: низкий уровень напряжения на нем приводит к генерации сигнала сброса микроконтроллера. Отключение внешнего сброса может быть оправдано при работе с микроконтроллерами, имеющими небольшое количество выводов, в других случаях лучше не трогать этот фьюз.

Фьюз (Fuse) биты микроконтроллеров

Фьюз (Fuses) биты микроконтроллера предназначены для настройки микроконтроллера на определенную работу . Включая или выключая те или иные биты, мы может тем самым менять настройки микроконтроллера. К примеру настроить в нутренний делитель, включить старожевой таймер и другие.

Но знать их необходимо, базовыми знаниями тут не обойтись.

Фьюз биты расположены в особой области памяти, изменить их можно только используя программатор в процессе прошивки. При помощи фьюз битов можно настроить следующие опции и режимы работы:

  • произвести выбор задающего генератора;
  • какой будет использоваться внутренний или внешний;
  • выключить возможность прошивки или чтения данных микронтроллера;
  • включить/выключить таймеры;
  • задать частоту генератора (деление частоты генератора);
  • защитить память EEPROOM от стирания;
  • и другие настройки.

У каждого микроконтроллера свои fuse-биты, как они называется и за что отвечают можно посмотреть в даташитах на микроконтроллер. Там все подробно расписано, перед тем как прошивать камень нужно знать какие биты выставлять нужно ознакомиться с документацией.
Настройка или установка этих битов осуществляется при помощи программатора.

Тут есть одна тонкость: Бит считается установленным если его значение равно нулю.

Этот момент нужно просто запомнить и привыкнуть, что если мы установили значение бита в ноль то значит мы его включили.Выставление битов при помощи программы AVRDUDE_PROG 3.3

Установка фьюз битов при помощи программы AVRDUDE_PROG 3.3
Фьюз биты микрокотроллеров AVR

CKSEL

Чаще всего настраивается фьюзы CKSEL0, CKSEL, CKSEL2, CKSEL3 они настраивают частоту с которой работает тактовый генератор и его тип. Выставляя то или ной бит можно сделать 16 разных комбинаций. Но опять же нужно посмотреть в datasheet.

С этими битами нужно быть осторожнее можно к примеру можно выставит биты таким образом что МК будет работать от внешнего генератора который подключается на ножки XTAL1 и XTAL2. И в случае его отсутствия, микроконтроллер станет «заблокирован»

По умолчанию большинство микроконтроллеров AVR настроены на работу от внутреннего источника тактов

SUT

Фьюзы SUT0 и SUT1 необходимя для настройки режимов старта тактовых генераторов. Довольно мудреные биты, если не правильно выставить эти биты то могут быть тормоза с запуском тактового генератора либо сбросы МК в момент полачи патания.

CKOPT

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

OCDEN

Этот бит необходим для разрешения или запрета чтения данных из памяти микроконтроллера.

SELFPRGEN

При помощи этого бита мы можеи запретить или наоборот разрешить запись данных в память.

BODLEVEL

Этот фьюз бит устанавливает момент уровень напряжения питания при котором происходит рестарт микроконтроллера.

BODEN

Если выставить это бит то будет происходить контроль за питающим напряжением, другими словами включиться детектор недопустимого значения уровня напряжения питания.

BOOTRST

Отправная точка начала исполнения программы. Установка адреса с которого начинает работать исполняемая программ. Если это фьюз бит выставить то программа стартует с адреса области загрузчика

RSTDISBL

С этим битом нужно быть осторожным. Если не так выставить то можно вырубить вывод RESET, в результате чего больше не сможете программировать по ISP. Это бит преобразует вывод RESET в порт ввода-вывода. Не понятно зачем придумали этот бит, наверно на случай если не хватает выводов. Но как по мне то его лучше вообще не трогать.

BOOTSZ

Состоит из BOOTSZ1 и BOOTSZ0 выставляют размер области памяти записываемых программ

EESAVE

Этот бит предназначен для защиты памяти EEPROM от стирания. Если выставить этот бит то при очистке МК память EEPROM останется не тронутой.

Читать:
Как часто нужно заряжать li sould

SPIEN

Это бит разрешает МК работать по интерфейсу SPI. У всех МК этот бит по умолчанию выставлен.

В приведенной ниже таблице fuse-биты микрокнтроллеров семейства ATtiny и ATmega. Знаком плюс указано наличие данного бита у МК.

Таблица фьюз битов микроконтроллеров AVR

Фьюз бит Семейство
ATtiny
Семейство
ATmega
2313 25/
45/
85
13 26 261/
461/
861
8 16 48/
88/
168
128 169 329 8515 8535
RESERVED M103С + S8515С S8535С
OCDEN + + + +
JTAGEN + + + +
SELFPRGEN + + + + +
DWEN + + + + + +
EESAVE + + + + + + + + + + + + +
SPIEN + + + + + + + + + + + + +
WDTON + + + + + + + + + + +
BODLEVEL2 + + + + +
BODLEVEL1 + + + + + + +
BODLEVEL0 + + + BODLEVEL + BODLEVEL BODLEVEL + BODLEVEL + + BODLEVEL BODLEVEL
BODEN + + + + + +
RSTDISBL + + + + + + + +
CKDIV8 + + + + + + +
CKOUT + + + + + +
SUT1 + + + + + + + + + + + + +
SUT0 + + + + + + + + + + + + +
CKOPT + + + + + +
CKSEL3 + + + + + + + + + + + +
CKSEL2 + + + + + + + + + + + +
CKSEL1 + + + + + + + + + + + + +
CKSEL0 + + + + + + + + + + + + +
PLLCK +
BOOTRST + + + + + + + +
BOOTSZ1 + + + + + + + +
BOOTSZ0 + + + + + + + +

Калькулятор фьюз битов микроконтроллеров

Калькулятор фьюзов AVR помогает быстро установить нужные биты, скачать офлайн версию программы можно по ссылке ниже.

Что такое Fuse и Lock биты в AVR микроконтроллере, как с ними работать

В этой статье постараюсь кратко изложить суть того, чем являются конфигурационные (Fuse) и блокировочные (Lock) биты в AVR микроконтроллерах (МК) производства фирмы ATMEL.

Вы узнаете что такое Fuse и Lock биты, для чего они нужны, как с ними работать, приведу различные примеры из документации, а также несколько примеров работы с AVRDude.

Что такое Fuse и Lock байты/биты?

Слово «Fuse» (Фьюз) с английского переводится как «плавкий предохранитель». А слово «Lock» — «блокировка».

Fuse- и Lock-биты в AVR микроконтроллере содержатся в нескольких специальных байтах энергонезависимой памяти. Их можно представить себе как наборы специальных переключателей, положение каждого из которых влияет на определенный функционал и настройки в МК.

Каждый такой бит имеет специальное название и отвечает за некоторую закрепленную за ним функцию. Например установка фьюза «RSTDSBL» превратит пин для сброса (RESET) в обычный I/O-порт.

Особенность таких «переключателей» в AVR МК состоит не только в их назначении, но и в понимании микроконтроллером значений их бит:

  • 1 — не активен (не установлен, не запрограммирован);
  • 0 — активен (установлен, запрограммирован).

Это важно запомнить!

В общем понимании нам привычно что » 1 » является установкой значения (например контакты выключателя замкнуты и ток течет), а » 0 » — сбросом (контакты разомкнуты, ток не течет). Но в ситуации с Fuse- и Lock-битами в МК все иначе.

Почему же так сделано и зачем это нужно?

Дело в том, что установка каждого из фьюз- или лок-битов в AVR микроконтроллере — операция необратимая (как при пережигании нити плавкого предохранителя).

Например, если в каком-то МК установить ( активировать , значение » 0 «) специальный бит с названием «CKSEL0», то чип переключится на использование генератора тактовых сигналов с обязательным внешним кварцевым резонатором (кварцом). Если кварц не подключен, то генератор не заработает, не будет тактового сигнала — процессор микроконтроллера не запустится.

Вернуть обратно состояние такого бита при обычном программировании МК уже не получится. Сбросить его возможно удастся лишь используя специальный высоковольтный программатор (HVP, High Voltage Programmer).

Вот почему такие биты называются «Fuse» (Фьюз, плавкий предохранитель)!

Давайте представим себе что Fuse-биты в одном из байтов AVR МК представляют из себя набор реальных плавких предохранителей (по английски «Fuses»).

Микроконтроллер это понимает так: если нить «плавкого предохранителя» цела (преднамеренно не пережигалась) — то значение соответствующего ему бита равно » 1 » ( не активен , не установлен).

Для установки нужных нам значений (битов) в Fuse-байте понадобится спалить соответствующие им «плавкие предохранители», то есть перевести их в состояние логического » 0 » ( активен , уставновлен).

Рис. 1. Что такое фьюзы (fuses), пример кодирования с плавкими предохранителями.

На рисунке мы видим 8 плавких предохранителей, изменяя состояния которых можно запрограммировать 1 байт (8 бит) информации.

AVR микроконтроллер проверит состояния всех фьюз-битов и узнает что значения для номеров 1-3, 7 (отсчет справа налево) равны » 0 » — это соответствует состоянию » активен , установлен», что задаст некоторые параметры и включит нужный функционал.

Предохранители прожжены (по аналогии с Fuse-битами в МК значения установлены), возврат их состояний обратно электрическим способом невозможен. если конечно не запаять внутрь трубочек по кусочку проволоки (что по аналогии равно использованию специального высоковольтного программатора для МК).

Начиная работать с AVR микроконтроллерами кому-то может быть сложно понять зачем было ломать принятые и вполне логичные нормы где: 1=установлен, а 0=не установлен .

Но если исходить из названия «Fuse» и с пониманием того как такие «плавкие предохранители» работают в МК (прожигание нужных позиций для установки значений с необратимостью операции) — то все становится закономерно и вполне понятно!

Итак: Fuse- или Lock-бит в AVR MK имеющий числовое значение » 0 » является активным (установленным).

Для чего нужны биты конфигурации и блокировки

Итак, мы уже знаем что Fuse- и Lock-биты в AVR микроконтроллерах содержатся в специальной, независимой от питания чипа области памяти.

При помощи Fuse-битов можно установить различные режимы работы микроконтроллера, параметры подключенных к его портам пинов, задать источник тактового сигнала и его частоту, превратить пин для «Reset» в обычный порт ввода-вывода, а также многое другое.

Некоторые названия и описания часто используемых Fuse-битов в AVR МК:

  • RSTDSBL (ReSeT DiSaBLe) — «запретить ресет», превращает пин для сброса МК в обычный порт ввода/вывода;
  • CKSEL0..3 (ClocK SELect) — четыре бита для установки параметров и источника тактового сигнала МК (внешний кварц, внутренний RC-генератор, делитель частоты и т.п.);
  • CKDIV8 (ClocK DIVision 8) — если этот бит установлен то тактовая частота от внутреннего RC-генератора будет делиться на 8;
  • CKOPT (ClocK OPTimization) — задает размах сигнала (амплитуду) с выходного тактового генератора, оптимизация потребляемого тока, влияет на помехоустойчивость;
  • SUT0..1 (Start Up Time) — установка временной задержки запуска программы после подачи питания или перезапуска МК;
  • SPIEN (Serial Programming Interface ENable) — разрешение/запрещение программирования МК через последовательный программный интерфейс;
  • JTAGEN (JTAG ENable) — разрешает/запрещает использование JTAG интерфейса;
  • EESAVE (EEprom SAVE) — если этот бит установлен, то содержимое энергонезависимой памяти будет сохранено после стирания кристалла (опция -e в AVRDude);
  • WDTON (Watch Dog Timer ON) — отключение программного управления сторожевым таймером, запуск таймера автоматически при подаче питания на МК;
  • BODEN (Brown-Out Detection ENabled), BODLEVEL (Brown-Out Detection LEVEL) — биты для включения и настройки мониторинга за напряжением питания МК;
  • BOOTRST (BOOT ReSeT) — выполнять запуск через загрузчик (Boot Loader), микроконтроллер начнет выполнение программы не с адреса 0x0000 (по умолчанию), а с адреса где расположен загрузчик.

Важно заметить что при установке фьюза RSTDSBL теряется возможность перепрошивки МК через ISP-интерфейс. Тем не менее, с использованием высоковольтного (+12В) параллельного программатора перепрошивка все же возможна.

Биты блокировки (Lock bits) позволяют установить режимы доступа (запись/чтение) к внутренней Flash-памяти и/или EEPROM, причем направление доступа можно ограничить как изнутри микроконтроллера, так и снаружи (при использовании ISP-интерфейса).

Данная возможность может быть полезна для защиты от копирования/изменения вашей программы, а также хранящихся в энергонезависимой памяти данных.

Структура конфигурационного и блокировочного байта

Фьюзы (фьюз-биты) содержатся в трех байтах:

  1. Fuse Low Byte — младший байт;
  2. Fuse High Byte — старший байт;
  3. Fuse Extended Byte — байт с опциями расширенных функций.

Блокировочные биты (Lock Bits) микроконтроллера расположены в отдельном блокировочном байте. Не редко можно слышать что их относят к фьюзам, но это не так, не стоит путать, тем более что названы они так чтобы можно было их четко различать.

У каждой модели микроконтроллера есть свой набор доступных к изменению фьюзов и блокировочных битов. Чтобы более детально разобраться со структурой Fuse- и Lock-байтов в интересующем вас МК — нужно обратиться к официальной документации (даташиту) по конкретной модели микроконтроллера.

Ниже приведен пример структуры Fuse-байтов для микроконтроллера ATTiny13. В первой строке идет номер бита, во второй — название, а в третьей — значение по умолчанию. Помним что значение 0 = бит установлен (запрограммирован).

Младший Fuse-байт (Fuse Low Byte):

7 6 5 4 3 2 1 0
SPIEN EESAVE WDTON CKDIV8 SUT1 SUT0 CKSEL1 CKSEL0
0 1 1 0 1 0 1 0

Как видим, интерфейс последовательного программирования (SPI) по умолчанию разрешен, частота внутреннего тактового генератора делится на 8 (CKDIV8), в качестве источника тактового сигнала используется внутренний RC-генератор (CKSEL0).

Старший Fuse-байт (Fuse High Byte):

7 6 5 4 3 2 1 0
SELFPRGEN DWEN BODLEVEL1 BODLEVEL0 SRTDISBL
1 1 1 1 1 1 1 1

В данном фьюз-байте все биты неактивны (не запрограммированы).

Структура блокировочного байта (Lock Byte):

7 6 5 4 3 2 1 0
LB2 LB1
1 1 1 1 1 1 1 1

Установка бита под номером «0» (LB1) в » 0 » ( активен ) запретит программирование внутренней Flash и EEPROM памяти. Если еще дополнительно установить бит под номером 1 (LB1) то это дополнительно заблокирует возможность считывания данных с памяти МК ATTiny13.

Данную информацию я легко получил, скачав даташит на ATTiny13 в формате PDF, для этого достаточно выполнить поиск в интернете в поисковой системе по запросу «ATTiny13 datasheet download».

Открыв документ ищем раздел «Memory Programming«. Как правило, PDF-файл с даташитом на микроконтроллер занимет от 1 до 10МБ. Документы от ATMEL хорошо структурированы, содержат хорошую внутреннюю навигацию со ссылками и содержанием, очень удобно искать нужную информацию.

Работа с фьюзами и Lock-битами

Выполнять установку фьюз-битов и битов блокировки нужно очень и очень аккуратно, с уверенным пониманием того что и для чего выполняется!

Невнимательность и лень в изучении документации может стать причиной неработоспособности используемого AVR микроконтроллера.

Самая безопасная стратегия при записи фьюзов и блокировочных битов:

  1. Читаем значение нужного байта из МК;
  2. Устанавливаем в полученном байте нужные биты, все внимательно проверяем;
  3. Записываем результирующий байт в МК.

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

Важно помнить что в случае выполнения операции стирания (опция «-e» в AVRDUDE) все Fuse и Lock биты будут восстановлены по умолчанию, а записанная во Flash-память программа уничтожена.

Пример установки Fuses с использованием AVRDude

Допустим что нам нужно выполнить сброс фьюза CKDIV8 в младшем байте, эта операция заставит микроконтроллер ATTIny13 работать на тактовой частоте 8МГц вместо 1МГц (когда бит установлен то частота делится на 8).

Попробуем выполнить чтение байта с фьюзами, изменим один бит (установим фьюз), а потом выполним запись в МК при помощи AVRDude на примере малыша ATTiny13.

Если возникнут вопросы при работе с «дудкой» — читаем документацию по AVRDude.

Итак, изучаем документацию (даташит, datasheet) по микроконтроллеру и подключаем его к программатору.

Микроконтроллер ATTiny13 подключен к программатору USB ISP

Рис. 2. Микроконтроллер ATTiny13 подключен к программатору USB ISP.

По умолчанию, при запуске AVRDude выводит на экран значения всех трех байтов с фьюзами, достаточно подключить МК к программатору и выполнить команду с нужными настройками (в данном случае МК — ATTiny13, программатор — USB ISP):

Как видим, значения байтов следующие:

  • E — расширенный Fuse-байт (Extended) = FF (0xFF);
  • H — старший байт (High Byte) = FF (0xFF);
  • L — младший байт (Low Byte) = 6A (0x6A).

Также значение любого из фьюз-байтов можно считать и сохранить в файл. К примеру, запишем значение младшего фьюз-байта (Low Fuse Byte, lfuse) в файл «lfuse.txt» и выведем его содержимое на экран:

Значение младшего байта с фьюзами сейчас — 0x6A, что в двоичном представлении равно 01101010 — именно то, что я приводил в структуре младшего фьюз-байта для ATTiny13 по умолчанию.

Теперь нам нужно изменить значение бита CKDIV8 в байте 01101010 на 1 (сбросить его), получаем двоичное число 01111010, которое равно 0x7A.

Раньше я уже описывал как работать с битами, а также как удобно переводить числа из одной системы счисления в другую. В одном из следующих разделов также опишу как выполнять расчет битов в байте простым «ручным» способом.

Итак, записываем новое значение в байт с фьюзами в микроконтроллере с помощью AVRDude:

Вот расшифровка «магии» с параметрами «-U lfuse:w:0x7a:m»:

  • -U — опция, указание на выполнение операции с памятью;
  • lfuse — область памяти, младший байт который содержит фьюзы (Low Fuse Byte);
  • : — разделитель;
  • w — значит что будет выполняться операция записи (write);
  • 0x7a — значение байта для записи в указанную область памяти;
  • m — указывает что данные (значение байта) будут указаны прямо в командной строчке.

Результат выполнения команды:

Как видим, все удачно записалось и прочиталось — «Fuses OK (E:FF, H:FF, L:7A)»! Теперь микроконтроллер должен работать на частоте 8МГц.

Для записи старшего или расширенного байтов нужно ‘lfuse‘ заменить на ‘hfuse‘ (старший байт) или на ‘efuse‘ (байт с расширенными настройками).

Также в одном вызове команды avrdude можно указать запись сразу нескольких байтов.

Примеры команд (данные «0x..» заменены на XXXX, там должны быть ваши значения для каждого из байтов):

Важно! Перед записью байтов фьюзов в микроконтроллер:

  1. Считываем состояния байтов в МК;
  2. Сопоставляем данные с теми которые должны быть записаны с учетом уже установленных значений (заводских, по умолчанию);
  3. Записываем измененные и проверенные значения в МК.

Пример установки Lock Bits с использованием AVRDude

Для установки битов блокировки (Lock Bits) в микроконтроллере используем аналогичную стратегию, но есть и отличия. Для считывания значения байта, содержащего биты блокировки, понадобится указать AVRDude выполнить операцию чтения из памяти.

Считываем текущее значение байта с битами блокировки в файл «lock.txt» и выводим содержимое этого файла на экран:

  • -U — выполнение операции с памятью;
  • lock — область памяти, которая содержит фьюзы блокировки (Lock Fuses);
  • : — разделитель;
  • r — значит что будет выполняться операция чтения (read);
  • lock.txt — имя файла, в который будет записана считываемая из памяти информация;
  • h — формат данных шестнадцатеричный (hexadecimal).

Результат работы команд:

Текущее значение байта с Lock Bits — 0x3F, что в двоичном представлении равно 00111111. В даташите на ATTiny13 указано что для изменения значимы только два бита — 00111111.

Изменив эти биты на 0 мы активируем соотвествующие биты блокировки, чем заблокируем возможность программирования и чтения внутренней Flash + EEPROM. В результате наш байт будет выглядеть вот так — 00111100, а в шестнадцатеричном представлении — 0x3C.

Для записи байта c Lock-битами в микроконтроллер ATtiny13 нужно выполнить следующую команду:

Будьте предельно внимательны с этой командой, поскольку изменение Lock-битов может повлечь за собой необратимые последствия!

Выполняем расчет битов в байте вручную

Расчет значения байта с установленными нужными в нем битами для AVR микроконтроллера можно выполнять в различных онлайн-калькуляторах, ссылка на один из таких приведена в конце статьи.

Тем не менее, важно уметь выполнить такие расчеты «вручную», то есть изучив документацию по микроконтроллеру самому составить нужную последовательность бит и перевести состоящий из них байт в двоичный (Binary) или шестнадцатеричный (HEX) вид.

Допустим что изучив структуру фьюзов микроконтроллера ATTiny13 нам нужно в младшем Fuse-байте выполнить следующее:

  • Сбросить фьюз (CKDIV8) — 4-й бит уствновить в 1;
  • Активировать фьюз (EESAVE) — 6-й бит установить в 0.

Итак, у нас есть новенький микроконтроллер и значение младшего Fuse-байта по умолчанию — «0x6a» (0x — значит что значение представлено в HEX-формате, это число мы узнали считав значение байта при помощи AVRDude, а также из документации).

Теперь нам нужно число «0x6a» перевести в двоичное представление, это можно сделать используя специализированный математический калькулятор, а можно просто разделить значение на две части и воспользоваться табличкой что ниже.

Binary 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
HEX 0 1 2 3 4 5 6 7 8 9
Binary 1010 1011 1100 1101 1110 1111
HEX A B C D E F

Разделяем значение «6A» (0x6a) на две части — «6» и «A», ищем в табличке соответствующие бинарные представления — 0110 (6) и 1010 (А). Значение 0x6a в двоичной системе счисления — 01101010.

Теперь изменим 4-й бит в байте на 1, а 6-й бит — на 0: [7й бит->] 00111010 [<-0й бит]

Разделяем полученное бинарное представление 00111010 на две равные части: 0011 и 1010. Конвертируем эти части в HEX, используя табличку выше: 0011 = 3, 1010 = A.

Соединяем полученные цифры в шестнадцатеричном формате: 0011 1010 = 3A. Получается, для того чтобы сбросить фьюз 4 (CKDIV8), а также активировать фьюз 6 (EESAVE) — нужно в младший фьюз-байт записать значение «0x3a».

Заключение

Работа с Fuses в AVR-микроконтроллере — это относительно не сложно, но стоит проявить внимательность. Главное не спешить и не лениться сверяться с официальной документацией.

Всю рутину по записи и считывании значений берет на себя «швейцарский нож» из мира AVR по имени AVRDude, нам лишь остается только правильно выполнить расчет нужного байта с фьюзами.

Похожие публикации