Как запрограммировать беспроводной стек в защищенную область памяти STM32WB55

14 апреля

автомобильная электроникаучёт ресурсовпотребительская электроникаинтернет вещейST Microelectronicsстатьяинтегральные микросхемыбеспроводные технологиисредства разработки и материалы802.15.4Cortex-M4BLEМикроконтроллерSTM32USBInternet-of-Things2400 МГцwirelessThreadZigBee

Александр Шауэрман (Алтайский край)

Подробная пошаговая инструкция по программированию стека, управляющего сетевым протоколом беспроводного двухъядерного микроконтроллера STM32WB производства STMicroelectronics, в защищенную область Flash-памяти и ОЗУ данного МК при помощи STM32CubeProgrammer версии 2.4.0 или выше.

Особенность архитектуры микроконтроллеров STM32WB подразумевает наличие защищенной области во Flash-памяти и ОЗУ для работы сетевого сопроцессора Cortex®-M0+ (далее CM0+). Ядро CM0+ управляет приемопередатчиком и выполняет программный стек сетевого протокола. Подробнее о работе системы STM32WB можно почитать в предыдущих статьях автора: «Отладочная плата P-NUCLEO-WB55 для STM32WB55: возможности и особенности» [1] и «Как создать прототип BLE-приложения на STM32WB с помощью STM32CubeWB» [2]. В данной статье мы рассмотрим способы обновления прошивки сетевого стека.

Механизм обновления стека. Сервис FUS

Обновить исполняемый код CM0+ может только специальный сервис FUS (Firmware Upgrade Services). Этот сервис – часть встроенного в микроконтроллер программного обеспечения, которое размещается в защищенной части Flash-памяти. FUS исполняется сопроцессором CM0+ и может быть активирован программно пользовательским сопроцессором Cortex®-M4 (далее CM4F) либо с помощью команд встроенного загрузчика, например, DFU (который также выполняется на CM4F). Бинарный файл FUS предоставляется компанией STMicroelectronics, имеет цифровую подпись и не может быть модифицирован пользователем.

Сервис FUS гарантирует, что в качестве сетевого стека будут использоваться только проверенные, зашифрованные и подписанные STMicroelectronics прошивки. Если это необходимо, FUS позволяет производителю оборудования на базе STM32WB сделать свою дополнительную подпись.
Задачи FUS:

  • установка, обновление или удаление беспроводного стека сопроцессора CM0+;
  • обновление самого себя;
  • управление ключом аутентификации пользователя. Эта возможность потребуется, если разработчик пожелает добавить цифровые подписи для своих прошивок;
  • взаимодействие с сопроцессором CM4F (программа пользователя или бутлоадер).

Сведения об установленном FUS и сетевом стеке хранятся в специальной таблице (Device Info Table, далее – DIT), расположенной в SRAM2a. Нужно понимать, что SRAM2a – это оперативная память, и значения, содержащиеся в ней, должны обновляться каждый раз при включении микроконтроллера. SRAM2a – это защищенная область, только CM0+ имеет возможность делать в ней записи.

Для того чтобы в DIT появились актуальные данные, должен быть запущен FUS. Рассмотрим два случая:

  • Сетевой стек не запущен или вообще отсутствует. В этом случае для запуска FUS требуется активировать ядро CM0+, для этого в регистре PWR_CR4 нужно установить бит C2BOOT и убедиться, что в IPCCDBA (Option Bytes) установлено корректное значение указателя на DIT (значение по умолчанию ноль, это значит, что в первой ячейке SRAM2a будет храниться адрес таблицы). Обратим внимание, что оба действия выполняются встроенным загрузчиком DFU. Таким образом, если загрузка процессора происходит из системной памяти (BOOT0 установлен в низкий уровень), то FUS запускается автоматически, в противном случае это должен сделать код на сопроцессоре CM4F.
  • Сетевой стек установлен и запущен. Во-первых, нужно выполнить все шаги из первого пункта. Во-вторых, для запуска FUS нужно отправить последовательно две одинаковые команды FUS_GET_STATE. Первый раз команда должна вернуть отклик «FUS_STATE_NOT_RUNNING», а второй – запустить FUS.

Используя DIT, можно контролировать версию и статус FUS и сетевого стека.

STM32CubeProgrammer CLI

Подготовка к работе

Для работы нам понадобится STM32CubeProgrammer версии 2.4.0 или выше. Если вы работаете в Windows, то потребуется командный интерпретатор – достаточно встроенного cmd.exe.
В процессе инсталляции STM32CubeProgrammer прописывает пути к своим исполняемым файлам в переменную окружения «Path», поэтому интерпретатор может работать с STM32CubeProgrammer, используя относительный путь.

Проверить, что утилита готова к работе, просто: нужно запустить интерпретатор и выполнить команду STM32_Programmer_CLI.exe. В ответ будет распечатана справочная информация (Help). Если этого не произошло, то проверьте пути в переменной окружения «Path»: должен быть указан путь к директории «bin» с установленной утилитой, например, «c:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\». При необходимости этот путь можно добавить в переменную вручную либо в командах интерпретатору использовать абсолютный путь к STM32_Programmer_CLI.exe. Другой способ – запустить интерпретатор непосредственно из директории с файлом STM32_Programmer_CLI.exe.

Примечание. Чтобы запустить интерфейс командной строки в macOS, вам нужно вызвать STM32CubeProgrammer.app/Contents/MacOs/bin/STM32_Programmer_CLI.

Подробное описание интерфейса пользователя и команд STM32CubeProgrammer можно найти в руководстве пользователя UM2237 [3].
В общем случае алгоритм обновления стека будет следующим:

  • устанавливаем связь с целевым микроконтроллером по выбранному интерфейсу;
  • считываем текущую версию FUS;
  • если есть необходимость – обновляем версию FUS до актуальной;
  • используя команды FUS, обновляем прошивку стека.

Подключение к целевому контроллеру

Для того чтобы определить, какие коммуникационные интерфейсы в настоящий момент подключены к компьютеру, полезно выполнить STM32_Programmer_CLI.exe с командой «-l.» Команда отобразит все интерфейсы, потенциально пригодные для взаимодействия с микроконтроллерами STM32. На рисунке 1 показан пример вывода команды:


STM32_Programmer_CLI.exe –l

Рис. 1. STM32_Programmer_CLI, список портов

Рис. 1. STM32_Programmer_CLI, список портов

Из примера видно, что в настоящий момент к компьютеру подключен микроконтроллер в режиме DFU (порт USB1) и программатор ST-LINK.

Для того чтобы подключиться к целевому микроконтроллеру, используется команда «-c», или полная форма «—connect», в качестве аргумента указывается порт для подключения (UART/USB/JTAG/SWD/SPI/CAN/I2C).

В данной статье мы будем использовать два режима работы: встроенный загрузчик DFU и программатор ST-LINK. В первом случае мы должны указать порт «USB1», во втором – «SWD».

На рисунке 2 показан пример вывода команды для STM32WB55, подключенного через USB в режиме DFU:


STM32_Programmer_CLI.exe -c port=usb1

Рис. 2. STM32_Programmer_CLI. Подключение к DFU по USB

Рис. 2. STM32_Programmer_CLI. Подключение к DFU по USB

Выполнение команды подтверждает отсутствие аппаратных проблем. На экран выводятся версия DFU, параметры подключения и целевого микроконтроллера.

При подключении через ST-LINK дополнительно выводятся параметры программатора (рисунок 3).

Рис. 3. STM32_Programmer_CLI. Подключение через SWD

Рис. 3. STM32_Programmer_CLI. Подключение через SWD

Определение версии FUS

Первая ячейка SRAM2 содержит адрес таблицы данных DIT. В этой таблице содержатся сведения о сетевом стеке и FUS: тип, версия, занимаемая память. Полное описание таблицы можно найти в указаниях по применению AN5185 [4]. Версия FUS смещена на 12 байт от начала таблицы, то есть для того, чтобы получить версию FUS, нужно из первых четырех байт памяти SRAM2 (адрес 0x20030000) взять адрес таблицы, прибавить к нему 12 (0xC) и считать непосредственно версию FUS. По умолчанию адрес таблицы – 0x20030024, таким образом, адрес ячейки с версией – 0x20030030.

Подробную карту памяти и список адресов регистров микроконтроллера STM32WB можно найти в руководстве RM0434 [5].

Команда чтения данных из памяти имеет формат:


-r32 <address> <size>

где:

  • <address> – абсолютный адрес;
  • <size> – число считываемых байт.

Команда чтения версии FUS примет вид:


STM32_Programmer_CLI.exe -c port=usb1 -r32 0x20030030 4

Рис. 4. STM32_Programmer_CLI. Чтение версии FUS

Рис. 4. STM32_Programmer_CLI. Чтение версии FUS

На рисунке 4 показан результат чтения версии. Значение 01 01 00 00 нужно интерпретировать как FUS версии 1.1.0.0 – старший байт (биты 24…31) – основная версия. Это значение обновляется при внесении ключевых изменений, когда обратная совместимость нарушена. Биты 26…23 кодируют минорную часть – значение обновляется, если добавлены существенные изменения, но обратная совместимость сохранена. Биты 8…15 кодируют подверсию, это значение обновляется, если внесены несущественные изменения. Наконец, младший байт описывает номер сборки. Как правило, номер сборки в версии опускается.

Однако, поскольку значение DIT не всегда актуализировано, имеет смысл при чтении версии вычитывать всю таблицу либо считать содержимое первых четырех байт, они должны содержать «магическое число» 0xA94656B9 [4], при любом другом значении таблица не верна.

Команда чтения состояния DIT и вывод консоли (рисунок 5) показаны ниже:


STM32_Programmer_CLI.exe -c port=usb1 -r32 0x20030024 4

Рис. 5. STM32_Programmer_CLI. Чтение статуса DIT

Рис. 5. STM32_Programmer_CLI. Чтение статуса DIT

Команда чтения таблицы целиком:


STM32_Programmer_CLI.exe -c port=usb1 -r32 0x20030024 52

Вывод команды показан на рисунке 6.

Рис. 6. STM32_Programmer_CLI. Чтение DIT

Рис. 6. STM32_Programmer_CLI. Чтение DIT

При необходимости обновить данные в таблице можно выполнить два раза команду:


STM32_Programmer_CLI.exe -c port=usb1 -fusgetstate

Обновление FUS

В настоящий момент актуальная версия FUS v1.1.0. Обновление до версии v1.1.0 возможно только с v1.0.2, обновление с более ранних версий проводится в два этапа:

  • обновление до v1.0.2;
  • обновление с v1.0.2 до версии v1.1.0.

Для обновления FUS используется специальная команда «fwupgrade».
Общий формат команды:


-fwupgrade <file_path> <address> [firstinstall=0|1] [startstack=0|1] -v

где:

  • <file_path> – обязательная часть, путь к образу бинарного файла прошивки FUS;
  • <address> – также обязательная часть, адрес в памяти микроконтроллера, куда программатор должен записать образ;
  • [firstinstall=0|1] – необязательная опция, если это первая установка, то следует указать 1, иначе — 0, по умолчанию параметр равен нулю;
  • [startstack=0|1] – определяет, следует ли запустить сетевой стек после обновления FUS, необязательная опция, по умолчанию startstack=1;
  • добавление опции «-v» заставит программатор убедиться, что операция загрузки выполнена успешно, прежде чем начинать обновление.

Бинарные файлы прошивок сетевого стека и FUS можно получить, установив актуальную версию пакета STM32CubeWB (подробнее о STM32CubeWB в [2]). Файлы расположены в каталоге Projects/STM32WB_Copro_Wireless_Binaries. Файл Release_Notes.html содержит краткие инструкции по загрузке бинарных файлов в память STM32WB, таблицу со списком предоставленных бинарных файлов и адреса, по которым каждый файл должен быть записан в соответствующий микроконтроллер.

Примечание. Использование указанных адресов строго обязательно!

Команда для обновления FUS до версии v1.0.2:


STM32_Programmer_CLI.exe -c port=usb1 -fwupgrade stm32wb5x_FUS_fw_1_0_2.bin 0x080EC000 firstinstall=0

Команда для обновления FUS с версии v1.0.2 до v1.1.0 будет иметь вид:


STM32_Programmer_CLI.exe -c port=usb1 -fwupgrade stm32wb5x_FUS_fw.bin 0x080EC000 firstinstall=0

Примечание. В команде требуется указать полный путь до бинарного файла прошивки.

Загрузка сетевого стека

После того как FUS обновлен до актуального состояния, можно загрузить прошивку сетевого стека. Используется команда «-fwupgrade», указывается путь к файлу прошивки и адрес в памяти:


STM32_Programmer_CLI.exe -c port=usb1 -fwupgrade c:\STM32WB5x\stm32wb5x_BLE_Stack_full_fw.bin 0x080CB000 firstinstall=0

На рисунке 7 показан пример вывода в консоль команды загрузки.

Примечание. Адрес загрузки бинарного файла должен строго соответствовать указанным в таблице «Release_Notes.html».

Рис. 7. STM32_Programmer_CLI. Загрузка стека

Рис. 7. STM32_Programmer_CLI. Загрузка стека

Особенности работы с портом SWD

Как уже говорилось выше, полноценный доступ к функционалу FUS может быть реализован только с помощью сопроцессора CM4F. Однако и с помощью ST-LINK можно загрузить или обновить сетевой стек. В этом случае алгоритм обновления будет выглядеть следующим образом:

  1. устанавливаем связь с целевым микроконтроллером по SWD-интерфейсу;
  2. безусловно обновляем FUS до версии v1.0.2. Если текущая версия FUS более старшая, то обновление завершится ошибкой, при этом FUS останется прежним;
  3. безусловно обновляем FUS до актуальной версии. Если текущая версия FUS уже актуальна, то обновление завершиться ошибкой, при этом FUS останется неповрежденным;
  4. используя команды FUS, обновляем прошивку стека.

Примечание. Если происходит повторное обновление стека, то пункты 2 и 3 алгоритма можно пропустить.

При подключении по swd используется режим UR (Under Reset), в данном режиме при подключении к целевому микроконтроллеру происходит перехват вектора сброса перед выполнением любых инструкций. Кроме того, должны быть установлены байты настройки (Option Byte) следующим образом:

  • nSWboot0 = 0;
  • nboot1 = 1;
  • nboot0 = 1.

Команда обновления FUS до версии v1.0.2:


STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade stm32wb5x_FUS_fw_1_0_2.bin 0x080EC000 firstinstall=0

Команда обновления FUS до версии v1.1.0:


STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade stm32wb5x_FUS_fw_1_0_2.bin 0x080EC000 firstinstall=0

Команда загрузки сетевого стека:


STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade stm32wb5x_BLE_Stack_full_fw.bin 0x080CB000 firstinstall=1

Примечание. Адрес загрузки стека и FUS должны строго соответствовать указанным в таблице «Release_Notes.html».

Графический режим STM32CubeProgrammer

В программе ST32CubeProgrammer, начиная с версии 2.4.0, добавлена возможность работы с FUS и обновления сетевого стека в графическом режиме.

Утилита STM32CubeProgrammer по своей сути есть графическая надстройка над командным интерфейсом STM32_Programmer_CLI, поэтому алгоритм и принципы работы с FUS принципиально не отличается от рассмотренных в предыдущей главе.

Подключение по USB через DFU

Запускаем STM32CubeProgrammer, выбираем интерфейс USB, активируем соединение кнопкой «Connect» (рисунок 8).

Рис. 8. STM32CubeProgrammer. Подключение USB DFU

Рис. 8. STM32CubeProgrammer. Подключение USB DFU

Переходим в раздел «Firmware Upgrade Services» (рисунок 9).

Рис. 9. STM32CubeProgrammer. Переход в раздел «Firmware Upgrade Services»

Рис. 9. STM32CubeProgrammer. Переход в раздел «Firmware Upgrade Services»

В данном разделе собраны опции для работы с FUS. Кнопка «Read FUS State» прочитает состояние и версию FUS, кнопка «Firmware delete» удалит сетевой стек (рисунок 10).

Рис. 10. STM32CubeProgrammer. Раздел «Firmware Upgrade Services»

Рис. 10. STM32CubeProgrammer. Раздел «Firmware Upgrade Services»

Обновление FUS и сетевого стека выполняется в области «Firmware Upgrade». Кнопкой «Browse» выбирается нужный файл прошивки, в поле «Start address» нужно внести целевой адрес в памяти микроконтроллера. Адрес загрузки бинарного файла должен строго соответствовать указанному в таблице «Release_Notes.html». Для запуска обновления следует нажать кнопку «Firmware Upgrade» (рисунок 10).

При удачном обновлении стека появится окно с сообщением «Firmware Upgrade Success» (рисунок 11).

Рис. 11. STM32CubeProgrammer. Завершение загрузки стека

Рис. 11. STM32CubeProgrammer. Завершение загрузки стека

Особенность работы с ST-LINK

Если используется программатор, в STM32CubeProgrammer при подключении к целевому микроконтроллеру следует выбрать интерфейс ST-LINK и нажать кнопку «Connect», как показано на рисунке 12.

Рис. 12. STM32CubeProgrammer. Подключение по SWD

Рис. 12. STM32CubeProgrammer. Подключение по SWD

В связи с ограничением swd по работе с FUS часть кнопок в разделе «Firmware Upgrade Services» будет неактивна (рисунок 13), однако обновить или установить сетевой стек возможно, для этого нужно следовать алгоритму, описанному в разделе «Особенности работы с портом SWD».

Рис. 13. STM32CubeProgrammer. Ограниченный функционал «Firmware Upgrade Services»

Рис. 13. STM32CubeProgrammer. Ограниченный функционал «Firmware Upgrade Services»

Литература

  1. А. Шауэрман. Отладочная плата P-NUCLEO-WB55 для STM32WB55: возможности и особенности.
  2. А. Шауэрман. Как создать прототип BLE-приложения на STM32WB с помощью STM32CubeWB.
  3. STM32CubeProgrammer software description. ST User manual UM2237.
  4. ST firmware upgrade services for STM32WB Series. Application note AN5185.
  5. Multiprotocol wireless 32-bit MCU Arm®-based Cortex®-M4 with FPU, Bluetooth® Low-Energy and 802.15.4 radio solution. ST Reference manual RM0434.
•••

Наши информационные каналы

О компании ST Microelectronics

Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство ...читать далее

Товары
Наименование
STM32WB55CGU7 (ST)
STM32WB55CGU6TR (ST)
STM32WB55CGU6 (ST)
STM32WB55CСU6 (ST)
STM32WB55CEU6 (ST)
STM32WB55CEU6TR (ST)
STM32WB55CCU7 (ST)
STM32WB55CCU6 (ST)
STM32WB55CCU6TR (ST)
P-NUCLEO-WB55 (ST)