47901

[i] Загрузка программы в ОЗУ и запуск через UART

Дата последнего изменения: 17.10.2022 16:05:51

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

Для запуска в ОЗУ потребуется программа, которая использует только адреса ОЗУ. Такой пример рассматривался в статье - Запуск программы из ОЗУ в среде Keil, программа называется HelloWorld_RAM. В проект нужно внести изменение (см. раздел "Получение bin-файла").

Получение bin-файла

Для начала необходимо получить бинарный файл программы из проекта HelloWorld_RAM. В этом файле нет ничего лишнего - только байты кода программы. Есть различные конвертеры, которые позволяют из hex файла получить bin файл. Можно было бы использовать их. Но можно использовать штатную возможность Keil, описанную здесь - Keil: GENERATING BINARY OUTPUT DURING A BUILD

Bin файл будет автоматически генерироваться при сборке проекта. В настройках проекта необходимо зайти во вкладку Options - User, найти пункт AfterBuild/Rebuild и установить галочку в опции Run #1. В поле команды данного пункта необходимо вписать следующее:

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L

 Рисунок 1 - Настройки во вкладке Otions for Target -> User для создания bin-файла программы

Теперь необходимо пересобрать проект (Rebuild) HelloWorld_RAM, и в папке проекта появится файл "HelloWorld_RAM.bin". Keil и проект можно закрыть, они больше не потребуются.

Загрузка bin файла в ОЗУ

Далее необходимо узнать размер файла, поскольку для команды LOAD потребуется указать количество байт, записываемых в ОЗУ. Для этого нужно кликнуть правой кнопкой мыши на "HelloWorld_RAM.bin", выбирать свойства и посмотреть точный размер файла в байтах (рисунок 2).

 Рисунок 2 - Размер HelloWorld_RAM.bin

Размер HelloWorld_RAM.bin равен 3116 байт, что в шестнадцатеричной системе равно 0х0С2С. Теперь есть все данные для загрузки программы.

Запустите программу Terminal v1.9b и повторите все действия, описанные в статье Тестируем Bootloader в режиме UART до получения приглашения от микроконтроллера. При желании можно также увеличить скорость обмена по UART, чтобы загрузка прошла быстрее. Например, выставить 19200 бод.

Теперь нужно написать макрос M10. Код команды = 'L', адрес = 0x2000_0000, количество байт = 0x0000_0C2C. Записать программу необходимо с адреса, который был указан в поле IROM1 закладки Options - Target при сборке проекта "HelloWorld_RAM". Там был указан стартовый адрес ОЗУ, поэтому и параметр адрес = 0x2000_0000.

Код макроса М10: L$00$00$00$20$2C$0C$00$00

(1) - Нажмите М10 .

(2) - После этого придет подтверждение команды загрузки - 'L'. 

(3, 4) - Теперь UART загрузчик ожидает приема 3116-ти байт. Необходимо отправить ему файл "HelloWorld_RAM.bin". Для этого нужно кликнуть "Send File" и в открывшемся окне выбрать "HelloWorld_RAM.bin". 

Теперь можно нажать ОК и файл будет передан в UART (последовательность действий изображена на  рисунке 3). 

 Рисунок 3 - Последовательность действий для загрузки файла HelloWorld_RAM.bin по UART

Спустя несколько секунд, приходит символ 'K' - подтверждение от микроконтроллера об успешном получении 3116 байт. Теперь программа находится в ОЗУ. В терминале это выглядит так:

>LK

Запуск

Для запуска программы нужно написать макрос М11, код команды = 'R', стартовый адрес = 0x2000_0000.

Код макроса М11: R$00$00$00$20 >R 00 00 00 20 < 52 = 'R' - подтверждение команды запуска

ОСОБЕННОСТЬ: В некоторых микроконтроллерах требуется указать не стартовый адрес программы, а сразу адрес обработчика Reset_Handle. Этот адрес необходимо взять из загружаемого образа программы, с адреса 4. Первые 4 байта используются для указателя стека, а вторые 4 байта - это и есть необходимый адрес обработчика. Код внутри загрузчика проверяет этот адрес.

Запустите М11. При этом придет приходит подтверждение команды запуска, символ 'R'. Светодиод на плате начинает мигать, значит, записанная программа успешно стартовала из ОЗУ.

Таким не сложным образом можно загружать программу в ОЗУ и запускать ее на исполнение. На основе данного примера можно реализовать прошивку и Flash памяти процессора. Только потребуется загрузить две программы:

  1. пользовательскую программу, которую необходимо зашить в Flash.
  2. программу-"прошиватель", которая умеет писать в Flash.

После загрузки обеих программ запускается программа-"прошиватель". Эта программа-"прошиватель" будет брать код пользовательской программы и писать ее в Flash. Как это сделать рассмотрено в статье - Прошивка программы в FLASH и запуск через UART.

На самом деле загрузчик Bootloader, который работает в МК и обеспечивает связь по UART, является программой, написанной на Си. Поэтому младшие адреса заняты под глобальные переменные и кучу, а старшие адреса ОЗУ заняты под стек. Загружая программу с адреса 0х2000_0000, есть риск затереть данные программы загрузчика. Поэтому при загрузке в память следует отступить от края ОЗУ. Например, на форуме приводится рекомендация при загрузке программы по UART использовать диапазон адресов 0x2000_0100 - 0x2000_7E00.

 


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

Теги

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