Содержание статьи
info
Рекомендую ознакомиться с моей прошлой статьей, в которой более подробно описаны микроконтроллеры, о которых говорится ниже.
AVR
В семействе AVR для настройки применяются фьюзы. Фьюзы (от англ. fuse — предохранитель) — это особые биты в микроконтроллере, которые, как и все биты, хранят информацию. Их основные особенности следующие:
- они хранятся и прошиваются отдельно от остальной памяти;
- изменяются только извне;
- управляют работой микроконтроллера на самом низком уровне.
Лучше всего их можно объяснить на примере дозиметра РКСБ-104.
Основная настройка его выполнялась одним переключателем на передней панели. А вот более тонкие настройки требовали снять защитную крышку с задней стенки и воспользоваться маленькими переключателями (белые посередине).
В AVR эти биты для удобства соединяются в байты: старший, младший, защитный и дополнительный. К каждому биту можно получить доступ по принципу байт → бит. Младший байт обычно отвечает за тактирование, а старший — за плюшки. Биты отличаются от чипа к чипу, поэтому с каждым чипом в идеале стоит разбираться отдельно с помощью документации.
Значение битов в этом семействе инвертировано: 1 значит, что бит стерт, а 0 — что установлен. Но вот программы для прошивки МК работают по‑разному. Для разных программ нужно уточнять логику работы с фьюзами.
Что могут фьюзы в этом семействе МК:
- управление тактированием (частота генератора, внешний или внутренний генератор);
- разрешение на чтение прошивки микроконтроллера (самое интересное, но об этом позже);
- управление таймерами;
- защита EEPROM;
- более специфичные функции, их надо уточнять к конкретному чипу.
Самые «популярные» биты:
-
CKSEL
— их четыре, и они отвечают за тактирование; -
SUT
— их два, и они управляют режимом запуска тактирования; -
CKOPT
— конфигурирует внутренний генератор; -
RSTDISBL
— режим работы ножки RESET МК; -
SPIEN
— разрешение SPI; -
EESAVE
— защита EEPROM; -
BOOTRST
— адрес, откуда начать исполнять код; -
BODEN
— контроль питания; -
SELFPRGEN
— разрешение записи в память изнутри; -
OCDEN
— вот он, бит, разрешающий чтение прошивки.
Считывают фьюзы обычно не вручную, а с помощью специальных калькуляторов. Вот один из них — Fusecalc.
Софт
warning
При работе с фьюзами будь предельно внимателен. Неправильно выставленный бит может превратить чип в «кирпич». Перед прошивкой уточняй логику работы с фьюзами в твоей программе.
Linux
Я обычно работал с программой 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
; 0x99
):
$ 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:
. Это строки в специальном формате для avrdude
. Для чего такое решение — не знаю ни я, ни кто‑либо еще.
Части этих строк разделены двоеточиями:
- первая часть — область памяти в МК (например,
flash
илиlfuse
); - вторая — направление (
w
— write илиr
— read); - третья — файл на локальном устройстве (например, файл с прошивкой);
- последняя (опциональная) — формат файла (например,
r
— raw илиi
— ihex, интеловский шестнадцатеричный).
Более специфичные случаи применения этой строки выходят за рамки данной статьи.
Windows
Оконщики обычно пользуются программами с GUI. Например, AvrDude GUI.
Первая вкладка предназначена для загрузки прошивки. Мы видим и можем выбрать целевое устройство, формат файлов прошивки и пути к самим файлам. Один предназначен для программы, другой — для энергонезависимой памяти.
Вторая вкладка конфигурирует программатор: какая используется модель и на каком порте она сидит.
Вкладка управления защитными битами.
А вот наконец и фьюзы. Задаются они как байты.
Как видишь, все просто, и использовать фьюзы можно, даже не открывая терминал!
info
На Arduino можно конфигурировать МК, не задумываясь о работе фьюзов. Этим занимается Arduino IDE в автоматическом режиме.
STM
В семействе STM для задания конфигурации используются биты в специальных регистрах. Информацию об этих регистрах и их назначении ищи в документации. Менять значения этих регистров можно и нужно на ходу, но, в отличие от AVR, конфигурируется тут не только самое низкоуровневое (тактирование, например), но и всякая мелкая периферия.
Настраивать надо много, даже если проект в духе Hello world, поэтому обычно это делается не ручной записью регистров, а с помощью красивого и мощного софта.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»