Здравствуйте, уважаемые читатели! В прошлой статье я рассказывал, как можно просто скопировать информацию с одного микроконтроллера на другой, используя ISP программатор, в качестве которого выступала Arduino UNO и самодельный модуль. Мы копировали Flash память и энергонезависимую память EEPROM . И вполне логично возникает вопрос, а можно ли как-то защитить микроконтроллер от подобного копирования.
Что такое Lock биты (Lock bits)
Да, такой метод существует и связан он с таким понятием как Лок биты ( Loc k bits ), т.е. биты блокировки. Эти биты в целом похожи на своих родственников Fuse биты, но и имеют свои отличия. Общее то, что Lock биты, как и Fuse биты являются битами конфигурации, хранятся в отдельной области памяти и единица означает, как и у фьюзов, что данный бит не установлен, не запрограммирован. А ноль , что установлен. Я про эту особенность рассказывал в отдельной статье , где было подробно про Fuse биты.
Но в отличие от фьюзов, которых достаточно много разновидностей и которые занимают от одного байта (для ATtiny10), до 3-х на микроконтроллерах начиная с ATtiny25/45/85 и большинстве других. Lock биты всегда занимают один байт.
Более того, задействуются в основном только два младших бита , которые и позволяют осуществить 2 разных варианта блокировки микроконтроллера.
Перейдем непосредственно к описанию Lock битов.
Режим 1 (LB Mode 1) где оба Lock бита равны 1, означает, что Lock биты не заданы и микроконтроллер работает в обычном режиме, где все функции доступны.
Режим 2 (LB Mode 2) где Lock бит LB 2 равен 1 , а Lock бит LB 1 равен 0 означает, что заблокирована перепрошивка микроконтроллера и изменение фьюзов как с помощью ISP программатора, так и с помощью высоковольтного программатора ("Как восстановить фьюзы на микроконтроллерах ATtiny13/25/45/85?").
Режим 3 (LB Mode 3) где оба Lock бита равны 0 , означает, что мы к тому же еще не сможем скопировать содержимое внутренней памяти микроконтроллера. Именно этот режим нас больше всего и интересует.
Как изменить Lock биты
Для примера возьмем ATtiny85. Подключаем микроконтроллер к ISP-программатору, в качестве которого выступает Arduino UNO. В микроконтроллер загружен скетч, который полностью очищает энергонезависимую память EEPROM и в первую ячейку данной памяти записывается число 5. И далее, в коде скетча, задано мигание светодиодом столько раз, сколько у нас записано в EEPROM памяти. Это нам поможет визуально наблюдать, какие изменения будут происходить с памятью в ходе дальнейших действий.
Запускаем утилиту, которую я уже показывал для изменения фьюзов. Она упрощает работу с программой avrdude . Я сюда добавил еще несколько строк, в которых мы можем прочитать установленные для микроконтроллера Lock-биты и изменить их. Ссылка на утилиту во вложении.
Вначале выбираем микроконтроллер. В данном случае это A Ttiny 85 и номер COM порта. У меня это com3.
Выбрав пункт 3 , можно прочитать Lock биты, установленные на микроконтроллере. В каталоге с утилитой создается файл lock.txt в который записывается лок байт в шестнадцатеричном представлении, т.е. FF, что соответствует 8 единицам в двоичной системе исчисления.
Если выбрать пункт 4 , то произойдет частичная блокировка микроконтроллера. Т.е. например, мы не сможем изменить фьюзы. Но скопировать прошивку всё равно сможем.
И только выбрав пункт 5 , мы заблокируем микроконтроллер от чтения и последующего копирования его внутренней памяти. Речь идет как о Flash памяти, так и о памяти EEPROM.
Т.е. при попытке копирования Flash памяти с помощью утилиты из прошлой статьи, создается файл flash.hex, который фактически пустой.
А при попытке копирования EEPROM памяти с помощью той же утилиты из прошлой статьи, создается файл eeprom .hex, который заполнен буквами F, т.е. в каждую ячейку записано значение 255. При этом, светодиод продолжает мигать 5 раз подряд. Т.е. записанная нами пятерка в нулевой ячейке памяти сохраняется, а это всё фиктивные данные.
И если выбрать пункт 6 , Chip Erase, вызывается программа avrdude с префиксом – e . Что приводит к полному стиранию чипа и возвращению к заводским установкам. Очищается и Flash и EEPROM память (если не установлен Fuse EESAVE ). Соответственно, подключенный к микроконтроллеру светодиод перестает мигать, т.к. память микроконтроллера пуста.
Еще одним способом вернуть чип к нормальной работе, является классическая загрузка скетча через ISP-программатор из среды Arduino IDE . Дело в том, что каждый раз, при загрузке нового скетча в среде Arduino IDE вызывается команда Chip Erase, которая и производит очистку памяти микроконтроллера и возвращение Lock битов в состояние по умолчанию.
Еще стоит отметить, что при работе с ATtiny13 значения Lock байта у не заблокированного микроконтроллера равно не FF , как у ATtiny85 и других микроконтроллеров, а 3F , что в двоичном представлении равно 0011 1111 . Таким образом, чтобы установить частичную блокировку нам нужно задать значение Lock байта равное 3E . А для полной блокировки – 3С . В отличие от остальных микроконтроллеров, где задается FE и FC , соответственно.
Вот об этом моменте нужно помнить при работе с ATtiny13.
Ссылка на скетч из статьи - https://disk.yandex.ru/d/23WrD4eJklEYrQ
Ссылка на утилиту для изменения фьюзов и битов блокировки - https://disk.yandex.ru/d/aB0ke523QH_I7g
Видео по материалам статьи:
_________________________________________________________
Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!
Другие публикации по теме:
- Создаем удобный модуль для программирования микроконтроллеров ATtiny.
- ATtiny13 и ATtiny85. Обзор и программирование с помощью Arduino.