Инструменты пользователя

Инструменты сайта


prog:uart:loader_uart

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

Для работы с UART нам потребуется кабель переходник USB-RS232. Я купил для этих целей модель "ua-amdb9-012", только потому что она стоила порядка ~400 рублей и была в наличии в магазине. Пока работает и меня устраивает. В комплекте идет диск, наверное с драйверами, но CD привода у меня не оказалось и драйвера пришлось качнуть отсюда.

На демо-плате для 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, у меня моему соединению соответствует COM3. Для того чтобы узнать к какому COM порту подключен МК достаточно запустить программу терминал с отключенным и подключенным адаптером. Появившийся выбор с разделе COM Port и будет вашим соединением.

Далее:

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

У меня при стартовом подключении UART проскочил символ FF, не обращаем на это внимания. Все макросы представленные в окне 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   '>' - Приглашение пришло, значит скорость сработала.  

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

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

Код макросов для смены скоростей

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 обмена.

prog/uart/loader_uart.txt · Последнее изменение: 2022/04/03 23:09 (внешнее изменение)