unbricker
ch32v003_unbricker.py
Небольшой скрипт на Python предназначен для раскирпичивания микроконтроллеров CH32V003.
Описание проблемы
Микроконтроллер типа CH32V003J4M6 выпускается в корпусе SOP8, у которого всего 8 выводов. Почти все ноги имеют двойное-, тройное и даже больше назначение.
Так например, на ножку 8 выведены сигналы сразу с трёх контактных площадок кремниевого чипа. При грамотном их использовании эти сигналы друг другу не мешают и, соответственно, не приводят к каким-либо фатальным последствиям. Более того, этот же вывод используется для управления микроконтроллером со стороны программатора, то есть для программирования и других задач.
Программист-разработчик может смело использовать этот вывод в качестве входа для портов PD1, PD4, PD5, а также с может использовать в качестве входа альтернативных функций, совмещённых с этими портами, если эти функции входа.
Проблема возникает, если этот вывод использовать в качестве выхода названных портов или альтернативных функций, подразумевающих выход.
Почему? Да потому, что если программист определит ножку на выход, то программатор уже не сможет "достучаться" через неё до микроконтроллера.
Понятно, что такое происходит тогда, когда программатор пытается обратится к микроконтроллеру. Тут следует заметить, что "непродуманная" программа, которая переводит ножку на выход, переключает ножку на выход на сразу после снятия сигнала сброс, а через некоторое время.
Сначала микроконтроллеру нужно настроить стек, проинициализировать тактовую систему, проинициализировать переменные в памяти и так далее. На это уходит какое-то время. Несколько десятков (а может и сотню-другую) микросекунд. Но это всё равно очень малое время, значительно меньшее, чем скорость реакции человека.
Учитывая, что у микроконтроллера CH32V003J4M6 отсутствует вывод (ножка на корпусе) для сигнала NRST, ситуация становится вообще плачевная. Ведь единственный сигнал сброса, которым можно хоть как-то управлять микроконтроллером, осуществляется внутренней схемой POR/PDR. И в результате получается так, что нужно очень сильно исхитрится, чтобы после подачи питания на микроконтроллер суметь внутри этих десятков микросекунд обратиться к микроконтроллеру программатором. Задача не то, чтобы из разряда нелёгких, скорее даже из разряда невыполнимых руками человека.
Поэтому на практике у программистов иногда случается случайно "окирпичить" этот микроконтроллер.
Работа скрипта
Скрипт написан на Python. Обкатка и проверка осуществлялись на Линуксе (Debian). Поскольку Python кросс-платформенный, то, я думаю, что скрипт под Виндовсом тоже должен работать. (Хотя, если честно, то я не проверял.)
Для раскирпичивания нужно всё соединить как обычно: компьютер, программатор и микроконтроллер. Ничего дополнительного делать не надо. Скрипт -- это консольная программа, которая работает в терминальном окне, поэтому запускается одной командой:
$ ch32v003_unbricker.py
Через секунду-две, а в некоторых случая и быстрее, микроконтроллер будет раскирпичен.
ВНИМАНИЕ! На всякий случай напоминаю, что процесс раскирпичивания очищает флешь и снимет защиты от её считывания.
Предустановка необходимого программного обеспечения
Сейчас я говорю про Линукс. Про Виндовс ничего не скажу, я, можно сказать, его не знаю совсем.
В целом для работы раскирпичивателя нужен сам Python и три дополнительных к нему пакета:
- pyusb
- pyserial
- hid
Python на компах с Линуксом обычно уже установлен, поэтому всё, что необходимо сделать -- это проинсталлировать три пакета.
$ pip3 install pyusb pyserial hid -U
В конце команды находится ключик -U (вместо него можно написать --uprgade). Если у вас на компе уже установлены эти пакеты, то этот ключик позволит их проапгрейдировать.
Бывают случаи (редко, но иногда я сталкиваюсь с этим), что на копме отсутствует питоновский установщик pip. Если что, то установить его можно командой:
python3 -m pip install --upgrade pip
Особенности установки программы в Windows
Товарищ, пожелавший остаться инкогнито, столкнулся с проблемой отсутствия в Windows библиотеки libusb. Если она не установлена, то скрипт, понятное дело, вообще не увидит программатор.
Товарищ нашёл решение тут. Решение заключается в том, что нужно установить библиотеки pyusb и libusb:
pip install pyusb
pip install libusb
После нужно добавить libusb в переменные окружения Windows (необходимо указать полный путь до папки):
Другой вариант -- после установки libusb (pip install libusb) зайти в папку с библиотекой
(или
, соответственно), найти там файл libusb-1.0.dll и положить его в папку
. В этом случае вносить никаких изменений в переменные окружения Windows не надо.
Про кишки
Скрипт небольшой. Мне кажется, что понять его работу будет несложно. Тем более, что я не поленился и натыкал в тексте скрипта немного комментариев. Думаю, они помогут вам разобраться, как оно работает.
Кому интересно еще погрузиться в тему раскирпичивания и посмотреть на осциллограммы процесса, могут почитать мою статью на wordpress
Обратная связь
Обсудить работу скрипта или как-то повлиять на его функционал, а так же высказать мне всё, что вы думаете по этому поводу, можно в Телеге
или пишите мне на почту
Языки
Python