Isp программирование что это такое
Разработка приложений для встраиваемых систем (firmware) обычно осуществляется на настольной рабочей станции (компьютер PC, работающий под Windows или Linux), на языке ассемблера и высокоуровневом языке C. С помощью кросс-платформенных инструментов (компилятор, линкер и т. д.) генерируется исполняемый двоичный код, который должен быть выгружен в память целевой платы. В большинстве случаев это энергонезависимая память (non-volatile memory), требующая выполнения специальных процедур для своего программирования.
На самых ранних этапах развития микроконтроллеров и процессоров энергонезависимая память была представлена микросхемами EPROM, EEPROM или FLASH с параллельным интерфейсом, которые для своего перепрограммирования требовали извлечения из сокета целевой системы и установки в сокет программатора (иногда перед этим требовалось стирание с помощью ультрафиолетовой лампы). Сегодня память микроконтроллеров и внешних микросхем памяти может быть перепрограммирована без извлечения из схемы, где они работают. Эта технология называется внутрисхемное (in-ciruit) или внутрисистемное (in-system) программирование, часто обозначаемая аббревиатурой ISP (от in-system programming).
Для реализации ISP требуются следующие составляющие:
1. Программный инструмент, работающий на PC (утилита программирования), который может управлять интерфейсом программирования через любой стандартный порт (сегодня это чаще всего USB). Компьютер, где работает это программное обеспечение, называют еще хостом PC.
2. Адаптер программирования, который позволяет подключиться к интерфейсу программирования целевой платы через любой стандартный порт компьютера PC (сегодня это чаще всего USB, раньше также использовались порты RS-232, принтер порта LPT).
3. Специальный интерфейс программирования наподобие SPI [2], JTAG [3] (иногда используются и другие интерфейсы).
Все 3 этих требования должны быть так или иначе реализованы, однако в реальном мире существует множество вариантов реализации. Например, адаптер программирования может быть интегрирован в целевую плату. В этом примере кабель USB будет подключаться напрямую к PC и к целевой плате. Иногда интерфейс программирования доступен через специальные инструкции или регистры микроконтроллера, которые позволяют загрузить в память новое firmware.
Здесь (перевод [1]) представлен обзор различных методов ISP, используемые сегодня с популярными семействами микроконтроллеров AVR и ARM. Эта статья не претендует на полноценный обзор ISP, потому что в мире существует множество семейств микроконтроллеров и процессоров с различными особеностями реализации технологии внутрисхемного программирования.
[Программное обеспечение PC]
Есть множество инструментов (утилит программирования), каждый поддерживает свой набор интерфейсов программирования, адаптеров и целей (микроконтроллеров) для программирования. Довольно важен тот момент, что не все инструменты доступны для каждой операционной системы PC.
Утилита программирования взаимодействует с пользователем либо через командную строку (command line, CLI) или через графический интерфейс (окно диалога с кнопками и галочками, GUI). Каждый из этих методов взаимодействия имеет свои достоинства и недостатки. В то время как CLI лучше всего подходят для автоматизации (очень важно в производстве, когда нужно многократно повторять одну и ту же последовательность операций), интерфейс GUI упрощает ручное изменение различных опций программирования, избавляя от запоминания команд CLI. Некоторые утилиты поддерживают оба метода использования, CLI и GUI. Иногда графический интерфейс служит надстройкой над ниже лежащим интерфейсом командной строки, формируя командную строку из опций графического интерфейса.
Некоторые адаптеры программирования наподобие Zylin ZY1000 (см. ниже) имеют встроенное программное обеспечение программирования, управляемое через web-интерфейс. Это делает возможность программирования практически независимой от используемой операционной системы настольного компьютера PC.
В таблице ниже представлено популярное бесплатное программное обеспечение (некоторые из них с открытым исходным кодом) для программирования встраиваемых систем.
| Название | Open Source |
Поддержка OS |
CLI | GUI | Поддерживаемые микроконтроллеры |
| AVRDUDE [4] | Да | Linux Windows OS X |
Да | Да [10] | AVR |
| AVR Studio 4 [5] | — | Windows | Да | Да | AVR |
| JTAG-O-MAT [6] | Да | Linux Windows |
Да | — | ARM |
| OpenOCD [7] | Да | Linux Windows OS X |
Да | — | ARM |
| SAM-PROG [8] | — | Windows | ? | Да | ARM |
| UISP [9] | Да | Linux Windows |
Да | — | AVR |
[Порты PC, используемые для ISP]
Адаптеры, использующие для подключения порт принтера LPT, являются самыми простыми. Обычно в них нет ничего, кроме микросхем буфера или преобразователя уровней, подключаемых с одной стороны к сигналам LPT, а с другой стороны к программируемой целевой системе. Иногда в качестве преобразователей уровня используются обычные резисторы. Интерфейс LPT был широко распространен в 80-х и 90-х годах двадцатого века, но эти времена прошли. Сегодня уже трудно найти компьютер PC, на котором был бы интерфейс LPT, однако в продаже все еще можно найти карты расширения для шины PCI, на которых есть интерфейс LPT.
Как и порты принтера LPT, последовательные интерфейсы RS-232 (COM-порт) сегодня заменил интерфейс USB. Однако последовательные порты RS-232 все еще остаются популярными для встраиваемых систем. Многие продвинутые адаптеры программирования основаны на микроконтроллерах, и почти у всех микроконтроллеров есть в распоряжении как минимум один последовательный порт UART. Это аппаратная логическая составляющая, которая делает возможным обмен данными через RS-232. Таким образом, адаптеры программирования с портами RS-232 сегодня все еще используются. Некоторые производители продают преобразователи USB — RS-232, которые можно использовать для подключения программатора с интерфейсом RS-232 к компьютеру, но иногда подключение через преобразователь не работает (это зависит от реализации программного обеспечения PC и аппаратуры преобразователя USB — UART, насколько он хорошо совместим с интерфейсом программатора).
USB намного сложнее, чем параллельный порт LPT или последовательный интерфейс RS-232, однако сегодня уже имеется много микроконтроллеров, аппаратно поддерживающих этот интерфейс, и их ассортимент с каждым днем увеличивается. Таким образом, появляется все больше и больше адаптеров программирования, подключаемых через порт USB, потому что интерфейс USB есть практически на каждом компьютере PC. После того, как компания FTDI предоставила специальные микросхемы [11], которые дают возможность просто реализовать программирование JTAG через USB без необходимости писать для этого какое-либо firmware, цена адаптеров программирования для JTAG, которые работают через USB, значительно упала.
Примечание: если говорить о цене на адаптеры, то она может меняться в широких пределах — от нескольких долларов до нескольких тысяч долларов. Цена основана на поддержке больших скоростей, реализации гальванической изоляции, поддержке отладки, качества буферизации сигналов, уникальных возможностях и т. д.
Одним из недостатков USB является ограниченная длина кабеля. Чем короче кабель, тем вся система программирования работает надежнее. Сегодня наиболее продвинутые адаптеры программирования поддерживают подключение через Ethernet, что дает возможность программирования и отладку даже через сеть Интернет.
[AVR ISP]
Есть несколько способов реализации внутрисхемного программирования для программирования внутренней flash-памяти микроконтроллеров AVR. Ниже приведены названия этих интерфейсов по терминологии Atmel:
• ISP , который иногда называют SPI, потому что он основан на последовательном периферийном интерфейсе [2].
• JTAG , доступный на мощных микроконтроллерах AVR, он может служить альтернативой для ISP. JTAG позволяет не только программировать память AVR, но еще позволяет выполнять отладку программ по исходному коду и поддерживает внутрисхемное тестирование системы (технология boundary scan). Микроконтроллеры AVR, на которых есть JTAG, также дополнительно могут программироваться не только через JTAG, но еще и через ISP.
• DebugWire , используется на многих микроконтроллерах AVR, у которых малое количество выводов. Для передачи данных используется только один сигнальный вывод микроконтроллера. Этот интерфейс кроме программирования памяти также поддерживает и отладку.
• PDI можно найти на новых чипах XMEGA.
• TPI используется на некоторых TinyAVR, у которых мало внешних выводов и мало доступной памяти.
Примечание: для AVR существуют еще так называемые методы программирования HVSP (высоковольтное последовательное программирование) и HVPP (высоковольтное параллельное программирование), но эти технологии здесь не рассматриваются, потому что они не относятся к внутрисхемному программированию. Высоковольтное прогаммирование часто используется для восстановления фьюзов, в частности HVSP использует устройство AVR fuse doctor [12].
STK200 это простой, недорогой адаптер программирования ISP, подключаемый через параллельный порт принтера LPT. Изначально этот адаптер входил в состав комплекта начинающего разработчика Atmel STK200 starter kit, сейчас этот адаптер компанией Atmel больше не поддерживается. Однако существует множество утилит программирования, поддерживающих этот адаптер, и многие компании все еще представляют клоны этого адаптера. Из-за простоты STK200 и доступности его принципиальной схемы такой адаптер можно собрать самому (ниже приведена одна из таких схем).

Сегодня Atmel официально предоставляет 3 адаптера для программирования AVR. Ниже приведен их список в порядке возрастания цены и увеличения возможностей. Все эти адаптеры подключаются через USB.
AVR ISP mkII. Это программатор ISP, поддерживает интерфейсы ISP, PDI и TPI, отладка не поддерживается.
Схема и прошивка программатора AVR ISP mkII компанией Atmel не опубликована, однако в Интернете давно доступны варианты реализации (клоны) этого программатора на основе чипов AT90USB162, ATmega16U2 и ATmega32U4 (см. описание одного из вариантов такой реализации в статье [13]), прошивка для него сделана на основе библиотеки LUFA [14]. Таким образом, Вы сами можете изготовить такой программатор и залить в него готовую прошивку, либо можете скомпилировать эту прошивку для исходного кода.
AVR Dragon. Поддерживает программирование через ISP и отладку по исходному коду через DebugWire.
JTAGICE mkII. Поддерживает программирование через ISP и JTAG, а также отладку по исходному коду через JTAG и DebugWire.
[Альтернативные адаптеры AVR]
1. SP Duo JTAG Programmer site:embedded-creations.com.
2. AVR DUO ICE site:avrfreaks.net.
Эти адаптеры интересны тем, что предоставляют программирование через ISP и JTAG. SP Duo подключается через интерфейс RS-232, и он поставляется со своим собственным firmware, отладка JTAG не поддерживается. AVR DUO ICE подключается через USB, и поддерживает отладку JTAG.
Открытым сообществом разработчиков было сделано несколько попыток использования чипов FT2232 для реализации недорогого адаптера JTAG для AVR, но без особого успеха. Программирование происходит довольно медленно, и отладка JTAG работает ненадежно из-за того, что политика Atmel держит в секрете тонкости реализации технологии отладки AVR.
Следует упомянуть про интересную разработку, которая поддерживает не только программирование через JTAG, но также и отладку.
[ARM ISP]
Внутрисхемное программирование внутренней памяти FLASH микроконтроллеров ARM обычно осуществляется через JTAG. Наиболее простым адаптером JTAG в плане аппаратуры является адаптер Wiggler, который подключается через параллельный порт принтера LPT. Изначально этот адаптер предлагала компания Macraigor Systems, и в Интернет можно найти различные схемы его клонов.
Turtelizer [15] это один из примеров адаптера JTAG, подключаемого через RS-232. Он основан на микроконтроллере ATmega8 или ATmega168. Дизайн и прошивка адаптера Turtelizer опубликованы под лицензией BSD.
Сегодня многие адаптеры JTAG основаны на чипе FT2232 компании FTDI. На основе одного такого чипа можно создать два независимых интерфейса — один это JTAG, другой дополнительный порт RS-232. Turtelizer 2 [16] это пример одного из таких адаптеров, опубликованных как открытая разработка (Open Source Hardware).
Норвежская компания Zylin AS, известная как разработчик плагина Embedded CDT для Eclipse и поставщик пакетов OpenOCD, предоставляет сегодня наиболее подвинутые адаптеры JTAG. Адаптер программирования ZY1000, основанный на открытом программном обеспечении, это в действительности маленькая система Linux со встроенным интерфейсом Ethernet и JTAG, где интегрирован пакет OpenOCD и web-сервер. Все, что Вам нужно для программирования устройств ARM, это только браузер.
[Программирование внешней памяти через ISP]
Из-за Гарвардской архитектуры, где 8-битная шина данных микшируется с 16-битной шиной кода инструкции, выполнение программы всех микроконтроллеров семейства AVR ограничено только внутренней памятью FLASH. Это остается верным даже если доступна внешняя шина памяти. Тем не менее для хранения энергонезависимой памяти данных (non-volatile data memory) может использоваться внешняя память FLASH.
Микроконтроллеры ARM с внешней памяти не ограничены использованием внутренней памяти для памяти программ, для этого может использоваться и внешняя шина. Большое количество микроконтроллеров ARM представляются не только с внутренней памятью FLASH для памяти программ, куда записывается firmware, но также для firmware может записываться и во внешнюю FLASH-память, подключаемую к микроконтроллеру ARM в виде внешней микросхемы.
Существуют как минимум два основных метода для реализации внутрисхемного программирования внешних устройств памяти. Первый основан на технологии пограничного сканирования JTAG (JTAG boundary scan), которая позволяет переключать любой вывод и считывать его состояние у тестируемого микроконтроллера ARM. Если все выводы программирования совмещены с управляемыми выводами микроконтроллера, то JTAG boundary scan может использоваться для генерации сигналов последовательности программирования памяти чипа. Достоинство этого метода в том, что на целевой плате не требуется наличие никакого дополнительного поддерживающего кода, потому что технология JTAG boundary scan в чипе ARM полностью реализована аппаратно. Но, как можно было бы ожидать, это довольно медленный способ программирования.
Второй метод использует интерфейс отладки JTAG, который позволяет CPU выполнять отдельные инструкции. Этот метод программирования внешней памяти чипа позволяет использовать выполняемую по шагам последовательность инструкций. Это значительно быстрее метода boundary scan, но требует, чтобы CPU был инициализирован и запущен в работу на выполнение процедуры программирования. Вариант этого метода может быть использован, когда доступна некоторая область оперативной RAM. Вместо эмуляции отдельных инструкций в RAM выгружается и запускается целый кусок кода, осуществляющий программирование данных, поступающих в буфер RAM через JTAG. Программируемые данные могут поступать и через JTAG, и через дополнительный канал передачи данных, так называемый интерфейс JTAG COMM.
[Использование загрузчика (bootloader)]
Как правило загрузчики получают исполняемый двоичный код через один из внешних интерфейсов микроконтроллера, и записывают этот код в некую встроенную энергонезависимую память (она может находиться на кристалле микроконтроллера или установлена на плате в виде отдельной микросхемы). После того, как код передан и записан, он может быть запущен на выполнение специальной командой или последующим сбросом или включением питания системы. Часто в качестве интерфейса связи с хостом PC загрузчик использует UART, иногда USB и другие интерфейсы.
Загрузчик также может брать исполняемый код из энергонезависимой памяти, установленной на плате системы, загружать этот код в RAM и запускать его. Это происходит всякий раз при включении питания или сбросе системы.
Таким образом, различают 2 вида загрузчиков — один предназначен для получения кода firmware из внешнего источника (хоста PC) и прошивки его в энергонезависимую память системы, а второй вид загрузчика берет код из энергонезависимой памяти системы, записывает его в RAM и запускает на выполнение. Первый вид загрузчиков предназначен для обновления программного обеспечения без специального программатора. Подразумевается, что микроконтроллер системы поддерживает самопрограммирование. Второй вид загрузчика используется, когда этого требуют особенности реализации микроконтроллера и всей встраиваемой системы (используется реже).
Загрузчики AVR. Многие модели микроконтроллеров AVR поддерживают самопрограммирование, т. е. они могут перезаписывать собственную память программ [17]. Некоторая часть области кода памяти FLASH может быть предоставлена под код загрузчика. Из-за того, что этот код находится в отдельной секции, он может получить доступ на запись к другим секциям памяти FLASH микроконтроллера AVR. Краткий обзор загрузчиков AVR дан в статье [18].
Загрузчики ARM. Почти все микроконтроллеры серии AT91SAM компании Atmel имеют на борту записанный в ПЗУ специальный загрузчик кода, это так называя технология SAM-BA [8]. Работой этой технологии управляет энергонезависимый бит — он определяет, будет ли запущен при включении питания/сбросе код загрузчика, или же будет запущена ранее записанная в память FLASH программа приложения (firmware). Загрузчик активируется при очистке памяти микроконтроллера.
AVR. Учебный курс. Трактат о программаторах
Что же представляет из себя это устройство?
В простейшем случае программатор это девайс который связывает микроконтроллер и компьютер, позволяя с компа залить файл прошивки в память контроллера. Также нужна прошивающая программа, которая по специальному протоколу загонит данные в микроконтроллер.
Программаторы бывают разные под разные семейства контроллеров существуют свои программаторы. Впрочем, бывают и универсальные. Более того, даже ту же простейшую AVR’ку можно прошить несколькими способами:
Внутрисхемное программирование (ISP)
Самый популярный способ прошивать современные контроллеры. Внутрисхемным данный метод называется потому, что микроконтроллер в этот момент находится в схеме целевого устройства — он может быть даже наглухо туда впаян. Для нужд программатора в этом случае выделяется несколько выводов контроллера (обычно 3..5 в зависимости от контроллера).
К этим выводам подключается прошивающий шнур программатора и происходит заливка прошивки. После чего шнур отключается и контроллер начинает работу.
У AVR прошивка заливается по интерфейсу SPI и для работы программатора нужно четыре линии и питание (достаточно только земли, чтобы уравнять потенциалы земель программатора и устройства):
- MISO — данные идущие от контроллера (Master-Input/Slave-Output)
- MOSI — данные идущие в контроллер (Master-Output/Slave-Input)
- SCK — тактовые импульсы интерфейса SPI
- RESET — сигналом на RESET программатор вводит контроллер в режим программирования
- GND — земля
Сам же разъем внутрисхемного программирования представляет собой всего лишь несколько штырьков. Лишь бы на него было удобно надеть разъем. Конфигурация его может быть любой, как тебе удобней.
Однако все же есть один популярный стандарт:
Для внутрисхемной прошивки контроллеров AVR существует не один десяток разнообразных программаторов. Отличаются они в первую очередь по скорости работы и типу подключения к компьютеру (COM/LPT/USB). А также бывают безмозглыми или со своим управляющим контроллером.
Безмозглые программаторы, как правило, дешевые, очень простые в изготовлении и наладке. Но при этом обычно работают исключительно через архаичные COM или LPT порты. Которые найти в современном компьютере целая проблема. А еще требуют прямого доступа к портам, что уже в Windows XP может быть проблемой. Плюс бывает зависимость от тактовой частоты процессора компьютера.
Так что твой 3ГГЦ-овый десятиядерный монстр может пролететь, как фанера над Парижем.
Идеальный компьютер для работы с такими программаторами это какой-нибудь PIII-800Mhz с Windows98…XP.
Вот очень краткая подборка проверенных лично безмозглых программаторов:
- Программатор Громова.
Простейшая схема, работает через оболочку UniProf(удобнейшая вещь. ), но имеет ряд проблем. В частности тут COM порт используется нетрадиционно и на некоторых материнках может не заработать. А еще на быстрых компах часто не работает. Да, через адаптер USB-COM эта схема работать не будет. По причине извратности подхода 🙂 - STK200
Надежная и дубовая, как кувалда, схема. Работает через LPT порт. Поддерживается многими программами, например avrdude. Требует прямого доступа к порту со стороны операционной системы и наличие LPT порта. - FTBB-PROG.
Очень надежный и быстрый программатор работающий через USB, причем безо всяких извратов. C драйверами под разные операционные системы. И мощной оболочкой avrdude. Недостаток один — содержит редкую и дорогую микросхему FTDI, да в таком мелком корпусе, что запаять ее без меткого глаза, твердой руки и большого опыта пайки весьма сложно. Шаг выводов около 0.3мм. Данный программатор встроен в демоплаты Pinboard
Программаторы с управляющим контроллером лишены многих проблем безмозглых. Они без особых проблем работают через USB. А если собраны на COM порт, то без извращенских методик работы с данными — как честный COM порт. Так что адаптеры COM-USB работают на ура. И детали подобрать можно покрупней, чтобы легче было паять. Но у этих программаторов есть другая проблема — для того чтобы сделать такой программатор нужен другой программатор, чтобы прошить ему управляющий контроллер. Проблема курицы и яйца. Широко получили распространение такие программаторы как:
- USBASP
- AVRDOPER
- AVR910 Protoss
Внутрисхемное программирование, несмотря на все его удобства, имеет ряд ограничений.
Микроконтроллер должен быть запущен, иначе он не сможет ответить на сигнал программатора. Поэтому если неправильно выставить биты конфигурации (FUSE), например, переключить на внешний кварцевый резонатор, а сам кварц не поставить. То контроллер не сможет запуститься и прошить его внутрисхемно будет уже нельзя. По крайней мере до тех пор пока МК не будет запущен.
Также в битах конфигурации можно отключить режим внутрисхемной прошивки или преваратить вывод RESET в обычный порт ввода-вывода (это справедливо для малых МК, у которых RESET совмещен с портом). Такое действо тоже обрубает программирование по ISP.
Параллельное высоковольтное программирование
Обычно применяется на поточном производстве при массовой (сотни штук) прошивке чипов в программаторе перед запайкой их в устройство.
Параллельное программирование во много раз быстрей последовательного (ISP), но требует подачи на RESET напряжения в 12 вольт. А также для параллельной зашивки требуется уже не 3 линии данных, а восемь + линии управления. Для программирования в этом режиме микроконтроллер вставляется в панельку программатора, а после прошивки переставляется в целевое устройство.
Для радиолюбительской практики он особо не нужен, т.к. ISP программатор решает 99% насущных задач, но тем не менее параллельный программатор может пригодиться. Например, если в результате ошибочных действий были неправильно выставлены FUSE биты и был отрублен режим ISP. Параллельному программатору на настройку FUSE плевать с высокой колокольни. Плюс некоторые старые модели микроконтроллеров могут прошиваться только высоковольтным программатором.
Из параллельных программаторов для AVR на ум приходит только:
- HVProg от ElmChan
- Paraprog
- DerHammer
А также есть универсальные вроде TurboProg 6, BeeProg, ChipProg++, Fiton которые могут прошивать огромное количество разных микроконтроллеров, но и стоят неслабо. Тысяч по 10-15. Нужны в основном только ремонтникам, т.к. когда не знаешь что тебе завтра притащат на ремонт надо быть готовым ко всему.
Прошивка через JTAG
Вообще JTAG это отладочный интерфейс. Он позволяет пошагово выполнять твою программу прям в кристалле. Но с его помощью можно и программу прошить, или FUSE биты вставить. К сожалению JTAG доступен далеко не во всех микроконтроллерах, только в старших моделях в 40ногих микроконтроллерах. Начиная с Atmega16.
Компания AVR продает фирменный комплект JTAG ICEII для работы с микроконтроллерами по JTAG, но стоит он (как и любой профессиональный инструмент) недешево. Около 10-15тыр. Также есть первая модель JTAG ICE. Ее можно легко изготовить самому, а еще она встроена в мою демоплату Pinboard.
![]() |
Прошивка через Bootloader
Многие микроконтроллеры AVR имеют режим самопрошивки. Т.е. в микроконтроллер изначально, любым указанным выше способом, зашивается спец программка — bootloader. Дальше для перешивки программатор не нужен. Достаточно выполнить сброс микроконтроллера и подать ему специальный сигнал. После чего он входит в режим программирования и через обычный последовательный интерфейс в него заливается прошивка. Подробней описано в статье посвященной бутлоадеру.
Достоинство этого метода еще и в том, что работая через бутлоадер очень сложно закосячить микроконтроллер настолько, что он не будет отвечать вообще. Т.к. настройки FUSE для бутлоадера недоступны.
Бутлоадер также прошит по умолчанию в главный контроллер демоплаты Pinboard чтобы облегчить и обезопасить первые шаги на пути освоения микроконтроллеров.
Pinboard II
Прошивка AVR с помощью демоплаты Pinboard II (для Pinboard 1.1 все похоже)
Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
89 thoughts on “AVR. Учебный курс. Трактат о программаторах”
А что это делает в учебном курсе? чего не на главной странице?
Здарова, Артем, вот я и зашел, чего то не мог зайти долго…
Я постепенно правлю и переписываю старые статьи, чтобы привести их в более стройный и завершенный вид.
Introduction to Programming of Microcontroller: ISP, IAP and ICP
Microcontroller programming is to load the original program into the computer after compiling and processing, and let the computer execute the written program. For example, when program a single-chip program, it loads the .hex file and stores it in the single-chip computer. The written program can be realized when the computer is turned on. . To put it simply, the process of making the microcomputer boot and execute the programming.
Chip programming is an important part of the production process of electronic products. The efficiency is an important aspect that customers pay attention to. Generally, the current programming are divided into 2 methods, offline programming and online programming.
Offline programming: Through the link of the adapter and the chips of different packages, the chip and the adapter can be used together to realize the programming of the program. The essence of the adapter is similar to a precision fixture, and chips in different packages need to be matched with different adapters.
If there is an error during the production test, the chip needs to be disassembled from the adapter and re-programmed according to the prescribed process, which consumes a lot of manpower and material resources, and the cost is high, and it is also relatively prone to problems. Therefore, offline programming is generally not recommended.
Online programming: Online programming uses the standard communication bus of the chip, such as USB, SWD, JTAG, UART, etc. The interface is generally fixed, and there are few pins that need to be connected during programming. Since the communication rate of the interface is not high, the programming can be completed by using ordinary wires without high consumption.
Online programming is programmed by connecting wires. If an error is found during production testing, you can perform programming again without disassembling the chip. It not only saves production cost, but also increases the efficiency of programming. So now the way of online burning is generally used.
2. Three Common Methods of Microcontroller Programming: ISP, IAP and ICP
Let’s talk about the three common methods of microcontroller programming: ISP, IAP and ICP, and their differences. What are the principles of these three program? Before analyzing the principle, you need to know the access address of the microcontroller Flash to see where the program is burned.
1). The location of MCU Flash in the address mapping table
The figure below is an address mapping table of STM32F4xx, from 0x0000 0000 to 0xFFFF FFFF, totaling 4Gbyte. The access addresses of the on-chip Flash, on-chip RAM, on-chip peripherals and external expansion interfaces of the microcontroller are all mapped within the range of 4Gbyte.
In this picture, we need to pay attention to the lower part:
Main memory main storage area: Usually, the code we write is placed at the starting position of the main storage area (0x0800 0000) to start running. When run the program, just from here 0x0800 0000.
System memory system storage area: System memory (starting position 0x1FFF 0000). This is a piece of ROM that cannot be modified after leaving the factory.
After understanding the specific address of the program, we also need to look at the startup method of the single-chip microcomputer:
2). Introduction to ISP, ICP, and IAP
ISP: In System Programming.
ISP means that programming can be performed on the board level, that is, the entire program is written without dismantling the chip, usually through the ISP interface line.
Chips that support ISP generally solidify a boot program (upgraded with ISP) inside the chip. BOOT0 = 1, BOOT1 = 0
Start address: 0x1FFF0000
use Flash loader to program STM32, use STC-ISP to program STC chip.
ICP: In Circuit Programming
ICSP: In-Circuit Serial Programming, in-circuit serial programming. Such as: EEPROM programming, etc.
BOOT0 = 0, BOOT1 = x
Start address: 0x08000000
There are different opinions on the ICP programming method on the Internet. From the literal meaning (in the circuit), all the chips that are being programmed need to be powered on, and they are all in the circuit. Strictly speaking, programming using J-Link, ST-Link, e-Link32 and other tools also belongs to in-circuit programming (ICP).

IAP: In application programming. Perform programming (upgrade program, update firmware) while the program is running.
The principle of IAP is quite different from the above two. In this way, the main storage area is divided into two areas (allocated by the developer according to actual needs). This part at the beginning of 0800 0000 stores a developer’s own The designed Bootloader program, the other part stores the APP program that actually needs to run.
IAP is the programming of part of the User Flash by the user’s own program during operation. The purpose is to update and upgrade the firmware program in the product through the reserved communication port conveniently after the product is released.
IAP communication port There are many kinds of IAP communication ports: UART serial port, ETH Ethernet, I2C, SPI, etc. It stands to reason that as long as the communication port that can transmit data can realize the function of IAP.

The Difference Between ISPs and IAPs
1) For Applications
1. The update of ISP program needs to be solved on site, but it does not need to dismantle the machine;
2. IAP If there is a network management system, use the network management to download everything, and people don’t have to run around.
2) How ISPs and IAPs Work
The implementation of ISP is relatively simple, and the common practice is that the internal memory can be rewritten by the software of the host computer through the serial port. For the microcontroller, the data can be received through SPI or other serial interfaces and written into the memory. So even if we solder the chip on the circuit board, as long as the serial port to interface with the host computer is reserved, the internal memory of can be rewritten.
The implementation of IAP is complicated. When implementing the function, it needs to have two areas for storage inside the MCU. Generally, there are 2 areas, one is called the BOOT area, and the other is storage area. The MCU is powered on and runs in the BOOT area. If the conditions for external program rewriting are met, the program in the storage area will be rewritten. If the conditions for rewriting the program externally are not met, the program pointer jumps to the storage area and starts to execute the program placed in the storage area, thus realizing the IAP function.
3) Advantages of ISPs and IAPs
ISP: The experiment and development of the microcontroller can be carried out without a programmer. The MCU chip can be directly welded to the circuit board, and the finished product is ready after debugging, which eliminates the frequent insertion and removal of the chip to the chip and the circuit board during debugging. Inconvenience caused.
IAP: The IAP technology maps the Flash memory into two memory parts structurally. When running the user program on one memory bank, the other memory bank can be reprogrammed, and then the program is transferred from one memory bank to the other.
The realization of ISP generally requires few external circuits to assist the realization, while the realization of IAP is more flexible. Usually, the serial port of the single-chip microcomputer can be used to connect to the RS232 port of the computer, and the internal memory can be programmed through a specially designed firmware program. It is very convenient to realize remote upgrade and maintenance through Internet or other communication methods.
Внутрисхемное программирование
Метод внутрисхемного (внутрисистемного) программирования (ISP — In-System Programmability) на сегодняшний день является основным способом программирования микроконтроллеров, ПЛИС и других приборов, в состав которых входит память Flash или EEPROM. В основе внутрисистемного программирования лежит идея использования какоголибо стандартного интерфейса, интегрированного в программируемую микросхему для последовательного занесения в нее программных или конфигурационных данных.
Типичная система ISP-программирования представляет собой комплекс средств, состоящий из персонального компьютера, интерфейсной платы и специализированного программного обеспечения. В зависимости от типа программируемой микросхемы могут использоваться различные средства программирования:
- специализированные программаторы, ориентированные на работу с определенными сериями микроконтроллеров, ПЛИС, DSP или CPLD (Complex Programmable Logic Device — комплексное программируемое логическое устройство);
- интерфейсные платы или так называемые «загрузочные кабели» для программирования с использованием персонального компьютера;
- тестовое оборудование (ATE — Automated Test Equipment), позволяющее помимо тестирования платы проводить также и программирование с использованием JTAG-интерфейса.
Основные преимущества использования ISP-технологии отражены в таблице 1.

Для понимания особенностей внутрисхемной отладки и программирования по ISP-технологии далее будут рассмотрены три основных интерфейса, используемых для этих целей:
- JTAG/IEEE 1149.1 — 4-проводной интерфейс, обеспечивающий тестирование и программирование микросхем, смонтированных на печатной плате;
- SPI — интерфейс, позволяющий реализовать высокоскоростной полнодуплексный синхронный обмен данными по 3-проводной шине и программирование в последовательном режиме;
- DebugWIRE — однопроводной интерфейс, используемый в новейших микроконтроллерах ATMEL, ориентированный на программирование встроенной памяти и отладку в составе готового устройства.
Бурное развитие электронной техники и связанный с этим рост степени интеграции микросхем к концу 70-х годов привели к необходимости разработки механизма тестирования, способного обеспечить полноценное тестирование сложных и функционально насыщенных печатных плат. В 1980 году группой JTAG (Joint Test Automation Group — объединенная рабочая группа по автоматизации тестирования) была начата разработка спецификации граничного (периферийного) сканирования, стандартизованная в 1990 году институтом IEEE. Получившийся стандарт известен как IEEE Std.1149.1–1990. В дальнейшем было выполнено несколько пересмотров стандарта. В 1994 году в него было добавлено описание языка BSDL (Boundary-Scan Description Language — язык описания устройств, поддерживающих периферийное сканирование). С этого момента стандарт был принят ведущими электронными компаниями во всем мире. В настоящее время многие небольшие фирмы, которые по экономическим причинам не могут воспользоваться дорогими внутрисхемными тестерами, используют технологию граничного сканирования. Последний раз стандарт был пересмотрен в 2001 году [1]. Текст стандарта можно приобрести в IEEE (http://shop.ieee.org).
Архитектура граничного сканирования (Boundary-Scan Test) обеспечивает тестирование соединений между интегральными схемами на плате без использования физических тестовых пробников. Предполагается, что тестируемые микросхемы имеют поддержку JTAG-интерфейса. Стандарт IEEE 1149.1 определяет 4-проводной (опционально 5-проводной) последовательный интерфейс доступа к микропроцессорам, DSP, CPLD. Любая совместимая с JTAG-интерфейсом микросхема (рис. 1) имеет регистры сдвига и модуль поддержки функций граничного сканирования. Ячейки регистра сдвига (BS-регистра) располагаются непосредственно между внешними выводами и функциональным ядром микросхемы.

Данные, поступающие в кристалл через вывод TDI, сохраняются в регистре инструкций или в одном из регистров данных. Последовательные данные выводятся из микросхемы через вывод TDO. Логический модуль интерфейса тактируется сигналом на входе TCK, не зависимом от системной тактовой частоты. Сигналы на входе TMS управляют состоянием порта TAP (Test Access Port). Вывод TRST является необязательным и служит для сброса логики интерфейса JTAG.
Множество микросхем, совместимых со стандартом IEEE 1149.1, могут последовательно соединяться друг за другом на печатной плате, формируя цепь граничного сканирования (рис. 2).

С ее помощью появляется возможность получать информацию о состоянии каждого вывода каждой микросхемы, являющейся частью общей цепи сканирования через последовательный TAP-интерфейс. При обычной работе устройства JTAG-интерфейс не оказывает никакого влияния на его работу.
При тестировании или внутрисхемном программировании с помощью JTAG-интерфейса можно воздействовать на логическое ядро микросхемы, выдавать логические сигналы на выводы микросхемы, считывать выходные сигналы от внутренней логики или значение логических уровней на выводах, впаянных в печатную плату.
Технология граничного сканирования позволяет испытывать плату на наличие структурных производственных ошибок и выполнять ISP-программирование почти всех устройств на плате, независимо от типа и размера встроенной памяти, через стандартный JTAG TAP-интерфейс. В результате происходит значительное сокращение необходимых точек тестирования на плате. Это приносит много выгод: упрощается разводка печатной платы, снижаются затраты и время тестирования [2], сокращается время выхода готового изделия на рынок.
Файлы, содержащие описание поддерживаемых инструкций и конфигурационных параметров регистров сдвига JTAG-совместимых микросхем на языке BSDL, бесплатно доступны на сайтах фирм-производителей.
Интерфейс SPI (Serial Peripheral Interface — последовательный периферийный интерфейс) обеспечивает высокоскоростную передачу информации в синхронном режиме между ведущим и ведомыми устройствами. На рис. 3 показано включение ведущего и ведомого устройств с использованием SPI.

Ведущее устройство содержит 8-разрядный регистр сдвига и генератор синхроимпульсов. Инициирование цикла обмена данными происходит, когда ведущий устанавливает на выводе SS ведомого устройства лог. «0». Ведущее устройство генерирует необходимую тактовую последовательность на выводе SCK для обмена данными между сдвиговыми регистрами устройств. Данные побитно сдвигаются от ведущего к ведомому по линии MOSI (Master Out — Slave In) и от ведомого к ведущему по линии MISO (Master In — Slave Out). В итоге содержимое регистра сдвига ведущего оказывается в регистре сдвига ведомого и наоборот. После передачи каждого пакета данных ведущий синхронизируется с ведомым установкой лог. «1» на линии SS.
Следует учитывать, что если устройство сконфигурировано как ведущее, модуль SPI-интерфейса автоматически не управляет линией SS. Передача нового байта данных происходит сразу же после его записи в регистр сдвига. При необходимости использования линии SS управлять ее состоянием должно программное обеспечение пользователя.
В AVR-микроконтроллере ATmega8 фирмы Atmel модуль SPI-интерфейса обладает следующими возможностями [3]:
- полнодуплексная 3-проводная синхронная передача данных;
- работа в режиме ведущего или ведомого;
- возможность определения порядка передачи: первым передается либо младший, либо старший бит;
- семь программируемых величин скорости передачи;
- флаг прерывания окончания передачи;
- флаг защиты от коллизий записи;
- система «пробуждения» из режима Idle;
- максимальная тактовая частота интерфейса в два раза ниже тактовой частоты процессорного ядра.
С помощью SPI легко организуется внутрисхемное программирование микроконтроллеров Atmel (рис. 4).

Для этого используется три линии интерфейса: MISO, MOSI и SCK. Вывод RESET подключается к «земле» у AVR-серии или к положительному источнику — у серии AT89Sx. В этом режиме обеспечивается программирование (запись и чтение) памяти программ и данных, а также конфигурационных битов кристалла.
DebugWIRE
В мае 2003 года Atmel анонсировала интегрированный в устройства ATtiny13 [4] и ATtiny2313 интерфейс DebugWIRE (One-Wire Debug Interface — однопроводной отладочный интерфейс). Он представляет собой встроенный в кристалл механизм отладки на основе одной двунаправленной линии передачи информации, позволяющий управлять программным потоком, выполнять AVR-инструкции ядра микроконтроллера и осуществлять программирование интегрированной энергонезависимой памяти.
Основные возможности интерфейса DebugWIRE:
- комплексное управление программным потоком;
- эмулирование всех функций кристалла, включая цифровые и аналоговые, за исключением вывода RESET;
- работа в реальном времени;
- поддержка символьной отладки (на основе исходных кодов ассемблера, С или других языков высокого уровня);
- неограниченное число программных точек останова;
- работа в «теневом» режиме (интерфейс не препятствует работе основной программы);
- электрические характеристики идентичны реальному устройству;
- автоматическое конфигурирование системы;
- высокая скорость работы;
- программирование энергонезависимой памяти.
Режим отладки в устройстве активируется установкой бита DWEN (debugWIRE Enable) и сброса Lock-битов микроконтроллера. Физическое подключение эмулятора интерфейса к микроконтроллеру производится через вывод RESET, который работает как двунаправленный вывод с открытым стоком с подтягивающим к шине питания резистором. На рис. 5 показана схема подключения отлаживаемого микроконтроллера в режиме debugWIRE к эмулятору.

Тактовая частота определяется установками битов CKSEL и не зависит от debugWIRE. Когда разрабатывается система, в которой будет использоваться debugWIRE, необходимо соблюдать следующие требования:
- если используется «подтягивающий» резистор на выводе dW(RESET), величина его сопротивления должна лежать в диапазоне от 10 до 20 кОм;
- соединение вывода RESET напрямую с источником питания Vcc недопустимо;
- конденсаторы, подключенные к выводу RESET, должны быть отключены при использовании debugWIRE;
- все внешние источники сброса микроконтроллера должны быть отключены.
Поддержка программных точек останова в debugWIRE реализуется при работе с интегрированной средой разработки AVR Studio. При установке точки останова в исходной программе в AVR Studio в программную память микроконтроллера будет вставлена инструкция BREAK. Инструкция, замещенная инструкцией BREAK, будет сохранена. Когда выполнение программы будет продолжено, сначала будет выполнена инструкция, сохраненная из памяти программ. Команду останова можно вставить вручную, поместив инструкцию BREAK в программную память микроконтроллера. Следует учитывать, что Flash-память микроконтроллера перепрограммируется при каждом изменении точки останова. Этот процесс автоматически выполняет AVR Studio через интерфейс debugWIRE. Использование точек останова уменьшает ресурс Flash-памяти. Устройства, применявшиеся в отладке системы, не должны передаваться конечным пользователям.
Использование интерфейса debugWIRE накладывает некоторые ограничения на устройство, в котором он применяется. Коммуникационный вывод интерфейса dW физически совмещен с выводом внешнего сброса. Поэтому источники внешнего сброса не поддерживаются при работе debugWIRE.
Система debugWIRE точно эмулирует все входные и выходные функции на полной скорости, когда выполняется программа в CPU. Если процессорное ядро остановлено, необходимо проявлять осторожность при доступе к некоторым регистрам ввода-вывода через отладчик AVR Studio.
При установке бита DWEN (активации debugWIRE), некоторые части системы тактирования остаются в активном состоянии при переходе в режим «sleep», что приводит к увеличению потребляемой мощности. Поэтому необходимо отключать DWEN, когда debugWIRE не используется. При работе с debugWIRE микроконтроллер использует 8-разрядный регистр DWDR, образующий коммуникационный канал между исполняемой в микроконтроллере программой и отладчиком. Этот регистр доступен только интерфейсу debugWIRE и не может быть использован как регистр общего назначения при нормальной работе.
Дальнейшее развитие идея внутрисхемного программирования получила в 8-разрядной серии AVR микроконтроллеров Atmel. В ней реализован механизм самопрограммирования Flash-памяти программ через интегрированные интерфейсы SPI, UART или TWI. Все операции по программированию и перепрограммированию процессорное ядро выполняет по программе, находящейся в загрузочной области программной памяти. Когда происходит самопрограммирование, данные считываются в оперативную память через внешний интерфейс и затем записываются в программную память блоками по 10, 128 или 256 байт. Особенности такого подхода состоят в следующем:
- возможно перепрограммирование готового изделия непосредственно в условиях его применения;
- снижаются затраты, поскольку нет необходимости использовать дополнительные компоненты;
- программирование может выполняться значительно быстрее, поскольку каждый сектор памяти стирается и программируется индивидуально;
- перепрограммирование осуществляется через различные периферийные интерфейсы;
- работа в режиме самопрограммирования осуществляется в полном температурном диапазоне и при любом допустимом напряжении питания.
Комплексы внутрисхемного программирования
Практическое применение ISP-технологии возможно с использованием аппаратно-программных комплексов самых разных производителей. Наиболее развитым направлением в этой сфере является производство разнообразных модулей и программных средств для решений на основе технологии JTAG/IEEE 1149.1. Гамма предлагаемых устройств включает контроллеры, подключаемые к портам ПК, а также устанавливаемые в слоты ISA, PCI, USB, PXI. Программное обеспечение этих приборов функционирует на платформе Windows (некоторые версии адаптированы для UNIX) и позволяет проводить тестирование, отладку модулей и перепрограммирование пользовательских микросхем на плате через стандартный TAP-интерфейс. Оборудование для работы с технологией граничного сканирования производят:
- Corelis Inc., США (www.corelis.com).
- JTAG Technologies, Нидерланды (www.jtag.com).
- GOEPEL Electronic, Германия (www.goepel.com).
- ASSET InterTech Inc., США (www.asset-intertech.com).
- XJTAG Limited, Великобритания (www.xjtag.com).
- Hewlett-Packard, США (www.hp.com).
- Teradyne, США (www.teradyne.com).
Важно отметить, что профессиональное оборудование для граничного сканирования имеет достаточно высокую стоимость. Для оценки возможностей JTAG-технологии можно воспользоваться бесплатным программным обеспечением Дмитрия Кузнецова VEC4JTAG, которое доступно по адресу http://www.orc.ru/
dkuzn/index.htm. Пакет предназначен для получения доступа к средствам контроля и управления схемами ввода-вывода BS-чипов через порт JTAG при помощи кабеля ByteBlaster фирмы Altera. Пакет включает в себя:
- утилиту для трансляции текстового файла назначений векторов и параметров цепи JTAG в более удобную форму — байт-код;
- библиотеку для обеспечения доступа к назначенным векторам;
- файлы примеров.
Файл назначений векторов (с расширением .V4J) содержит список определений векторов в качестве объектов доступа к BS, а также определяет конфигурацию цепи JTAG. Вектор доступа к BS-чипам определяет совокупность (из одного или нескольких) выводов микросхем, объединенных в цепи JTAG.
Библиотека V4J поддерживается в следующих операционных системах:
- DOS;
- Windows 9x (в DOS-сесии).
- свободный LPT-порт;
- загрузочный кабель Altera ByteBlaster (его конструкция достаточно проста для самостоятельного повторения и бесплатно доступна на сайте www.altera.com).
Фирма BLIC (www.blic.ru) предлагает бесплатную программу PasByteBlaster, которая работает в среде Windows 9x и при использовании производимого фирмой загрузочного кабеля BLIC ByteBlaster обеспечивает следующие возможности:
- внутрисистемное программирование микроконтроллеров, поддерживающих программирование через SPI-интерфейс, например, фирмы Atmel;
- ISP-программирование микросхем серий MAX9000 и MAX7000A, S фирмы Altera через LPT-порт в режиме JTAG-интерфейса;
- конфигурирование микросхем серии FLEX 10K, KA, KE; FLEX 8000 и FLEX6000 фирмы Altera в пассивном последовательном режиме PS;
- поддерживается программирование микросхем на разные напряжения: 3,3 и 5 В;
- поддерживается загрузка данных непосредственно из среды программирования Altera MAX+PLUS II.
Бесплатный программный продукт PonyProg от Claudio Lanconelli (www.LancOS.com) ориентирован на программирование в последовательном режиме большого количества перепрограммируемых микросхем памяти и микроконтроллеров различных фирм: Atmel, Microchip и пр. Версия PonyProg2000 V2.06a поддерживает следующие семейства:
- I2C 8- и 16-разрядные EEPROM серий 24x, и AT17x;
- MicroWire8 и MicroWire16 EEPROM серии 93х;
- SPI EEPROM серии 25х;
- микроконтроллеры Atmel AVR-серии и AT89Sx;
- микроконтроллеры Microchip серий PIC12 и PIC16;
- ImBUS EEPROM MDA2062, NVM3065;
- SDE2506 EEPROM;
- S2430, X2444, X2445.
Конструктивно программатор PonyProg состоит из базового модуля, подключаемого к последовательному порту компьютера, и набора адаптеров для различных интерфейсов: SPI, I2C, MicroWire и ICSP (для поддержки PIC Microchip). Схема программатора очень проста и может быть реализована на доступных компонентах, ее версия 2.2 свободно доступна на сайте www.LancOS.com.
Корпорация Atmel производит большой ассортимент средств ISP-программирования и отладки для своих изделий. Для микроконтроллеров AVR-серии на сайте фирмы (www.atmel.com) бесплатно предлагается интегрированная среда разработки AVR Studio, работающая в среде Windows 98/2000/XP. С ее помощью возможно программирование и отладка в исходных кодах на ассемблере, а также внутрисхемное программирование микроконтроллеров с помощью программаторов JTAG, ICE, STK500, ICE50 и AVR-ISP (работает через SPI).
Программатор AVR-ISP можно изготовить самостоятельно, на основе информации, содержащейся в Application Note «AVR910: In-System Programming» (находится на www. atmel.com). Схема этого программатора представлена на рис. 6.

Он обеспечивает согласование COM-порта персонального компьютера с SPI-портом микроконтроллера. Программатор питается от того же источника, что и программируемый микроконтроллер. Когда программирование не происходит, все выводы программатора, подключенные к SPI-порту микроконтроллера, переводятся в третье состояние, благодаря чему программатор может быть постоянно подключен к плате с микроконтроллером.
В целом, использование бесплатной программы AVR Studio и самостоятельно изготовленный вариант программатора AVR-ISP представляется идеальным решением для разработки и программирования устройств на базе линейки AVR-микроконтроллеров фирмы Atmel без каких-либо дополнительных затрат.

