Программирование ARM STM32F407: внустрисхемное программирование через Ethernet Tue, March 19 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

STM32F407: внустрисхемное программирование через Ethernet Печать
Добавил(а) microsin   

Внутрисхемное программирование (In-Application Programming, IAP) - метод программирования памяти программ FLASH, когда это делает программа, работающая в той же самой памяти FLASH (самопрограммирование). Это дает возможность загрузить код приложения в память кристалла с использованием высокоскоростных протоколов обмена данными. Далее приведен перевод даташита UM1709 "STM32Cube Ethernet IAP example" компании ST [1].

Это руководство пользователя предназначено для разработчиков, использующих драйвера firmware STM32CubeHAL на базе микроконтроллеров STM32F2x7xx и STM32F4x7/9xx. Предоставляется реализация IAP с использованием канала связи Ethernet. Поверх стека LwIP TCP/IP предоставлено 2 возможных решения:

• IAP с использованием TFTP (Trivial File Transfer Protocol).
• IAP с использованием HTTP (Hypertext Transfer Protocol).

Примечание: в этом документе STM32Cube™ [2] относится к STM32CubeF2 и STM32CubeF4, микроконтроллерам от STM32F4xx до STM32F4x7xx и STM32F4x9xx, которые работают на оценочных платах STM324xx-EVAL, STM324xG-EVAL, STM324x9I-EVAL и подобных. Скриншоты и имена файлов, встречающиеся в этом документе, соответствуют примерам приложения, запущенным на микроконтроллерах STM32F4. Однако они также могут относится и к STM32F2x7xx.

[Обзор IAP]

IAP в своей сути означает обновление кода firmware (прошивка микроконтроллера) "в поле" (т. е. у конечного пользователя) с использованием интерфейсов обмена данными микроконтроллера, таких как UART, USB, CAN и Ethernet. Другой широко распространенный термин для той же самой функции - бутлоадер (bootloader, загрузчик кода). Когда Вы запускаете (boot) микроконтроллер, то Вы можете ввести его в один из 2 режимов:

• Режим IAP, когда выполняется код загрузчика.
• Нормальный режим, когда выполняется код приложения, и микроконтроллер выполняет свои основные функции.

И код IAP, и код основного приложения оба находятся во встроенной памяти программ микроконтроллера (MCU FLASH). Код IAP обычно сохраняется в первых страницах MCU FLASH, а код приложения пользователя занимает остальные страницы FLASH. На рис. 2 показан основной алгоритм работы IAP.

IAP-operation-flow-pic2

Рис. 2. Как работает IAP.

Когда доступен интерфейс Ethernet, то ему часто делают предпочтение в выборе для IAP, потому что он обладает следующими достоинствами:

• Высокоскоростной обмен данными (10/100 мегабит/сек).
• Удаленное программирование через сеть (LAN или даже WAN).
• Могут использоваться стандартные протоколы наподобие FTP, TFTP, HTTP поверх стека TCP/IP.

[TFTP IAP]

Протокол TFTP широко используется во всем мире для обновления прошивок сетевого оборудования (например, такое обновление поддерживается всеми коммутаторами и роутерами Cisco, и в загрузчиках встроенных систем, основанных на Linux). Протокол TFTP прост, и он работает поверх транспортного протокола UDP. Основная область применения протокола - локальная сеть (LAN). TFTP базируется на принципах архитектуры клиент/сервер, где клиент запрашивает сервер на предмет передачи файла (запрашивает операцию чтения или записи). В нашем случае сервер реализован на стороне микроконтроллера, и он обрабатывает запрос на запись со стороны клиента TFTP, запущенного на компьютере PC. Простейший сервер TFTP реализован поверх стека протоколов LwIP, который имеется в пакете STM32Cube™ [2].

Передача файла инициируется со стороны клиента TFTP, который посылает запрос Read или Write серверу TFTP. Когда сервер подтверждает запрос, начинается передача файла. Данные пересылаются блоками фиксированного размера (например, блоками по 512 байт). Каждый переданный блок данных должен быть подтвержден получателем до того, как может быть отправлен следующий блок. Механизм подтверждения основывается на номере блока, который отправляется с каждым блоком данных. Блок данных размером меньше, чем блок фиксированного размера, сигнализирует об окончании передачи файла.

TFTP-packets-pic3

Рис. 3. Описание формата различных пакетов TFTP.

Таблица 1. Коды операций TFTP (opcodes).

Opcode Операция
0x01 Запрос чтения (RRQ)
0x02 Запрос записи (WRQ)
0x03 Данные (Data)
0x04 Подтверждение (ACK)
0x05 Ошибка (Error)

Эта реализация загрузчика IAP состоит из сервера TFTP, работающего поверх стека LwIP TCP/IP. Этот сервер отвечает на запросы записи файла, принятые от сетевого клиента TFTP (запущенного на компьютере PC). Запросы TFTP на чтение файла игнорируются. Вместо записи принятых файлов в файловую систему, как это бывает на обычном сервере TFTP, наш сервер TFTP записывает принятые блоки данных в MCU Flash (область памяти программ пользователя, которая находится за программой загрузчика IAP).

Примечание: в этой реализации фиксированный размер блока данных равен 512 байтам.

IAP-Flowchart-TFTP-pic4

Рис. 4. Алгоритм работы IAP с реализацией на основе TFTP.

Чтобы протестировать IAP через TFTP, выполните следующие шаги:

1. Убедитесь в правильной установке перемычек на оценочной плате (см. секцию "Настройка рабочего окружения").
2. В заголовочном файле main.h раскомментируйте опцию #define USE_IAP_TFTP. Также, в зависимости от Ваших потребностей, раскомментируйте (или наоборот, закомментируйте) другие опции наподобие #define USE_DHCP или #define USE_LCD.
3. Перекомпилируйте firmware микроконтроллера. Просмотрите сгенерированный map-файл и убедитесь, что нет наложения друг на друга области кода IAP (она начинается с адреса 0x0) и области кода пользователя. Область кода пользователя начинается с адреса USER_FLASH_FIRST_PAGE_ADDRESS, заданного в main.h.
4. Запрограммируйте скомпилированное firmware IAP в память FLASH микроконтроллера STM32F4xx и запустите его.
5. Чтобы зайти в режим IAP, нажмите и отпустите кнопку Reset при постоянном удержании кнопки Key. После отпускания кнопки Reset отпустите также и кнопку Key.
6. Если задано USE_LCD в main.h, то экран LCD отобразит сообщение о входе в режим IAP. Также если используется DHCP (в main.h определено USE_DHCP), то будет выведено сообщение об успехе или ошибке процедуры DHCP для аренды адреса IP.
7. После назначения адреса IP (либо статически, либо динамически), пользователь может запустить процесс IAP.
8. На стороне PC запустите программу клиента TFTP (например, на Windows это может быть программа TFTPD32), и укажите в ней адрес сервера TFTP (host address для TFTPD32).
9. Найдите двоичный файл кода для загрузки в память FLASH STM32F4xx (в папке /project/binary для примера имеется такой двоичный файл).
10. Запустите запрос записи файла кликом на кнопке Put в окне утилиты TFTPD32.
11. Когда LCD разрешен, на нем будет отображаться статус прогресса операции IAP.
12. По окончании работы IAP Вы можете сбросить плату и запустить приложение, которое было загружено в память FLASH с помощью IAP.

IAP-TFTPD32-dialog-box-pic5

Рис. 5. Диалоговое окно TFTPD32.

[HTTP IAP]

Обновление firmware с использованием протокола HTTP меньше распространено, чем с TFTP, однако может быть полезным решением, когда обновление происходит не через локальную, а глобальную сеть (WAN) наподобие Internet. В этом случае для гарантии оптимальной и надежной работы используется транспортный протокол TCP (для TFTP используется UDP). HTTP как раз работает поверх TCP, и предоставляет способ отправки двоичного файла из HTML-формы WEB-страницы, которая отображается в окне HTTP-клиента (браузер Mozilla Firefox, или Microsoft Internet Explorer, или Google Chrome). Это называется HTTP Fileupload (см. RFC1867).

Выгрузка файла с использованием HTTP определена в стандарте RFC1867. Этот метод выгрузки файлов основывается на формах HTML. Чтобы отправить двоичный файл данных, используется метод HTML POST (вместо метода GET). Вот пример кода HTML для реализации выгрузки файла на основе формы:

< form action ="/upload.cgi" enctype="multipart/form-data" method="post">
   < p>Specify a binary file to upload into STM32F4xx Flash:
      < br>
      < input type="file" name="datafile" size="40">
   < /p>
   < div>
      < input type="submit" value="Upload">
   < /div>
< /form>

IAP-HTTP-Browser-view-file-upload-HTML-form-pic6

Рис. 6. Вид на форму выгрузки файла, открытую в окне браузера.

Нажмите кнопку Browse, чтобы выбрать двоичный файл для выгрузки, и затем нажмите кнопку Upload, чтобы отправить его серверу HTTP (WEB-сервер). В зависимости от размера файла, данные отправляются серверу в последовательных сегментах TCP.

Примечание: перед тем, как отправить данные файла, web-клиент отправляет данные заголовка HTTP, которые содержат информацию об имени файла и длине содержимого и другие данные, некоторые из них будут проанализированы WEB-сервером. Клиенты WEB не всегда задействуют один и тот же формат заголовка HTTP. WEB-сервер должен разбираться с этими различиями.

Эта реализация IAP основана на HTTP WEB-сервере, работающем поверх стека LwIP. Когда в адресной строке браузера будет введен IP-адрес STM32, то отобразится страница приглашения ввода логина и пароля (см. рис. 7). Это ограничивает доступ к выгрузке файла IAP - этим могут пользоваться только авторизованные пользователи.

IAP-HTTP-Login-web-page-pic7

Рис. 7. Отображение web-страницы логина.

Введите корректные идентификатор пользователя (User ID, логин) и пароль (Password). Логин и пароль предварительно задаются на этапе компиляции в файле main.h. Затем кликните на кнопку Login. Будет загружена страница для выбора выгружаемого файла (см. рис. 6).

Примечания:

1. По умолчанию User ID установлен в user, и Password установлен в stm32.
2. Если введенные User ID или Password некорректные, то будет заново загружена страница приглашения логина. После успешного логина (когда и User ID, и Password совпали со значениями в main.h), нажмите кнопку Browse... для выбора файла, который должен быть загружен в память FLASH микроконтроллера STM32.
3. Удостоверьтесь, что размер двоичного файла не превышает общего размера области кода пользователя во FLASH STM32.
4. После клика на кнопку Upload (выгрузка, см. рис. 6), серверу будет направлен запрос POST. В этот момент сервер начнет очистку всей области кода программы пользователя, и будет ожидать данных сырого двоичного файла кода (binary file raw data). Принятые данные затем будут записаны в область памяти FLASH, предназначенную для программы пользователя.
5. Обратите внимание на то, что общая длина данных будет распакована из данных заголовка HTTP, который был отправлен в самом начале процесса передачи.
6. По окончании операции IAP в браузере будет отображена web-страница, сообщающая об успешном завершении IAP. На этой странице будет кнопка, которая разрешит сброс MCU.

IAP-HTTP-File-upload-done-pic8

Рис. 8. Выгрузка файла завершена.

На рис. 9 показан принцип IAP при работе поверх HTTP.

IAP-Flowchart-HTTP-pic9

Рис. 9. Алгоритм работы IAP при использовании HTTP.

Чтобы протестировать IAP через HTTP, выполните следующие шаги:

1. Убедитесь в правильной установке перемычек на оценочной плате (см. секцию "Настройка рабочего окружения").
2. В заголовочном файле main.h раскомментируйте опцию USE_IAP_HTTP, также в зависимости от Ваших потребностей можно раскомментировать закомментировать другие опции наподобие USE_DHCP или USE_LCD.
3. Перекомпилируйте firmware микроконтроллера. Просмотрите сгенерированный map-файл и убедитесь, что нет наложения друг на друга области кода IAP (она начинается с адреса 0x0) и области кода пользователя. Область кода пользователя начинается с адреса USER_FLASH_FIRST_PAGE_ADDRESS, заданного в main.h.
4. Запрограммируйте скомпилированное firmware IAP в память FLASH микроконтроллера STM32F4xx и запустите его.
5. Чтобы зайти в режим IAP, нажмите и отпустите кнопку Reset при постоянном удержании кнопки Key. После отпускания кнопки Reset отпустите также и кнопку Key.
6. Если задано USE_LCD в main.h, то экран LCD отобразит сообщение о входе в режим IAP. Также если используется DHCP (в main.h определено USE_DHCP), то будет выведено сообщение об успехе или ошибке процедуры DHCP для аренды адреса IP.
7. После назначения адреса IP (либо статически, либо динамически), пользователь может запустить процесс IAP.
8. Откройте программу web-клиента (браузер Mozilla Firefox или Microsoft Internet Explorer), и введите в строке адреса IP-адрес STM32, на котором работает IAP.
9. В браузере отобразится страничка логина. Введите в поле User ID имя “user” и в поле Password введите “stm32”, затем нажмите кнопку Login.
10. В браузере загрузится и отобразится страничка fileupload.html. Нажмите на кнопку Browse для выбора файла выгружаемого двоичного кода (программа пользователя, IAP загрузит её в память FLASH микроконтроллера STM32), затем нажмите кнопку Upload, и процесс IAP запустится.
11. Когда LCD разрешен, на нем будет отображаться статус прогресса операции IAP.
12. По окончании IAP в браузере будет отображена новая web-страница, сообщающая об успешном завершении выгрузки файла.
13. Нажмите на web-страничке кнопку RESET MCU для сброса MCU и запуска приложения пользователя, которое только что было запрограммировано в память FLASH микроконтроллера STM32F4xx.

Примечания:

1. Если была проблема соединения, когда LCD разрешен, то соответствующее сообщение об ошибке будет отображено на экране LCD.
2. Программа IAP тестировалась с Web-клиентами Microsoft Internet Explorer 8 и Mozilla Firefox 24.

[Настройка рабочего окружения]

Конфигурация интерфейса PHY STM32. Периферийное устройство Ethernet соединено с внешним чипом PHY, чтобы предоставить физический уровень обмена данными. Определения регистров PHY и констант заданы в файле конфигурации HAL “stm32f4xx_hal_conf.h”. PHY работает в одном из двух режимов: MII и RMII; чтобы выбрать требуемый режим, пользователь заполняет параметр “MediaInterface” структуры “Init”, когда происходит инициализация периферийного устройства Ethernet.

Примечание: см. документацию на Вашу плату, чтобы узнать, какой режим поддерживается и как он включается. Режим RMII не поддерживается на плате STM324x9I-EVAL. Чтобы режим RMII работал с платой STM324xG-EVAL, Вы должны предоставить тактовую частоту 50 МГц путем напайки генератора 50 МГц (SM7745HEV-50.0M или аналогичный) в посадочное место U3 (размещено возле CN3) и также снятия перемычки JP5. Генератор с платой не поставляется, его нужно приобретать отдельно.

Установка адресов MAC и IP. MAC-адрес по умолчанию задан 00:00:00:00:00:02. Чтобы поменять его, измените 6 байт в файле stm32f4xx_hal_conf.h. IP-адрес установлен в значение 192.168.0.10. Чтобы поменять его, измените 4 байта в файле main.h.

Настройка STM324x9I-EVAL. Чтобы запустить загрузчик IAP на плате STM324x9I-EVAL, сконфигурируйте её, как показано в таблице 2.

Таблица 2. Установка перемычек STM324x9I-EVAL.

Перемычка Конфигурация режима MII
JP6 1-2: предоставление тактовой частоты 25 МГц с помощью внешнего кварцевого резонатора.
2-3: предоставление тактовой частоты 25 МГц от MCO, поданного с вывода PA8. 

Настройка STM324xG-EVAL. Чтобы запустить загрузчик IAP на плате STM324xG-EVAL, сконфигурируйте её, как показано в таблице 3.

Таблица 3. Установка перемычек STM324xG-EVAL.

Перемычка Конфигурация режима MII Конфигурация режима RMII
JP5 1-2: предоставление тактовой частоты 25 МГц с помощью внешнего кварцевого резонатора.
2-3: предоставление тактовой частоты 25 МГц от MCO, поданного с вывода PA8. 
Не приспособлено
JP6 2-3: разрешен режим интерфейса MII. 1-2: разрешен режим интерфейса RMII.
JP8 Перемычка снята: выбран режим интерфейса MII. Перемычка установлена: выбран режим интерфейса RMII.

Настройка STM322xG-EVAL. Чтобы запустить загрузчик IAP на плате STM322xG-EVAL, сконфигурируйте её, как показано в таблице 4.

Таблица 4. Установка перемычек STM322xG-EVAL.

Перемычка Конфигурация режима MII Конфигурация режима RMII
JP5 1-2: предоставление тактовой частоты 25 МГц с помощью внешнего кварцевого резонатора.
2-3: предоставление тактовой частоты 25 МГц от MCO, поданного с вывода PA8. 
Не приспособлено
JP6 2-3: разрешен режим интерфейса MII. 1-2: разрешен режим интерфейса RMII.
JP8 Перемычка снята: выбран режим интерфейса MII. Перемычка установлена: выбран режим интерфейса RMII.

[Внутренняя организация firmware IAP]

Таблица 5. Назначение исходных файлов проекта.

Имя файла Описание
main.c Главный модуль приложения.
main.h Главный конфигурационный файл модуля приложения.
httpserver.c, httpserver.h Реализация сервера HTTP.
tftpserver.c, tftpserver.h Реализация сервера TFTP.
flash_if.c, flash_if.h Высокоуровневый доступ к памяти FLASH.
stm32f4xx_it.c, stm32f4xx_it.h Обработчик прерывания.
fsdata.c Код файлов HTML в виде файловой системы ROM.
lwipopts.h Опции конфигурации стека LwIP.
ethernetif.c, ethernetif.h Интерфейс между LwIP и драйвером Ethernet.
stm32f4xx_hal_conf Конфигурационный файл HAL.

Примечание: в таблице не показаны файлы, задействованные из библиотек STM32Cube HAL, BSP и стека LwIP.

Чтобы получить исполняемый код для загрузки через IAP, убедитесь в следующем:

1. Код пользовательского firmware компилируется и линкуется для запуска со стартового адреса области программы пользователя (user Flash area, этот адрес должен быть тот же самый, что и адрес, заданный макросом USER_FLASH_FIRST_PAGE_ADDRESS в файле main.h IAP).
2. Начальный адрес таблицы векторов прерываний конфигурируется от начального адреса области программ пользователя (user Flash area). Смещение базового адреса таблицы векторов конфигурируется путем модификации значения константы VECT_TAB_OFFSET, заданной в файле system_stm32f4xx.c file. Например, для установки базового адреса таблицы векторов по адресу 0x08020000 укажите следующее определение:

#define VECT_TAB_OFFSET 0x20000

3. Скомпилированный размер firmware не должен превышать размера области программы пользователя (user Flash area).

[Заключение]

В этом руководстве пользователя рассказано о технологии обновления программного обеспечения (самопрограммирование Flash) Ethernet In-Application Programming (IAP). Описанное IAP использует драйвера STM32Cube HAL для микроконтроллеров STM32F4xx и стек сетевых протоколов TCP/IP LwIP. IAP может работать в 2 вариантах - либо с поддержкой протокола TFTP, либо HTTP.

[FAQ, часто задаваемые вопросы]

1. Как выбрать между статическим или динамическим (через DHCP) выбором IP-адреса? Ответ: когда закомментирован макрос #define USE_DHCP, размещенный в файле “main.h” IAP, то адрес IP назначается статически кодом микроконтроллера STM32 (по умолчанию это адрес 192.168.0.10, это значение можно поменять в файле “main.h”). Если макрос #define USE_DHCP не закомментирован, то разрешена работа протокола DHCP, и STM32 работает как клиент DHCP, так что он может получить аренду адреса от сервера DHCP.

2. Как ведет себя приложение, когда кабель Ethernet не подключен? Ответ: когда кабель Ethernet не подключен, то периферийное устройство Ethernet прекращает передачу и прием трафика, и сетевой интерфейс оказывается выключенным. Если контроллер LCD используется для отображения сообщений IAP, то на нем будет высвечено сообщение о том, что кабель не подключен, иначе на оценочной плате загорится красный светодиод (Red LED). Когда пользователи снова подключит кабель, трафик Ethernet возобновится, и сетевой интерфейс поднимется. Если используется LCD контроллер, то на нем отобразится сообщения о новом адресе IP, присвоенном интерфейсу (статически или динамически), иначе на оценочной плате загорится желтый светодиод (Yellow LED).

3. Как портировать код IAP на другую аппаратуру (оценочную плату)? Ответ: когда используется другая аппаратная платформа, то проверьте конфигурацию GPIO в функции HAL_ETH_MspInit() для периферийного устройства Ethernet, а также HAL_PPP_MspInit() или HAL_MspInit(), если приложение нуждается в дополнительной периферии PPP.

[Ссылки]

1. UM1709 - STM32Cube Ethernet IAP example site:st.com.
2. STM32CubeF4.
3. TFTPD32 site:tftpd32.jounin.net.
4STM32: аббревиатуры и термины.
5. IAR: создание загрузчика для Cortex-M.

 

Комментарии  

 
+1 #2 alex 11.02.2019 17:45
А как запустить на STM32f407vg discovery? При загрузке примеров СUBE ничего не происходит, ping не проходит, хотя в README написано, что для 407-ой платы тоже подходит пример.

microsin: скорее всего грубая ошибка при настройке системы тактовых частот. Если конечно все делаете правильно. Короче говоря, нужна отладка и проверка, как что работает.
Цитировать
 
 
+1 #1 Олег 12.12.2018 14:05
А где сам код загрузчика?

microsin: в библиотеке STM32Cube, см. папку LwIP_IAP.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page