Fuse

Fuse

Radioelectronics

Микроконтроллеры являются довольно универсальными электронными компонентами для создания большого разнообразия устройств. При множестве вариаций моделей МК от разных фирм главным преимуществом этих компонентов является возможность заставить готовые устройства работать по заранее заданным алгоритмам, которые реализуются с помощью написанной и скомпилированной программы, записанной в итоге в память МК. Но недостаточно просто залить прошивку в микроконтроллер. Ведь чтобы осуществить заливку, нужно запустить МК и запустить его правильно. Иначе даже в запущенном состоянии он будет работать некорректно. Другими словами, для МК нужно задать глобальную конфигурацию и выбрать необходимые режимы работы.

Как поступали производители микросхем в давние времена для простого программирования микросхем? Микросхему в большинстве случаев можно было запрограммировать один раз. Это делалось путем сжигания специальных перемычек внутри микросхемы. Словно выборочно сжечь множество миниатюрных плавких предохранителей (Fuse). А после запуска этой микросхемы уже учитывались состояния этих предохранителей. Если предохранитель цел, то он проводит ток и доставляет сигнал в виде логической единицы в нужное место. Но если предохранитель сожжён, то он больше не проводит ток и не доставляет никуда сигнал в виде логической единицы, то есть в том месте остается сигнал в виде логического нуля.

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

Актуально ли так программировать большие объемы памяти? Не особо. Но можно таким образом быстро конфигурировать некоторые универсальные микросхемы прямо с завода, чтобы они получили уникальные и неизменяемые настройки параметров. Чаще всего это ограниченный набор байт.

Сейчас в сложных микросхемах есть применение таким сжигаемым перемычкам, но нас больше интересует возможность конфигурирования работы МК. Понятное дело, что внутреннюю память МК можно многократно перезаписывать прошивкой с новой программой. Это подразумевает и то, что конфигурацию МК требуется многократно менять с учетом требований каждой прошивки. Менять придётся специальные биты конфигурации. Вариант со сгораемыми перемычками не подойдет, так как он одноразовый. Но вполне можно выделить небольшой участок перезаписываемой памяти под эти нужды и иметь возможность по необходимости многократно изменять конфигурацию настроек МК. Каждому биту такой области памяти будет соответствовать какая-то определенная настройка конфигурации.

Инверсия фьюз-битов

Важное замечание: для МК фирмы AVR такие биты являются инверсными. То есть установленным считается бит, который сброшен в логический ноль. А сброшенный бит конфигурации имеет в себе логическую единицу. Словно как с плавкими перемычками. Такое может запутать, ведь это было логично именно для плавких предохранителей, но это сохранилось и в применении для битов конфигурации МК AVR.

По аналогии такие биты конфигурации назвали фьюз-битами (fuse-биты, fuse-bits).

Просто запомним, что:

1 – бит не установлен (не запрограммирован);

0 – бит установлен (запрограммирован).

Довольно часто можно встретить в статьях указания и утверждения о том, что "ни в коем случае не стоит изменять фьюз-биты, иначе они заблокируют МК и сделают невозможным его запуск". Звучит вполне предостерегающе, но такие рекомендации лишь отстраняют людей и не дают в итоге тонко настраивать микроконтроллер. А ведь хочется полноценно управлять своим МК. Всё же крупица истины в этом утверждении есть. Нужно подробно знать назначение каждого конфигурационного бита и в итоге случайно не выставить критичные для работы биты в инверсном режиме.

Чтобы иметь общее представление о том, что же там можно конфигурировать, рассмотрим частично описание определённого микроконтроллера.


Краткое описание конфигурационных битов

Конфигурационные биты находятся в особой области памяти и могут быть изменены только с помощью программатора при записи контроллера. Эти биты для удобства сгруппированы в отдельные байты.

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

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

Дополнительно выделяют еще один конфигурационный байт.

  • Lock Bit Byte - байт с опциями блокировки доступа к памяти.

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

В вышеприведённых таблицах можно видеть название каждого бита, его порядковый номер в байте, очень краткое описание и значение по умолчанию. Может показаться, что в названии каждого бита указан случайный набор букв, но это вовсе не так. Например, бит SPIEN получил название из начальных букв фразы Serial Programming Interface ENable, что означает разрешение на последовательное программирование. Если внимательно присмотреться к остальным битам, то можно заметить эту закономерность.

Некоторые биты объединяются в общую по смыслу группу. У такого набора битов общее буквенное название, но разные цифровые обозначения, означающие порядок каждого бита в этой группе. Например, биты группы CKSEL (ClocK SELect) задают конфигурацию тактового сигнала для МК. В группу входят четыре бита, и их порядок нумеруется цифрами от нуля до трёх. Это можно записать как CKSEL[3:0]. Комбинации из четырёх битов могут дать немалое разнообразие режимов настройки.

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


Более понятное описание конфигурационных битов

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

CKSEL[3:0] (ClocK SELect) – фьюз-биты, определяющие конфигурацию тактового сигнала. Их комбинация задаёт тип и частоту источника тактирования. Всего возможно до 16 комбинаций, однако не все определены для всех типов МК. Поэтому не ошибаемся, когда задаём эти биты.

SUT[1:0] (Start-Up Time) – задает скорость запуска микроконтроллера после снятия сигнала RESET или подачи питания и является своеобразной задержкой старта МК после его перезагрузки. Такая задержка нужна, чтобы напряжение питания МК стало стабильным и обеспечило стабильную генерацию импульсов.

CKOUT (ClocK OUT) – разрешает вывод сигнала с тактовой частотой на один из выводов МК (для тактирования других устройств).

CKDIV8 (ClocK DIVision 8) – данный бит разрешает деление тактовой частоты на 8. Реальная частота МК будет понижена в 8 раз относительно частоты тактирования.

BOOTRST (BOOT ReSeT) – этот бит определяет адрес, с которого и будет начато исполнение программы. Если бит активен, то он заставляет МК запускаться при старте не с адреса 0000h, а с адреса бутсектора. Таким образом вначале запускается бутлоадер (Boot Loader, загрузчик).

BOOTSZ[1:0] (BOOT SiZe) – фьюз-биты, которые задают размер бут сектора (загрузчика). Определяют размер области памяти записываемых программ. Эти биты связаны с битом BOOTRST.

EESAVE (EEprom SAVE) – защищает содержимое памяти EEPROM от стирания во время выполнения полной очистки чипа МК.

WDTON (Watch Dog Timer ON) – включает Watch Dog Timer. МК в редких (и не особо редких) случаях могут зависнуть. Это может происходить по вине как программной части, так и аппаратной. Сторожевой таймер работает независимо от тактового генератора МК и позволяет перезапустить МК, если тот перестал отвечать на запросы.

SPIEN (Serial Programming Interface ENable) – разрешение на последовательное программирование. Обычно в программах для прошивки МК изменение этого бита недоступно, но если появилась возможность изменить его значение на противоположное, то лучше даже не пробовать. Из категории фьюзов "Не трогай".

DWEN (DebugWIRE Enable) – включение однопроводного отладочного интерфейса, работающего через ножку сброса (Reset). При активации вывод сброса становится выводом связи, и нормальный сброс больше не работает. Из категории фьюзов "Не трогай".

RSTDISBL (Reset Disable) – отключение функции сброса на выводе Reset. Из категории фьюзов "Не трогай".

BODLEVEL[2:0] (Brown-Out Detection LEVEL) – управление схемой мониторинга напряжения питания МК. Если напряжение опустится ниже установленного данными фьюз-битами, то МК сбросится и будет держаться в режиме сброса, пока напряжение питания не превысит установленный порог.

LB[2:1] (Lock Bit) – управление доступом к памяти (flash и EEPROM) микроконтроллера извне. Например, при использовании программатора. Обычно используется для защиты прошивки устройства от копирования.

BLB0[2:1] (Boot Lock Bits) – запрет для МК записывать данные в область программы на flash памяти.

BLB1[2:1] (Boot Lock Bits) – запрет для МК записывать данные в область загрузчика на flash памяти.

Такое слегка развёрнутое описание должно чуть больше прояснить картину о назначении каждого бита.


Предупреждение

Так отчего же нас везде пытаются отговорить прикасаться к этим фьюзам? Есть несколько фьюз-битов, установка которых в активное состояние может затруднить возможность взаимодействовать с МК. Затруднить, но не исключить навсегда. Если возникло подобное затруднение, то понадобится просто более навороченный программатор, чтобы вернуть МК в нормальное состояние.

Что же это за биты? Выше они были рассмотрены, но надо конкретизировать.

RSTDISBL позволяет запретить использование ножки сброса. По умолчанию равен 1 (сброшен). Если этот бит сделать активным, то ножка сброса станет еще одним портом ввода-вывода, но станет невозможным последовательное программирование через ISP-интерфейс. Всё можно восстановить с помощью высоковольтного параллельного программатора. Зачем тогда есть возможность делать ножку сброса портом ввода-вывода, если при этом будет затруднительно в обычных условиях что-то записать в МК? Бывают МК, которые имеют всего восемь выводов. Из них два связаны с питанием, а еще один с ногой RESET. Остается всего 5 свободных выводов, которых порой не хватает. А в такой ситуации очень щедрым будет предложение получить еще один вывод, который можно будет использовать. В итоге два вывода заняты питанием МК, а шесть остальных могут использоваться по нашему хотению.
DWEN разрешает использование отладочного интерфейса DebugWire. По умолчанию равен 1 (сброшен). В обычных условиях нет смысла изменять.
SPIEN разрешает последовательное программирование. По умолчанию равен 0 (установлен). Тут всё просто – если запретим, то не сможем использовать обычный программатор.

Еще немного затруднить положение мы можем, если неправильно сконфигурируем биты группы CKSEL. При этом МК будет ожидать тактирование совсем другим способом, а не тем, которым он физически подключен. Тут исправить ситуацию намного проще – нужно правильно подключить МК и задать ему способ тактирования, соответствующий комбинации группы битов CKSEL.


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

Самый безопасный вариант работы с МК:

  1. Выбираем нужную модель МК в программе;
  2. Считываем значение фьюзов нашего МК;
  3. В случае успешного чтения видим, как установлены все четыре байта;
  4. Если есть необходимость, то корректируем отдельные биты;
  5. Записываем фьюзы в МК.

В программе AVRDUDE_PROG 3.3 есть возможность выводить фьюз-биты в прямом либо инвертированном виде. Это указывается соответствующей настройкой под списком всех битов. Можно же запутаться в конец, ведь установленный бит содержит 0, а сброшенный – 1. Но есть "маячки", с помощью которых можно не ошибиться. Посмотрите на биты SPIEN и RSTDISBL после чтения фьюзов с МК. В случае удачного чтения они будут установлены по следующим правилам.

Если используется инверсный режим отображения, то галочка напротив бита означает, что он установлен (запрограммирован), а отсутствие галочки означает, что бит сброшен (не запрограммирован). В таком режиме бит SPIEN установлен и имеет галочку, а бит RSTDISBL сброшен и не имеет галочки.
Если используется прямой режим отображения, то галочка напротив бита означает, что он сброшен (не запрограммирован), а отсутствие галочки означает, что бит установлен (запрограммирован). В таком режиме бит SPIEN сброшен и не имеет галочки, а бит RSTDISBL установлен и имеет галочку.

Уверен, что так намного легче запомнить этот момент.

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


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

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

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

Один из сайтов с калькулятором фьюзов

Такие калькуляторы можно встретить на разных сайтах, но принцип у них один. Поэтому стоит выбрать понравившийся и пользоваться им по необходимости.

http://homes-smart.ru/fusecalc/?prog=avrstudio&part=ATmega328P

http://fusecalc.mirmk.ru/

https://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p


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

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

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

Report Page