В своей первой статье я описал схему простого программатора, сегодня расскажу, каким образом, подсоединить его к программируемому устройству.
В старые, добрые времена, когда микроконтроллеры с перепрограммируемой памятью программ на основе FLASH только начинали появляться, их программирование осуществлялось по параллельном интерфейсу. При этом для программирования могло использоваться более 20 выводов и зачастую требовалось использовать повышенное напряжение — 12 вольт и более. Микроконтроллеры тогда выпускались в выводных ДИП корпусах. Программировали их в основном вставив в высококачественные панельки программатора, а уже затем впаивали в устройство. Однако со временем начался переход на программирование по последовательному каналу, при этом для программирования стало использоваться уже всего 4-5 сигнальных ножек. Кроме этого микросхемы стали изготавливать в совершенно экзотических корпусах. Надёжные панельки под такие корпуса иной раз могли стоить чуть ли не больше самого программатора! Появилась возможность и необходимость перепрограммировать микроконтроллеры не выпаивая из схемы – внутрисхемное программирование. Это очень удобно для отладки программы. Кроме этого появилась возможность производить монтаж платы целиком, а программирование осуществлять уже при настройке и выпуске прибора. Особенно это удобно при работе с контрактными производителями – есть гарантия, что не произойдёт утечка программного кода.
Сегодня большая часть устройств на микроконтроллерах использует внутрисхемное программирование. Для иллюстрации рассмотрим микроконтроллеры семейства LPC2xxx.
Эти микроконтроллеры имеют встроенный бутлоадер, который позволяет прошивать FLASH память путём внутрисхемного программирования. Для передачи данных используется последовательный порт 0 – выводы RXD0 и TXD0. Алгоритм входа в режим программирования очень простой, для этого используются всего две дополнительные сигнальные ножки – P0.14 и Reset.
Порт P0.14 устанавливается в низкий логический уровень, проще говоря замыкается на землю, при этом на выводе Reset должен присутствовать высокий логический уровень. Стоит однако заметить, что возможны и исключения, если до этого была запущена программа пользователя, в которой например задействован сторожевой таймер. Поэтому самый надёжный алгоритм ввода микроконтроллера в режим программирования следующий.
До включения питания замкнуть выводы P0.14 и Reset на землю. Подать питание, подождать пока оно установится в номинальное значение. Перевести Reset в высокий логический уровень, подождать как минимум несколько миллисекунд и подать высокий уровень на P0.14.
Для успешного применения данной возможности необходимо соблюдать несколько не сложных правил, которые проще продемонстрировать на примере схемы подключения программатора к устройству на основе микроконтроллера из серии LPC 214x. Для программирования будем использовать программатор, описанный в прошлой статье.
Рис. 1. Схема подключения программатора.
Начнём обзор схемы. Порт P0.14 подтянут к питанию с помощью резистора R4, чтобы при включении устройства в штатном режиме, на нём появлялся высокий уровень и соответственно, запускалась программа пользователя. В цепи LPC_RESET стоит подтягивающий регистр на питание и конденсатор на землю. Для нормальной работы их номиналы необходимо подбирать в зависимости от используемого источника питания. Дело в том, что при подключении устройства к питанию напряжение на нём достигает номинального не мгновенно, а постепенно, по мере того как заряжаются фильтрующие ёмкости. Для нормальной работы устройства необходимо чтобы запуск микроконтроллера начинался только по достижению определённого уровня питания, в современных микроконтроллерах для этого предусмотрены специальные цепи, однако на них надейся, а сам не плошай — как показывает практика при медленном увеличении питающего напряжения эти схемы могут срабатывать некорректно. В момент подачи напряжения питания конденсатор C2 начинает заряжаться и напряжение на нём некоторое время удерживается в низком уровне. Номиналы цепи R5,C2 желательно подобрать таким образом, чтобы высокий уровень на входе RESET появлялся не раньше, чем напряжение питания микроконтроллера достигнет напряжения 2,6 вольт.
Процесс программирования происходит при низком уровне на входе RESET, при это все порты ввода-вывода микроконтроллера переводятся в высокоомное состояние. Если порты вашего микроконтроллера используются для управления какими – либо узлами, например силовыми ключами или управляемыми стабилизаторами напряжения необходимо обеспечить их подтяжку к нужному логическому уровню во время программирования, иначе могут произойти большие неприятности, вплоть до выхода самой платы и управляемых ею устройств из строя.
В нашем примере нулевой COM порт используется не только для программирования, но и для обмена данными по интерфейсу RS485. Для этого служит узел на микросхеме D2. Обычно микросхема D2 постоянно включена в режим приёма, при этом она формирует сигнал на входе RXD микроконтроллера. В режиме программирования этот сигнал будет мешать программатору, для того чтобы этого не произошло, в схеме предусмотрены сопротивления R1 и R3. R1 переводит приёмник D2 в неактивное состояние – выход R0 переходит в высокоомное состояние и не мешает передавать данные программатору, а R3 отключает передатчик, чтобы некорректные данные не поступали через драйвер RS-485 интерфейса.
В случае, если вы собираетесь использовать для программирования достаточно длинные провода, либо имеется вероятность, что перепрограммированием устройства могут заняться пользователи, не имеющие достаточной квалификации следует побеспокоиться о защите программируемого микроконтроллера от статики и бросков напряжения. У меня, например, был случай, когда в устройстве пришлось заменять микроконтроллер 4 раза из-за криворуких “программистов”! Простейшая защита может состоять из диодов или стабилитронов, ограничивающих напряжение и включенных последовательно резисторов с небольшим сопротивлением. Например, как показано на рисунке 2.
Рис. 2. Схема подключения программатора с защитными цепями.
Осталось добавить, что для программирования микроконтроллеров семейства LPC2xxx на основе ядра ARM7TDMI вывод 3 программатора подсоединяют к порту P0.14. Для программирования микроконтроллеров семейства LPCxxx на основе ядра ARM7 Cortex вывод 3 программатора подсоединяют к порту P2.10.
Тема программирования микроконтроллеров и других приборов, не смотря на кажущуюся простоту, очень многогранна и полна нюансов. Однако для нашего случая
осталось рассказать о программном обеспечении и об особенностях программирования серии LPC900.
P.S.Данная статья рассчитана в основном на начинающих ембеддеров, поэтому извиняюсь за то, что возможно излишне подробно объясняю некоторые очевидные для профи вещи.
Автор: progchip666