Календарь |
« Март 2018 » | Пн | Вт | Ср | Чт | Пт | Сб | Вс | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|
Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
Мой сайт |
|
Главная » 2018 » Март » 20 » Какие фьюзы лучше не трогать
21:28 Какие фьюзы лучше не трогать |
Fuse-биты — это не страшно.
 YS
6 лет ago
В своей практике я не раз встречался с тем, что 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-битах нет ничего страшного, всю необходимую информацию можно получить из даташита. Главное — хорошо осознавать цель их установки и быть предельно внимательным при конструировании значения нужного байта.
|
Просмотров: 307 |
Добавил: marwell
| Рейтинг: 0.0/0 |
|
|