[i] Тестируем Bootloader в режиме UART
Для работы с UART потребуется кабель переходник USB-RS232. Для этих целей можно использовать модель "ua-amdb9-012".
На демо-плате для К1986ВЕ92QI выведен разъем под RS-232 типа "Папа". На переходнике разъем также оказался "Папа", поэтому подключение реализовано через нуль-модемный провод, который идет в комплекте с демо-платой. В итоге получилось подключение:
PC.USB ↔ USB-RS232 ↔ Нуль модемный кабель мама-мама ↔ К1986ВЕ92QI_board.RS232.
Для общения с микроконтроллером потребуется программа Terminal v1.9b.
Программатор не понадобится, его можно отключить. Переключателями на плате необходимо выставить режим загрузки UART2, MODE = "110". Подать питание.
При старте в микроконтроллере запускается Bootloader, проверяет выводы MODE и настраивает аппаратный UART с параметрами согласно спецификации:
-
скорость 9600 бод;
-
количество бит данных - 8;
-
четность - выкл.;
-
1 стоп бит.
Установка соединения
Для установки соединения нужно запустить программу Terminal v1.9b и определить, какой COM-порт соответствует установленному соединению. Для этого достаточно запустить программу терминал с отключенным и подключенным адаптером. Появившийся выбор с разделе COM Port и будет используемым соединением.
Далее:
-
Выставить параметры обмена и в блоке Receive включить опцию Hex - отображение данных в 16-м формате.
-
Нажать Connect.
-
Нажать кнопку "Set Macro", при этом откроется окно Macro Settings.
-
В окне Macro Settings можно на каждую кнопку назначить определенную посылку. Все необходимые посылки представлены на рисунке 1 и будут разобраны ниже. Согласно спецификации, для установления связи с UART загрузчиком необходимо осуществлять посылку в него нуля до появления ответного приветствия. Для посылки нулей настроен макрос М1.
-
$0 - означает посылку числового нуля в шестнадцатеричной системе. Если не использовать знак $, то это была бы посылка символа '0'.
-
10 - это минимальный период повторения посылки в миллисекундах. Меньше выставить нельзя.
-
Галочка - это включение циклической посылки. При выставлении галочки начинается циклическая запись нуля в МК.
-
-
После старта МК тактируется от внутреннего генератора HSI на 8МГц. Частота этого генератора находится чаще всего в пределах от 6 до 10 МГц. По этой причине алгоритм загрузчика подстраивает свою частоту UART на основе входных посылок от мастера, в данном случае PC. Как только внутренняя скорость UART совпадет со скоростью PC, загрузчик возвращает приглашение. Приглашение состоит из кодов возврата каретки, перевода строки и символа '2'. Числовые значения этих кодов видны в окне Hex входных данных.
-
После получения подтверждения нужно снять галочку у макроса М1, останавливая таким образом циклическую посылку нуля. Связь установлена.
Рисунок 1 - Настройка терминальной программы
Все макросы представленные в окне Macro Settings лучше сохранить, на случай, если они потребуется когда-то в дальнейшем. Для этого необходимо воспользоваться кнопкой Save.
Проверка команд обмена
Команды, которые можно выдавать в UART-загрузчик описаны в спецификации. Команда состоит из одного байта, а каждый из параметров в команде - из 4 байт. Байты передаются младшим битом вперед.
Команда | Код | ASCII | Параметр 1 | Параметр 2 | Описание |
---|---|---|---|---|---|
SYNC | 0x00 | Синхронизация при старте | |||
Пустая команда, после соединения | |||||
CR | 0x0D | Выдача приветствия | |||
BAUD | 0x42 | 'B' | New Baud | Смена скорости обмена | |
LOAD | 0x4C | 'L' | Dest Addr | Byte Count | Загрузка массива байт из PC |
VFY | 0x59 | 'Y' | Src Addr | Byte Count | Считывание массива байт в PC |
RUN | 0x52 | 'R' | Start Addr | Запуск программы на выполнение |
Выдача приветствия - CR
Для настройки макроса М2 на выдачу приветствия в поле посылки необходимо записать $0D и нажать кнопку М2. В ответ будет получен символ '>'.
Далее запрос и ответ будут оформляться через символы '<' и '>' для наглядности диалога. Коды будут представлены в hex формате без вспомогательных '$'.
> 0D - запрос приглашения
< 0D - подтверждение кода команды
< 0A - перевод строки
< 3E - символ приглашения '>'
Смена скорости - BAUD
Для смены скорости обмена необходимо настроить макрос М7 на смену скорости на 19200 бод, что в шестнадцатеричной системе равно 0x4B00, а в 4-х байтовом представлении 0x00004В00. Учитывая, что первый символ 'B' - это команда, а следующие 4 байта - это новая скорость младшим байтом вперед, то в макрос следует записать B$00$4B$00$00. После этого нажать кнопку M7. Будет получен ответ:
> B 00 4B 00 00 - Запрос смены скорости на новую - 19200 бод (М7).
< F1 - !? Непонятный ответ, такого нет в спецификации.
> 0D - Пробуем получить приглашение, не меняя скорости (М2).
< 40 FF - Опять неудача.
Для того, чтобы попробовать изменить скорость на 19200 бод в мастере, в программе Terminal необходимо выставить галочку на скорость 19200. После этого нажать М2 - запрос приглашения.
> 0D - Пробуем получить приглашение на новой скорости, 19200 бод (М2).
< 0D - подтверждение кода команды
< 0A - перевод строки
< 3E - символ приглашения '>'
Скорость в микроконтроллере переключилась. Теперь можно настроить макрос М5 на начальную скорость в 9600 бод, а макрос М6 - на скорость 14400 бод и попереключаться.
> B 40 38 00 00 - Запрос смены скорости на новую - 14400 бод (М6).
< 42 = 'B' - Сработало! Вернулось подтверждение команды.
Меняем скорость в Terminal на 14400, запрашиваем приглашение:
> 0D - Пробуем получить приглашение на скорости (М2).
< 0D 0A 3E '>' - Приглашение пришло, значит, скорость сработала.
По спецификации загрузчик должен отвечать на текущей скорости, а потом выставить новую. Но бывает, что при смене скорости ответ приходит неверный.
Код макросов для смены скоростей представлен ниже.
B$80$25$00$00 - M5, 9600 бод.
B$40$38$00$00 - M6, 14400 бод.
B$00$4B$00$00 - М7, 19200 бод.
Загрузка массива в МК
Загрузка массива командой LOAD возможна только в ОЗУ микроконтроллера. Запись Flash памяти - это сложный процесс с последовательными переключениями линий и задержками. Необходима специальная программа, которая будет не просто писать значение в память, а реализовывать весь алгоритм прошивки Flash. Рассмотрим процедуру записи массивов в ОЗУ.
Первым параметром должен быть адрес в ОЗУ, с которого будут записываться данные, например, начальный адрес - 0х2000_0000. Длина массива выбрана равной 4 байта, то есть второй параметр равен 0х0000_0004. После параметров в микроконтроллер необходимо передать сам массив данных из указанного количества байт. Можно передать, например, первые четыре буквы латинского алфавита - "ABCD". Итоговый код макроса M3 показан во фрагменте кода ниже:
Код макроса М3:
L$00$00$00$20$04$00$00$00ABCD = L 00000020 04000000 ABCD
Запускаем: > L 00 00 00 20 04 00 00 00 A B C D
< 4C = 'L' - подтверждение команды Load
< 4B = 'K' - подтверждение окончания принятия 4 байт.
Если послано недостаточное количество байт, то подтверждение 'K' не придет, пока микроконтроллер не примет заданное количество. Загрузка отработала корректно, перейдем к операции чтения массива.
Считывание массива из МК
Для считывания массива байт будет настроен макрос М4. Первым параметром к команде 'Y' указан тот же адрес 0х2000_0000 и такое же количество данных 0х0000_0004, что и при записи. Запускается макрос нажатием на кнопку М4.
код макроса М4
Y$00$00$00$20$04$00$00$00 = Y 00000020 04000000
Запускаем:
>Y 00 00 00 20 04 00 00 00
< 59 = 'Y' - Подтверждение полученной команды
< 41 42 43 44 = "ABCD" - Массив из памяти
< 4B = 'K' - Подтверждение передачи массива из 4 байт
Команда отработала успешно. Можно видеть, что считалось именно то, что было записано ранее.
Запуск программы из Flash
Для проверки команды RUN - запуск на исполнение, можно запустить программу, записанную во Flash. Если прошит пример Hello World - светодиод, то случае удачного запуска будет мигать светодиод.
Настройка макроса М8: к команде R необходимо в параметре указать стартовый адрес программы, в рассматриваемом случае это стартовый адрес Flash памяти 0x0800_0000. Этот адрес был выставлен в опциях проекта IROM1.
Код макроса М8:
R$00$00$00$08 = R 00000008
Запускаем:
> R 00 00 00 08
< 52 = 'R' - подтверждение команды Run
Команда отработала верно, подтверждение пришло и светодиод мигает. Теперь выполняется программа из Flash, обработчик обмена по UART теперь стал недоступен. Можно попытаться послать запрос на приглашение М2, ответа не будет. Это понятно, ведь в цикле мигания светодиодом, кроме переключения портов ничего нет.
Кроме запуска программы в Flash, можно записать какую-то программу в ОЗУ, используя команду LOAD, и запустить ее. Такой вариант рассмотрен в статье Загрузка программы в ОЗУ и запуск через UART.
Что будет, если подать RESET?
На данном этапе, может возникнуть вопрос - что будет, если сейчас подать Reset? Выводы MODE выставлены на режим работы UART-загрузчика, но программа сейчас выполняется из Flash. Проще говоря, после Reset произойдет ли перезапуск программы из Flash или снова заработает UART загрузчик?
Нажмем Reset на демоплате и увидим, что мигание светодиода не восстановилось. Значит, запуск программы из Flash не произошел. Давайте попробуем снова наладить общение с UART посылкой в него нуля, как было описано в начале этой статьи. В макросе М1 запускаем циклическую запись установкой галочки. Через некоторое время пришло приглашение от микроконтроллера. Значит, после Reset отработал начальный загрузчик и снова запустился обработчик UART обмена.
Тестирование Bootloader в режиме UART при работе на отладочной плате для МК К1986ВЕ1QI
Для работы микроконтроллера К1986ВЕ1QI в режиме UART-загрузчика необходимо выставить на выводах MODE одну из комбинаций - [100]-[110]. При этом микроконтроллер через интерфейс UART1 на выводах PC[4:3] получает код программы в ОЗУ для исполнения.
Сохранить статью в PDF