Что такое фьюзы в микроконтроллере
Перейти к содержимому

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

  • автор:

Фьюзы микроконтроллеров 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 и некоторых других, фьюзы нужно выставлять зеркально по сравнению с предыдущим списком программ.

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

beginner92-2.png

Данные приложения очень удобны, т.к. например в последнее время очень часто авторы своих проектов значения фьюзов пишут непонятными буквами или цифрами, или же словами, новичку не понятно, что это значит и какие фьюзы при этом нужно выставлять, (часто можно встретить комментарий к статье «а какие фьюзы выставлять?»). Калькулятор фьюзов нам в этом плане очень сильно помогает.

beginner92-3.png

Думаю что теперь, если у вас спросят «что такое фьюзы, и зачем они нужны?», вы сможете объяснить человеку их назначение, а пока, на этом все!

Романов. А.С. Опубликована: 2012 г. 0 3

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

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

Новая серия ИП LI100-20BxxPR3 от MORNSUN: от умных домов до промышленной автоматизации

Несмотря на то, что в технической документации на каждый МК дается исчерпывающая информация по 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.

Биты защиты. Разбираем способы защиты микроконтроллеров

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

В семей­стве AVR для нас­трой­ки при­меня­ются фьюзы. Фьюзы (от англ. fuse — пре­дох­ранитель) — это осо­бые биты в мик­рокон­трол­лере, которые, как и все биты, хра­нят информа­цию. Их основные осо­бен­ности сле­дующие:

  • они хра­нят­ся и про­шива­ются отдель­но от осталь­ной памяти;
  • из­меня­ются толь­ко извне;
  • уп­равля­ют работой мик­рокон­трол­лера на самом низ­ком уров­не.

Луч­ше все­го их мож­но объ­яснить на при­мере дозимет­ра РКСБ-104.

Дозиметр РКСБ-104До­зиметр РКСБ-104

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

Задняя панель со снятой крышкойЗад­няя панель со сня­той крыш­кой

В AVR эти биты для удобс­тва соеди­няют­ся в бай­ты: стар­ший, млад­ший, защит­ный и допол­нитель­ный. К каж­дому биту мож­но получить дос­туп по прин­ципу байт → бит. Млад­ший байт обыч­но отве­чает за так­тирова­ние, а стар­ший — за плюш­ки. Биты отли­чают­ся от чипа к чипу, поэто­му с каж­дым чипом в иде­але сто­ит раз­бирать­ся отдель­но с помощью докумен­тации.

Зна­чение битов в этом семей­стве инверти­рова­но: 1 зна­чит, что бит стерт, а 0 — что уста­нов­лен. Но вот прог­раммы для про­шив­ки МК работа­ют по‑раз­ному. Для раз­ных прог­рамм нуж­но уточ­нять логику работы с фьюза­ми.

Что могут фьюзы в этом семей­стве МК:

  • уп­равле­ние так­тирова­нием (час­тота генера­тора, внеш­ний или внут­ренний генера­тор);
  • раз­решение на чте­ние про­шив­ки мик­рокон­трол­лера (самое инте­рес­ное, но об этом поз­же);
  • уп­равле­ние тай­мерами;
  • за­щита EEPROM;
  • бо­лее спе­цифич­ные фун­кции, их надо уточ­нять к кон­крет­ному чипу.

Са­мые «популяр­ные» биты:

  • CKSEL — их четыре, и они отве­чают за так­тирова­ние;
  • SUT — их два, и они управля­ют режимом запус­ка так­тирова­ния;
  • CKOPT — кон­фигури­рует внут­ренний генера­тор;
  • RSTDISBL — режим работы нож­ки RESET МК;
  • SPIEN — раз­решение SPI;
  • EESAVE — защита EEPROM;
  • BOOTRST — адрес, отку­да начать исполнять код;
  • BODEN — кон­троль питания;
  • SELFPRGEN — раз­решение записи в память изнутри;
  • OCDEN — вот он, бит, раз­реша­ющий чте­ние про­шив­ки.

Счи­тыва­ют фьюзы обыч­но не вруч­ную, а с помощью спе­циаль­ных каль­кулято­ров. Вот один из них — Fusecalc.

warning

При работе с фьюза­ми будь пре­дель­но вни­мате­лен. Неп­равиль­но выс­тавлен­ный бит может прев­ратить чип в «кир­пич». Перед про­шив­кой уточ­няй логику работы с фьюза­ми в тво­ей прог­рамме.

Linux

Я обыч­но работал с прог­раммой avrdude. При­веду пару команд без допол­нитель­ных парамет­ров (чип, прог­рамма­тор). Счи­тыва­ние про­шив­ки из чипа в файл:

Счи­тыва­ние энер­гонеза­виси­мой памяти в файл:

За­пись про­шив­ки из фай­ла в чип:

За­пись энер­гонеза­виси­мой памяти из фай­ла:

За­пись фьюзов ( 0xc3 -> lfuse ; 0x99 -> hfuse ):

Чте­ние фьюзов в фай­лы:

Есть допол­нитель­ные парамет­ры -с и -p . Пер­вый отве­чает за прог­рамма­тор, а вто­рой — за чип. В качес­тве при­мера — коман­да для про­шив­ки кон­трол­лера ATmega328p с помощью USBASP:

В коман­дах есть стран­ные стро­ки вида flash: w: flash_dump. hex . Это стро­ки в спе­циаль­ном фор­мате для avrdude . Для чего такое решение — не знаю ни я, ни кто‑либо еще.

Час­ти этих строк раз­делены дво­ето­чиями:

  • пер­вая часть — область памяти в МК (нап­ример, flash или lfuse );
  • вто­рая — нап­равле­ние ( w — write или r — read);
  • третья — файл на локаль­ном устрой­стве (нап­ример, файл с про­шив­кой);
  • пос­ледняя (опци­ональ­ная) — фор­мат фай­ла (нап­ример, r — raw или i — ihex, инте­лов­ский шес­тнад­цатерич­ный).

Бо­лее спе­цифич­ные слу­чаи при­мене­ния этой стро­ки выходят за рам­ки дан­ной статьи.

Windows

Окон­щики обыч­но поль­зуют­ся прог­рамма­ми с GUI. Нап­ример, AvrDude GUI.

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

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

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

А вот наконец и фьюзы. Зада­ются они как бай­ты.

Как видишь, все прос­то, и исполь­зовать фьюзы мож­но, даже не откры­вая тер­минал!

На Arduino мож­но кон­фигури­ровать МК, не задумы­ваясь о работе фьюзов. Этим занима­ется Arduino IDE в авто­мати­чес­ком режиме.

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

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

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *