Фьюзы микроконтроллеров 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
Про Ардуино и не только
Сегодня я хочу рассказать о том, что такое фьюзы, за что они отвечают и как их можно прочитать и записать в Ардуино. Рекомендую также заглянуть в предыдущую публикацию, т.к. работа с фьюзами возможна только через программатор.
Фьюзы (от английского Fuse bits) — это конфигурационные биты микроконтроллера, отвечающие за его предварительную настройку. Эти биты расположены в отдельном адресном пространстве, доступном только при программировании. Биты объединяются в конфигурационные байты и их состав зависит от конкретной модели микроконтроллера.
При работе с конфигурационными битами нужно помнить один важный момент: если бит содержит логическую единицу, то это означает что он не запрограммирован, соответственно, запрограммированный конфигурационный бит содержит логический ноль. Такая логика основана на принципе хранения данных в EEPROM: чистая микросхема памяти содержит во всех ячейках единицы, а термин запрограммирована по отношению к такой ячейке означает, что в нее записали ноль.
Фьюзы ATmega328 / ATmega328p
Микроконтроллеры ATmega328 и ATmega328p, на базе которых построено большинство плат семейства Ардуино, имеют 3 байта конфигурации: младший, старший и дополнительный. Их описание приведено ниже в таблицах.
Младший конфигурационный байт ATmega328/P
Номер бита | Навание | Описание | Значение по умолчанию |
---|---|---|---|
7 | CKDIV8 | Divide clock by 8 | 0 (запрограммирован) |
6 | CKOUT | Clock output | 1 (не запрограммирован) |
5 | SUT1 | Select start-up time | 1 (не запрограммирован) |
4 | SUT0 | Select start-up time | 0 (запрограммирован) |
3 | CKSEL3 | Select Clock source | 0 (запрограммирован) |
2 | CKSEL2 | Select Clock source | 0 (запрограммирован) |
1 | CKSEL1 | Select Clock source | 1 (не запрограммирован) |
0 | CKSEL0 | Select Clock source | 0 (запрограммирован) |
Старший конфигурационный байт ATmega328/P
Номер бита | Навание | Описание | Значение по умолчанию |
---|---|---|---|
7 | RSTDISBL | External Reset Disable | 1 (не запрограммирован) |
6 | DWEN | debugWIRE Enable | 1 (не запрограммирован) |
5 | SPIEN | Enable Serial Program and Data Downloading | 0 (запрограммирован) |
4 | WDTON | Watchdog Timer Always On | 1 (не запрограммирован) |
3 | EESAVE | EEPROM memory is preserved through the Chip Erase | 1 (не запрограммирован) |
2 | BOOTSZ1 | Select Boot Size | 0 (запрограммирован) |
1 | BOOTSZ0 | Select Boot Size | 0 (запрограммирован) |
0 | BOOTRST | Select Reset Vector | 0 (запрограммирован) |
Дополнительный конфигурационный байт ATmega328/P
Номер бита | Навание | Описание | Значение по умолчанию |
---|---|---|---|
7 | — | — | 1 |
6 | — | — | 1 |
5 | — | — | 1 |
4 | — | — | 1 |
3 | — | — | 1 |
2 | BODLEVEL2 | Brown-out Detector trigger level | 1 (не запрограммирован) |
1 | BODLEVEL1 | Brown-out Detector trigger level | 1 (не запрограммирован) |
0 | BODLEVEL0 | Brown-out Detector trigger level | 1 (не запрограммирован) |
Таким образом, значения конфигурационных байтов в ATmega328/P по умолчанию: Low: 0x62, High: 0xD9, Extended: 0xFF. Обратите внимание, это значения именно для «чистого» микроконтроллера ATmega328/P , а не для Ардуино. Значения фьюзов для Ардуино можно найти в файле Arduino_dir\hardware\arduino\avr\Boards.txt, где Arduino_dir — это путь к IDE Arduino. Откройте файл в текстовом редакторе и найдите интересующую плату по названию, чуть ниже будет информация о фьюзах:
uno.name=Arduino/Genuino Uno
.
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0x05
Для расшифровки шестнадцатеричных значений конфигурационных байтов удобно использовать онлайн калькулятор Engbedded Atmel AVR® Fuse Calculator:
Выберите модель микроконтроллера и введите значения фьюзов в соответствующие поля внизу страницы в разделе Current settings — введенные значения будут моментально расшифрованы и представлены в удобном виде. И, наоборот, можно изменить конфигурацию битов в разделах Manual fuse bits configuration и Feature configuration и получить значения конфигурационных байтов для записи в микроконтроллер.
Рассмотрим назначение конфигурационных битов более подробно.
CKDIV8
CKOUT
Конфигурационные биты SUT совместно с битами CKSEL определяют длительность задержки при старте микроконтроллера. Задержка необходима для того, чтобы источник тактовой частоты стабилизировался после подачи питания и вошел в свой рабочий режим. Величина задержки зависит от выбранного источника и составляет от 0 до 65мс. Конкретные значения можно найти в даташите.
CKSEL
Современные микроконтроллеры способны работать с различными источниками тактового сигнала. Выбор источника осуществляется установкой конфигурационных битов CKSEL. В таблице ниже приведены источники тактового сигнала, поддерживаемые микроконтроллерами ATmega328 / ATmega328P, и соответствующие им значения CKSEL.
Источник тактового сигнала | Значение CKSEL3..0 |
---|---|
Экономичный кварцевый генератор | 1111-1000 |
Кварцевый генератор | 0111-0110 |
Низкочастотный кварцевый генератор | 0101-0100 |
Внутренний RC-генератор на 128кГц | 0011 |
Внутренний калиброванный RC-генератор | 0010 |
Внешний сигнал синхронизации | 0000 |
Зарезервировано | 0001 |
RSTDISBL
Фьюз RSTDISBL управляет работой цифрового вывода микроконтроллера, совмещенного с входом внешнего сброса. Если RSTDISBL запрограммирован, то вывод может быть использован как обычный цифровой пин ввода/вывода. Если фьюз RSTDISBL не запрограммирован, то вывод используется для внешнего сигнала сброса: низкий уровень напряжения на нем приводит к генерации сигнала сброса микроконтроллера. Отключение внешнего сброса может быть оправдано при работе с микроконтроллерами, имеющими небольшое количество выводов, в других случаях лучше не трогать этот фьюз.
Все что нужно знать о Fuse- и Lock-битах AVR микроконтроллеров
Установка Fuse- и Lock-битов (битов конфигурации и блокировки) микроконтроллеров (МК) семейства Atmel AVR, особенно для начинающих, является достаточно сложной задачей и не редко может вызывать путаницу при настройке и программировании МК. Если вы какой-то бит пропустили или установили неверно, это может привести к неправильной работе программы или, что еще хуже, к невозможности запрограммировать МК внутрисхемно по последовательному интерфейсу.
Несмотря на то, что в технической документации на каждый МК дается исчерпывающая информация по Fuse- и Lock-битам, новички часто чувствуют себя несколько неуверенно перед выполнением команды записи битов конфигурации и блокировки. В статье мы рассмотрим основные особенности битов конфигурации МК семейства AVR.
Fuse- и Lock-биты
Перед тем как мы приступим к подробному разбору битов конфигурации, нужно уяснить и запомнить один момент:
- Fuse-бит = 1, означает, что он незапрограммирован (сброшен, неактивен);
- Fuse-бит = 0, означает, что он запрограммирован (установлен, активен).
Это один из основных источников возникающей путаницы в процессе программирования Fuse- и Lock-битов. Мы привыкли думать, что установить значение какого-либо параметра означает записать 1, верно? С Fuse-битами AVR – наоборот, установка какого-либо бита означает запись 0, и это нужно помнить.
Биты конфигурации расположены в отдельной области энергонезависимой памяти. К примеру, МК ATmega328P имеет четыре конфигурационных байта, которые необходимо запрограммировать для корректного функционирования. Один из этих байтов содержит биты блокировки, оставшиеся три (часто именуемые старший, младший и расширенный) – содержат конфигурационные биты. Этот набор битов устанавливает начальные настройки МК: источник тактового сигнала, область загрузчика, функционирование аппаратного сброса, сторожевого таймера и пр. Сначала мы рассмотрим биты блокировки (Рисунок 1).
Рисунок 1. | Lock-биты микроконтроллеров AVR. |
В зависимости от типа микроконтроллера AVR количество Lock-битов может быть различным, но два младших бита всегда присутствуют. Биты LB1 и LB2 используются для блокировки доступа к встроенной Flash-памяти. Вы, наверное, знаете, что разработчики каких-либо устройств практически всегда блокируют чтение прошивки МК, чтобы защитить свою интеллектуальную собственность и предотвратить создание дубликатов и подделок. Чтение заблокированного микроконтроллера – это как конфета для аппаратных хакеров, но это отдельная тема. Так, если нужно защитить свою прошивку от копирования, необходимо заблокировать содержимое памяти микроконтроллера, в противном случае оставьте биты без изменения. Другие биты блокировки (BLB01, BLB02, BLB11 и BLB11) могут использоваться для блокировки записи/чтения в/из Flash-памяти, как из области приложения, так и из секции загрузчика. Биты блокировки довольно редко программируются (зависит от специфики приложения), мы не будем на них заострять внимание. Даже если вы запрограммируете любой из них – биты блокировки сбрасываются (устанавливаются в 1) во время выполнения команды полного стирания кристалла (Chip Erase).
Больше всего нас интересуют биты конфигурации, с ними вам придется иметь дело очень часто, хотите вы этого или нет. Расположение определенных Fuse-битов в трех байтах конфигурации отличается в зависимости от используемого МК. Для примера, мы рассмотрим ATmega328P, имеющий три байта конфигурации (Рисунок 2).
Посмотрите на состав младшего байта. Вы видите группу из 4 одинаковых битов CKSEL0, CKSEL1, CKSEL2, CKSEL3. Они используются для выбора типа источника тактовых сигналов для микроконтроллера МК. По-умолчанию (заводские установки) микроконтроллер настроен на работу от внутреннего RC осциллятора 8 МГц. Логически это самый безопасный вариант работы с микроконтроллером. Но, как известно, приборы семейства AVR могут работать от различных источников тактовой частоты:
- калиброванный внутренний RC осциллятор (по умолчанию 8 МГц);
- внешний RC осциллятор;
- внешний керамический или кварцевый резонатор;
- внешний низкочастотный кварц;
- внешний источник тактового сигнала.
Для каждого из представленных режимов тактирования имеется диапазон установок Fuse-битов CKSEL0..3, которые используются для управления частотой тактового генератора и временем выхода микроконтроллера на рабочий режим из режима пониженного энергопотребления. Эти биты тесно связаны с битами SUT0 и SUT1, фактически управляющими временем запуска микроконтроллера после подачи питания. Задержка запуска необходима для стабилизации генерации керамических резонаторов и кварцев. Точные значения времени выхода микроконтроллера на рабочий режим приводятся в технической документации.
Конфигурационный бит CKOUT разрешает/запрещает вывод тактовой частоты на один из выводов МК; для ATmega328P на вывод PORTB0 (для тактирования других устройств), причем независимо от того, какой используется источник тактирования МК. Если бит запрограммирован, то для пользовательского приложения основная и альтернативные функции порта PB0 недоступны.
Последний бит в младшем байте – CKDIV8. По умолчанию этот бит установлен, что означает подключение к внутреннему RC осциллятору 8 МГц делителя частоты с коэффициентом 8, поэтому системная тактовая частота МК в этом случае будет равна 1 МГц. Если вам нужна тактовая частота 8 МГц, бит CKDIV8 нужно сбросить.
Теперь акцентируем внимание на старшем конфигурационном байте.
Первый бит – BOOTRST, который по умолчанию сброшен. Если этот бит установить, то после подачи питания на микроконтроллер или после сброса микроконтроллер начнет выполнение программы из загрузочного сектора. Проще говоря, если в приложении требуется выполнение функций загрузчика из Flash-памяти, то этот бит нужно запрограммировать. Если необходимо просто запрограммировать микроконтроллер по внутрисхемному интерфейсу, то можно оставить этот бит нетронутым.
При использовании загрузчика немаловажное значение приобретают биты BOOTSZ0 и BOOTSZ1. Они задают область Flash-памяти для загрузчика. Если программный код загрузчика вашего приложения имеет маленький объем, то с помощью битов конфигурации можно выделить область Flash-памяти меньшего размера для загрузчика, а остальное оставить для приложения.
Следующий бит EESAVE. Если его запрограммировать (0), то содержимое энергонезависимой памяти данных EEPROM останется нетронутым во время процедуры стирания кристалла (Chip Erase). В большинстве случаев это полезная функция, например, когда в EEPROM хранятся важные данные или калибровочные параметры и необходимо выполнить обновление прошивки, то перед заменой прошивки запрограммируйте бит EESAVE.
После установки бита WDTON сторожевой таймер микроконтроллера включается сразу после подачи питания, и выключить программно его невозможно. В этом случае сторожевой таймер будет постоянно выполнять свою функцию периодического сброса микроконтроллера, если в коде программы не выполнять специальную команду сброса сторожевого таймера. Если бит WDTON не установлен, то включение/отключение сторожевого таймера осуществляется программно.
Бит SPIEN предназначен для отключения последовательного интерфейса программирования микроконтроллера. На самом деле вы не сможете изменить состояние этого бита используя последовательный интерфейс (МК AVR поддерживают еще два режима параллельного программирования), но известны случаи изменения состояния бита SPIEN при некорректной работе или сбое внутрисхемного программатора.
Аналогичная ситуация с битом RSTDSBL – он используется для отключения функции аппаратного сброса, другими словами вывод сброса МК используется как порт ввода/вывода. В некоторых ситуациях (МК с малым числом линий ввода/вывода) это очень удобно, но в целом не рекомендуется. Ошибочная установка бита RSTDSBL может лишить вас возможности программировать микроконтроллер по SPI, т. к. наличие сигнала сброса – обязательное условие включения режима программирования.
Бит DWEN используется для включения специального отладочного интерфейса DebugWire микроконтроллеров AVR. Изменить состояние битов SPIEN, RSTDSBL и DWEN по последовательному интерфейсу невозможно, для этого потребуется параллельный программатор с поддержкой высоковольтного режима программирования или подключение по интерфейсу DebugWire.
Следует отметить еще бит CKOPT в старшем байте конфигурации (в ATmega328P он отсутствует, но есть в других МК AVR), управляющий режимом работы усилителя тактового генератора. Если бит запрограммирован (0), то выходной сигнал тактового генератора имеет размах (амплитуду), равный напряжению питания. Использовать эту опцию можно, когда микроконтроллер будет работать в обстановке с высоким уровнем помех, а также когда планируется подключить еще один микроконтроллер к выводу XTAL2. В других случаях этот режим нужно отключить (CKOPT=1), поскольку увеличивается энергопотребление микроконтроллера, а это не приветствуется в устройствах с батарейным питанием.
Последний конфигурационный байт (расширенный). Для микроконтроллера Atmega328P в нем содержатся три бита: BODLEVEL0, BODLEVEL1, BODLEVEL2. Эти биты предназначены для установки порога срабатывания схемы детектора напряжения питания: когда напряжения питания достигнет установленного уровня, произойдет сброс микроконтроллера.
Калькулятор значений Fuse-битов
Когда вам потребуется запрограммировать новый МК, для установки Fuse-битов вы можете воспользоваться техническим описанием на микроконтроллер. Но есть более удобный и простой способ – калькулятор Fuse-битов – онлайн инструмент, разработанный Марком Хаммерлингом (Рисунок 3). Вы самостоятельно выбираете тип микроконтроллера и включаете/выключаете необходимые опции, а конфигурация Fuse-битов будет обновляться автоматически.
Рисунок 3. | В онлайн калькуляторе Fuse-битов МК AVR пользователь может самостоятельно выбирать необходимые опции. |
Кроме того, вы можете индивидуально устанавливать Fuse-биты в отдельной форме, значения младшего, старшего и расширенного байта конфигурации также будут обновляться автоматически (Рисунок 4), одновременно генерируются команды для программатора AVRDude.
Рисунок 4. | При индивидуальной установке Fuse-битов значения байтов конфигурации обновляются автоматически. |
Если у вас есть мобильный телефон или планшетный ПК с ОС Android, можно воспользоваться бесплатным приложением AVR Fuse Calculator, которое выполняет те же функции и генерирует команды для программатора AVRDude. В базе данных программы 144 МК AVR.
Биты защиты. Разбираем способы защиты микроконтроллеров
Рекомендую ознакомиться с моей прошлой статьей, в которой более подробно описаны микроконтроллеры, о которых говорится ниже.
В семействе AVR для настройки применяются фьюзы. Фьюзы (от англ. fuse — предохранитель) — это особые биты в микроконтроллере, которые, как и все биты, хранят информацию. Их основные особенности следующие:
- они хранятся и прошиваются отдельно от остальной памяти;
- изменяются только извне;
- управляют работой микроконтроллера на самом низком уровне.
Лучше всего их можно объяснить на примере дозиметра РКСБ-104.
Дозиметр РКСБ-104
Основная настройка его выполнялась одним переключателем на передней панели. А вот более тонкие настройки требовали снять защитную крышку с задней стенки и воспользоваться маленькими переключателями (белые посередине).
Задняя панель со снятой крышкой
В AVR эти биты для удобства соединяются в байты: старший, младший, защитный и дополнительный. К каждому биту можно получить доступ по принципу байт → бит. Младший байт обычно отвечает за тактирование, а старший — за плюшки. Биты отличаются от чипа к чипу, поэтому с каждым чипом в идеале стоит разбираться отдельно с помощью документации.
Значение битов в этом семействе инвертировано: 1 значит, что бит стерт, а 0 — что установлен. Но вот программы для прошивки МК работают по‑разному. Для разных программ нужно уточнять логику работы с фьюзами.
Что могут фьюзы в этом семействе МК:
- управление тактированием (частота генератора, внешний или внутренний генератор);
- разрешение на чтение прошивки микроконтроллера (самое интересное, но об этом позже);
- управление таймерами;
- защита EEPROM;
- более специфичные функции, их надо уточнять к конкретному чипу.
Самые «популярные» биты:
- CKSEL — их четыре, и они отвечают за тактирование;
- SUT — их два, и они управляют режимом запуска тактирования;
- CKOPT — конфигурирует внутренний генератор;
- RSTDISBL — режим работы ножки RESET МК;
- SPIEN — разрешение SPI;
- EESAVE — защита EEPROM;
- BOOTRST — адрес, откуда начать исполнять код;
- BODEN — контроль питания;
- SELFPRGEN — разрешение записи в память изнутри;
- OCDEN — вот он, бит, разрешающий чтение прошивки.
Считывают фьюзы обычно не вручную, а с помощью специальных калькуляторов. Вот один из них — Fusecalc.
warning
При работе с фьюзами будь предельно внимателен. Неправильно выставленный бит может превратить чип в «кирпич». Перед прошивкой уточняй логику работы с фьюзами в твоей программе.
Linux
Я обычно работал с программой avrdude. Приведу пару команд без дополнительных параметров (чип, программатор). Считывание прошивки из чипа в файл:
Считывание энергонезависимой памяти в файл:
Запись прошивки из файла в чип:
Запись энергонезависимой памяти из файла:
Запись фьюзов ( 0xc3 -> lfuse ; 0x99 -> hfuse ):
Чтение фьюзов в файлы:
Есть дополнительные параметры -с и -p . Первый отвечает за программатор, а второй — за чип. В качестве примера — команда для прошивки контроллера ATmega328p с помощью USBASP:
В командах есть странные строки вида flash: w: flash_dump. hex . Это строки в специальном формате для avrdude . Для чего такое решение — не знаю ни я, ни кто‑либо еще.
Части этих строк разделены двоеточиями:
- первая часть — область памяти в МК (например, flash или lfuse );
- вторая — направление ( w — write или r — read);
- третья — файл на локальном устройстве (например, файл с прошивкой);
- последняя (опциональная) — формат файла (например, r — raw или i — ihex, интеловский шестнадцатеричный).
Более специфичные случаи применения этой строки выходят за рамки данной статьи.
Windows
Оконщики обычно пользуются программами с GUI. Например, AvrDude GUI.
Первая вкладка предназначена для загрузки прошивки. Мы видим и можем выбрать целевое устройство, формат файлов прошивки и пути к самим файлам. Один предназначен для программы, другой — для энергонезависимой памяти.
Вторая вкладка конфигурирует программатор: какая используется модель и на каком порте она сидит.
Вкладка управления защитными битами.
А вот наконец и фьюзы. Задаются они как байты.
Как видишь, все просто, и использовать фьюзы можно, даже не открывая терминал!
На Arduino можно конфигурировать МК, не задумываясь о работе фьюзов. Этим занимается Arduino IDE в автоматическом режиме.
В семействе STM для задания конфигурации используются биты в специальных регистрах. Информацию об этих регистрах и их назначении ищи в документации. Менять значения этих регистров можно и нужно на ходу, но, в отличие от AVR, конфигурируется тут не только самое низкоуровневое (тактирование, например), но и всякая мелкая периферия.
Настраивать надо много, даже если проект в духе Hello world, поэтому обычно это делается не ручной записью регистров, а с помощью красивого и мощного софта.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее