Андрей Смирнов
Время чтения: ~12 мин.
Просмотров: 5

Дебаггинг в реальном времени через JTAG/SWJ-DP для микроконтроллеров на ядре ARM Cortex-M

212cf6.jpg

  • Цена: 9,5$

Сегодня хочу поделиться с общественностью пожалуй самым популярным применением сего программатора — прошивкой принтера Samsung ML-2160. В определенных кругах известно как «унижение принтера ml-2160». Тема старая, но все равно много кто и сейчас «напарывается на грабли» при прошивке сего устройства. Кому интересно — прошу под кат. Осторожно — много фото! Хочу начать с того, что в свободное от работы время я для развлечения и тренировки мозга и рук чиню всякую микропроцессорную электронику. Однажды пришел ко мне знакомый с просьбой «почини принтер». Был это популярный тогда Samsung ML-2160. И выглядел как недавний подопытный: 91802f.jpg Хитрый самсунг хотел денег за родные картриджи, ну а людей exUSSR ставит в ступор цена оригинального картриджа — мы ведь лазерный принтер купили чтобы было дешево 😉 Первые версии принтера можно было откатить на старую прошивку без особых проблем, но в следующих прошивках такую возможность убрали. В общем вечер гугла и мы заказываем программатор. Заодно рекомендую купить USB TTL-UART, чтобы видеть что нам отвечает принтер во время прошивки. Через пару недель к нам приезжает наш красавец:732c05.jpg и внутри:

На этом месте все обычно подключают программатор, качают последнюю версию софта с офсайта, ставят, запускают, наблюдают радостное окно программы, которая нашла программатор: Но счастье их длится не долго: Говорят, некоторые после этого получают кирпич из программатора. Всех остальных просто задалбывает это окно. А всего лишь нужно было поставить софт v4.92 (setup_jlink_v492.zip). Сразу оговорюсь, что весь необходимый софт оставлю в конце обзора. Теперь включаем принтер. Кладем лист бумаги зажимаем и держим кнопку PrintScr на принтере примерно 10 секунд. Он радостно заморгает лампочкой и напечатает что-то подобное:Читаем строку Firmware version, видим версию ….02.00 и понимаем что не зря купили программатор. Теперь ставим драйвера. На случай если у вас их нет — SamsungUniversalPrintDriver22.exe. Windows 10 подхватывает сама. Если вы еще не распаковали мой архив — самое время. Копируем Boot.bin в c: (чтобы не бороться с проблемами с кодировками итд, хотите экспериментов — редактируйте download.jlink) Если поставили jlink не в каталог по умолчанию — редактируете путь в файле flashme.bat. Минимальный набор софта есть. Можно приступить к потрошению принтера 🙂 Отвертка PH2 — наше все! Отключаем принтер от сети и откручиваем один саморез:и видим плату: отстыковываем шлейфы и откручиваем 3 винта. Нам предстоит распаяться вот так:
распиновка разЪема на программаторе: Тут следует обратить внимание что на кабеле распиновка зеркальная! 1 и 2 ногу программатора спаиваем вместе и в зависимости от положения джампера на плате подключаем к 3.3В принтера или нет. Если не хотите разбирать программатор, то померяйте напряжение на закороченном 1 и 2 контакте относительно земли: если там 3,3В есть, то паять к принтеру не надо. Основная проблема теперь в том, что придется поднимать вторую от угла ногу процессора! Не вторую, по счету, а вторую от угла. Проблема здесь в том, что по инету бродит фото, где написано 2 ногу, фото крупным планом, но процессор другой! Увлекшись фотографированием я сам опять наступил на эти грабли и поднял не ту ногу! Но времени переснимать, к сожалению, не было. Далее несколько фото того как поднимать ногу иголкой, но нога неправильная. Правильная нога на фото выше! Процедура такова: капаем припоем (а лучше сплавом Розе/Вуда) на 2 крайних ноги. Затем вставляем иголку, греем припой паяльником и поворачиваем немного против часовой стрелки: Лишний припой убираем оплеткой Теперь опускаем первую с края ногу и паяем провода ко всем контактным площадкам. В последнюю очередь паяемся ко второй с краю ноге процессора, предварительно зафиксировав скотчем/изолентой провод. В итоге получается вот такая экибана: Еще раз повторюсь, что по этой фото я заметил что не туда припаял провод к процессору. Паяем его правильно, припаиваем консоль (usb-uart) и подключаем шлейфы назад. Вот так должно получиться:ну и все вместе выглядит примерно так: Все, с пайкой на пока закончили. Подключаем принтер, консоль, программатор у компьютеру. Если консоль паяли, то ставим например Tera Term, выбираем нужный порт и скорость 115200. Все остальное по умолчанию. Не забываем подключиться к порту. Подключаем в сеть принтер. Нажимаем принтскрин на принтере и не отпускаем, нажимаем и отпускаем «сеть», ждем 3 секунды и отпускаем принтскрин. Принтер обычно перемагривается лампочками и загорается зеленая. Попутно в диспетчере задач видим устройства «нет подключенного принтера» и «поддержка usb принтера»: Тем временем в консоли бегут буковки: запускаем flashme.bat: тем временем в консоли (Если честно, я не уверен насчет правильности последующей фотки ибо есть подозрение что я ее мог перепутать делая скрин плохого кабеля 🙁 ): Этими действиями мы закинули загрузчик, и теперь нужно влить новую прошивку. Вливаем MA_2160_05.hd. Для этого перетягиеваем его на usbprns2.exe в проводнике или запускаем из командной строки «usbprns2.exe MA_2160_05.hd» я предпочитаю второй вариант: в консоли: Ну вот и все — принтер унижен! 🙂 Отключаем все от принтера, снимаем плату, распаиваем и собираем все назад. Не забываем заклеить скотчем чип на картридже или вовсе его выковырять. Напоследок хочу рассказать о проблемах при перепрошивке. 1. Вы припаяли что-то не так и не туда, тогда программа для прошивки не сможет подключиться к процессору, не отобразит регистры, выдаст кучу ошибок итд. Вы это увидите. 2. Случается так, что кабель принтера совсем Г, тогда вы получите вот такое в консоли: и это, собственно один из не многих случаев, когда нужна консоль. Сами понимаете — оно и тут не очевидно что кабель не очень, а без консоли вообще тоска. 3. Не делайте длинные провода от шлейфа программатора — поймаете помехи. 4. Иногда по какой-то причине принтеры с прошивкой V1.01.02.00 отказываются прошиваться. Лучше сразу обновите до V1.01.02.01 — запустите ML216x_V1.01.02.01.exe, там по ходу разберетесь. Кое какие фото не моей платы, а взяты с просторов инета — ибо не получились фото, а принтера уже не было… Вот вроде и все. Будем надеяться что мой опыт кому-то пригодится.Архив со всем необходимым тут

J-Link V8 ARM USB-JTAG (Полная версия) Программатор — это JTAG эмулятор с питанием от шины USB, поддерживающий большое количество ядер CPU. Основанный на 32-разрядном RISC CPU, он может с высокой скоростью обмениваться данными со всеми поддерживаемыми CPU. J-Link используется в десятках тысяч мест по всему миру для целей разработки и производства (программирования flash памяти). Питание подается от USB шины. Программатор комплектуется диском с программным обеспечением и инструкцией по установке ПО.

Работает с оригинальным софтом с официального сайта производителя.

Отличительные особенности:

J-LINK – идеальное дополнение к отладочным платам фирм: OLIMEX, KEIL, IAR, EMBEDDED ARTISTS

USB эмулятор, программатор J-Link V8 ARM, Cortex-M используется для программирования процессоров ARM7/9/11, Cortex-A5/A8/A9, Cortex-M0/M1/M3/M4, Cortex-R4, Microchip PIC32 и Renesas, а также для работы с отладочными платами IAR EWARM, Keil MDK, Роули Crossworks, Atollic TrueSTUDIO, IAR EWRX, Renesas HEW, Renesas e2studio. Для использования программатора отладчика J-Link ARM V8 нужно подключить его к компьютеру с помощью кабеля USB тип A – USB тип B (идет в комплекте). Ваша операционная система начнет автоматический поиск и установку драйверов. Если операционная система не смогла найти и установить драйвера, то это нужно сделать самостоятельно, предварительно скачав их здесь. После подачи питания на корпусе программатора должен мигать зеленый светодиод. Потом надо скачать и установить среду разработки. Скачать среду разработки можно здесь. Программное обеспечение совместимо с операционными системами Microsoft Windows 2000, Microsoft Windows XP, Microsoft Windows XP x64, Microsoft Windows 2003, Microsoft Windows 2003 x64, Microsoft Windows Vista, Microsoft Windows Vista x64, Windows 7, Windows 7 x64, Windows 8, Windows 8 x64, Linux, Mac OSX 10.5 и выше. После установки программного обеспечения к программатору можно подключать процессоры или отладочные платы. Для этого программатор оснащен 20-пиновым JTAG разъемом. Также в комплекте с программатором идет 20-проводниковый шлейф для удобства подключения к отладочным платам. Разъем программатора и коннектор шлейфа оснащены ключами, с помощью которых невозможно неправильно соединить JTAG разъем и шлейф. После этого программатор готов к работе. Программатор отладчик J-Link ARM V8 имеет два разъема для подключения к компьютеру и для подключения к программируемым устройствам:

  • для подключения к компьютеру используется интерфейс USB спецификации 2.0. Обмен данными происходит на скорости full speed;
  • для подключения программируемых устройств используется 20-пиновый JTAG разъем. Разъем вмещает в себя несколько интерфейсов: JTAG, SWD, SWV, SWO, RDI.

Распиновка 20-ти пинового JTAG разъема: Питание программатора отладчика J-Link ARM V8 осуществляется от USB порта компьютера. Напряжение питания 5 вольт. Сам отладчик может питать устройства с напряжением питания до 5 вольт и током до 300 мА.

Комплект поставки:

** Незаменимый инструмент для восстановления диагностического оборудования, блоков управления ЭБУ / ECU и многое другое !

  • Код товара: J-Link V8 ARM USB-JTAG (Полная версия) Программатор
  • Доступность: В Наличии
  • 2 800.00 р.

<label>Кол-во</label>

Теги: J-Link V8 ARM USB-JTAG (Полная версия) Программатор

1628602b65a44f9180bfa7181caa6398.png С некоторых пор фирма Segger предлагает технологию Real Time Terminal (RTT) для своих JTAG адаптеров J-Link. Суть ее в том, что программа на микроконтроллере может выводить и принимать отладочную информацию из JTAG/SWJ-DP порта, как это обычно делается через UART. И тогда нам больше не нужен реальный отладочный UART. Далее чуть подробнее о возможностях этой технологии. Возможность выводить программой отладочную информацию в порт JTAG/SWJ-DP была реализована, как только у микроконтроллеров появился сам этот порт. Для этого есть два пути: использовать технику semihosting или технику Serial Wire Output (SWO). Использование semihosting приводит к подмене каналов ввода-вывода стандартных файловых операций языка С-и. Это не всегда приемлемо, поскольку файловые операции в приложении могут уже использоваться по другому назначению. Также semihosting необходимо явно отключать и перекомпилировать проект при выпуске релизной версии. Вдобавок ко всему semihosting обеспечивает самую медленную передачу данных из рассматриваемых здесь технологий. Использование Serial Wire Output проще чем semihosting, однако требует использования дополнительного сигнала SWO порта JTAG/SWJ-DP, и также вызывает необходимость в перекомпиляции при переходе на релизную версию, т.е. версию без подключения отладчика. Функции вывода SWO синхронные, т.е. ожидают готовности порта и не обладают необходимым детерминизмом. Технология Real Time Terminal от Segger еще более упрощает вывод отладочной информации через SWJ-DP и предоставляет следующие удобства: • Достаточно только двух внешних линий– это SW CLK и SW DIO. • Весь дополнительный код в микроконтроллере занимает не более 500 байт, если не использовать ввод, то даже 300 байт. • Не требуется перекомпиляция для релизной версии, функции отладочного вывода асинхронные и практически не занимают процессорного времени и не оказывают никакого влияния на ход выполнения программы при отсутствии подключения отладочного адаптера. • Скорость отладочного ввода-вывода очень высока. • Отладочный ввод-вывод можно перенаправить в любую стороннюю программу эмулятор терминала поддерживающую протокол telnet. • Segger предоставляет бесплатные утилиты эмулятора терминала, логгера и telnet клиента для подключения к микроконтроллеру через отладочный адаптер без необходимости запуска сторонних IDE с отладчиками. 7ae8311d400a494da1348bb20b9f3988.png На рисунке выше плата контроллера на базе чипа STM32F745VET6. Внешний кварц 16 МГц. Частота ядра 168 МГц. Отладка потребовалась для начального загрузчика по шине CAN. Последовательный порт RS232 подключенный к UART есть, но тоже используется для загрузчика. Выводить в него отладочную информацию означало бы сильно видоизменить отладочную версию программы по сравнению с релизной. При дефиците времени это крайне нежелательно. Для подключения RTT были выполнены следующие шаги:

  1. Взяты исходники RTT (http://download.segger.com/J-Link/RTT/RTT_Implementation_141217.zip)
  2. Исходники распакованы и скопированы в директорию проекта названную RTT. Сам проект выполнялся в среде Keil MDK ARM
  3. Исходники подключены к проекту. В общий список заголовочных файлов проекта добавлены файлы SEGGER_RTT.h и SEGGER_RTT_Conf.h
  4. В файле SEGGER_RTT_Conf.h выполнены дополнительные настройки: значение BUFFER_SIZE_UP увеличено до 2048, значение SEGGER_RTT_PRINTF_BUFFER_SIZE увеличено до 512. Параметры изменялись на самом деле итерационно, пока не перестали происходить переполнения указанных буферов.
  5. Редактирование исходников загрузчика. Во все интересующие места были вставлены вызовы функции SEGGER_RTT_printf с необходимыми сообщениями. Использовал эту функцию как самую удобную, хотя она и вносит значительное потребление стека и определенную задержку преобразования данных. Но в моем случае это было приемлемо.
  6. Поскольку нужна была отладка даже во время программирования внутренней Flash, то перенес код RTT в RAM микроконтроллера. Для этого во всех 2-х файлах исходников RTT ввел директиву

    #pragma arm section code = «CODE_IN_RAM»,

    а в файле линкера .sct определил эту область следующим образом:

  7. Определил для структуры SEGGER_RTT_CB абсолютный адрес размещения директивой

    static SEGGER_RTT_CB _SEGGER_RTT __attribute__((at(0x20000000)))

  8. Скомпилировал проект. После компиляции выяснилось, что код RTT в RAM занял 400 байт при нулевой оптимизации.
  9. Вставил в инструментальное меню IDE Keil вызов утилиты JLinkRTTViewer.exe
  10. Поскольку предпочитаю в качестве эмулятора термина использовать TeraTerm, то вставил в меню вызов и его. Строка вызова при этом такая:

    ”C:/Program Files (x86)/teraterm/ttermpro.exe” /T=1 telnet://localhost:19021 /X=0 /Y=0 /W=»J-Link RTT»

Показалось интересным с какой же скоростью выводится информация в эмулятор терминала через отладочный адаптер с применением RTT. Были сняты осциллограммы с сигналов SW SLK и SW DIO. Оказалось, что в J-Link используется поллинг с периодичностью около 40 мс. Для передачи данных используется не более 50% этого периода. В блоке данных передаваемых за период пакеты несущие полезные данные занимают тоже не более 50% времени. Пакеты переносят не более 3-х байт полезных данных. Три байта полезных данных в пакете также занимают не более 50% его длины. Итого получаем: 0.5*0.5*0.5 = 0.125 т.е. 12.5 % пропускной способности канала SW используется для передачи отладочного вывода. Частоту канала выше 4 МГц в J-Link поднять не удалось ни при каких настройках. Это значит, что максимально мы имеем скорость передачи 4 Мбит/с. Из них только 4*0.125= 0.5 т.е. 500 Кбит/с в лучшем случае можно использовать для отладочного вывода. Это, конечно, немного, по сравнению с реальным отладочным UART, которые могут передавать на скоростях в несколько Мбит/с, но все имеет свою цену. 989bd9969f21494eadaf5deff73cd350.pngИспользуемые источники:

  • https://mysku.ru/blog/aliexpress/67235.html
  • https://ruavtoshop.ru/products/programmatory-eeprom/j-link-v8-arm-usb-jtag
  • https://habr.com/post/259205/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации