Я заметил, что в отношении микроконтроллеров существует несколько способов их программирования. Я вроде как знаком с USB, так как мой Arduino можно запрограммировать через USB.
Что такое интерфейс JTAG или SPI?
В конце концов я знаю, что эти интерфейсы позволяют прошивать чип новыми инструкциями, но чем они отличаются? Есть ли преимущества одного перед другим?
Микроконтроллеры ATMEGA, подобные тому, что используется в Arduino, которые поставляются прямо с завода, могут быть запрограммированы только с использованием интерфейса SPI или JTAG.
SPI означает последовательный периферийный интерфейс и позволяет микроконтроллерам взаимодействовать друг с другом или с внешним миром. Его также иногда называют 3-проводным, потому что он использует для связи три провода. Чтобы запрограммировать чип, вам понадобится специальный программатор, который считывает команды с USB, чтобы управлять линиями SPI для программирования чипа. Популярным кажется USBTinyISP от Adafruit . Очень хорошее введение в программирование SPI можно найти на SparkFun.. Самыми популярными приложениями для программирования чипов Atmel AVR являются avrdude (строка cmd), ponyprog (не работает с новыми программистами) и в некоторых случаях AVR Studio (если ваш программатор поддерживает это). Преимущество программирования SPI заключается в том, что вы можете запрограммировать любой чип Atmel прямо с завода, поэтому вам не всегда понадобится Arduino в ваших проектах.
Если SPI — это «просто еще один» последовательный протокол, то JTAG — это протокол, специально разработанный для программирования и отладки микроконтроллеров. Не все Atmel micro поддерживают JTAG, но те, которые используются в Arduino, поддерживают. Протокол JTAG можно использовать для интересных вещей, таких как «эмуляция схемы» и отладка, что означает, что он позволяет вам видеть состояние программы в вашем микроконтроллере во время ее фактического выполнения. Для этого вам понадобится специальный программатор. Видел мой ответ на другой вопрос .
Чтобы запрограммировать чип с помощью USB, вам нужно сначала запрограммировать его с помощью «загрузчика» с использованием SPI или JTAG. После загрузки загрузчика систему можно будет запрограммировать с любого ПК с помощью преобразователя USB-Serial. Минус в том, что загрузчик занимает некоторое место в памяти и этот способ не позволяет увидеть состояние чипа во время его работы.
Хотя я хотел бы погрузиться в различные доступные методы программирования, кто-то уже сделал это. Вот учебник Dean Camera по AVRFreaks, Методы программирования AVR :
Существует множество способов программирования микроконтроллеров AVR. Поскольку многие люди время от времени спрашивают о разных, я решил описать их здесь, чтобы на их вопросы можно было быстро и эффективно ответить. Пожалуйста, простите меня, если я пропущу метод или сделаю ошибку.
МЕТОД 1: В системном программировании (ISP)
Поддерживается: Подавляющим большинством AVR (см. сообщения ниже)
Поддерживаемые программисты: AVRISP MKI/II, JTAG MKII, STK500, STK600, Dragon, клоны AVRISP, программисты AVR910, AVRONEВ системном программировании это, пожалуй, самый распространенный метод программирования флэш-памяти, EEPROM, фьюза и локбайтов всей линейки AVR. Интернет-провайдер может программировать AVR на чрезвычайно высокой тактовой частоте (при условии, что целевой AVR работает на высокой частоте и программатор поддерживает это), и это метод, который выбирают почти все любители AVR. На рынке существует множество клонов AVRISP и программаторов AVR910 в дополнение к простым самодельным ключам, которые подключаются к параллельному порту вашего компьютера.
Последние новые конструкции ключа могут использовать последовательный порт компьютера, однако неофициальные данные говорят о том, что этот метод чрезвычайно медленный из-за технических ограничений.
ISP требует, чтобы целевой AVR работал с тактовой частотой, по крайней мере, в четыре раза превышающей тактовую частоту ISP. Это распространенная ошибка и источник путаницы для многих новичков в AVR.
МЕТОД 2: JTAG
Поддерживается: См. справку AVRStudio Tools для поддержки устройств MKI и MKII
Поддерживаемые программисты: JTAG-ICE, JTAG-ICE MKII, Dragon, клоны JTAG-ICE, AVRONE, STK600 (только программирование)Технически JTAG — это система отладки, а не метод программирования. Тем не менее, интерфейс JTAG позволяет программировать AVR, который его поддерживает.
JTAG — это внутрисистемный инструмент отладки, который позволяет вам манипулировать и проверять состояние поддерживаемого AVR во время его работы в цепи. JTAG позволяет пользователю остановить выполнение в любое время, манипулировать внутренними регистрами AVR и многое другое.
Официальные блоки JTAG-ICE от ATMEL были заменены JTAG-ICE MKII, который поддерживает более новый и более широко поддерживаемый в линейке AVR протокол отладки DebugWire, а также программирование с помощью метода ISP (см. выше).
Клоны JTAG-ICE доступны по низким ценам, однако их ограниченная совместимость лишь с несколькими AVR ограничивает их полезность. Независимо от этого, если ваш AVR поддерживает интерфейс JTAG, JTAG-ICE остается очень хорошим и эффективным методом отладки и программатором.
МЕТОД 3: Отладка провода
Поддерживается: Многие небольшие AVR
Поддерживаемые программисты: JTAG-ICE MKII, Dragon, AVRONEОпять же, DebugWire — это скорее отладочный, чем программный интерфейс, но его можно использовать для загрузки программ в поддерживаемые AVR. Интерфейс dW использует один контакт AVR (линия /RESET) для всех коммуникаций, что делает его идеальным для устройств AVR с малым количеством контактов.
МЕТОД 4: загрузчик
Поддерживается: большинством новых AVR
Поддерживаемые программисты: нет данныхОпять же, технически это не метод программирования. Загрузчик — это небольшая программа AVR, которая находится в устанавливаемом пользователем зарезервированном разделе обычной флэш-памяти. Загрузчики используют функции самомодификации флэш-памяти, доступные в новых AVR, чтобы позволить AVR программировать себя с помощью программных данных, загруженных из внешнего источника. Загрузчики могут получать свои данные из любого места (например, из внешней флэш-памяти или SD-карты), однако, безусловно, наиболее распространенный тип загрузчика связывается с ПК через порт RS-232 (последовательный) AVR.
Загрузчики ограничены тем, что они потребляют пространство флэш-памяти (ограничивая размер флэш-памяти, доступной для приложения AVR), и они не могут изменять биты предохранителей AVR.
Загрузчики широко доступны в Интернете для загрузки, но они страдают от проблемы «курица и яйцо»; вам нужен программатор другого типа, перечисленный здесь, чтобы в первую очередь запрограммировать загрузчик. Обычно это решается созданием простого ключа параллельного порта (см. раздел ISP) или покупкой AVR с уже предустановленным загрузчиком (например, плата AVRButterfly).
МЕТОД 5: Параллельное программирование высокого напряжения (HVPP)
Поддерживается: большинством не-TINY AVR (за исключением)
Поддерживаемые программисты: STK500, STK600, Dragon, Homebrew Dongles, AVRONEПараллельное программирование высокого напряжения — это метод программирования, который редко используется из-за сложности его настройки. Несмотря на это, программирование HVPP обычно используется для «восстановления» AVR, чьи биты предохранителей были неправильно настроены с помощью другого метода программирования.
И STK500, и Dragon поддерживают HVPP. Во время HVPP контакт /RESET цели поднимается до необычно высокого значения 12 В, что задействует внутреннюю схему параллельного программирования. Вывод /RESET — единственный вывод AVR (на AVR с поддержкой HVPP), который можно безопасно поднять до этого уровня.
Вы можете создать свой собственный ключ HVPP, используя такие онлайн-планы, как этот.
МЕТОД 6: Высоковольтное последовательное программирование (HVSP)
Поддерживается: Многие TINY AVR (за исключением)
Поддерживаемые программисты: STK500, STK600, Dragon, Homebrew Dongles, AVRONEHVSP похож на HVPP, за исключением того, что передача данных выполняется последовательно, а не параллельно. Это альтернативный метод программирования, используемый во многих AV-ресиверах серии TINY, у которых недостаточно контактов для HVPP.
МЕТОД 7: ПДИ
Поддерживается: XMEGA AVR
Поддерживаемые программисты: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKIIPDI — это новый программный интерфейс, основанный на протоколе debugWire, для линейки AVR XMEGA. В настоящее время он не используется ни в каких других 8-битных микроконтроллерах AVR.
МЕТОД 8: ТПИ
Поддерживается: 6-Pin TINY AVR (ATTINY10 и т. д.)
Поддерживаемые программисты: STK600, Dragon, AVRISP MKIITPI — это очень маленький программный интерфейс для новой линейки TINY AVR с ограниченным количеством контактов, например, 6-контактный ATTINY10. Как и dW, TPI использует линию /RESET устройства как часть коммуникационного интерфейса, но на этом сходство заканчивается. Поскольку в TINY AVR размером с пинту отсутствует встроенная схема отладки, протокол TPI использует новый программный интерфейс с тремя контактами в полудуплексном протоколе. Поскольку линия /RESET должна быть поднята до +12 В для программирования, когда установлен вывод RSTDSB устройства, в настоящее время это поддерживается только более новой платой программирования STK600.
Бонусный раздел часто задаваемых вопросов!
Какой метод лучше?
Не существует универсального «лучшего» метода. Программирование провайдера простое и чрезвычайно популярное, однако все вышеперечисленные методы будут работать. Два режима программирования высокого напряжения (в зависимости от того, какой из них применим к вашему устройству) являются наиболее многофункциональными, поскольку они позволяют ремонтировать AVR, в котором были неправильно настроены предохранители. Однако эти методы сложны в настройке, поэтому большинство пользователей используют интернет-провайдера.Я сделал ключ параллельного порта. Могу ли я использовать его с AVRStudio?
Я не боюсь. AVRStudio не может взаимодействовать с какими-либо «тупыми» ключами — для расшифровки отправляемого им протокола связи требуется интеллектуальное устройство программирования, содержащее сам микроконтроллер. Простые ключи без микроконтроллера должны быть "побитовыми" (т.е. соответствующие сигналы смоделированы через ключ с помощью компьютера).Значит, мой ключ бесполезен?
Нет. Вы по-прежнему можете программировать с помощью самодельного ключа с помощью программного инструмента стороннего разработчика. AVRDude — это хорошо известная бесплатная утилита командной строки, которая входит в состав пакета WinAVR.Какие есть варианты, если я хочу, чтобы мой программатор работал с AVRStudio?
Выберите программатор, использующий протокол, поддерживаемый AVRStudio. Это может быть простой протокол "AVR910" (устаревший) или пользовательская реализация протокола, используемого STK500/AVRISP. Обратите внимание, что для этих программаторов требуется микроконтроллер, что приводит к ситуации «уловка 22». Эту проблему можно решить, предварительно запрограммировав AVR программатора во время покупки соответствующей прошивкой или предварительно запрограммировав AVR с помощью загрузчика.Хорошо, я хочу использовать загрузчик. Как я могу получить его там в первую очередь?!
Чтобы использовать загрузчик в AVR, вам сначала нужно запрограммировать загрузчик. Если у вас нет существующего программатора (даже простого тупого ключа будет достаточно для начального программирования), вы также можете приобрести AVR, предварительно запрограммированный с помощью загрузчик от нескольких поставщиков.
Atmel также производит демонстрационную плату Butterfly, чей MEGA169 AVR поставляется с предустановленным загрузчиком, совместимым с AVR-Studio.Помощь! Я перепутал предохранители и сломал свой AVR, используя ISP! Наиболее распространенной ошибкой является изменение предохранителей выбора часов на недопустимую настройку. Попробуйте подключить внешние часы к выводу XTAL1 AVR и посмотрите, поможет ли это.
В противном случае, если это возможно, используйте один из высоковольтных методов. Это исправит любую неправильную конфигурацию, в том числе связанную с источником тактового сигнала, поскольку высоковольтные методы предоставляют AVR собственные часы для программирования.Как мне взаимодействовать с моим программатором?
Какое программное обеспечение вы используете для взаимодействия с вашим программатором, зависит от типа используемого вами программатора.
Простые «глупые» ключи требуют стороннего программного обеспечения, такого как PonyProg или AVRDude. Это могут быть инструменты командной строки или графического интерфейса — поищите в Интернете, и вы найдете тот, который соответствует вашим потребностям.
Программаторы и загрузчики, основанные на протоколе AVR910, могут использоваться в AVRStudio. В меню «Инструменты» выберите параметр «AVRProg», чтобы открыть экран с графическим интерфейсом для взаимодействия с вашим программатором. В качестве альтернативы сторонние инструменты, такие как AVRDude, также совместимы с AVR910.
Официальные инструменты тесно интегрированы в AVRStudio, особенно в случае вариантов отладки (JTAG/Dragon/и т.д.). В меню «Инструменты AVRStudio» выберите подменю «Программировать AVR…» и щелкните пункт «Подключиться». В новом окне выберите свой инструмент и его интерфейс подключения и нажмите «ОК».
Как и в случае с тупыми ключами и программаторами AVR910, официальные инструменты также могут использоваться с программным обеспечением сторонних производителей.(C) Dean Camera, 2009 г. Все права защищены. Не для воспроизведения на любом веб-сайте, кроме AVRFreaks.net, без предварительного явного разрешения.
Воспроизведено с предварительного явного разрешения, конечно!
Я хотел бы добавить еще одну вещь к обсуждению.
SPI — очень распространенный интерфейс для чипов. Намек на 3-wire - это режим SPI, в котором вы не используете вывод выбора микросхемы.
I2C является основным конкурентом для интерфейса, поскольку он использует только 2 провода независимо от количества микросхем, в то время как SPI требует другого провода для каждого интерфейса, но он медленнее.
При обучении я считаю преподавание интерфейсов одной из самых важных задач.
Вики сообщества доступна для тех, кто хочет расширить мою информацию.
С общей точки зрения эти интерфейсы различаются только тем, какие программисты и какие микроконтроллеры их поддерживают. Пока у вас есть совпадение между программатором и микроконтроллером, я бы не беспокоился.
Когда вы углубитесь в это, вы обнаружите, что контакты, которые интерфейс использует на микроконтроллере, имеют большее значение - если вы используете эти контакты для датчиков, тогда сигналы могут мешать, когда вы программируете устройство. Самое простое решение, если это проблема, — отключить датчики во время программирования.
Некоторые интерфейсы (в том числе JTAG) позволяют отлаживать устройство, но тогда вам нужен программатор (и программное обеспечение для его управления), которое также поддерживает это. В предыдущем вопросе мне указали на Dragon для отладки устройств AVR — я собираюсь получить его и поиграть, когда мой текущий раунд проектов будет близок к завершению.
Как вы упомянули, используются серийный номер, spi (2 провода, 3 провода?), usb, jtag, swd и т. д.
Да есть плюсы и минусы. Jtag, например, во всех случаях, о которых я знаю, встроен в аппаратное обеспечение, изначально и в основном использовался для чего-то другого, кроме отладки процессора, но они также используют его для этого. если доступен jtag, то, как правило, это лучший интерфейс по этой причине, но есть и исключения. Например, если контакты не предназначены для jtag, у вас может быть ошибка в коде и/или преднамеренное использование одного из этих контактов для чего-то еще, что делает невозможным доступ к чипу с помощью jtag (если он загружает программное обеспечение во флэш-память, которая переназначает эти штифты). Еще исключение, если ядро процессора может зависнуть из-за бага в ПО во флеше и зависшее ядро не поддается отладке через jtag. Я бы назвал это ошибкой в конструкции оборудования, но недавно имел дело с этим в коммерческой части.
На AVR, например, PDI, который, я думаю, люди могут называть здесь spi, а может и нет. по крайней мере, на xmega кажется, что pdi и внешний jtag подключаются к общему интерфейсу pdi внутри. Таким образом, контакты pdi дают вам прямой доступ к этому вместо накладных расходов jtag. до тех пор, пока этот интерфейс работает, когда программное обеспечение во флэш-памяти повесило ядро, то это был бы идеальный интерфейс для этого семейства. Протокол опубликован, относительно прост и встроен в аппаратное обеспечение. у него есть недостаток двунаправленной шины данных, такой как i2c.
У Arm есть jtag с меньшим количеством проводов, называемых swd, которые они не обязательно хотят открыто публиковать. хотя инструменты с открытым исходным кодом реализуют это. Теоретически это последовательный jtag, разные сигналы jtag отправляются последовательно по одному проводу, а не параллельно по многим проводам. внутри части я предполагаю, что он снова распараллеливается и подает обычную логику jtag. Недостатком этого является то, что ARM хочет сохранить это в полусекрете, а отладчики ARM jtag в любом случае являются королевской болью. Так что это много работы. Если/когда openocd заработает, это может быть совсем другая история. Вам также все еще нужно беспокоиться о перепрофилированных выводах и о том, что происходит с зависшим ядром.
Ряд поставщиков используют решение, в котором у них есть одна или несколько областей загрузочной флэш-памяти, в зависимости от того, каким образом вытягивается контакт, два или три, в зависимости от того, с какой флэш-памяти вы загружаетесь. Таким образом, вы можете загрузиться с пользовательской флэш-памяти, или вы можете загрузиться с флэш-памяти, которая, по крайней мере, с завода имеет загрузчик на основе последовательного порта или загрузчик на основе USB. Для каждого поставщика эти программные решения могут различаться и действительно различаются, последовательный протокол меняется тонким или более чем тонким образом, решение USB может меняться совсем немного. Хорошо и плохо то, что некоторые из этих прошивок вы можете получить, поэтому вы можете изменить серийный загрузчик, это и хорошо, и плохо, хорошо тем, что вы можете настроить его для своего продукта, плохо, что это возможно чтобы случайно стереть его и заблокировать часть, по крайней мере, заблокировать его для этого интерфейса.
Инструменты Jtag раньше стоили тысячи долларов, теперь они не стоят, примерно за 15 долларов вы можете получить разделительную плату ftdi и перепрофилировать ее с помощью openocd. За 50 долларов плюс или минус вы можете получить USB-решение на основе ftdi, которое работает из коробки с openocd. Вы можете получить некоммерческую j-ссылку примерно за 75–80 долларов. А еще есть многотысячные, которые быстрые, конечно, но в целом не стоят денег. Вы покупаете их, когда являетесь огромной корпорацией, у которой много денег и вы хотите платить за поддержку. Когда вы платите по этим ценам, вы получаете продукт, который хотите, и сразу же получаете ответы на вопросы техподдержки. Например, как бесплатный linux vs windows или RHEL, поддержка linux бесплатна, но вы получаете то, что получаете. В любом случае, это делает jtag более привлекательным.
Вы должны иметь в своем арсенале инструменты jtag для отладки и разработки, когда и где они доступны. У sparkfun есть платы USB-to-serial на основе ftdi, а части ftdi могут быть перепрофилированы в big bangers, вы можете использовать их для spi, i2c, pdi, jtag или других интерфейсов. В идеале получить платы, сделанные для интересующей вас шины/детали, и использовать бесплатное программное обеспечение с открытым исходным кодом, которое идет с ним. Также используйте эти последовательные платы, в идеале имеющие питание 3,3 В и 5 В (около 15 долларов США за каждую, которую вы используете для lillypads и arduino mini и т. д.) для подключения к последовательным портам для различных микроконтроллеров, которые имеют какой-то последовательный протокол. Мне проще написать свой собственный загрузчик на основе этих протоколов, например, как у разработчиков arduino/avr, где опубликован исходный код загрузчика, и он значительно отличается от предполагаемого стандарта, который они поддерживают. YMMV.
Короче говоря, нет одного хорошего решения, у всех есть плюсы и минусы. Будьте готовы поддержать как минимум двоих из них. usb и последовательный порт или usb и jtag или jtag и серийный номер и т. д. Просто положите контактные площадки или отверстия на плате и не обязательно заполнять. Для вашей личной или лабораторной разработки имейте полный набор инструментов и будьте готовы переключаться с одного на другой, когда вы собираете чипы и должны восстанавливать платы или когда вы разрабатываете свой собственный загрузчик, прошивку USB и т. д.
Крис Стрэттон
праздник