Если ты занимался микроконтроллерами, то, конечно, слышал о битах конфигурации. Для разных семейств они называются по‑разному: в AVR это фьюзы, а в PIC — конфигурационное слово. Сегодня мы разберемся с ними поподробнее, а еще рассмотрим их применение для защиты прошивки в контроллере. И это не был бы «Хакер», если бы мы не показали способы обхода такой защиты. Поехали!
Рекомендую ознакомиться с моей прошлой статьей, в которой более подробно описаны микроконтроллеры, о которых говорится ниже.
В семействе AVR для настройки применяются фьюзы. Фьюзы (от англ. fuse — предохранитель) — это особые биты в микроконтроллере, которые, как и все биты, хранят информацию. Их основные особенности следующие:
Лучше всего их можно объяснить на примере дозиметра РКСБ-104.
Основная настройка его выполнялась одним переключателем на передней панели. А вот более тонкие настройки требовали снять защитную крышку с задней стенки и воспользоваться маленькими переключателями (белые посередине).
В AVR эти биты для удобства соединяются в байты: старший, младший, защитный и дополнительный. К каждому биту можно получить доступ по принципу байт → бит. Младший байт обычно отвечает за тактирование, а старший — за плюшки. Биты отличаются от чипа к чипу, поэтому с каждым чипом в идеале стоит разбираться отдельно с помощью документации.
Значение битов в этом семействе инвертировано: 1 значит, что бит стерт, а 0 — что установлен. Но вот программы для прошивки МК работают по‑разному. Для разных программ нужно уточнять логику работы с фьюзами.
Что могут фьюзы в этом семействе МК:
Самые «популярные» биты:
CKSEL
— их четыре, и они отвечают за тактирование;SUT
— их два, и они управляют режимом запуска тактирования;CKOPT
— конфигурирует внутренний генератор;RSTDISBL
— режим работы ножки RESET МК;SPIEN
— разрешение SPI;EESAVE
— защита EEPROM;BOOTRST
— адрес, откуда начать исполнять код;BODEN
— контроль питания;SELFPRGEN
— разрешение записи в память изнутри;OCDEN
— вот он, бит, разрешающий чтение прошивки.Считывают фьюзы обычно не вручную, а с помощью специальных калькуляторов. Вот один из них — Fusecalc.
При работе с фьюзами будь предельно внимателен. Неправильно выставленный бит может превратить чип в «кирпич». Перед прошивкой уточняй логику работы с фьюзами в твоей программе.
Я обычно работал с программой avrdude. Приведу пару команд без дополнительных параметров (чип, программатор). Считывание прошивки из чипа в файл:
$ avrdude -U flash:r:flash_dump.hex:i
Считывание энергонезависимой памяти в файл:
$ avrdude -U eeprom:r:eeprom_dump.raw:r
Запись прошивки из файла в чип:
$ avrdude -U flash:w:flash_dump.hex
Запись энергонезависимой памяти из файла:
$ avrdude -U eeprom:w:eeprom_dump.raw
Запись фьюзов (0xc3 -> lfuse
; 0x99 -> hfuse
):
$ avrdude -U lfuse:w:0xc3:m -U hfuse:w:0x99:m
Чтение фьюзов в файлы:
$ avrdude -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h
Есть дополнительные параметры -с
и -p
. Первый отвечает за программатор, а второй — за чип. В качестве примера — команда для прошивки контроллера ATmega328p с помощью USBASP:
$ avrdude -U flash:w:flash_dump.hex -c usbasp -p m328p
В командах есть странные строки вида flash:w:flash_dump.hex
. Это строки в специальном формате для avrdude
. Для чего такое решение — не знаю ни я, ни кто‑либо еще.
Части этих строк разделены двоеточиями:
flash
или lfuse
);w
— write или r
— read);r
— raw или i
— ihex, интеловский шестнадцатеричный).Более специфичные случаи применения этой строки выходят за рамки данной статьи.
Оконщики обычно пользуются программами с GUI. Например, AVRdude GUI.
Первая вкладка предназначена для загрузки прошивки. Мы видим и можем выбрать целевое устройство, формат файлов прошивки и пути к самим файлам. Один предназначен для программы, другой — для энергонезависимой памяти.
Вторая вкладка конфигурирует программатор: какая используется модель и на каком порте она сидит.
Вкладка управления защитными битами.
А вот наконец и фьюзы. Задаются они как байты.
Как видишь, все просто, и использовать фьюзы можно, даже не открывая терминал!
На Arduino можно конфигурировать МК, не задумываясь о работе фьюзов. Этим занимается Arduino IDE в автоматическом режиме.
В семействе STM для задания конфигурации используются биты в специальных регистрах. Информацию об этих регистрах и их назначении ищи в документации. Менять значения этих регистров можно и нужно на ходу, но, в отличие от AVR, конфигурируется тут не только самое низкоуровневое (тактирование, например), но и всякая мелкая периферия.
Настраивать надо много, даже если проект в духе Hello world, поэтому обычно это делается не ручной записью регистров, а с помощью красивого и мощного софта.
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
1 год7690 р. |
1 месяц720 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости