Информационный портал технической поддержки Центра проектирования интегральных микросхем |
В статье Тестируем Bootloader в режиме UART были протестированы команды управления UART-загрузчиком, а также запущена программа, записанная в Flash. Команды загрузчика позволяют записать массив байт в ОЗУ и запустить программу с заданного адреса. Этого достаточно, чтобы записать в ОЗУ программу и её запустить. Этому будет посвящена данная статья.
Для запуска в ОЗУ потребуется программа, которая использует только адреса ОЗУ. Такой пример рассматривался в статье - Запуск программы из ОЗУ в среде Keil, программа называется HelloWorld_RAM. В проект нужно внести изменение (см. раздел "Получение 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 и проект можно закрыть, они больше не потребуются.
Далее необходимо узнать размер файла, поскольку для команды 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 памяти процессора. Только потребуется загрузить две программы:
После загрузки обеих программ запускается программа-"прошиватель". Эта программа-"прошиватель" будет брать код пользовательской программы и писать ее в Flash. Как это сделать рассмотрено в статье - Прошивка программы в FLASH и запуск через UART.
Сайт: | https://support.milandr.ru |
E-mail: | support@milandr.ru |
Телефон: | +7 495 221-13-55 |