Прошивка bin через usb
В этом руководстве (перевод статьи [1]) показано, как записать загрузчик USB (USB Bootloader) в память микроконтроллера STM32F103C8T6 платы Blue Pill. С помощью этого загрузчика можно намного удобнее программировать плату Blue Pill Board через её порт USB, без необходимости применения дополнительного внешнего оборудования (такого как отладчик ST-Link или преобразователь интерфейсов USB - TTL UART).
Примечание: настоятельно рекомендуется предварительно ознакомиться с базовым руководством [2], чтобы получить общее понятие о конфигурации, настройках, соединениях платы Blue Pill.
Самая главная киллер-фича платы Arduino UNO (или любых подобных плат Arduino), из-за которой она стала такой популярной - простота программирования. Все, что нужно - просто подключить платку Arduino к компьютеру PC, запустить среду Arduino IDE, выполнить пару простых настроек - и после этого можно сразу погрузиться в мир программирования. Это действительно очень просто, если Вы правильно выбрали в настройках модель платы и правильный порт USB.
Изначально нельзя сказать то же самое про плату STM32F103C8T6 Blue Pill. В руководстве [2] было показано, как программировать обычную плату с микроконтроллером STM32F103C8T6 с помощью дополнительного внешнего адаптера USB - последовательный порт TTL UART. Описанный процесс выгрузки программы через адаптер FTDI не очень сложен, однако чтобы выгрузить программу, нужно каждый раз переключать микроконтроллер в режим программирования через его системный загрузчик (находящийся в ROM), и для нормальной работы нужно переключаться обратно (для чего ножку BOOT0 надо переводить в уровни лог. 1 и лог. 0).
Было бы проще, если использовать штатный microUSB порт платы Blue Pill для программирования. Загрузчик с открытым исходным кодом STM32F103C8T6 USB Bootloader [3] предоставляет такую возможность. С ним можно просто подключить плату Blue Pill через USB, и через него загрузить свою программу прямо из среды Arduino IDE. Как дополнительное преимущество - не придется манипулировать ножкой BOOT0, её можно просто оставить в рабочем режиме.
Для работы нам понадобиться следующее:
• Платка STM32F103C8T6 Blue Pill.
• Преобразователь интерфейсов USB - TTL UART (на чипе FTDI, CH340 или любой другой).
• Несколько соединительных проводов.
• Резистор 1.8 кОм (не обязательно).
• Компьютер PC с установленной системой программирования Arduino IDE
На рисунке ниже показана схема соединений между платой STM32 Blue Pill и преобразователем USB - TTL UART. Она такая же, как была описана в руководстве [2].
Наша задача - записать в память микроконтроллера двоичный код загрузчика [3] с помощью адаптера USB - TTL UART, как было описано в руководстве [2]. Двоичный код загрузчика находится в файле generic_boot20_pc13.bin, который можно загрузить по ссылке [4] (в каталоге binaries можно найти двоичный код загрузчика для многих других плат STM32).
Процесс установки загрузчика по шагам:
1. Выполните необходимые соединения, как показано на рисунке выше. Ножку BOOT0 необходимо перевести в уровень лог. 1, что при включении питания (или при сбросе) переведет микроконтроллер STM32F103C8T6 в режим программирования через его последовательный порт USART (запустится внутренний загрузчик, находящийся в системной памяти ROM микроконтроллера).
Примечание: логические уровни на ножках BOOT0 и BOOT1 переключаются желтыми перемычками. Резистор 1.8 кОм устанавливать не обязательно. Иногда это может понадобиться, при неуверенной работе интерфейса USB, если внутренней подтяжки pull-up не хватает.
2. Подключите к компьютеру адаптер USB - TTL UART, и подайте питание на плату Blue Pill. Питание можно подать через порт microUSB платы Blue Pill, либо так, как показано на рисунке выше - некоторые адаптеры USB - TTL UART выводят на свои контакты напряжение 5V или 3.3V. Запомните, какой номер COM-порта определился на компьютере, в Windows это можно узнать с помощью Диспетчера Устройств.
3. Выберите в каталоге binaries нужный файл загрузчика. Для платки Blue Pill нужен файл прошивки generic_boot20_pc13.bin [4].
Примечание: прошивки для разных плат отличаются в основном только ножкой микроконтроллера, к которой подключен светодиод. У платы Blue Pill это цифровой порт 13 по системе нумерации портов Arduino, что и отражено в имени файла прошивки загрузчика generic_boot20_pc13.bin.
Основные подготовительные работы сделаны. Остается самый важный шаг - выгрузка прошивки загрузчика через адаптер USB - TTL UART. Выгрузить прошивку можно двумя способами - с помощью утилиты STM32CubeProgrammer [5], либо с помощью утилиты STMFlashLoader Demo [6]. И тот и другой способ работают одинаково хорошо, в этой статье описано применение STM32CubeProgrammer.
4. Этот шаг можно пропустить, если утилита STM32CubeProgrammer уже установлена. Загрузите с сайта st.com утилиту STM32CubeProgrammer и установите. Утилита загружается в виде архива наподобие en.stm32cubeprg-win64_v2-7-0.zip (имя зависит от целевой операционной системы и от версии), для загрузки требуется регистрация на сайте st.com (регистрация несложная и бесплатная). Раскройте архив, и запустите находящийся в нем инсталлятор. При установке оставляйте все опции по умолчанию. После установки исполняемый файл утилиты STM32CubeProgrammer.exe будет находиться в папке наподобие "C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer".
5. Запустите утилиту STM32CubeProgrammer, выберите COM-порт для подключения (метки 1 и 2 на рисунке ниже). В этом примере показан выбор COM4, но в вашем случае может быть другой номер COM-порта, который был подключен на шаге 2. Оставьте остальные опции по умолчанию и кликните на кнопке Connect (метка 3 на рисунке).
6. В окне будет показан дамп памяти программ FLASH микроконтроллера, начиная с адреса 0x08000000. Кликните на кнопку загрузки файла прошивки, она находится слева (на рисунке ниже она показана красной стрелкой).
7. Отобразится окно диалога "Erasing & Programming", см. рисунок ниже. Кнопкой Browse (метка 1 на рисунке) выберите файл прошивки generic_boot20_pc13.bin. Убедитесь, что в поле ввода Start address указано значение 0x08000000 (метка 2 на рисунке). Все опции оставьте, как на рисунке, и кликните на кнопку Start Programming (метка 3 на рисунке).
8. Закройте утилиту STM32CubeProgrammer, отключите адаптер USB - TTL UART от компьютера. Переставьте перемычку BOOT0 обратно (для уровня лог. 0), после включения питания сразу будет запускаться программа загрузчика.
[Установка необходимых драйверов]
9. Перед тем, как продолжить, нужно скачать драйверы. Сначала загрузите ZIP-архив по ссылке [6], это драйверы для Arduino. Распакуйте содержимое архива, и переименуйте распакованную корневую папку как Arduino_STM32. Скопируйте эту папку со всем содержимым в директорию "C:\Users\ИмяПользователя\Documents\Arduino\hardware" (здесь вместо ИмяПользователя будет другой каталог, соответствующий имени текущего пользователя операционной системы). Если каталог Arduino\hardware не существует, то создайте его.
10. Откройте консоль командной строки с правами администратора, и перейдите в каталог "C:\Users\ИмяПользователя\Documents\Arduino\hardware\Arduino_STM32\drivers\win”. Запустите файл install_drivers.bat, это установит Maple DFU Driver и Maple Serial Driver.
После этого запустите файл install_STM_COM_drivers.bat для установки STM Serial Driver.
[Конфигурирование Arduino IDE]
11. Если Arduino IDE уже открыта, закройте её, подключите STM32 Blue Pill к компьютеру PC кабелем microUSB, и снова запустите Arduino IDE. В Arduino IDE перейдите в меню Tools и сделайте необходимые изменения в селекторе платы (Board Selector) так, как это было описано в руководстве [2]. Но сейчас необходимо поменять метод выгрузки программы (Upload Method) на "Maple DFU Bootloader 2.0". Остальные настройки будут такими же.
[Загрузка программы]
В качестве простой программы, на которой будем проверять работу сделанных настроек, выберите Blinky Sketch для STM32F103C8T6 Blue Pill Board. Убедитесь что для порта светодиода LED выбран порт PC13, и кликните на кнопку Upload. Программа Blinky Sketch скомпилируется, и через USB-загрузчик [3] будет записана в память микроконтроллера платы.
После загрузки программы светодиод начнет мигать.
[Ссылки]
Возможность обновления прошивки на серийно выпускаемых изделиях, или на единичных изделиях, находящихся в эксплуатации у заказчика трудно переоценить. Это не просто даёт возможность последующего устранения багов и расширения функционала, но и позволяет разработчику с более лёгким сердцем выпускать «еще сыроватый» продукт на рынок, если руководство того требует.
Поэтому важность наличия bootloader'а во вновь разрабатываемых устройствах в большинстве случаев не вызывает сомнений. В данной статье пойдет речь о разработке bootloader'а по интерфейсу USB на микроконтроллере Atmel SAM D21 с ядром Cortex M0+. А конкретно на SAMD21J18A. У микроконтроллеров SAM D20/21 нет предзаписанного бутлоадера, поэтому придётся заниматься его программной реализацией. На сайте Atmel можно найти Application notes, как сделать его с использованием стандартных интерфейсов (UART, I2C, SPI, USB). Под катом описание процесса создания USB-бутлоадера.
Постановка задачи
- Необходимо разработать наиболее простой, с точки зрения конечного пользователя, способ обновления прошивки устройства. Для этого потребуется скопировать на обыкновенную флешку файл с новой прошивкой, воткнуть флешку в устройство и нажать кнопку reset (или пересбросить питание). После этого стартует bootloader, проверяет наличие файла с прошивкой на флешке и заливает содержимое этого файла в качестве application
- В качестве «защиты от дурака» используем заранее известное специальное название файла прошивки, что бы исключить случайное совпадение имен с другими файлами на флешке. При этом если «злоумышленник» самостоятельно создаст сторонний файл с именем, совпадающим с ожидаемым, устройство будет пытаться использовать его в качестве прошивки. Разумеется, в этом случае работоспособность устройства будет нарушена, но её можно будет впоследствии восстановить подсунув флешку с корректной прошивкой
- В качестве USB интерфейса используется аппаратный USB микроконтроллера устройства
- Устройство не имеет постоянного подключения к интернету, что бы самостоятельно скачать новую прошивку
- Считаем что подключение ПК к устройству и обновление прошивки с помощью сторонней утилиты является более сложным для конечного пользователя
Немного теории и подготовки
Память
Адресное пространство в памяти микроконтроллеров серии SAMD20/21 устроено просто:
Энергонезависимая память организована рядами, каждый ряд содержит 4 страницы. Размер 1 страницы 64 байта. Энергонезависимая память стирается рядами, а записывается постранично. Это важно помнить.
Нижние (младшие) ряды в основном адресном пространстве энергонезависимой памяти могут быть использованы для бутлоадера (настраивается с помощью фьюзов BOOTPROT), а верхние ряды для эмуляции EEPROM.
Bootloader-секция защищена соответствующими этому адресному пространству lock-битами и фьюзами BOOTPROT.
Фьюзы BOOTPROT одновременно определяют размер bootloader-секции и защищают выделенную область памяти от чтения.
EEPROM может быть записана несмотря на защиту соответствующей ей области памяти.
Что потребуется для организации bootloader'а?
- Работа с памятью контроллера – за это отвечает контроллер энергонезависимой памяти Non-volatile memory (NVM);
- Работа с USB – за это отвечает контроллер USB;
- Работа с файловой системой – это под силу FATFS.
- И по мелочи: работа с портами ввода/вывода, тактирование.
Примечание: в качестве среды разработки используется Atmel Studio версии 6.2 (наследница AVR Studio) и фреймворк ASF (Atmel Software Framework)
Тонкости USB
В соответствии со стандартом USB для реализации шины необходимо очень точное тактирование. Мы будем использовать внешний кварц на 32 кГц как опору для DFLL (Digital Frequency Locked Loop). Выход DFLL будет использоваться как для тактирования USB модуля, так и всего контроллера. Для работы USB модуля необходимо настроить DFLL так, чтобы на выходе было ровно 48 МГц. Для стабильности и точности выходной частоты DFFL он должен быть сконфигурирован в режиме closed loop.
Собираем проект
С помощью ASF wizard подключаем все необходимые нам модули, перечисленные выше.
USB Host
- conf_usb_host.h – конфигурирует USB и настраивает обработчики прерываний (Callback),
- conf_access.h – конфигурирует абстрактный уровень для работы с памятью.
Так же добавляем в этот файл строку:
Теперь требуется глобально определить переменную-счетчик в файле main.c, именно ее будем увеличивать при каждом вызове соответствующего обработчика:
Добавляем собственно обработчик прерывания (callback):
Файловая система
Добавляем FAT FS file system service (c помощью ASF wizard). Раскрываем модуль и выбираем режим RTC драйвера calendar_polled.
Для полноценного функционирования модуля файловой системы добавляем в начале main.c:
Работа с энергонезависимой памятью
Добавляем NVM-Non-volatile memory (driver). Кроме этого определяем необходимые константы и переменные в файле main.c:
Еще нужно сконфигурировать контроллер энергонезависимой памяти. Для этого добавляем конфигурационную структуру (глобально), считываем настройки по умолчанию, изменяем необходимое и устанавливаем (оформляем в отдельную функцию):
Все необходимые модули добавлены, можно писать код.
Стоит отметить, что если в бутлоадер использует ту же периферию, что и application, то ее нужно обязательно сбросить перед переходом в application. Сброс (reset) осуществляется специальными функциями в ASF.
Также замечу, что обращаться к USB устройству можно только после 1-2 секунд с момента его подключения к шине, так как до этого происходит инициализация устройства.
Краткий алгоритм работы (только bootloader) приведен на рисунке ниже:
В своем проекте я использую микроконтроллер STM32F103C8 и фреймворк stm32duino. Этот клон Ардуино предлагает специальный бутлоадер, который позволяет заливать прошивку через USB, без использования внешних компонентов типа ST-Link или USB-UART переходника.
Сегодня мне понадобилось поработать с голым контроллером из-под CooCox и без stm32duino. Но вот в чем проблема. Даже простая моргалка лампочкой влитая через этот бутлоадер не работает.
Давайте разбираться. Возможно, мои выкладки покажутся кому-то банальностью. Но я только начинаю изучать контроллеры STM32 и на поиск проблемы убил как минимум полдня. Вдруг эта статья сократит кому-то время разработки.
Я ничего не имею против ST-Link и других отладчиков. Но в моем готовом устройстве его не будет, но точно будет USB. Почему бы сразу не заложить возможность обновлять прошивку через USB? Лично я нахожу этот способ удобным. тем более что все равно у меня уже подключен шнурок по которому идет питание и USB Serial.
Давайте посмотрим как работает бутлоадер. Для начала на примере контроллеров AVR. Почему я о нем вспомнил? Я переходил с Arduino и подсознательно ожидал такого же поведения. Но в STM32 оказалось все по другому. Потому хочу рассказать о разнице этих двух микроконтроллеров.
Итак. В микроконтроллерах AVR ATMega под бутлоадер можно зарезервировать некоторое количество памяти ближе к концу флеша. С помощью fuse битов можно регулировать с какого адреса будет стартовать программа. Если бутлоадера нет — программа стартует с адреса 0x0000. Если бутлоадер есть — он запускается с некоторого другого адреса (скажем, в ATMega32 с 0x3C00, если размер бутлоадера выбран 2к).
Когда бутлоадер сделал свои дела он передает управление основной программе с адреса 0x0000. Т.е. программа всегда стартует с адреса 0x0000. Компилятор и линковщик работают с учетом того, что код будет находится в начале адресного пространства.
В микроконтроллерах STM32 все не так. Все программы стартуют с адреса 0x0800000. Бутлоадер не является чем-то таким особенным. Это такая же программа, которая стартует с того же самого начального адреса. В процессе работы бутлоадер может принять прошивку (через USB или UART, считать с флешки, принять со спутника, достать из подпространства, whatever. ) и записать ее по адресам выше чем находится сам загрузчик. Ну и, конечно же, в конце своей работы передать управление основной программе.
Так вот при компиляции прошивки нужно знать куда же бутлоадер запишет прошивку и соответствующим образом скорректировать адреса.
На этом с теорией все. Переходим к практике. Ниже пошаговая инструкция как прикрутить USB загрузчик к микроконтроллерам серии STM32F1xx, а может быть и к некоторым другим тоже.
Есть, правда, некоторые ограничения по схемотехнике. Тут я, к сожалению, не силен. ЯТП нужен подтягивающий резистор 1.5к для порта PA12 (он же USB D+). Это позволяет загрузчику в нужные моменты времени подключаться и отключаться от USB.
-
Указать линкеру стартовый адрес. В CooCox это делается в настройках проекта, вкладка Link, раздел Memory Areas, Адрес IROM1 Start Address. Бутлоадер занимает первые 8 килобайт, значит стартовый адрес прошивки будет 0x0800000 + 0x2000 = 0x08002000. Поле Size, наверное, тоже стоит уменьшить на 8к.
Вместо COM20 нужно подставить свой порт куда прицепился микроконтроллер.
Заливатор штука очень нежная, относительных путей не любит. так что путь к прошивке нужно указывать полностью.
1EAF:0003 — это VID и PID
Чтобы не нажимать каждый раз ресет, платы основанные на libmaple/stm32duino используют трюк. Они слушают usb serial порт. Если там возникает сигнал DTR и передается ключевая последовательность байт, то микроконтроллер перегружается в бутлоадер. Смотреть в функцию rxHook().
Из-за этого может возникнуть неудобство. Если микроконтроллер заглючил и повис, то он уже не слушает порт. Следовательно он не может услышать ключевую последовательность и перегрузиться в бутлоадер. Тогда только ресет в помощь.
На этом все. Надеюсь моя статья прольет свет на то, как работает загрузчик в STM32 и как можно загружать прошивку через USB порт. К сожалению порог вхождения по прежнему высок, но вдруг кому-то моя статья поможет его преодолеть.
Если статья Вам понравилась, Вы можете поддержать меня купив чашечку кофе.
Готовую программу надо каким-либо образом запихать в контроллер. Для этого существует множество способов.
JTAG/SWD адаптер
Так как часто для отладки под ARM используется JTAG, то этот метод получается наверное самым популярным. Для этой цели используется какой-либо адаптер. Например я использую CoLinkEX так что показывать буду на его примере. Там все просто — подключаешь адаптер к контроллеру стандартным SWD или JTAG шлейфом. Через линии NRST/TDI/TDO/TCK/TMS для JTAG или через SWO/SWOCLK/SWDIO/NRST для SWD режима. На адаптере моей верси CoLinkEX оба эти разьема выведены на одну колодку, так что получается как бы сразу и JTAG и SWD соединение. А там какое надо такое и выбираешь. Особой разницы в отладке/прошивке между ними нет.
И прошиваешь либо из среды Keil.
Выбираем тип контроллера, размер памяти.
А дальше надо только указать бинарный или Hex файл и нажать прошивку.
Чтобы Keil сгенерировал hex файл нужно выставить галочку в опциях проекта.
А чтобы получить bin файл прогнать выходной axf файл через специальную утилитку fromelf входящую в состав Keil. Проще всего вписать это сразу в постобработку:
Формат там такой:
fromelf --bin --output .\имя_будущего_файла.bin .\имя_создаваемого_файла.axf
Ну или, если выходные файлы создаются в какой-либо подпапке, то путь будет включать и эту подпапку
Первичный Bootloader
Если нет JTAG/SWD адаптера, то не беда. Достаточно иметь переходник USB-UART или COM-UART так как почти все ARM контроллеры содержат в памяти аппаратно встроенный бутлоадер, позволяющий накатить прошивку. Главное следить за тем, чтобы напряжение на выходе с адаптера совпадало с напряжением питания контроллера, а то можно пожечь входы (FTDI можно запитать от 3.3 вольт. А для работы с RS232 использвоать не MAX232, а MAX3232 — то же самое, но на 3.3 вольта). Я в качестве USB-UART использую свою демоплату Pinboard с джампером питания выставленным на 3.3 вольта. Питание беру с той же платы.
Готово — можно шить. Для прошивки в STM32 используется программка Flash Loader Demonstrator v2.2.0 от STM запускаем ее:
Настраиваем порт, жмем Next
Она сразу показывает, что есть контроллер.
Тут можно посмотреть какие страницы флеша нам доступны на запись. Жмем Next
Выбираем какую операцию будем делать. Для прошивки надо выбрать Download и не забыть галочку Стереть чип.
Жмем Next и пошел процесс прошивки-проверки
Для LPC от NXP используется другая утилитка, зовется она Flash Magic — те же яйца, вид сбоку. Разве что может быть для входа в загрузчик надо другие выводы коротить. Это надо в User Manual на LPC уточнять уже.
Mass Storage USB Bootloader
Кроме того, у LPC1343 (у других LPC не встречал) есть одна прикольня фича. Там встроенный загрузчик может работать и по USB. Для этого надо собрать следующую схему:
Еще нужно вывод PIO001 подтянуть резистором на 10кОм к 3.3 вольтам питания и вывести на джампер, который бы его коротил в землю. Это будет условия входа в бутлоадер. После чего замыкается джампер входа в бут и девайс втыкается в USB. Винда его быстро определяет как сьемный диск объемом в 32Кб, на котором лежит файл firmware.bin если его скопировать — то мы получим юзерскую прошивку, что была там ранее. Это если не включена защита.
В противном случае мы, наверное, считаем мусор. А если удалить файл firmware.bin и на ее место записать файл с бинариком новой прошивки, то он вольется во флеш. Усе, не надо больше ничего! Красота! Правда в линухе оно работает не так как надо, дело в том, что линух пишет туда начиная со второго чтоль сектора и в результате Epic Fail. Впрочем, там же есть замечательная утилитка dd которая может скопировать на эту «флешку» файл в точности как надо, с нулевого адреса.
Вторичный бутлоадер
Поскольку я решил зарыться в STM32, то мне тоже захотелось такую вкусняшку как USB boot в режиме mass storage. Забросил идею Владимиру aka RtxOnAir и в результате он, за пару дней, выдал аналогичное решение для STM32F103.
Для загрузки с USB нужна следующая схема:
Транзистор подтягивает линию D+ к питанию и это означает, что на шине кто то появился, заставляя OС компа произвести определение устройства. Можно сделать и по колхозному. Подтянуть D+ через резистор напрямую. Но в этом случае для входа в бут придется передергивать шнур USB, иначе винда не захочет находить устройство. А так контроллер сам дернет вожжу.
Штука у Владимира получилась классная — автоматом определяет все типы кристаллов серии F103, позволяет выбрать любую ногу для передергивания USB шиной. Для входа во вторичный бутлоадер надо выводы Boot_0 и Boot_1 посадить на землю и нажать RESET ну или воткнуть девайс в USB если шина у нас не коммутируемая. Также можно выбирать работу от внутреннего генератора или от внешнего.
Вообще, инструкция явно говорит, что USB может работать только от внешнего кварцевого резонатора, т.к. частота внутреннего нестабильная и вообще кака. Не будем спорить с создателями камня, но у нас наш бутлоадер отлично завелся на HSI и при комнатной температуре отлично работал. Впрочем, стабильность тут явно не на высоте и надо быть осторожным.
Конфигурация бутлоадера
Для конфигурации нашего бута RtxOnAir написал небольшую утилитку:
Запустив которую можно выбрать нужные опции и нажав «Ок» получить сконфигурированный бутлоадер, который надо залить в МК любым вышеуказанным способом. Переключив джамперы Boot0 и Boot1 в режим нормальной работы Boot0=0 Boot1=1 и нажав сброс мы должны увидеть как в системе появится новый USB Mass Storage диск с емкостью равным размеру флеш памяти нашего кристалла за вычетом размеров бутлоадера.
Ну и прописать строку для формирования бинарика из axf файла.
После чего файлы прошивки можно банальным копированием загонять в STM32 и никакой программатор или адаптер больше не нужны совсем. Красота же!
Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
129 thoughts on “Прошивка ARM Cortex M3 на примере STM32 и LPC1300”
А зачем из hex делать bin? В чем разница?
Смотря для чего. Если грубо, то bin — это сама откомпилированная программа в том виде, как она будет записана во флеш-память МК байт в байт, т.е. это непосредственные коды команд, данные в сыром виде и т.д. А hex формат — это тоже самое но в виде обычного текста + доп. информация. Т.е. если прошивку в hex формате залить в МК 1 в 1, то естественно работать ничего не будет.
Заливка через USB, я так понимаю, работает только для 103 серии, где он есть?
Ну логично, чтобы шить через USB необходимо наличие его в МК. :-)
Ещё у STM32 есть фирменная система DFU (Device Firmware Upgrade) используя которую тоже можно шить по USB, предварительно прошив контроллер спец прошивкой от них. Там все довольно запутанно, но промучавшись пол дня все получилось.
И работает это не только для 105 или 107 (в этих USB загрузчик с завода), но и для всех контроллеров серии с USB. Лично я прошил так 103 проц.
В курсе. Но раз все равно нужен свой бутлоадер (я имею ввиду 103 серию), то зачем связываться с «запутанным» DFU, который к тому же требует использование утилиты-прошивальщика, раз можно сразу сделать весь процесс прошивки в виде удаления/копирования файла стандартными способами самой системы, что, согласитесь, всетаки на порядки проще.
Конечно, чем больше вариантов тем лучше! Спасибо вам за труд. Скоро опробую ваш способ.
А не могли бы подсказать где эту прошивку саму взять и как ее сгенерировать?
Я нашел только ту чем прошивать. boot от rtxonair так нормально и не заработал..
Там дельфийская прога. В ней выбираешь проц, ноги и жмешь сгенерить. На выходе будет бинарь
А можно этот генератор перевести на английский. А то у иеня винда не русская и показывает знаки вопроса.. Ну или хотябы сделать её в уникоде?? А то неудобно.. а попробовать хочется..
Можно. В ближайших планах есть такое намерение.
Но, у меня тоже английская винда без MUI… И все на русском везде отображается без проблем. Есть подозрение, что нужно выбрать русский язык в Control Panel->Regional and Language Options->Advanced->Language for non-Unicode programs.
Это да.. Только после этого начинают не так работать и показывать буквы остальные програмы :) Вобщем подожду на английскую версию..
Попробовал.. Не работает… Хотя способ интересный.. Я пробовал и другие програмы.. Чтото работает а чтото нет..
> А как быть с бин файлом? Может кто то подскажет?
> LPC flash utility с бин файлами не может работать.
Ну во первых, если уж использовать LPC flash utility, то зачем генерить именно bin файлы?
А во вторых, очевидно, нужно читать даташит в котором сказано где должна распологаться контрольная сумма и как ее считать. Я с LPC баловался совсем не много, но по моему и EWARM и Keil могут считать контрольную сумму и записывать ее куда надо.
Прошивка в формате бин нужна для того чтоб залить её через ЮЗБ. Где должна распологаться контрольная сумма я знаю, а вот как заставить чтоб ИДЕ её генерировала и записывало в нужное место я так до сих пор и не нашёл. и посему использую LPC flash utility для правки контрольной суммы.
rtxonair не могли бы вы вспомнить что надо делать чтоб иде генерировала и писала контрольную сумму куда надо? был бы очень благодарен
А чем именно вы пользуетесь? Сейчас проверил в EWARM 5.4 — он автоматом всатвляет контрольную сумму в bin файл, если правильно указан тип МК в свойствах проекта. Потом нашел ту-же инфу на их сайте…
Пользуюсь я IAR 5.2. Я ещё пока ЮЗБ загрузчик не прошил и пока ставлю чтоб ИДЕ генерировала файлы в хекс формате. И оно контрольную сумму не вставляет. Программа не работае ни в железе ни в протеусе. Хотя я выставляю тип мк в свойствах проекта LPC2142. После того как исправлю контрольную сумму LPC flash utility работает и в железе и в протеусе.
rtxonair покажите пожалуйста где на их сайте рассказывается в какие выходные форматы оно вставляет контрольную сумму.
Посмотрел на файлы конфигурации упомянутые в статье по приведенной мной ссылке. Насколько я понял, вото оно:
//IElfTool command line for device specific post processing
IElfToolPostProcess=—checksum __vector_table+0x1c:4,sum32:2;__vector_table-__vector_table+0x1B
Или можно самомому воспользоваться утилитой ielftool.exe с приведенными параметрами —checksum __vector_table+0x1c:4,sum32:2;__vector_table-__vector_table+0x1B
>А почему бы не перейти на EWARM 5.4?
Да я бы с радостью но пока я этой идеей в серйоз не задавалдся.
Но я думаю и версия 5.2 тоже это должна делать испавлять вектора.
За ссылку спасибо щас буду внимательно изучать.
rtxonair а можно с вами как то по мылу/асаьке/скайпу связаться?
В коментах тяжело общаться.
rtxonair да вы правы. версия 5.4 сама правит контрольную сумму в зависчимости какой девайс выбран. Вот оно: This Tech Note does not apply to recent versions. There is no need for the label __vector_0x14 (or __vector_table_0x1c) as the EWARM get the information based on the slected chip in the General Options. Эта техническая нотация не применяется к недавним версиям. Нет нужды для метки __vector_0x14 (or __vector_table_0x1c) так как EWARM получает информацию по выбраному чипу в главных настройках.
Только я вот не совсем разобрался с этой строкой: IElfToolPostProcess=–checksum __vector_table+0×1c:4,sum32:2;__vector_table-__vector_table+0×1B
Я так понял эту строку нужно указавать линковщику.
настройки, категория линкер, вкладка экстра опшонс, ставим галочку использовать опции командной строки и туда эту строку писать?
Я правильно понял?
Скачал я ИАР 5.4. Написал простенькую программу мигания светодиодом. Запускаю в протеус и результата 0. Программа не работает. Может я проект неправильно создаю, может я ещё что то не так делаю я не пойму.
Кто знает помогите пожалуйста.
Выложи архив с проектом, я у себя постараюсь посмотреть что там не так.
Кхм, кхм, кхм… Даже не знаю с чего начать… :-)
Ну попробую:
1. Мы здесь ведем речь об МК на базе архитектуры Cortex-M3 а LPC2138 и LPC2142 это архитектура ARM7TDMI. Я, конечно, понимаю, что и то и то АРМ, но все таки архитектуры довольно таки различны…
2. Файлы генерятся нормальные и контрольная сумма генерится и ложится куда надо. Можешь убедиться сам что:
а) оба HEX файла одинаковые с точностью до байта кроме 1 строки в каждом файле, которые данными прошивки не являются (о них речь ниже).
б) генерируемый BIN файл с точностью до байта повторяет данные в HEX файлах.
в) сама контрольная сумма лежит по адресу 0x14 (4 байта). И она меняется, если изменять содержимое векторов прерываний, я проверил.
3. По видимому ты либо както не так генерируешь BIN файл либо шьешь его как-то не так или не туда (в друге адреса может быть).
rtxonair спасибо за ответ. По поводу первого пункта я понимаю что вопрос совсем не в тему(DI HALT вообще имеет полное право эти коменты удать) но самому мне трудно разобраться и поэтому просил помощи.
->Оба HEX файла одинаковые с точностью до байта кроме 1 строки в каждом файле.
В этом я убедился, а вот когда сравнивал «исправленую прошивку IAR 5.3» и прошивку которая была сгенерирована IAR той же версии без исправлений, то там пол файла не совпадает.
Сравнивал в тотал командере сравнить по содержимому.
Если пол файла не совпадает, то это уже что-то не то…
Контрольная сумма занимает всего 4 байта. Вот они могут не совпадать… А остальное, должно оставаться без изменений!
Об использовании USB-загрузчика у NXP имеется аппноут AN10986 (код). Я же попробую в рамках курса для новичков рассказать его по-русски.
На данном этапе отладчик нам не нужен, поэтому отключаем его от USB.
Для данного урока вам не подойдет LPC1114 поскольку в нем нет USB, не спотря на то, что они подписаны на плате.
Схема
- Земля, aka GND. Тут как бы без вопросов: земля разъема USB обязана быть объединена с землей контроллера;
- Питание для платы будем брать с USB. На самой плате предусмотрен вывод +5VIN предназначенный для подключения внешнего источника питания на 5 вольт. Соответственно этот вывод и подключаем к USB +5V;
- D- заводим на USB-DM вывод платы;
- D+ заводим на USB-DP вывод платы;
- Что бы контроллер мог обнаружить подключение к USB шине (и понял, что требуется USB версия загрузчика взамен UART), подключаем +5 вольт с USB на вывод USB-VBUS платы;
- Что бы компьютер, в свою очередь, смог определить, что к нему подключено USB full-speed устройство, линию D+ подключаем через резистор 1.5КОм к выводу +3.3вольта. Номинал желательно не менять. У меня работало и с резюками 1.3к-1.6к, но нет гарантии, что оно будет работать стабильно.
- Что бы контроллер понял, что требуется режим загрузчика, вывод FT/GPIO платы подключаем через переключатель на землю. При замкнутом за землю выводе у нас будет режим загрузки, а при разомкнутом – режим выполнения прошивки.
Возможные проблемы
Если что-то начало сильно греться, или вдруг задымилось, то, вероятно, вы просто перепутали полярность.
Если ОС сообщает что подключено неизвестное устройство, то проверьте правильность монтажа. Правильно ли подключено питание. Не перепутаны ли выводы D+ и D-. Правильный ли установлен резистор.
Думаю так же стоит упомянуть про возможность защиты кода. Как видно на картинке, метка диска у контроллера CRP disabld, что означает отключенную защиту. У вас будет точно так же, если вы конечно прежде ни где ничего не натворили. Но если вдруг метка другая, то у вас могут возникнуть трудности с чтением/записью прошивки. Подробнее написано в аппноуте.
Прошиваем контроллер
- Копируем файл firmware.bin с контроллера (съемного диска, соответствующего нашей плате) к себе на диск.
- Удаляем файл с контроллера. Это приведёт к стиранию прошивки.Отключаем плату от USB и разрываем соединение FT/GPIO с землёй, тем самым вернув контроллер в режим исполнения прошивки.
Подключаем плату к компьютеры через USB-разъем отладчика и видим что светодиод просто тускло светит. И правильно, в контроллере то нет никакой прошивки.
Отключаем плату от USB и восстанавливаем подключение FT/GPIO с землёй.
Подключаем плату через новый USB разъем. Должен снова появиться диск с файлом firmware.bin, но в нем уже будет мусор.
Возвращаем сохраненный файл firmware.bin на контроллер (на запрос заменить, отвечаем утвердительно).
Повторно отключаем плату от USB и разрываем соединение FT/GPIO с землёй, повторно вернув контроллер в режим исполнения прошивки.
Снова подключаем плату к компьютеры через USB-разъем отладчика и видим что светодиод снова начал мигать.
Отступление для Linux и MacOS
В Linux и MacOS не всё на столько удобно. В связи с особенностью этих систем (по непонятным причинам) писать на пустой диск новый файл, начиная не с первого сектора, а со второго, контроллер в итоге прошивается не правильно.
Но выход есть и тут. Достаточно файл прошивки принудительно записать начиная с первого сектора, например, с помощью dd. Конечно менее удобно чем простое перетаскивание файлов, но линуксойдам не привыкать.
Читайте также: