J-Link OpenSource Hardware v9.x

Обновили редактор записей в вордпрессе, стало намного удобнее, появились интересные фишки, а это значит, что надо пересилить лень и опробовать новый редактор на небольшой статье о самодельном варианте отладчика-программатора, который можно прошить в J-Link v9.x.

Внимание! Материал ниже представлен исключительно в ознакомительных целях, и если Вам необходим J-Link в коммерческих целях, то следует приобрести отладчик у официального дилера.

Реклама

Всё началось с проекта на гитхабе от китайского инженера — Kevincoooool/MCU_Link_Diy, тут можно найти проект для Альтиума и bootloader, есть ещё и утилита для выковыривания прошивок из DLL драйверов J-Link, но она не работает с последними версиями драйверов (да и не столь она нужна, самое главное, есть bootloader). Ну что же, посмотрим проект…

Схемотехника

Уже глядя на фотографии собранного отладчика, можно заметить некоторые недочёты:

  • отсутствуют согласователи уровней, а значит, целевая плата может быть только с +3,3 В уровнями;
  • выходы МК всегда подключены к выводам JTAG через резисторы (т. к. согласователи уровней отсутствуют), и это может создавать проблемы повышенного потребления или возникновения помех или даже отваливания отладчика (вот тут описаны подобные проблемы с использованием такого же отладчика);
  • 10-контактный разъём JTAG также не соответствует стандартной распиновке;
  • несколько небрежная разводка, особенно «радуют» переходные отверстия 0,3 мм с пояском в 0,1 мм.

Пример последнего пункта:

В итоге, насмотревшись на всё это дело, я решил сделать свою версию отладчика без этих недочётов и со своими приколами. :D Для начала была откопана ещё одна схема, J-Link v9.3, она тоже не идеальна, но проливает свет на то, как подключать согласователи уровней, и в целом более грамотная:

Определю основные требования к отладчику, что будет реализован на основе вышеприведённых двух:

  • 2-слойная печатная плата с базовыми требованиями к технологическим возможностям производства, чтобы можно было заказать плату практически где угодно без лишних наценок;
  • согласователи уровней с OE входом (обязательно НЕ автоматически переключаемые), чтобы избежать проблем в работе на высоких скоростях с целевым МК;
  • стандартный JTAG 10-контактный разъём для подключения рядовых кабелей без геморроя;
  • JTAG разъём (XF2M-1015-1A) с подключением посредством FFC кабеля для малогабаритных устройств, который можно просто не впаивать и пользоваться IDC-10 разъёмом;
  • дополнительный разъём отладки для FFC кабеля, также опционален;
  • подача питания +5 В на целевую плату не предусмотрена, и эта часть на плате не будет собрана;
  • TVСС с целевой платы берётся напрямую, без буфера на ОУ, чтобы не загромождать плату, т. к. ток будет небольшой и смысла я в этом не вижу;
  • применять компоненты, которые легко купить на маузере или LCSC;
  • возможность создания USB-A или USB Type C отладчика, просто запаяв необходимый разъём;
  • минимальные размеры. :)

Итак, пробегусь вкратце по получившейся схеме и её особенностям. Итоговая схема отладчика:

Первая особенность происходит из обозначенного ранее требования — возможность выбора типа разъёма USB (запаивается или XP1, или XS1, R2, R3):

Также оставлены резисторы-перемычки в местах, которые смущали меня при сравнении схем различных J-link (в плате, собранной мной, все элементы DNI не впаяны, соответственно):

Каналы АЦП оставлены только для измерения напряжения TVCC (целевого МК) и положительного канала для измерения тока подаваемых +5 В наружу (но эта опция вырезана за ненадобностью, поэтому оставлен только положительный канал АЦП):

Также для наглядности я не давал цепям условных имён, а соединял все пины МК около согласователей уровней:

Выход включения подачи +5 В на целевую плату помечен, но никуда не подключен:

Ну и, собственно, сами согласователи уровней и выходные разъёмы:

Здесь я немного оптимизировал их количество и тип (применив одноканальные вместо двухканальных в некоторых местах), а также основная особенность — разъёмы XS2 (JTAG, SWD), XS3 (отдельный отладочный порт), это типа моего привычного стандарта для подключения SWD, JTAG в малогабаритных устройствах посредством 10-контактного FFC 0,5 мм шлейфа. XS2 (XF2M-1015-1A), XS3 (XF2M-0615-1A). Да, и ещё одна небольшая особенность, я не применял буфера на ОУ для питания от целевой платы, т. к. посчитал это избыточным (ток потребления во время работы отладчика небольшой, и можно пренебречь, поставив простой LC фильтр):

Вот вроде бы и всё. Перечень компонентов и схему можно глянуть тут.

Реклама

Разводка

Этот раздел больше для красоты, т. к. тут никаких тонкостей или нюансов разводки нет, 2-слойная печатная плата с минимальными технологическими требованиями к производству. Разводка Top \ Bottom слоёв:

И отдельно линии питания VCC3P3 и TVCC, с разводкой которых было некоторое веселье, чтобы не плодить кучу переходных и уместить это с сигнальными проводниками:

Итоговый вид в 3D для Type C варианта:

Да, маленький нюанс, если платы заказывать на JLCPCB, то можно пометить место, где будет нанесён производственный номер платы, и, соответственно, можно его спрятать для красоты, а не надеяться, что китайские инженеры не залепят его на самое видное место:

При заказе только обязательно надо поставить в опциях, что для номера заказа на плате указано специальное место:

Вот и всё, заказываем плату!

Собранная плата

Спустя немалое время я таки получил платы:

Уже и успел забыть про них… а после получения как-то и запал давно иссяк на написание статьи, поэтому забыл сделать фотографии в процессе пайки. Есть фотографии пары собранных образцов обоих вариантов исполнения:

А также покажу мои кабели для отладки. Первый собран на основе силиконовых проводов (30 AWG для данных и 24 AWG для питания и общего) и представляет собой стандартный переходник IDC-10 в BLS-4 (SWD) + BLS-1 (Reset) для подключения различных целевых китайских плат и просто габаритных плат посредством SWD. Второй же кабель состоит фактически из 10-контактного FFC 0,5 мм, и подключается он к плате с аналогичным разъёмом (XF2M-1015-1A), к которому уже на целевой плате подведён полноценный JTAG или только SWD, а также есть дополнительная плата-переходник (больше для прикола сделал), если потребуется подключаться к обычной целевой плате с PLS-5 разъёмом.

Ну что, можно заливать bootloader теперь!

Реклама

Прошивка

Начинается всё с типичной дилеммы курицы и яйца, но тут будем предполагать, что у вас уже есть копеечный свисток с Али или друг, у которого можно прошить STM-ку, т. к. пин BOOT0 на плате жестко посажен на общий, и я не стал намеренно делать перемычек и прочего, просто заложил 5-контактный разъём SWD сбоку для обычной прошивки.

Запускаем JFlashLite.exe из папки драйверов\утилит J-Link, выбираем целевым МК — STM32F205RE и SWD интерфейс:

Выбираем bootloader.bin из папки Loader проекта отладчика и адрес 0x0 (по-умолчанию):

Заливаем, отключаем свисток (или чем вы заливали прошивку), а также переподключаем наш отладчик к ПК, он должен определиться в системе, но в загрузочном режиме. Теперь запускаем командную консоль JLink.exe :

Она увидит отладчик в загрузочном режиме и предложит восстановить прошивку в нём, Ок, это то, что нам и надо! После заливания прошивки отладчик сам должен перенумероваться в ОС:

Примечание: У меня было раз, что на этом этапе, после восстановления прошивки, отладчик не перенумеровался сам в ОС, просто переподключаем его физически.

Запускаем командную консоль JLink.exe снова:

Тадааа, плата теперь — полноценный отладчик, только вот серийного номера у него нет (он, по идее, привязан к идентификатору МК и хитро рассчитывается, если почитать форум China-Link, Вариант отладчика из Китая ), но без специальных опций всё вполне работает и с установленным от балды (ну почти от балды, есть таки формат серийного номера для разных версий J-Link, и меняются в пределах мажорной версии последние цифры). Единственный нюанс, который я заметил, только в том, что 3-я цифра серийного номера отвечает за версию отладчика, отображаемую в консоли, но это никак не влияло на функциональность. Скриншот из описания на гитхабе китайского инженера:

Так вот, чтобы установить серийный номер, в командной консоли вводим команду формата (где вместо xxxxxxxxx пишем серийный номер):

Exec SetSN=xxxxxxxxx

Результат:

Да, а вот некоторого рода подтверждение, что от версии отладчика (установленной в серийном номере) ничего не меняется, т. к. прошивка на обоих в итоге одна и та же, и она не обновляется выше:

Далее можно добавить различные опции, поддерживаемые отладчиком. Обычно на форумах советуют следующий список команд:

Exec AddFeature GDB
Exec AddFeature RDI
Exec AddFeature FlashBP
Exec AddFeature FlashDL
Exec AddFeature JFlash
Exec AddFeature RDDI

Но если попробовать в командной консоли добавить любую из них, будет отображена ошибка, мол, не знает консоль таких команд:

Но вот если запустить командную консоль более старой версии драйверов (а их можно параллельно установить на одной ОС), то тут уже всё работает (и да, не стоит добавлять опции, которые вам не потребуются в дальнейшем, есть сообщения, что от некоторых опций типа GDB, не соответствующих серийному номеру, отладчик блокируется):

Ну что, проверим по-быстрому наш отладчик. Возьмём любую плату с JTAG или SWD (у меня была под рукой плата на основе RTL8710AF и с полноценным JTAG):

Запускаем тот же JFlash.exe (чтобы не возиться с консолью) и указываем JTAG со скоростью 12 МГц:

Жмакаем Targert -> Connect:

Всё успешно на выбранной скорости в 12 МГц, также это проверенно и в фирменном отладчике Ozone, который теперь работает ощутимо быстрее (в сравнении с обычными свистками на F103) и не ругается на ограниченность функционала.

Реклама

Бонус — чтение SPI FLASH

Ну и как альтернативный вариант проверки отладчика — есть стандартная утилита, поставляемая с драйверами J-Link — JFlashSPI.exe, которая позволяет без запар читать\писать SPI флешки. Более подробно можно почитать тут — J-Flash SPI. Я же приведу оттуда таблицу подключения флешки (стоит напомнить только, что возможность выдачи на 5-й пин питания +5 В в моей версии отладчика отсутствует!):

Собираем макетку (даже без фильтрующего конденсатора по питанию и подтяжек на IO, только WP и HOLD пины флешки напрямую к питанию подключил) и паяем первую попавшуюся под руку флешку (вроде с роутера древнего):

Подаём внешнее питание (я подал +3 В) и жмём Targert -> Connect:

Успех! Флешка опознана, хоть и производитель неверно опознан, но размер и её параметры верны. Скорость 8 МГц. Жмём Targert -> Read Back -> Entire Chip, чтобы прочитать весь чип:

Успешно:

И теперь можно работать с дампом флешки, менять, заливать обратно:

И да… HAL, HAL везде тебя найдёт, Ты НЕ СПРЯЧЕШЬСЯ ОТ НЕГО!!!

Ссылки

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s