======Загрузка микропроцессора и реанимация====== За режим работы микроконтроллеров отвечают выводы MODE[2:0] и они должны быть выставлены до подачи питания. Значение этих выводов опрашивается только один раз при подаче питания и в дальнейшем данные выводы могут быть использованы для другого назначения. Выбранный режим работы МК при возникновении Reset не изменяется. Диаграмма загрузки микроконтроллеров **1986ВЕ1** и **1986ВЕ3**: \\ {{doc:doclist:loadve1.png}} Диаграмма загрузки микроконтроллера **1986ВЕ4**: \\ {{doc:doclist:loadve4.png}} Диаграмма загрузки микроконтроллеров **1986ВЕ9х**: \\ {{doc:doclist:loadve9x.png}} =====Включение питания===== При включении питания первым всегда работает начальный загрузчик. Этот загрузчик настраивает порты на чтение и считывает состояние выводов MODE[2:0]. После этого он конфигурирует микроконтроллер для работы в заданном режиме и переходит в данный режим. * Если выбран режим Flash памяти, то происходит запуск программы с начального адреса Flash памяти. Устанавливается бит FPOR. * Если выбран режим внешней шины, то необходимые порты настраиваются на работу как шина и происходит запуск программы с начального адреса внешней памяти. Устанавливается бит FPOR. * Если выбран режим UART, то настраивается аппаратный UART с настройками, указанными в спецификации, и ожидаются команды извне. Бит FPOR не устанавливается. Бит FPOR регистра BKP_REG_OE батарейного домена используется для индикации того, что начальный загрузчик отработал. Этот регистр не сбрасывается при последующих Reset. В 1986ВЕ9х микроконтроллерах значение выводов MODE так же записывается в этот регистр и используется в дальнейшем. В зависимости от МК загрузчик расположен: * 1986ВЕ1, 1986ВЕ3, 1986ВЕ9х - в масочном ПЗУ и не может быть изменен * 1986ВЕ4 - в информационной памяти Flash, может быть изменен или случайно затерт. Загрузчик автоматически восстанавливается при стирании всей памяти в Keil. За это отвечает FLM файл. =====Reset===== При возникновении ресета микроконтроллеры ведут себя по-разному: * 1986ВЕ1 и 1986ВЕ3 - Бит FPOR является ChipSelect для ПЗУ с начальным загрузчиком. - Если FPOR = 0, то выбрано масочное ПЗУ и снова запускается загрузчик. Бит FPOR может остаться равен "0", если при подаче питания был активирован режим UART. В тоже время, если по UART будет загружена в ОЗУ и запущена программа, которая выставляет FPOR = 1, то при выставлении данного бита происходит аппаратный //Reset//. ПЗУ c загрузчиком после этого становится не доступно. - Если FPOR = 1, то в зависимости от вывода ITCMLAEN происходит старт программы из внутренней или внешней памяти. Вход в Bootloader не происходит. * 1986ВЕ9х - Запускается BootLoader, но не считывает состояние MODE c ножек, а использует это значение MODE из регистра BKP_REG_OE. Определять значение MODE по внешним выводам, или брать значение из регистра BKP_REG_OE загрузчик решает по состоянию бита FPOR. Далее загрузчик отрабатывает так же, как и при подаче питания. * 1986ВЕ4У - Аналогично 1986ВЕ1, с той лишь разницей, что нет варианта запуска программы из внешней памяти. =====FLM файл===== FLM - файл, это обычная программа для микропроцессора в среде Keil, реализованная по определенному шаблону и используемая для загрузки бинарного кода программы в Flash память процессора или, например, внешнее ПЗУ. Поскольку в разных МК для записи памяти требуется различная настройка периферии, шин, тактирования и прочего, то каждый FLM реализует требуемые настройки под необходимый режим. Так, например, для прошивки программы во внутреннюю Flash память и во внешнее ПЗУ требуются разные FLM. Как написать свой FLM файл можно узнать в документации Keil - [[http://www.keil.com/support/man/docs/ulink2/ulink2_su_newalgorithms.htm| Creating New Algorithms]]. =====Запуск программы из ОЗУ===== Keil позволяет записать программу в ОЗУ микроконтроллера и осуществить запуск оттуда. Это позволяет сохранить ресурс Flash памяти при разработке. Поскольку, согласно спецификации, **Flash память микропроцессора допускает порядка 10000 циклов перезаписи, при этом нельзя допускать циклы "стирания-записи"/ "стирания-стирания" одной ячейки с периодом менее 4мс.** Пример реализации - [[prog:start:run_ram_keil|Запуск программы в ОЗУ из Keil]]. Кроме этого записать программу в ОЗУ и запустить можно через UART. Подробнее - [[prog:uart:run_ram_uart|Запуск программы в ОЗУ через UART]]. =====Реанимация - как оживить "камень"===== Для отладки программ на микроконтроллерах, как правило, реализовано два JTAG интерфейса JTAG_A и JTAG_B. Выводы этих интерфейсов являются выводами GPIO и могут быть использованы программистом в своих целях. Если использованы выводы JTAG_A, то остается возможность отладки через JTAG_B. Если же переопределены порты обоих портов JTAG, тогда отладка не возможна. Случаются варианты когда программист по неосторожности отключил тактирование всех портов в своей программе и МП никак не реагирует на попытки перепрошить программу через любой JTAG. Если посмотреть на диаграммы вначале статьи, то видно, что интерфейс JTAG ломает только программа в Flash, запущенная после отработки BootLoader. Но остается возможность после запуска BootLoader пустить исполнение по другим ветвям - на внешнюю шину или UART. Тогда пользовательская программа, переопределяющая выводы JTAG не отработает, и они останутся доступны. Варианты "оживления" процессора: ====Стирание FLASH памяти при выборе внешней шины==== Выбираем выводами MODE[2:0] режим загрузки на внешнюю шину. Для 1986ВЕ9х это комбинация на переключателях демо-платы "010". Далее запускаем Keil, открываем или создаем пустой проект под данный микропроцессор. Если этого не сделать, то пункт меню //Flash - Erase// недоступен. При создании проекта будет выбран FLM файл, который непосредственно стирает Flash память. {{doc:doclist:flasherase.png}} Запускаем //Flash - Erase// и теперь наша память пуста. Можно переключиться в режимы MODE[2:0] с отладкой через JTAG. //Если кнопка //Erase// неактивна, то необходимо открыть опции проекта и открыть вкладку Utilites. Это видимо глюк в Кейл, если в данную вкладку не войти ни разу, то данный пункт меню неактивен.// ====Загрузка через UART==== Второй вариант связан с применением утилит, которые загружаются в ОЗУ в режиме UART загрузчика и могут прошить во FLASH новую пользовательскую прошивку. Утилиты такие представлены на [[http://forum.milandr.ru/viewtopic.php?f=17&t=1739&hilit=boot|форуме]] пользователем //Vasili//. Огромное человеческое за это ему СПАСИБО!