Что такое фьюзы в микроконтроллере
Вы здесь: Home Железо Arduino Что такое фьюзы ( Fuse ) ?
Обновлено 16.12.2013 16:37 | Автор: MaksMS | Просмотров: 25599
Что такое фьюзы ( Fuse ) ?
Fuse — это дополнительные настройки микроконтроллеров, например можно переключить микроконтроллер на использование внутреннего кварца,а освободившиеся выводы использовать в своих целях ,но некоторые параметры,например Reset Disabled и Serial program downloading отключать не рекомендуется если вы не имеете специальный программатор HVSP или HVPP- вы не сможете прошивать м/к.Востановление только через HVSP !! Для вычисления данных фьюзов используем калькулятор фьюзов где узнаем Low ,High и у некоторых имеется Extended Action фьюз.
Перед тем как менять фьюзы обязательно читаем как шить через Arduino IDE или USBasp.
Пример порядка действий для изменения фьюзов через Arduino IDE:
1.берем из файла board.txt данные фьюзов того контроллера,для которого хотим что-то изменить, в строчках bootloader.low_fuses , bootloader.high_fuses и bootloader. extended_fuses (если есть) и вписываем в калькулятор ( в левой части страницы),только перед этим выбираем соотвествующий микроконтроллер.
2.Выбираем/меняем необходимые опции.
3.Создаем копию необходимого раздела в файле board.txt и меняем его имя в строчке name
4.Правим строчки fuses в board.txt (папка /hardware/arduino/ в Arduino IDE) в созданой копии,ставя те значения фьюзов,которые выдал калькулятор.
5.Выбираем программируемый микроконтроллер(как его назвали в пункте 3) в меню сервис-плата жмем прошить загрузчик.
Пример порядка действий для изменения фьюзов через avrdude (рекомендуется):
Для начала перейдем в консоль (cmd или bash) Вашей операционной системы в папку через команду cd путь_к_папке_ардуина_/hardware/tools/ и далее вводим команды.Данные о фьюзах по умолчанию можно взять из файла board.txt.
Установка фьюзов через Windows:
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -U lfuse:w:0xХХ:m -U hfuse:w:0xХХ:m
Установка фьюзов через Linux:
./avrdude -C avrdude.conf -c avrisp -P /dev/ttyUSB0 -b 19200 -p m8 -U lfuse:w:0xХХ:m -U hfuse:w:0xХХ:m
Где ХХ — это соотвествующие фьюзы микроконтроллера.Шестнадцатеричное значение.
Где -c avrisp — тип программатора, что значит прошивка используя плату Arduino.Возможна прошивка и через другие программаторы,например через USBasp ,указав строку вида -с usbasp.
на заполнении..
Будьте внимательны и не меняйте опции,в которых не понимаете — вы можете заблокировать микроконтроллер.
Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.
Микроконтроллеры ATMEL. Фьюзы. Fuses.
Фьюзы (Fuses) — это несколько специальных байт, которые можно прошить только программатором, и отвечают они за разные настройки микроконтроллера. У разных микроконтроллеров фьюзы могут отличаться. Поэтому более подробную информацию смотрите в документации. Поскольку это делается в последнюю очередь, я приведу здесь краткое описание фьюзов и перечислю наиболее часто встречающиеся ошибки при работе с фюзами.
Хочу заметить, что установленным считается бит, который сброшен в 0. Для начинающих это часто вносит путаницу, при работе с разными программами для прошивки. Так как не всегда ясно установленная напротив фьюза птичка это 1 или 0 (в смысле, установлен). Разработчики ПО имели ввиду, если стоит птичка, значит, бит считается установленным (т.е. =0).
Далее приведенная сборная информация для разных микроконтроллеров. Я не претендую на оригинальность, эту информацию я скачал с интернета, прошу прощения у авторов.
Семейство 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 | + | + | + | BOD LEVEL | + | BOD LEVEL | BOD LEVEL | + | BOD LEVEL | + | + | BOD LEVEL | BOD LEVEL |
BODEN | + | + | + | + | + | + | |||||||
RSTDISBL | + | + | + | + | + | + | + | + | |||||
CKDIV8 | + | + | + | + | + | + | + | ||||||
CKOUT | + | + | + | + | + | + | |||||||
SUT1 | + | + | + | + | + | + | + | + | + | + | + | + | + |
SUT0 | + | + | + | + | + | + | + | + | + | + | + | + | + |
CKOPT | + | + | + | + | + | + | |||||||
CKSEL3 | + | + | + | + | + | + | + | + | + | + | + | + | |
CKSEL2 | + | + | + | + | + | + | + | + | + | + | + | + | |
CKSEL1 | + | + | + | + | + | + | + | + | + | + | + | + | + |
CKSEL0 | + | + | + | + | + | + | + | + | + | + | + | + | + |
PLLCK | + | ||||||||||||
BOOTRST | + | + | + | + | + | + | + | + | |||||
BOOTSZ1 | + | + | + | + | + | + | + | + | |||||
BOOTSZ0 | + | + | + | + | + | + | + | + |
В таблице fuse-биты популярных AVR. Слева названия fuse-битов по даташиту, в первых двух строках перечислены семейства и типы конкретных МК, а на пересечении строк и столбцов стоит знак плюс, если данный fuse-бит имеется в данном МК, или указано название, отличное от стандартного. Если какой-то бит отсутствует — в соответствующей клетке ничего нет.Назначение каждого фьюза AVR fuse бита:RESERVED — этот бит зарезервирован для каких-то неизвестных простым смертным целей фирмой Atmel. Ни при каких условиях не рекомендуется менять его состояние (т. е. надо оставлять его таким, как он установлен при изготовлении МК). В этой строке встречаются биты с другими названиями, как правило, это биты включения режима совместимости с устаревшими типами МК, на смену которым выпущены новые. Обычно в конце названия такого fuse-бита имеется символ С — от COMPATIBLE (совместимый).
OCDEN — fuse разрешает работу схемы внутреннего отладчика (On Chip Debug ENable). Не оставляйте установленным этот бит в коммерческих продуктах! Иначе вашу программу можно будет считать из памяти МК.
JTAGEN — fuse бит разрешает работу интерфейса программирования-отладки JTAG. По сравнению с SPI-интерфейсом, JTAG обладает расширенными возможностями. Не рекомендуется без необходимости оставлять этот бит установленным, т. к. в этом случае потребляемый МК ток возрастает.
SELFPRGEN — бит, разрешающей программе МК производить запись в память программ, т. е. производить самопрограммирование.
DWEN — fuse бит, разрешающий работу DebugWire — это интерфейс отладки по одному проводу. Не рекомендуется оставлять его установленным в коммерческих изделиях.
EESAVE — fuse бит, после установки которого при стирании памяти МК содержимое EEPROM данных будет сохраняться нетронутым, т. е. не будет стерто.
SPIEN — fuse бит, разрешающий работу интерфейса внутрисхемного программирования МК по SPI. Этот бит может быть легко переустановлен при помощи параллельного программатора (или JTAG, если таковой разрешен и имеется в МК). Все МК выпускаются с установленным битом SPIEN, снять его по интерфейсу SPI невозможно.
WDTON — fuse бит, после установки которого сторожевой таймер WDT включается сразу после подачи питания и не может быть отключен программно. Если бит не установлен, то включением и отключением WDT можно управлять программно.
Группа fuse битов BODLEVEL. Может быть либо один такой бит, либо несколько, тогда они нумеруются, начиная с нуля. Значение этих fuse битов определяет порог срабатывания схемы BOD — детектора уровня питающего напряжения, при снижении напряжения питания ниже этого уровня произойдет «сброс» МК.
BODEN — fuse бит, включающий схему аппаратного детектора недопустимого уровня питающего напряжения, т.е. схему BOD.
RSTDISBL — fuse бит, отключающий сигнал внешнего сброса от вывода микроконтроллера и подключающий к нему схему порта ввода-вывода. Этот бит имеется только в тех МК, у которых вывод аппаратного сброса RESET совмещен с одинм из портов ввода-вывода. Ошибочная установка этого fuse бита может отключить RESET и вы не сможете больше прошивать по ISP. Не устанавливайте этот бит, если намерены продолжать работать с МК при помощи последовательных программаторов. «Оживить» МК с установленным RSTDISBL можно только параллельным программатором и не для всех МК.
CKDIV8 — fuse бит, включающий предварительное деление частоты кварцевого (или иного имеющегося) тактового генератора на 8. То есть при включенном этом бите и применении кварцевого резонатора на 8 МГц реальная тактовая частота МК составит1 МГц.
CKOUT — fuse бит, разрешающий вывод тактовой частоты на один из выводов МК (для тактирования других устройств).
SUT1 и SUT0 — fuse биты, управляющие режимом запуска тактовых генераторов МК. Связаны с нижеописываемыми битами, определяющими тип и частоту тактового генератора, причем связь весьма хитрая и запутанная. При ошибочной их установке возможны ситуации неустойчивого запуска генератора или неоднократного сброса МКв процессе подачи на него питания.
CKOPT — бит, определяющий режим работы встроенного генератора тактовой частоты для работы с кварцевыми резонаторами. Реально изменяет коэффициент усиления встроенного инвертора в схеме генератора и, следовательно, — выходное напряжение на ножке XTAL2. Ошибочная установка может приводить к неустойчивому запуску кварцевого генератора, вплоть до возбуждения его не на той гармонике, что надо (из-за этого бита кварц запускался или только при питании МК напряжением не выше 3,6В, или только после прикосновения к выводу XTAL1 пинцетом)
Группа битов CKSEL0…CKSEL3 — fuse биты, комбинация которых определяет тип и частоту работающего тактового генератора. Всего возможно до 16 комбинаций, однако не все определены для всех типов МК. Ошибочная установка комбинации этих битов может сделать МК «мертвым» — он не будет работать в схеме без подачи тактового сигнала на ножку XTAL1.
PLLCK — fuse бит, разрешающий использование встроенного синтезатора частоты для тактированияядра МК.
BOOTRST — fuse бит, определяющий адрес, с которого будет начато исполнение программы после сброса — если бит установлен, то начало программы будет не с адреса 0000h (как обычно), а с адреса области загрузчика (Boot Loader).
Группа fuse битов BOOTSZ — два fuse бита, определяющие размер области памяти программ, выделяемой для загрузчика (Boot Loader). Комбинация этих битов, в частности, определяет точку начала исполнения программы после сброса, если установлен бит BOOTRST.
Наиболее частые ошибки при настройке фюзов:
1. Установка фюза RSTDISBL. Ошибочная установка этого fuse бита отключает RESET, и Вы не сможете больше прошивать по ISP. Для этого потребуется последовательный программатор или что-то попроще для сброса фьюзов к заводским настройкам.
2. Неправильная установка CKSEL0, CKSEL1, CKSEL2, CKSEL3. Эти фьюзы определяют источник тактирования микроконтроллера. Если Вы случайно выбрали не ту частоту внутреннего RC генератора, это не смертельно. Программирование через ISP будет возможным, и вы сможете исправить ситуацию. А если случайно установить тактирование от внешнего источника, RC цепочки или кварцевого резонатора, а у Вас таких в схеме нет, то программирование по ISP тоже станет невозможным. По сути, микроконтроллер будет ожидать тактирования от несуществующей схемы. Как выйти из этого положения? Очень просто — дать микроконтроллеру источник тактирования и исправить фьюзы. Чаще всего устанавливают CKSEL все нули — тактирование от внешнего генератора. В этом случае можно собрать схему, генерирующую меандр (частота особой роли не играет, главное, чтобы она лежала пределах возможности микроконтроллера) и подать на ногу XTAL1. После чего микроконтроллер можно будет прошить через ISP. Первое, что надо сделать, — сбросить фьюзы к заводским настройкам. Если CKSEL все установлены в 1 — тактирование от внешнего кварца. Навесьте кварц после чего микроконтроллер снова будет доступен через ISP.
Ну и напоследок, найденные в интернете калькуляторы Фюзов. Иногда очень полезная штука:
Фьюзы микроконтроллеров 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 чел.
Что такое 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-интерфейса).
Данная возможность может быть полезна для защиты от копирования/изменения вашей программы, а также хранящихся в энергонезависимой памяти данных.
Структура конфигурационного и блокировочного байта
Фьюзы (фьюз-биты) содержатся в трех байтах:
- Fuse Low Byte — младший байт;
- Fuse High Byte — старший байт;
- 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 микроконтроллера.
Самая безопасная стратегия при записи фьюзов и блокировочных битов:
- Читаем значение нужного байта из МК;
- Устанавливаем в полученном байте нужные биты, все внимательно проверяем;
- Записываем результирующий байт в МК.
Почему именно так, а не сразу запись в МК? — потому что преследуя некоторую цель с установкой одного бита, можно нарушить состояние других битов, что может повлечь за собой, к примеру, переключение МК на источник тактового сигнала который не предусмотрен и микроконтроллер просто не запустится.
Важно помнить что в случае выполнения операции стирания (опция «-e» в AVRDUDE) все Fuse и Lock биты будут восстановлены по умолчанию, а записанная во Flash-память программа уничтожена.
Пример установки Fuses с использованием AVRDude
Допустим что нам нужно выполнить сброс фьюза CKDIV8 в младшем байте, эта операция заставит микроконтроллер ATTIny13 работать на тактовой частоте 8МГц вместо 1МГц (когда бит установлен то частота делится на 8).
Попробуем выполнить чтение байта с фьюзами, изменим один бит (установим фьюз), а потом выполним запись в МК при помощи AVRDude на примере малыша ATTiny13.
Если возникнут вопросы при работе с «дудкой» — читаем документацию по AVRDude.
Итак, изучаем документацию (даташит, datasheet) по микроконтроллеру и подключаем его к программатору.
Рис. 2. Микроконтроллер ATTiny13 подключен к программатору USB ISP.
По умолчанию, при запуске AVRDude выводит на экран значения всех трех байтов с фьюзами, достаточно подключить МК к программатору и выполнить команду с нужными настройками (в данном случае МК — ATTiny13, программатор — USB ISP):
avrdude -p t13 -c usbasp
avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9007 avrdude: safemode: Fuses OK (E:FF, H:FF, L:6A) avrdude done. Thank you.
Как видим, значения байтов следующие:
- E — расширенный Fuse-байт (Extended) = FF (0xFF);
- H — старший байт (High Byte) = FF (0xFF);
- L — младший байт (Low Byte) = 6A (0x6A).
Также значение любого из фьюз-байтов можно считать и сохранить в файл. К примеру, запишем значение младшего фьюз-байта (Low Fuse Byte, lfuse) в файл «lfuse.txt» и выведем его содержимое на экран:
avrdude -p t13 -c usbasp -U lfuse:r:lfuse.txt:h cat lfuse.txt
Значение младшего байта с фьюзами сейчас — 0x6A, что в двоичном представлении равно 01101010 — именно то, что я приводил в структуре младшего фьюз-байта для ATTiny13 по умолчанию.
Теперь нам нужно изменить значение бита CKDIV8 в байте 01101010 на 1 (сбросить его), получаем двоичное число 01111010, которое равно 0x7A.
Раньше я уже описывал как работать с битами, а также как удобно переводить числа из одной системы счисления в другую. В одном из следующих разделов также опишу как выполнять расчет битов в байте простым «ручным» способом.
Итак, записываем новое значение в байт с фьюзами в микроконтроллере с помощью AVRDude:
avrdude -p t13 -c usbasp -U lfuse:w:0x7a:m
Вот расшифровка «магии» с параметрами «-U lfuse:w:0x7a:m»:
- -U — опция, указание на выполнение операции с памятью;
- lfuse — область памяти, младший байт который содержит фьюзы (Low Fuse Byte);
- : — разделитель;
- w — значит что будет выполняться операция записи (write);
- 0x7a — значение байта для записи в указанную область памяти;
- m — указывает что данные (значение байта) будут указаны прямо в командной строчке.
Результат выполнения команды:
avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9007 avrdude: reading input file "0x7a" avrdude: writing lfuse (1 bytes): Writing | ################################################## | 100% 0.01s avrdude: 1 bytes of lfuse written avrdude: verifying lfuse memory against 0x7a: avrdude: load data lfuse data from input file 0x7a: avrdude: input file 0x7a contains 1 bytes avrdude: reading on-chip lfuse data: Reading | ################################################## | 100% 0.00s avrdude: verifying . avrdude: 1 bytes of lfuse verified avrdude: safemode: Fuses OK (E:FF, H:FF, L:7A) avrdude done. Thank you.
Как видим, все удачно записалось и прочиталось — «Fuses OK (E:FF, H:FF, L:7A)»! Теперь микроконтроллер должен работать на частоте 8МГц.
Для записи старшего или расширенного байтов нужно ‘lfuse‘ заменить на ‘hfuse‘ (старший байт) или на ‘efuse‘ (байт с расширенными настройками).
Также в одном вызове команды avrdude можно указать запись сразу нескольких байтов.
Примеры команд (данные «0x..» заменены на XXXX, там должны быть ваши значения для каждого из байтов):
# Установка Младшего + Старшего байтов, две команды avrdude -p m8 -c usbasp -U lfuse:w:XXXX:m avrdude -p m8 -c usbasp -U hfuse:w:XXXX:m # Установка Расширенного байта avrdude -p m8 -c usbasp -U efuse:w:XXXX:m # Установка Младшего + Старшего байтов, одна команда avrdude -p m8 -c usbasp -U lfuse:w:XXXX:m -U hfuse:w:XXXX:m # Установка Младшего + Старшего + Расширенного байтов avrdude -p m8 -c usbasp -U lfuse:w:XXXX:m -U hfuse:w:XXXX:m -U efuse:w:XXXX:m
Важно! Перед записью байтов фьюзов в микроконтроллер:
- Считываем состояния байтов в МК;
- Сопоставляем данные с теми которые должны быть записаны с учетом уже установленных значений (заводских, по умолчанию);
- Записываем измененные и проверенные значения в МК.
Пример установки Lock Bits с использованием AVRDude
Для установки битов блокировки (Lock Bits) в микроконтроллере используем аналогичную стратегию, но есть и отличия. Для считывания значения байта, содержащего биты блокировки, понадобится указать AVRDude выполнить операцию чтения из памяти.
Считываем текущее значение байта с битами блокировки в файл «lock.txt» и выводим содержимое этого файла на экран:
avrdude -p t13 -c usbasp -U lock:r:lock.txt:h cat lock.txt
- -U — выполнение операции с памятью;
- lock — область памяти, которая содержит фьюзы блокировки (Lock Fuses);
- : — разделитель;
- r — значит что будет выполняться операция чтения (read);
- lock.txt — имя файла, в который будет записана считываемая из памяти информация;
- h — формат данных шестнадцатеричный (hexadecimal).
Результат работы команд:
avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9007 avrdude: reading lock memory: Reading | ################################################## | 100% 0.00s avrdude: writing output file "lock.txt" avrdude: safemode: Fuses OK (E:FF, H:FF, L:7A) avrdude done. Thank you. 0x3f
Текущее значение байта с Lock Bits — 0x3F, что в двоичном представлении равно 00111111. В даташите на ATTiny13 указано что для изменения значимы только два бита — 00111111.
Изменив эти биты на 0 мы активируем соотвествующие биты блокировки, чем заблокируем возможность программирования и чтения внутренней Flash + EEPROM. В результате наш байт будет выглядеть вот так — 00111100, а в шестнадцатеричном представлении — 0x3C.
Для записи байта c Lock-битами в микроконтроллер ATtiny13 нужно выполнить следующую команду:
avrdude -p t13 -c usbasp -U lock:w:0x3c:m
Будьте предельно внимательны с этой командой, поскольку изменение 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 [
Разделяем полученное бинарное представление 00111010 на две равные части: 0011 и 1010. Конвертируем эти части в HEX, используя табличку выше: 0011 = 3, 1010 = A.
Соединяем полученные цифры в шестнадцатеричном формате: 0011 1010 = 3A. Получается, для того чтобы сбросить фьюз 4 (CKDIV8), а также активировать фьюз 6 (EESAVE) — нужно в младший фьюз-байт записать значение «0x3a».
Заключение
Работа с Fuses в AVR-микроконтроллере — это относительно не сложно, но стоит проявить внимательность. Главное не спешить и не лениться сверяться с официальной документацией.
Всю рутину по записи и считывании значений берет на себя «швейцарский нож» из мира AVR по имени AVRDude, нам лишь остается только правильно выполнить расчет нужного байта с фьюзами.
Удачного и результативного программирования!
- Javascript based AVR fuse calculator — калькулятор для расчета фьюзов и битов блокировки
- Easyelectronics — Конфигурация FUSE-бит
- Все что нужно знать о Fuse- и Lock-битах AVR микроконтроллеров (перевод статьи с embedds.com)