Главная > AVR > Fuse-биты — это не страшно.

Fuse-биты — это не страшно.

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

Что такое lock/fuse биты?

Все знают, что МК AVR имеют три области памяти: flash, где хранится программа, SRAM — оперативная память, и EEPROM, в которую программа может писать то, что необходимо сохранить после отключения питания. Так вот, есть и четвертая область памяти, доступная для программирования. Она состоит из нескольких байт (например, в ATmega48 четыре байта – один для lock-битов, и байты fuse – low, high и extended), в которых и располагаются эти легендарные биты.

Для чего они нужны?

Любой человек, знакомый с микроконтроллерами, привычен к тому, что конфигурирование периферии производится снятием/установкой битов в определенных регистрах. Собственно, байты, содержащие fuse/lock биты, можно сравнить с регистрами, управляющими самыми общими системными настройками: какую память можно читать/писать и можно ли вообще, какой источник тактирования использовать и делить ли его частоту (и на сколько), как быстро система будет входить в рабочий режим, как будет осуществляться программирование и т.д.

Почему их так боятся?

Тому есть несколько причин. Как уже говорилось, lock/fuse биты управляют самыми базовыми настройками МК, касающимися, в том числе, и методов его программирования и тактирования. Поэтому, неправильно установив их, очень легко получить нерабочий кристалл. Ситуацию усугубляет то, что активным (установленным), т.е., действующим, является lock/fuse бит, имеющий значение НОЛЬ, что вносит путаницу. Отдельную проблему представляют графические среды, в которых установка настроек производится чекбоксами. В них нет единого стандарта, и потому требуется внимательно следить за тем, что же означает галочка — единицу или ноль в интересующем бите.

Но на самом деле все не так страшно. Подробная информация о lock/fuse битах располагается в разделе Memory programming даташита на любой МК AVR. Потому самый главный совет – внимательно и вдумчиво читать описание перед тем, как что-то менять.

Распространенные проблемы.

Теперь о том, как избежать неприятностей.

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

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

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

DWEN – включает отладку через DebugWire. Поскольку вывод DW совмещен с выводом reset, этот бит имеет тот же конечный эффект, что и RSTDISBL.

SPIEN – отключает внутрисхемное программирование через SPI.

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

Следующие по силе действия – биты группы CKSELn. Они определяют опции тактирования. По умолчанию большинство МК поставляются работающими от встроенного генератора. CKSELn же дают возможность запустить контроллер от внешнего кварца/тактового сигнала. Собственно, если оный отсутствует, то МК не будет подавать признаков жизни. Лечится это состояние достаточно легко – нужно только подпаять к ножкам XTAL любой кварцевый резонатор (можно даже навесом без конденсаторов), либо спаять простенький генератор на пару мегагерц и подать тактовый сигнал с него туда же. Кристалл оживет и позволит установить правильную конфигурацию. Хотя, если контроллер в корпусе TQFP запаян в плату, а ножки XTAL не разведены, задача может превратиться в небольшой, но увлекательный квест. Поэтому перед программированием этих битов рекомендуется проверить их еще пару раз, если на плате нет резонатора.

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

Экспериментатора также может удивить эффект бита BOOTRST. Оный принуждает программу стартовать с секции бутлоадера, а не с начала (0x0000). Потому его также лучше не трогать, если, конечно, не пишется бутлоадер.

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

Итак, резюмируя сказанное, несколько простых правил, применимых в большинстве случаев, когда не стоит специальных задач:


— lock-биты трогать вообще не следует;
RSTDISBL, DWEN, SPIEN трогать категорически нельзя.
CKSELn стоит проверять до тех пор, пока не появится уверенности в их абсолютной правильности.
— остальные биты в основном безобидны, но менять их все же желательно с ясным пониманием цели.

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

Пример.

ATmega48 приходит с завода, настроенная на тактирование от внутреннего генератора частотой 8МГц. При этом у нее также запрограммирован fuse-бит CKDIV8, который управляет предделением тактовой частоты кристалла на 8. Таким образом, результирующая частота МК составляет 1МГц. Для меня это маловато, и я всегда в самом начале сбрасываю этот фьюз, чтобы использовать все 8МГц.

Как уже упоминалось, для однозначности желательно использовать такую утилиту для прошивки, которая позволяет задать фьюзы числом. Я использую консольный AVRdude, потому с этим проблем нет.

Итак, лезем в даташит, и смотрим, где же находится этот CKDIV8. Из таблицы на странице 288 ясно, что нас интересует младший байт фьюзов:

Его исходное значение – 0b01100010. CKDIV8 – седьмой бит. Остальные нас устраивают, трогать их не надо. Меняем только старший бит, новое значение младшего байта фьюзов – 0b11100010=0xE2. Командная строка для AVRdude будет иметь вид:

avrdude.exe -p m48 -c ftbb -P ft0 -e -U lfuse:w:0xE2:m -B 4800 -u

-p m48 — наш МК — ATmega48;
-c ftbb -P ft0я использую ftbb;
-e — стереть чип перед выполнением указанных действий;
-U lfuse:w записать младший (lfuse) байт фьюзов
:0xE2:m — числом 0xE2;
-B 4800 — делать это помедленнее, чтобы наверняка;
-u — делать, что велено и не ругаться.

Заключение

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

Рубрики:AVR
  1. 13/12/2012 в 14:51

    Reblogged this on Robotics and commented:
    საინტერესო სტატია Fuse — ბიტებთან დაკავშირებით «https://embedderslife.wordpress.com/»

  2. YS
    20/12/2012 в 16:20

    Я так понял, там тоже статья про fuse-биты. Жалко я не понимаю грузинского.🙂

  1. 20/12/2012 в 15:02

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s