47891

[i] Тестируем Bootloader в режиме UART

Дата последнего изменения: 30.11.2023 09:35:30
Материал из настоящей статьи, относящийся к микросхемам К1986ВЕ92QI и К1986ВЕ1QI, распространяется в том числе на микроконтроллеры К1986ВЕ92FI, К1986ВЕ92F1I, К1986ВЕ94GI и К1986ВЕ1FI, К1986ВЕ1GI

Для работы с 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 стоп бит.
При работе с К1901ВЦ1QI необходимо помнить, что начальная скорость UART = 13363 бод. Чтобы задать ее, нужно в поле Baud rate выбрать "custom", затем в "custom BR" ввести 13363. 

Установка соединения

Для установки соединения нужно запустить программу Terminal v1.9b и определить, какой COM-порт соответствует установленному соединению. Для этого достаточно запустить программу терминал с отключенным и подключенным адаптером. Появившийся выбор с разделе COM Port и будет используемым соединением.

Далее:

  1. Выставить параметры обмена и в блоке Receive включить опцию Hex - отображение данных в 16-м формате.
  2. Нажать Connect.
  3. Нажать кнопку "Set Macro", при этом откроется окно Macro Settings.
  4. В окне Macro Settings можно на каждую кнопку назначить определенную посылку. Все необходимые посылки представлены на рисунке 1 и будут разобраны ниже. Согласно спецификации, для установления связи с UART загрузчиком необходимо осуществлять посылку в него нуля до появления ответного приветствия. Для посылки нулей настроен макрос М1.
    • $0 - означает посылку числового нуля в шестнадцатеричной системе. Если не использовать знак $, то это была бы посылка символа '0'.
    • 10 - это минимальный период повторения посылки в миллисекундах. Меньше выставить нельзя.
    • Галочка - это включение циклической посылки. При выставлении галочки начинается циклическая запись нуля в МК.
  5. После старта МК тактируется от внутреннего генератора HSI на 8МГц. Частота этого генератора находится чаще всего в пределах от 6 до 10 МГц. По этой причине алгоритм загрузчика подстраивает свою частоту UART на основе входных посылок от мастера, в данном случае PC. Как только внутренняя скорость UART совпадет со скоростью PC, загрузчик возвращает приглашение. Приглашение состоит из кодов возврата каретки, перевода строки и символа '2'. Числовые значения этих кодов видны в окне Hex входных данных.
  6. После получения подтверждения нужно снять галочку у макроса М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

Теги

Была ли статья полезной?