Итак, полку атмеловских протоколов прибыло — ISP, JTAG, debugWIRE, TPI, aWire, PDI, теперь вот UPDI. При этом ситуация с экосистемой у AVR по-прежнему весьма нерадужная, так что мы собирались совсем уже отказываться от их использования, но последняя тенденция нас слегка порадовала, поэтому и была написана данная статья.
Использовать протокол UPDI могут только счастливые обладатели программатора Atmel ICE, который не очень удобен в эксплуатации из-за довольно странного выбора разъема, да и стоит не так уж дешево, чтобы позволить себе закупать его в промышленных масштабах. К тому же он требует установки Atmel Studio, которая периодически отказывается с ним работать, так как согласно политике нашей фирмы, большинство компьютеров не имеют доступа к Интернету, а студия периодически туда лезет то за драйверами, то за какими-то библиотеками, в итоге были моменты, когда программатор был виден в системе, то есть, драйвера установились верно, но он в упор не замечался самой студией до тех пор, пока она не получила доступ к сети и не была обновлена принудительным образом.
Поэтому сразу же после того, как мы начали использовать в своих разработках новый и довольно удобный микроконтроллер ATTiny1616 (о его достоинствах позднее), возникла потребность в инструменте, который мы могли бы применять для записи в контроллер первичного загрузчика в производстве. Разумеется, без
После небольших поисков я обнаружил на Гитхабе проект pyupdi (https://github.com/mraardvark/pyupdi) — реализацию протокола UPDI на Питоне, причем основана эта реализация на обычном протоколе UART, разве что без преобразователей уровня, что, на самом деле, еще удобнее, потому что позволяет использовать стандартные микросхемы преобразователей от FTDI или их китайские аналоги CH340/341.
Проект был скачан и опробован, дело пошло довольно бодро. Но через пару дней стало понятно, что он все-таки не совсем нам подходит. Причины:
- необходима инсталляция Питона и целой группы пакетов (напоминаю, речь идет о компьютерах без доступа к Инернету), пришлось скачать и вручную поставить почти десяток различных пакетов, которые зависимостями тянули друг друга. Да, в принципе, можно сделать из скрипта на Питоне исполняемый файл на другом компьютере, это как-то решало проблему, но на этом список проблем не заканчивался
- в скрипте почти отсутствует проверка на ошибки, любая ошибка заканчивается прерыванием с указанием кучи ссылающихся друг на друга файлов, что для рядового персонала выглядит не очень понятно
- невозможно прочитать содержимое памяти контроллера, что делает невозможным конечное тестирование процесса записи
- нет возможности прочитать фьюзы
- скорость работы скрипта оставляет желать лучшего, 16 кб пишутся почти минуту, связано это с отсутствием какой бы то ни было оптимизации в процессе передачи, все построено на жестких таймингах
- отсутствие индикации процесса записи
- проект не поддерживает целый ряд процессоров, которые мог бы поддерживать
- проект находится в полумертвом состоянии и не реагирует на запросы
Проблемы какое-то время решались в рамках Питона, но после любого фикса приходилось пересобирать проект, тестировать, так что появилось желание переписать скрипт на чем-то более привычном и быстром, то есть, на Си. Мы же эмбеддеры, в конце концов!
Теперь кратко о достоинствах нового семейства tinyAVR 1-Series:
- реальная унификация периферии и адресного пространства в рамках от 2 кб до 32 кб
- удобная конфигурация загрузчика (в начале памяти!)
- существенное упрощение алгоритма ISP (In-System-Programming)
- переход к фон-неймановской архитектуре
- до 32 кб флэш-памяти в мелком корпусе (3х3мм) с 24 выводами, из которых до 22(!) можно использовать как IO
- наличие внутреннего осциллятора на 16/20 МГц
- меньшая зависимость работоспособности от конфигурации фьюзов (вечная головная боль AVR)
- отличная для мелкого контроллера аналоговая часть (ADC/DAC/компараторы с возможностью как внутренней, так и внешней коммутации входов/выходов)
- однопроводные программирование и отладка
- крайне низкая цена в рознице (от 0.6€ за 16 кб)
В качестве железной части программатора мы взяли уже имеющийся в наличии преобразователь USB-UART TTL на базе китайского чипа CH340, вот такой:
Для программирования достаточно соединить два его вывода RX и TX, так как они уже оснащены выходным резистором на 1.5k, если резистор в Вашей модели преобразователя отсутствует, то его нужно добавить. Объединенный вывод соединяется с ножкой UPDI на программируемом чипе, земля преобразователя должна быть также соединена с землей контроллера. При наличии внешнего питания, нужно обратить внимание лишь на то, соответствует ли оно питанию, которое использует преобразователь (3.3В или 5В). Если есть необходимость, то можно запитать схему с контроллером и от самого преобразователя, что может быть очень удобным для первичного программирования.
Внимание! Резистор является опциональным, его нужно допаивать только в случае, если Ваш преобразователь не имеет никаких защитных резисторов на выходе.
Единственная проблема, которая связана с чипом CH340 — он не заработал в моей Линукс-версии программы, так как в протоколе программирования используется бит паритета, а драйвер CH340 в моей версии ядра работает с этим битом неправильно. Возможно, проблема будет устранена в ближайшее время, пока что заниматься этим у меня не хватило терпения.
В результате работы и экспериментов в IDE Code::Blocks была написана и отлажена программа updiprog, исходные коды которой выложены на Гитхабе.
Что было реализовано в данной версии программы:
- добавлена возможность считывания содержимого флэш-памяти контроллера в hex-файл
- добавлена возможность считывания состояния всех фьюзов контроллера
- по возможности добавлены обработки ошибок с соответствующими сообщениями
- добавлена индикация процесса записи/считывания
- значительно увеличена скорость работы (около 6 секунд для считывания 16 кб)
- добавлена поддержка всех микроконтроллеров семейства 1-Series
Исходный размер программы составляет около 25 кб в сравнении с 5 с копейками Мб для скомпилированного исходного скрипта на Питоне.
Надеюсь, что проделанная работа будет кому-то полезна. Буду рад отзывам и предложениям.
Комментарии (46)
igrushkin
22.10.2018 19:10Краткое содержание статьи: как создать проблемы на ровном месте из-за паранойи и жлобства
borisxm
22.10.2018 20:54переход к фон-неймановской архитектуре
Архитектура осталась гарвардской, просто флэш и EEPROM отображаются в память данных.
Serge78rus
23.10.2018 10:09+3У Вас в схеме ограничительный резистор включен в цепь RX, а не TX. Это действительно так, а не ошибка? Как тогда осуществляется двунаправленный обмен без замыкания выходов передатчиков друг на друга?
Polaris99 Автор
23.10.2018 10:52+1Да, действительно ошибка, сейчас исправлю, спасибо за внимательность!
courser
23.10.2018 23:36Спасибо, отличная работа. Серия TinyXX16 действительно очень интресна для применения в компактных устройствах с низким и экстремально низким потреблением(очень экономный RTC и слипы чуть ли не с наноамперным потреблением), у ST ничего подобного нет.
Нельзя ли где-то скачать уже откомпилированную экзешку?
Gordon01
24.10.2018 09:26Смотрели ли вы github.com/PitterL/cupdi?
Polaris99 Автор
24.10.2018 11:00Обнаружил как раз перед публикацией проекта. В принципе, очень похожая работа, разве что использует сторонний код для работы с hex и парсинга командной строки.
eugenk
25.10.2018 06:44Чуть-чуть не в тему, но поделюсь немножечко своей технологией. У меня есть маленькая демонстрационная платка с FPGA — ice40-hx8k breakout board. FPGA там не очень большая, 8К ячеек. На ней же стоит FTDI. Причем по одному каналу FPGA шьется, а другой разведен на её ноги, и может подключаться к проекту как uart. Т.е. можно не переключая кабеля и шить и общаться с прошивкой через виртуальный СОМ. Ещё одно достоинство — софт. Есть неофициальный проект www.clifford.at/icestorm. Занимает менее 100 мегабайт. Это не квартус и не вивадо не к ночи будь помянута, с их десятками гигов.
Как я этим пользуюсь. Если мне надо разобраться с каким-то микроконтроллером, я курю мануалы по его программированию, после чего просто реализую протокол программирования на верилоге. Управляющую программу пишу на яве. Итого, при трудозатратах 1-3 дня имею совершенно бесплатно программатор. Плюс у той же FPGA остается куча свободных ног, позволяющих как угодно обвязать этот микроконтроллер, разобраться с его интерфейсами и т.п. И всё это на одном разъеме, по одному жгуту. Ни колодок перетыкать ни даже нажимать кнопок. Зашил микроконтроллер и сразу тестируй. Штука исключительная по удобству! Сейчас именно так делаю один проектец на pic18f4550. Возможно расскажу о нем на хабре.
NordicEnergy
Политика фирмы… а на оставшихся машинах интернет по карточкам что ли? Даташиты на бумаге?))
Что касается темы, то ничего выдающегося не увидел. Такие же простенькие микроконтроллеры есть и у ST, и у NXP и про MSP430 забывать не стоит, при этом экосистема значительно лучше и нет такой свистопляски с интерфейсами отладки. Загрузчик кстати тоже в начале везде расположен, вообще странный плюс, раз что это для атмела стало «инновацией»
olartamonov
Люди вон радуются, что фьюзами уже контроллер убить чуть сложнее, чем раньше (чего он там, научился сам сваливаться на внутренний генератор, если внешнего нет?).
Ещё лет десять — и там, наверное, даже частоту ядра можно будет в рантайме менять.
NordicEnergy
А через 20 лет наверное можно даже будет не ставить атмел студио и работать из любой IDE!
esaulenka
15 лет назад я писал программку для ATMega (что-то типа курсовика) в блокноте. В те далёкие годы avr-gcc была совсем плохо прикручена к студии…
Polaris99 Автор
Кстати, в этом уже можно
StroboNights
Мне статья понравилась. Кстати, новый PICkit4 поддерживает UPDI. В microchipdirect он стоит ~48 долларов США. Сейчас ведь и AVR и PICи — все в MPLAB.
Polaris99 Автор
AVR — пока в бета-режиме, насколько я понял
StroboNights
Бета-режим — это имеет отношение только к IDE MPLAB. Главное, что PICkit4 интерфейс UPDI поддерживает; в спеках к нему заявлено: "...useful for debugging legacy AVR with MPLAB PICkit 4". Единственное, не знаю как у нового PICkit4 дела с подключением к Atmel Studio. Я PICkit4 вообще так-то планировал приобрести — вещь интересная, но мне он только для PICов нужен, да.
bugdesigner
А можно вопрос? PicKit умеет только шить новые AVR или там есть ещё отладка?
StroboNights
Например, на сайте Microchip, PicKit4 заявлен в качестве отладчика для упоминаемого в данной статье ATTINY1616 (Development Environment->Emulators & Debuggers).
xztau
есть SNAP за 1000 рублей:)
StroboNights
SNAP — это скорее любительский вариант, в то время как автор статьи очевидно занимается коммерческой разработкой электроники. PicKit4 — это профессиональный инструмент разработки; Вы же рекомендуете SNAP, в котором, например, нет поддержки 12-и вольтового UPDI.
xztau
Ну да, ну да… Спасибо, спасибо… UPDI там ест (для 12 вольт можно и транзистор прикрутить)
Минус то за что? Я же им не барыжу!?
acin
xMega уже давно умеет менять частоту.
olartamonov
Всё, что с Mega, давно уже сдало рынок кортексам.
Polaris99 Автор
Согласен, меги трогать вообще смысла нет, ни цена, ни возможности не дотягивают до кортексов, а экосистема вообще никуда не годится, за почти два десятка лет так и не смогли написать нормальный компилятор. А вот с мелкими камнями варианты есть, потому и заинтересовался этим малышом.
NordicEnergy
А что в них интересного (вернее что вас в них привлекло) на фоне аналогичных по цене Cortex-M0/М0+? Мельком пролистал ДШ, очевидных плюсов не заметил, но возможно просто невнимательность моя.
Polaris99 Автор
Во-первых, цена. В таком ценовом диапазоне есть только Пики, 8051 от Силабса и Tiny, Кортексов я не могу найти, они начинаются где-то в районе 20% дороже.
Во-вторых, количество памяти и ног в отношении к размеру корпуса. Ну а по характеристикам — возможность использования внутреннего DAC в качестве опоры для ADC или компаратора, очень полезная фишка. И возможность вывода сигналов от компаратора на ноги контроллера, такое раньше видел только у некоторых Пиков. Ну и количество обвязки минимально, так что 3 на 3 мм — это реальное занимаемое место на плате. Для нас как раз важны размер и стоимость на партию.
Misaka10032
Digikey:
Attiny1616(QFN-20), 8-bit AVR, 16kB Flash, 2kB SRAM, 20MHz — 0.63$ от 6000 штук, 0.77$(SOIC-20) от 1500 штук.
STM32F030F4P6(TSSOP-20), 32-bit Cortex-M0, 16kB Flash, 4kB SRAM, 48MHz — 0.55$ от 2500 штук.
Поштучно может и да, Attiny может быть дешевле. Если покупать катушками — то тут уже надо сильно задуматься.
olartamonov
Digikey — очень плохой, негодный индикатор оптовых цен.
Во-первых, дорого, во-вторых, у нормальных дистрибьюторов и соотношение цен может быть другим.
Misaka10032
Mouser?
Attiny1616, 6000 штук — 0.641$
STM32F030F4P6, 2500 штук — 0.552$. 0.532$ за 10000 штук.
olartamonov
Компэл — STM32F030F4P6 от 1110 штук по $0,43 с НДС, доставка послезавтра. Attiny1616 на локальном складе нет, так что с ним сравнить не могу.
Производители электроники пользуются более другими, менее публичными дистрибьюторами. Более того, от 10-20 тыс. штук часто уже начинается поставка по контракту «под проект» — и как говорят в таких случаях производители, «наши цены не должны стоять на пути нашего сотрудничества».
Misaka10032
Хм, жалко, что для тех, кто не зарегистрирован на Компэле, цены с недавних пор не отображаются :(
olartamonov
Можно на Элитане смотреть, они зеркалят склад Компэла к себе с поставкой 1-2 дня и примерно теми же ценами.
Более того, у них вообще от кого-то локального STM32F030F4P6 сейчас по $0,36 в опте есть.
И при этом ещё есть дисты с локальными складами и вообще без цен в открытом доступе — МТ-Системс, например. Разработчики просто знают, что если тебе нужен, например, Simcom — то это к ним, дешевле всё равно вряд ли где-то будет.
synka
Зарегистрированным тоже не отображаются. Но можно написать своему менеджеру и он присылает КП с ценами и сроками.
olartamonov
У правильно зарегистрированных есть sds.compel.ru
synka
Это для снабженцев. Я — разработчик. Но за наводку спасибо! Попробую получить доступ.
Polaris99 Автор
А что с корпусом и аналоговой периферией? При всей моей любви к кортексам от того же ST, аналоговая часть у них — просто катастрофа, а уж в этом немаленьком корпусе TSSOP-20 из 20 ног 5 уходит в пустоту — на питание, аналоговое питание и тот самый BOOT0. При всех прочих кортексы от ST в плане размеров всегда проигрывают другим производителям.
StroboNights
RL78 еще есть; тоже иногда вполне себе вариант.
xztau
RL78 сам в себе микроконтроллер, хотя и дешёвый.
Очень закрыт. Даже не смотря на документированный загрузчик, они нигде не дают документации на отладочный интерфейс (e-1 эмулятор встроенный по TOOL1, кажется). Только со своим или сеггеровским программатором за тучу денег. (Собственно, как и RX семейство).
Так же ХЗ кто там сочиняет для них GCC (лично для меня — это минус). Его даже на офф сайте, как у других производителей, нет. Сначала был у индусов KPIT, а потом у болгар (TOR студио, какая то, которая к встраиваемой технике никаким боком). И тут регистрацию просят.
В общем закрыт и проприетарен по самые помидоры. Мне так очень не понравилось.
(Хотя в последнее время renesas пытаются e2-studiuo под Linux запилить — может чего и поменяется.
olartamonov
Специфическая периферия и мелкие корпуса.
То же самое, что и с MSP430, какой-нибудь MSP430AFE2xx — это готовый электросчётчик с тремя параллельно работающими АЦП, и заменить его условным кортексом не так-то просто.
andrey_ssh
ATTiny13 умеет менять частоту.
andrey_ssh
Частоту ядра уже лет десять как можно менять в рантайме.
roboqueer
Роскомикс поди, какой или что-то типа того. Хотя возникает вопрос — а что это товарищи сидят на богомерзком Atmel вместо православных 1887ВЕ4У?