24398

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

Дата последнего изменения: 25.09.2020 15:06:22

Для работы с UART потребуется кабель переходник USB-RS232. Для этих целей можно использовать модель "ua-amdb9-012".

На демоплате для 1986ВЕ92 выведен разъем под RS-232 типа "Папа". На переходнике разъем также оказался "Папа", поэтому подключение реализовано через нуль-модемный провод, который идет в комплекте с демо-платой. В итоге получилось подключение:

PC.USB ↔ USB-RS232 ↔ Нуль модемный кабель мама-мама ↔ 1986ВЕ92_board.RS232.

Для общения с микроконтроллером потребуется программа Terminal v1.9b.

Программатор не понадобится, его можно отключить. Переключателями на плате необходимо выставить режим загрузки UART2, MODE = "110". Подать питание.

При старте в микроконтроллере запускается Bootloader, проверяет выводы MODE и настраивает аппаратный UART с параметрами согласно спецификации:

  • скорость 9600 бод;
  • количество бит данных - 8;
  • четность - выкл.;
  • 1 стоп бит.
При работе с демонстрационной платой для 1901ВЦ1Т необходимо помнить, что начальная скорость UART = 13363. Чтобы задать ее, нужно в поле Baud rate выбрать "custom", затем в "custom BR" ввести 13363. Режим загрузки для отладочной платы рев.4 должен быть установлен следующим образом: SW3 - 0, SW2 - 1, SW1 - 1

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

Для установки соединения нужно запустить программу 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 формате без вспомогательных '$' (рисунок 2).

> 0D - запрос приглашения
< 0D - подтверждение кода команды
< 0A - перевод строки
< 3E - символ приглашения '>'
 Рисунок 2

Смена скорости - BAUD

Для смены скорости обмена необходимо настроить макрос М7 на смену скорости на 19200 бод, что в шестнадцатеричной системе равно 0x4B00, а в 4-х байтовом представлении 0x00004В00. Учитывая, что первый символ 'B' - это команда, а следующие 4 байта - это новая скорость младшим байтом вперед, то в макрос следует записать B$00$4B$00$00. После этого нажать кнопку M7. Будет получен ответ (рисунок 3):

> B 00 4B 00 00 - Запрос смены скорости на новую - 19200 бод (М7).
< F1 - !? Непонятный ответ, такого нет в спецификации.

> 0D - Пробуем получить приглашение, не меняя скорости (М2).
< 40 FF - Опять неудача.

Рисунок 3

Для того, чтобы попробовать изменить скорость на 19200 бод в мастере, в программе Terminal необходимо выставить галочку на скорость 19200. После этого нажать М2 - запрос приглашения (рисунок 4).

> 0D - Пробуем получить приглашение на новой скорости, 19200 бод (М2).
< 0D - подтверждение кода команды
< 0A - перевод строки
< 3E - символ приглашения '>'
Рисунок 4 

Скорость в микроконтроллере переключилась. Теперь можно настроить макрос М5 на начальную скорость в 9600 бод, а макрос М6 - на скорость 14400 бод и попереключаться (рисунок 5).

> B 40 38 00 00 - Запрос смены скорости на новую - 14400 бод (М6).
< 42 = 'B' - Сработало! Вернулось подтверждение команды.
Меняем скорость в Terminal на 14400, запрашиваем приглашение:
> 0D - Пробуем получить приглашение на скорости (М2).
< 0D 0A 3E '>' - Приглашение пришло, значит, скорость сработала.
Рисунок 5

По спецификации загрузчик должен отвечать на текущей скорости, а потом выставить новую. Но бывает, что при смене скорости ответ приходит неверный. 

Некоторый анализ ошибки смены скорости приведен в статье - Пример Echo и смена скорости UART, пункт "особенность 3".

Код макросов для смены скоростей представлен на рисунке 6.

B$80$25$00$00 - M5, 9600 бод.
B$40$38$00$00 - M6, 14400 бод.
B$00$4B$00$00 - М7, 19200 бод.

Рисунок 6 - Коды макросов для смены скоростей


Загрузка массива в МК

Загрузка массива командой LOAD возможна только в ОЗУ микроконтроллера. Запись Flash памяти - это сложный процесс с последовательными переключениями линий и задержками. Необходима специальная программа, которая будет не просто писать значение в память, а реализовывать весь алгоритм прошивки Flash. Рассмотрим процедуру записи массивов в ОЗУ.

Первым параметром должен быть адрес в ОЗУ, с которого будут записываться данные, например, начальный адрес - 0х2000_0000. Длина массива выбрана равной 4 байта, то есть второй параметр равен 0х0000_0004. После параметров в микроконтроллер необходимо передать сам массив данных из указанного количества байт. Можно передать, например, первые четыре буквы латинского алфавита - "ABCD". Итоговый код макроса M3 показан на рисунке 7:

Код макроса М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 байт.
Рисунок 7 - Код макроса М3 "Загрузка массива байт в память микроконтроллера"


Если послано недостаточное количество байт, то подтверждение 'K' не придет, пока микроконтроллер не примет заданное количество. Загрузка отработала корректно, перейдем к операции чтения массива.

Считывание массива из МК

Для считывания массива байт будет настроен макрос М4. Первым параметром к команде 'Y' указан тот же адрес 0х2000_0000 и такое же количество данных 0х0000_0004, что и при записи. Запускается макрос нажатием на кнопку М4 (рисунок 8).

код макроса М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 байт
Рисунок 8 - Код макроса М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
Рисунок 9 - Код макроса М8.

Команда отработала верно, подтверждение пришло и светодиод мигает. Теперь выполняется программа из Flash, обработчик обмена по UART теперь стал недоступен. Можно попытаться послать запрос на приглашение М2, ответа не будет. Это понятно, ведь в цикле мигания светодиодом, кроме переключения портов ничего нет.

Кроме запуска программы в Flash, можно записать какую-то программу в ОЗУ, используя команду LOAD, и запустить ее. Такой вариант рассмотрен в статье Загрузка программы в ОЗУ и запуск через UART.

Что будет, если подать RESET?

На данном этапе, может возникнуть вопрос - что будет, если сейчас подать Reset? Выводы MODE выставлены на режим работы  UART-загрузчика, но программа сейчас выполняется из Flash. Проще говоря, после Reset произойдет ли перезапуск программы из Flash или снова заработает UART загрузчик? Ответ на этот вопрос раскрывает статья - Загрузка микроконтроллера и реанимация.

Но давайте узнаем это на практике. Нажмем Reset на демоплате и увидим, что мигание светодиода не восстановилось. Значит, запуск программы из Flash не произошел. Давайте попробуем снова наладить общение с UART посылкой в него нуля, как было описано в начале этой статьи. В макросе М1 запускаем циклическую запись установкой галочки. Через некоторое время пришло приглашение от микроконтроллера. Значит, после Reset отработал начальный загрузчик и снова запустился обработчик UART обмена.

Тестирование Bootloader в режиме UART при работе на отладочной плате для МК 1986ВЕ1Т

Для работы микроконтроллера 1986ВЕ1Т в режиме UART-загрузчика необходимо выставить на выводах MODE одну из комбинаций - [100]-[110]. При этом микроконтроллер через интерфейс UART1 на выводах PC[4:3] получает код программы в ОЗУ для исполнения. 

На плате для МК 1986ВЕ1Т для работы через интерфейс UART1 необходимо установить перемычки на разъемах XP6 и XP8, как изображено на рисунке 9.

Риcунок 9 - Установка перемычек на плате для 1986ВЕ1Т для работы UART1


Сохранить статью в PDF

Документация

Теги

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