Загрузчик (bootloader) находится во внутренней постоянной системной памяти (internal boot ROM) микроконтроллеров STM32. Он программируется во время производства микроконтроллера (MCU). Основная задача загрузчика - записать в память Flash программу приложения через один из доступных периферийных устройств (USART, CAN, USB, I2C, SPI и т. п.). Для каждого последовательного интерфейса определен протокол, с совместимым набором команд и их последовательностью. Документ [1] применим к микроконтроллерам, перечисленным в таблице 1. Все эти микроконтроллеры в приведенном описании сокращенно упоминаются как STM32 или MCU.
Таблица 1. Микроконтроллеры STM32, на борту которых есть загрузчик.
В документе [1] приведены требования к поддерживаемым периферийным устройствам загрузки и требования к аппаратуре, которые должны учитываться при использовании загрузчика STM32. Однако спецификации низкоуровневого коммуникационного протокола для каждого поддерживаемого последовательного периферийного устройства приведены в отдельном документе (см. врезку "Дополнительная документация").
Примечание: в этой статье приведена переведенная информация, в основном относящая с загрузчику STM32F42xxx/STM32F43xxx. Для других STM32 см. оригинальный документ [1]. Все непонятные термины и сокращения см. в Словарике [6].
Для каждого из поддерживаемых MCU, перечисленных в таблице 1, см. его даташит руководство пользователя (Reference manual). Также см. апноуты:
– AN3154: CAN protocol used in the STM32 bootloader – AN3155: USART protocol used in the STM32 bootloader [2] – AN3156: USB DFU protocol used in the STM32 bootloader – AN4221: I2C protocol used in the STM32 bootloader – AN4286: SPI protocol used in the STM32 bootloader
[Серия F0]
STM32F03xxx используется для обозначения STM32F030x4, STM32F030x6, STM32F038x6, STM32F030xC, STM32F031x4 и STM32F031x6.
STM32F04xxx используется для обозначения STM32F042x4 и STM32F042x6.
STM32F05xxx и STM32F030x8 используется для обозначения STM32F051x4, STM32F051x6, STM32F051x8, STM32F058x8 и STM32F030x8.
STM32F07xxx используется для обозначения STM32F070x6, STM32F070xB, STM32F071xB, STM32F072x8 и STM32F072xB.
STM32F09xxx используется для обозначения STM32F091xx и STM32F098xx.
[Серия F1]
STM32F10xxx используется для обозначения линеек MCU Low-density, Medium-density, High-density, Low-density, Lowdensity value line, Medium-density value line и High-density value line:
Low-density это STM32F101xx, STM32F102xx и STM32F103xx, у которых размер памяти Flash в диапазоне от 16 до 32 килобайт.
Medium-density это STM32F101xx, STM32F102xx и STM32F103xx, у которых размер памяти Flash в диапазоне от 64 до 128 килобайт.
High-density это STM32F101xx и STM32F103xx, у которых размер памяти Flash в диапазоне от 256 до 512 килобайт.
Low-density value line это STM32F100xx, у которых размер памяти Flash в диапазоне от 16 до 32 килобайт.
Medium-density value line это STM32F100xx, у которых размер памяти Flash в диапазоне от 64 до 128 килобайт.
High-density value line это STM32F100xx, у которых размер памяти Flash в диапазоне от 256 до 512 килобайт.
STM32F105xx/107xx используется для обозначения STM32F105xx и STM32F107xx.
STM32F10xxx XL-density используется для обозначения STM32F101xx и STM32F103xx, где размер памяти Flash между 768 килобайт и 1 мегабайт.
[Серия F2]
STM32F2xxxx используется для обозначения STM32F215xx, STM32F205xx, STM32F207xx и SMT32F217xx.
[Серия F3]
STM32F301xx/302x4(6/8) используется для обозначения STM32F301x4, STM32F301x6, STM32F301x8, STM32F302x4, STM32F302x6 и STM32F302x8.
STM32F302xB(C)/303xB(C) используется для обозначения STM32F302xB, STM32F302xC, STM32F303xB и STM32F303xC.
STM32F302xD(E)/303xD(E) используется для обозначения STM32F302xD, STM32F302xE, STM32F303xD и STM32F303xE.
STM32F303x4(6/8)/334xx/328xx используется для обозначения STM32F303x4, STM32F303x6, STM32F303x8, STM32F334x4, STM32F334x6, STM32F334x8 и STM32F328x8.
STM32F318xx используется для обозначения STM32F318x8.
STM32F358xx используется для обозначения STM32F358xC.
STM32F373xx используется для обозначения STM32F373x8, STM32F373xB и STM32F373xC.
STM32F378xx используется для обозначения STM32F378xC.
STM32F398xx используется для обозначения STM32F398xE.
[Серия F4]
STM32F40xxx/41xxx используется для обозначения STM32F405xx, STM32F407xx, STM32F415xx и SMT32F417xx.
STM32F401xB(C) используется для обозначения STM32F401xB и STM32F401xC.
STM32F401xD(E) используется для обозначения STM32F401xD и STM32F401xE.
STM32F410xx используется для обозначения STM32F410x8 и STM32F410xB.
STM32F411xx используется для обозначения STM32F411xD и STM32F411xE.
STM32F412xx используется для обозначения STM32F412Cx, STM32F412Rx, STM32F412Vx и STM32F412Zx.
STM32F413xx/423xx используется для обозначения STM32F413xG, STM32F413xH и STM32F423xH.
STM32F42xxx/43xxx используется для обозначения STM32F427xx, STM32F429xx, STM32F437xx и STM32F439xx.
STM32F446xx is используется для обозначения STM32F446xE и STM32F446xC.
STM32F469xx/479xx используется для обозначения STM32F469xE, STM32F469xG, STM32F469xI, STM32F479xG и STM32F479xI.
[Серия F7]
STM32F72xxx/73xxx используется для обозначения STM32F722xx, STM32F723xx, STM32F732xx и STM32F733xx.
STM32F74xxx/75xxx используется для обозначения STM32F745xx, STM32F746xx и STM32F756xx.
STM32F76xxx/77xxx используется для обозначения STM32F765xx, STM32F767xx, STM32F769xx, STM32F777xx и STM32F779xx.
[Серия G0]
STM32G03xxx/04xxx используется для обозначения STM32G03xxx и STM32G04xxx.
STM32G07xxx/08xxx используется для обозначения STM32G07xxx и STM32G08xxx.
[Серия G4]
STM32G431xx используется для обозначения STM32G431xx.
STM32G441xx используется для обозначения STM32G441xx.
STM32G47xxx используется для обозначения STM32G471xx, STM32G473xx и STM32G474xx.
STM32G48xxx используется для обозначения STM32G483xx и STM32G484xx.
[Серия H7]
STM32H74xxx/75xxx используется для обозначения STM32H743xx и STM32H753xx.
STM32H7A3xx/7B3xx используется для обозначения STM32H7A3xx/STM32H7B3xx.
[Серия L0]
STM32L01xxx/02xxx используется для обозначения STM32L011xx и STM32L021xx.
STM32L031xx/041xx используется для обозначения STM32L031xx и STM32L041xx.
STM32L05xxx/06xxx используется для обозначения MCU со сверхнизким энергопотреблением (ultralow power) STM32L051xx, STM32L052xx, STM32L053xx, STM32L062xx и STM32L063xx.
STM32L07xxx/08xxx используется для обозначения STM32L071xx, STM32L072xx, STM32L073xx, STM32L081xx, STM32L082xx и STM32L083xx
[Серия L1]
Это серии MCU со сверхнизким энергопотреблением:
STM32L1xxx6(8/B) используется для обозначения STM32L1xxV6T6, STM32L1xxV6H6, STM32L1xxR6T6, STM32L1xxR6H6, STM32L1xxC6T6, STM32L1xxC6H6, STM32L1xxV8T6, STM32L1xxV8H6, STM32L1xxR8T6, STM32L1xxR8H6, STM32L1xxC8T6, STM32L1xxC8H6, STM32L1xxVBT6, STM32L1xxVBH6, STM32L1xxRBT6, STM32L1xxRBH6, STM32L1xxCBT6 и STM32L1xxCBH6.
STM32L1xxx6(8/B)A используется для обозначения STM32L1xxV6T6-A, STM32L1xxV6H6-A, STM32L1xxR6T6-A, STM32L1xxR6H6-A, STM32L1xxC6T6-A, STM32L1xxC6H6-A, STM32L1xxV8T6-A, STM32L1xxV8H6-A, STM32L1xxR8T6-A, STM32L1xxR8H6-A, STM32L1xxC8T6-A, STM32L1xxC8H6-A, STM32L1xxVBT6-A, STM32L1xxVBH6-A, STM32L1xxRBT6-A, STM32L1xxRBH6-A, STM32L1xxCBT6-A и STM32L1xxCBH6-A.
STM32L1xxxC используется для обозначения STM32L1xxVCT6, STM32L1xxVCH6, STM32L1xxRCT6, STM32L1xxUCY6, STM32L1xxCCT6 и STM32L1xxCCU6.
STM32L1xxxD используется для обозначения STM32L1xxZDT6, STM32L1xxQDH6, STM32L1xxVDT6, STM32L1xxRDY6, STM32L1xxRDT6, STM32L1xxZCT6, STM32L1xxQCH6, STM32L1xxRCY6, STM32L1xxVCT6-A и STM32L1xxRCT6-A.
STM32L1xxxE используется для обозначения STM32L1xxZET6, STM32L1xxQEH6, STM32L1xxVET6, STM32L1xxVEY6, и STM32L1xxRET6.
[Серия L4]
STM32L412xx/422xx используется для обозначения STM32L412xB, STM32L412x8, STM32L422xB.
STM32L43xxx/44xxx используется для обозначения STM32L431xx, STM32L432xx, STM32L433xx, STM32L442xx и STM32L443xx.
STM32L45xxx/46xxx используется для обозначения STM32L451xx, STM32L452xx и STM32L462xx.
STM32L47xxx/48xxx используется для обозначения STM32L471xx, STM32L475xx, STM32L476xx и STM32L486xx.
STM32L496xx/4A6xx используется для обозначения STM32L496xE, STM32L496xG и STM32L4A6xG.
STM32L4Rxxx/4Sxxx используется для обозначения STM32L4R5xx, STM32L4R7xx, STM32L4R9xx, STM32L4S5xx, STM32L4S7xx и STM32L4S9xx.
STM32L4P5xx/4Q5xx используется для обозначения STM32L4P5xx/STM32L4Q5xx.
[Серия L5]
STM32L552xx используется для обозначения STM32L552xx.
STM32L562xx используется для обозначения STM32L562xx.
[Серия WB]
STM32WB50xx используется для обозначения STM32WB50xx.
STM32WB55xx используется для обозначения STM32WB55Cx, STM32WB55Rx, STM32WB55Vx.
[Серия WL]
STM32WLE5xx используется для обозначения STM32WLE5JC, STM32WLE5JB и STM32WLE5J8.
Примечание: BL_USART_Loop обозначает цикл выполнения загрузчика USART. BL_CAN_Loop обозначает цикл выполнения загрузчика CAN. BL_I2C_Loop обозначает цикл выполнения загрузчика I2C. BL_SPI_Loop обозначает цикл выполнения загрузчика SPI.
[Общее описание технологии bootloader STM32]
Загрузчик (bootloader) активируется подачей определенных логических уровней на специальные выводы MCU, что описано в таблице 2 ниже.
Если была активирована опция загрузки из Bank2 (для тех MCU, которые это поддерживают), то загрузчик запускает механизм двойной загрузки (Dual Boot), алгоритм которого показан на рисунках "Dual Bank Boot Implementation for STM32xxxx" [1], где STM32xxxx относится к соответствующим микроконтроллерам STM32 (в этом переводе см. рис. 36). Иначе протокол выбора загрузчика описывается на рисунках "Bootloader VY.x selection for STM32xxxx" [1], где STM32xxxx относится к соответствующим микроконтроллерам STM32.
Когда активирована защита чтения кода Level2, MCU STM32 в любом случае не загружается на системной памяти, и загрузчик не может запуститься (за исключением безусловного перехода к коду пользователя во Flash, недоступны все команды, кроме Get, GetID и GetVersion).
Таблица 2. Шаблоны запуска загрузчика.
Шаблон
Условие активации
Pattern1
Boot0(ножка корпуса) = 1 и Boot1(ножка корпуса) = 0
nBoot1(бит) = 1, nSWBoot0(бит) = 1, Boot0(ножка корпуса) = 0 и память Flash пользователя пуста
В дополнение к описанным выше шаблонам, пользователь также может запустить загрузчик, выполнив безусловный переход в системную память из кода пользователя. Перед переходом в загрузчик программа должна выполнить следующее:
• Запретить тактирование всех периферийных устройств (в библиотеках HAL это соответствует MSP-функциям HAL_XXX_MspDeInit, здесь XXX обозначает периферийное устройство, например ADC, SPI, USART и т. п.). • Запретить использование PLL. • Запретить прерывания. • Очистить все флаги прерываний, ожидающих своей обработки.
Из режима загрузки системной памяти (System memory boot mode) можно выйти путем снятия условия активации загрузчика и генерацией аппаратного сброса, либо использованием команды Go, выполненной для запуска кода пользователя.
Замечания:
1. Если выбрана команда Go, то регистры периферийных устройств, используемых в загрузчике, не инициализируются в свое состояние по умолчанию перед переходом в приложение пользователя. Таким образом, эти регистры и периферийные устройства должны быть заново переконфигурированы в приложении пользователя, если они должны использоваться. Так, если в приложении используется IWDG (Independent watchdog, сторожевой таймер ватчдог), то значение для прескалера IWDG должно быть адаптировано для требований приложения (поскольку прескалер в загрузчике был установлен в свое максимальное значение). Для некоторых MCU не устанавливается все значения, соответствующие сбросу. Для дополнительной информации обратитесь к описанию известных ограничений, описанных для определенных версий загрузчика каждого MCU.
2. Для тех MCU STM32, которые обладают функцией Dual Bank Boot, чтобы перейти в системную память из кода пользователя, программа должна сначала перенастроиться на системную память загрузчика (System Memory bootloader) по адресу 0x00000000, используя регистр SYSCFG (кроме серии STM32F7), затем перейти в загрузчик. Для серии STM32F7 пользовательская программа должна запретить функции nDBOOT и/или nDBANK (в байтах опций), затем перейти в загрузчик.
3. Для тех MCU STM32, в которых встроен интерфейс DFU/CAN (сокращение DFU означает Device Firmware Upgrade - обновление программного обеспечения устройства на микроконтроллере), для нормальной работы которого необходим внешний источник тактирования (HSE), детектирование частоты HSE осуществляется в firmware загрузчика динамически (с помощью HSI, MSI). Таким образом, когда температура или другие внешние рабочие условия выходят за допустимые пределы, частота внутреннего генератора изменяется, выходя за предсказуемые значения (1% возле теоретической величины), загрузчик може неправильно вычислить значение частоты HSE. Тогда загрузчик DFU/CAN может работать неправильно или не работать вовсе.
Идентификация загрузчика. В зависимости от используемого MCU STM32, загрузчик может поддерживать один или несколько встроенных последовательных интерфейсов для загрузки кода во внутреннюю память Flash. Идентификатор загрузчика (bootloader identifier, ID) предоставляет информацию о поддерживаемых последовательных периферийных устройствах.
Для имеющегося устройства STM32 загрузчик идентифицируется следующим образом:
1. По версии протокола загрузчика. Это версия коммуникационного протокола последовательного интерфейса (USART, CAN, USB, и т. п.), который использует загрузчик. Версию протокола можно получить, используя команду загрузчика Get Version.
2. По идентификатору загрузчика ID (bootloader identifier). Это версия загрузчика MCU STM32, кодируемая одним байтом в HEX-формате 0xXY, где значение X задает один из встроенных последовательных интерфейсов загрузчика:
X = 1: используется один USART X = 2: используются два USART-а X = 3: используются USART, CAN и DFU X = 4: используются USART и DFU X = 5: используются USART и I2C X = 6: используется I2C X = 7: используются USART, CAN, DFU и I2C X = 8: используются I2C и SPI X = 9: используются USART, CAN (или FDCAN), DFU, I2C и SPI X = 10: используются USART, DFU и I2C X = 11: используются USART, I2C и SPI X = 12: используются USART и SPI X = 13: используются USART, DFU, I2C и SPI
Y здесь задает версию загрузчика.
Например, bootloader ID равен 0x10. Это означает, что это первая версия загрузчика, который использует только один USART.
Значение bootloader ID программируется в адресе последнего байта -1 системной памяти MCU, и его можно прочитать командой "Read memory" загрузчика, либо с помощью интерфейса отладки JTAG/SWD.
Примечание: описанный формат bootloader ID применяется ко всем семействам MCU STM32, кроме семейства STM32F1xx. Версия загрузчика для STM32F1xx показывает только версию встроенного загрузчика, и не обозначает поддерживаемые протоколы.
Ниже в таблице предоставлена идентификационная информация встроенных загрузчиков STM32.
Примечание (1): MCU connectivity line загрузчик USART для версии протокола возвратит V2.0 вместо V2.2. Более подробную информацию см. в документации с описанием ошибок (errata sheet) "STM32F105xx и STM32F107xx revision Z" на сайте st.com.
Требования к каналу связи. Для использования загрузчика USART хост должен быть подключен к ножкам приема (RX) и передачи (TX) нужного интерфейса USARTx.
Рис. 1. Соединение через USART.
Примечания:
1. Должен на стороне MCU STM32 на каждый сигнал должен быть подключен верхний подтягивающий резистор (pull-up). Типовое значение для +V равно +3.3V, и R равно 100 кОм. Эти значения зависят от приложения и используемого оборудования. 2. Для адаптации стандартных уровней RS232 (-12V .. +12V) к уровням логики TTL (0V .. +3.3V) между MCU STM32 и хостом необходим преобразователь уровней (трансивер RS232), наподобие [4].
Для протокола DFU подключите интерфейс USB микроконтроллера (контроллер USB OTG_FS) к интерфейсу хоста USB (например компьютеру PC).
Рис. 2. Соединение через USB.
Примечание: дополнительная схема на транзисторе подключает резистор pull-up 1.5 кОм к сигналу DP с использованием при необходимости сигнала VBus. Чтобы узнать, должен ли быть подключен этот внешний резистор, см. секцию с описанием используемого MCU (таблица, описывающая конфигурацию STM32 в режиме загрузки системной памяти. Типовое значение для +V равно +3.3V, значение зависит от приложения и используемого оборудования.
Для использования загрузчика I2C подключите хост (мастер шины I2C) к желаемому интерфейсу I2Cx микроконтроллера (он работает как slave-устройство I2C) сигналами данных (SDA) и тактов (SCL). На оба этих сигнала должен быть подключен pull-up резистор 1.8 кОм.
Рис. 3. Соединение через I2C.
Для использования загрузчика SPI соедините хост (мастер шины SPI) и желаемый интерфейс SPIx микроконтроллера (он работает как slave-устройство SPI) сигналами MOSI, MISO и SCK. Ножка NSS микроконтроллера должна быть соединена с землей (GND). На линии SCK должен присутствовать нижний подтягивающий резистор R (pull-down).
Рис. 4. Соединение через SPI.
Примечание: типовое значение для R pull-down составляет 100 кОм. Это значение зависит от приложения и используемого оборудования.
Для использования интерфейса CAN хост шины должен быть подключен к ножкам приема (RX) и передачи (TX) желаемого интерфейса CANx микроконтроллера через трансиверы и физическую линию шины CAN. На обоих концах линии CAN должны присутствовать терминирующие резисторы 120 Ом.
Рис. 5. Соединение через CAN.
Примечание: когда firmware загрузчика поддерживает DFU, необходимо выполнение обязательного условия, чтобы на фазе выбора других интерфейсов загрузки к периферийному устройству USB не был подключен хост USB. После фазы выбора пользователь может подключить кабель USB без риска повлиять на выполнение выбранного загрузчика, за исключением команд, генерирующих сброс системы.
Рекомендуется удерживать сигналы RX не используемых загрузчиков (USART_RX, SPI_MOSI, CAN_RX и сигналы USB DP/DM, если они есть) в известный постоянный уровень (лог. 0 или лог. 1) на момент запуска загрузчика (фаза детектирования активного интерфейса загрузки). Если оставить эти выводы висящими в воздухе на фазе детектирования, то это может привести к активации не используемого интерфейса загрузки.
[Управление памятью загрузчика]
Все операции записи с помощью команд загрузчика должны быть обязательно выровнены на размер слова, т. е. адрес данных должен нацело делиться на 4). Количество записываемых байт также должно делиться на 4 (принимаются не выровненные адреса записи половины страницы).
У встроенных загрузчиков некоторых MCU есть специальные функции или отличия:
• Иногда не поддерживается операция полной очистки (Mass erase). Для выполнения полной очистки с помощью загрузчика в этом случае возможны 2 варианта:
– Стереть все секторы один за другим, с использованием команды Erase. – Установить уровень защиты на Level 1. Затем установить его на Level 0 (с помощью команды Read Protect и затем команды Read Unprotect). Эта операция приведет к полному стиранию внутренней памяти Flash.
• Firmware загрузчика STM32 L1 и L0 поддерживает память данных (Data Memory) в дополнение к стандартным типам памяти (внутренняя Flash, внутренняя SRAM, байты опций и системная память). Начальный адрес и размер этой области зависит от используемого MCU, для дополнительной информации см. его документацию. Data Memory может считывается и записываться, но не может быть стерта командой Erase. При записи в ячейку Data Memory код firmware загрузчика сам управляет операцией очистки для этой ячейки перед любой записью. Запись в Data Memory должна быть выровнена на размер слова (адрес записываемой области должен нацело делиться на 4). Количество записываемых данных также должно нацело делиться на 4. Чтобы стереть ячейку Data Memory, Вы можете записать в нею нули.
• Firmware загрузчика STM32 серий F2, F4, F7 и L4 поддерживают память OTP в дополнение к стандартным типам памяти (внутренняя Flash, внутренняя SRAM, байты опций и системная память). Начальный адрес и размер этой области зависит от используемого MCU, для дополнительной информации см. его документацию. Память OTP можно читать и записывать, но её нельзя стереть командой Erase. При записи в ячейку памяти OTP убедитесь, что соответствующий бит защиты не сброшен.
• Для серий STM32 F2, F4 и F7 формат операции записи внутренней Flash зависит от диапазона напряжения (voltage Range). По умолчанию операция записи допускается в формате одного байта (операции половины слова, слова или двойного слова не допускаются). Для увеличения скорости операции записи пользователь должен применить адекватный диапазон напряжений, который допускает операции записи половины слова (Half-Word), слова (Word) или двойного слова (Double-Word) и обновить эту конфигурацию на лету с применением программы загрузчика через области виртуальной памяти. Эта область памяти не физическая, однако её можно прочитать и записать обычными операциями чтения/записи загрузчика, в соответствии с используемым протоколом. Эта область памяти содержит 4 байта, описанные в таблице ниже, и к ней обращаются как 1, 2, 3 или 4 байтам. Однако зарезервированные байты должны должны оставаться в своих значениях по умолчанию (0xFF), иначе запрос будет отклонен (отрицательным подтверждением NACK).
Таблица 4. Конфигурация Voltage Range для STM32 F2, F4 и F7 с использованием загрузчика.
Адрес
Размер, байт
Описание
0xFFFF0000
1
Этот байт управляет текущим значением диапазона напряжения.
0x00: диапазон [1.8V, 2.1V] 0x01: диапазон [2.1V, 2.4V] 0x02: диапазон [2.4V, 2.7V] 0x03: диапазон [2.7V, 3.6V] 0x04: диапазон [2.7V, 3.6V], и используется операция записи/стирания (write/erase) двойного слова. В этом случае важно подать напряжение +9V на вывод VPP (см. руководство MCU для получения дополнительной информации по процедуре записи двойного слова).
Все другие значения не поддерживаются и будут отклонены отрицательным подтверждением (NACK).
0xFFFF0001
1
Зарезервировано, значение по умолчанию 0xFF. Все другие значения не поддерживаются и будут отклонены отрицательным подтверждением (NACK).
0xFFFF0002
1
0xFFFF0003
1
В следующей таблице перечислены допустимые области памяти для команд загрузчика.
Таблица 5. Поддерживаемые области памяти для команд Write, Read, Erase и Go (+ команда поддерживается, - не поддерживается).
Область памяти
Write
Read
Erase
Go
Flash
+
+
+
+
RAM
+
+
-
+
System Memory
-
+
-
-
Data Memory
+
+
-
-
OTP Memory
+
+
-
-
[STM32F42xxx/43xxx bootloader V7.x]
Загрузчик STM32F42xxx/43xxx активируется по шаблону pattern5 (см. таблицу 2 выше). В следующей таблице показаны аппаратные ресурсы, которые использует этот загрузчик.
Таблица 66. Конфигурация STM32F42xxx/43xxx в режиме system memory boot.
Bootloader
Функция/устройство
Состояние
Описание
Это относится ко всем загрузчикам
RCC
HSI разрешен
Системная тактовая частота 24 МГц, генерируемая с помощью PLL. Генератор тактов HSI используется в момент первоначального старта (на фазе детектирования интерфейса), и когда выбраны интерфейсы USART или I2C (как только выбраны загрузчики CAN или DFU, тактирование выбирается от внешнего кварца, т. е. от генератора HSE).
HSE разрешен
Тактовая частота системы 60 МГц. Генератор тактов HSE используется только когда выбран интерфейс CAN или DFU (USB FS Device). Внешняя тактовая частота должна (кварц) должна нацело делиться на 1 МГц и быть в диапазоне от 4 МГц до 26 МГц.
-
Для загрузчиков CAN и DFU разрешено прерывание Clock Security System (CSS). Любой отказ (или пропадание) внешних тактов генерирует системный сброс.
RAM
-
Firmware загрузчика использует 8 килобайт, начиная с адреса 0x20000000.
System Memory
-
29 килобайт, начиная с адреса 0x1FFF0000, содержат код firmware загрузчика.
IWDG
-
Прескалер IWDG конфигурируется на максимальное значение. Он периодически обновляется, чтобы предотвратить генерацию сброса сторожевого таймера watchdog reset (для случая, когда опция аппаратуры IWDG была предварительно разрешена пользователем).
Питание
-
Устанавливается диапазон напряжений [1.62V, 2.1V]. В этом диапазоне разрешены операции записи внутренней Flash только в форматах байта (операции Half-Word, Word и Double-Word не допускаются). Диапазон напряжений может быть сконфигурирован командами загрузчика во время его работы.
USART1 bootloader
USART1
Разрешен
Как только USART1 инициализирован, у него устанавливается конфигурация 8 бит, even parity и 1 стоп-бит.
Ножка USART1_RX
Вход
Порт PA10: USART1 в режиме приема.
Ножка USART1_TX
Выход
Порт PA9: USART1 в режиме передачи.
USART3 bootloader (PB10/PB11)
USART3
Разрешен
Как только USART3 инициализирован, у него устанавливается конфигурация 8 бит, even parity и 1 стоп-бит.
Ножка USART3_RX
Вход
Порт PB11: USART3 в режиме приема.
Ножка USART3_TX
Выход
Порт PB10: USART3 в режиме передачи.
USART3 bootloader (PC10/PC11)
USART3
Разрешен
Как только USART3 инициализирован, у него устанавливается конфигурация 8 бит, even parity и 1 стоп-бит.
Ножка USART3_RX
Вход
Порт PC11: USART3 в режиме приема.
Ножка USART3_TX
Выход
Порт PC10: USART3 в режиме передачи.
Относится ко всем USARTx
Таймер SysTick
Разрешен
Используется для автодетекта скорости загрузчиков USARTx.
CAN2 bootloader
CAN2
Разрешен
Как только CAN2 инициализирован, у него устанавливается конфигурация 125 kbps, 11-бит ID (стандартный идентификатор). Внимание: CAN1 тактируется во время работы CAN2 bootloader, потопу что CAN1 управляет обменом между CAN2 и SRAM.
Ножка CAN2_RX
Вход
Порт PB5: CAN2 в режиме приема.
Ножка CAN2_TX
Выход
Порт PB13: CAN2 в режиме передачи.
I2C1 bootloader
I2C1
Разрешен
Конфигурация I2C1 следующая: скорость до 400 кГц, адрес 7 бит, режим slave, аналоговый фильтр включен. 7-битный slave-адрес 0b0111000x (здесь x=0 для записи и x=1 для чтения).
Ножка I2C1_SCL
Вход/выход
Порт PB6: такты I2C, драйвер порта работает в режиме открытого стока (open-drain).
Ножка I2C1_SDA
Вход/выход
Порт PB9: данные I2C, драйвер порта работает в режиме открытого стока (open-drain).
DFU bootloader
USB
Разрешен
USB OTG FS [5] принудительно сконфигурирован в режиме устройства USB.
Ножка USB_DM
Вход/выход
Порт PA11: сигнал USB DM (D-).
Ножка USB_DP
Вход/выход
Порт PA12: сигнал USB DP (D+). Внешний верхний подтягивающий резистор (pull-up) не нужен.
Относится к загрузчикам CAN2 и DFU
TIM11
Разрешен
Этот таймер используется для определения частоты HSE. Как только частота генератора HSE определена, системные такты настраиваются на частоту 60 МГц от HSE с использованием PLL.
Для загрузчиков USARTx и I2Cx системная тактовая частота формируется от внутреннего высокоскоростного RC-генератора (HSI). Эта внутренняя тактовая частота также используется для CAN и DFU (USB FS Device), но только на фазе выбора интерфейса загрузки. Внешняя тактовая частота (кварц) должна нацело делиться на 1 МГц (должна быть в пределах от 4 до 26 МГц), это необходимо для работы загрузчиков CAN и DFU после фазы выбора интерфейса.
Выбор загрузчика. Рисунки 36 и 37 показывают механизм выбора загрузчика.
Рис. 36. Алгоритм Dual Bank Boot для STM32F42xxx/43xxx Bootloader версий V7.x и V9.x.
Примечание (1): содержимое CCM RAM не считается достоверным как адрес указателя стека для механизма dual bank boot.
Рис. 37. Алгоритм выбора варианта загрузки для Bootloader V7.x STM32F42xxx/43xxx.
Особенности версий загрузчика v7.x. В следующей таблице перечислены версии загрузчика STM32F42xxx/43xxx V7.x.
Таблица 67. Версии STM32F42xxx/43xxx bootloader V7.x (для [1] AN2606 Rev 42, декабрь 2019 года).
Версия
Описание
Известные ограничения
V7.0
Начальная версия загрузчика
Для интерфейса CAN команда Write Unprotect не функциональна. Вместо этого Вы можете использовать команду Write Memory и напрямую записывать байты опций, чтобы запретить защиту от записи.
Для интерфейса USB DFU, в режиме Dual Bank, операция Erase для второго банка не функциональна. Вместо этого Вы можете вернутся в режим Single Bank, стереть нужный сектор (секторы), и затем заново активировать режим Dual Bank.
После выполнения команды Go (jump в код пользователя) загрузчик сбрасывает значение AHB1ENR в 0x00000000, и таким образом CCM RAM, когда она имеется, не активна (должна быть разрешена повторно в коде пользователя на стадии начального запуска startup).
[STM32F42xxx/43xxx bootloader V9.x]
Загрузчик STM32F42xxx/43xxx активируется по шаблону pattern5 (см. таблицу 2 выше), также как и в версии V7.x. В следующей таблице показаны аппаратные ресурсы, которые использует этот загрузчик.
Таблица 68. Конфигурация STM32F42xxx/43xxx в режиме system memory boot. Отличия от версии V7.x выделены красным текстом.
Bootloader
Функция/устройство
Состояние
Описание
Это относится ко всем загрузчикам
RCC
HSI разрешен
Системная тактовая частота 60 МГц, генерируемая с помощью PLL. Генератор тактов HSI используется в момент первоначального старта (на фазе детектирования интерфейса), и когда выбраны интерфейсы USART, SPI или I2C (как только выбраны загрузчики CAN или DFU, тактирование выбирается от внешнего кварца, т. е. от генератора HSE).
HSE разрешен
Тактовая частота системы 60 МГц. Генератор тактов HSE используется только когда выбран интерфейс CAN или DFU (USB FS Device). Внешняя тактовая частота должна (кварц) должна нацело делиться на 1 МГц и быть в диапазоне от 4 МГц до 26 МГц.
-
Для загрузчиков CAN и DFU разрешено прерывание Clock Security System (CSS). Любой отказ (или пропадание) внешних тактов генерирует системный сброс.
RAM
-
Firmware загрузчика использует 12 килобайт, начиная с адреса 0x20000000.
System Memory
-
29 килобайт, начиная с адреса 0x1FFF0000, содержат код firmware загрузчика.
IWDG
-
Прескалер IWDG конфигурируется на максимальное значение. Он периодически обновляется, чтобы предотвратить генерацию сброса сторожевого таймера watchdog reset (для случая, когда опция аппаратуры IWDG была предварительно разрешена пользователем).
Питание
-
Устанавливается диапазон напряжений [1.62V, 2.1V]. В этом диапазоне разрешены операции записи внутренней Flash только в форматах байта (операции Half-Word, Word и Double-Word не допускаются). Диапазон напряжений может быть сконфигурирован командами загрузчика во время его работы.
USART1 bootloader
USART1
Разрешен
Как только USART1 инициализирован, у него устанавливается конфигурация 8 бит, even parity и 1 стоп-бит.
Ножка USART1_RX
Вход
Порт PA10: USART1 в режиме приема.
Ножка USART1_TX
Выход
Порт PA9: USART1 в режиме передачи.
USART3 bootloader (PB10/PB11)
USART3
Разрешен
Как только USART3 инициализирован, у него устанавливается конфигурация 8 бит, even parity и 1 стоп-бит.
Ножка USART3_RX
Вход
Порт PB11: USART3 в режиме приема.
Ножка USART3_TX
Выход
Порт PB10: USART3 в режиме передачи.
USART3 bootloader (PC10/PC11)
USART3
Разрешен
Как только USART3 инициализирован, у него устанавливается конфигурация 8 бит, even parity и 1 стоп-бит.
Ножка USART3_RX
Вход
Порт PC11: USART3 в режиме приема.
Ножка USART3_TX
Выход
Порт PC10: USART3 в режиме передачи.
Относится ко всем USARTx
Таймер SysTick
Разрешен
Используется для автодетекта скорости загрузчиков USARTx.
CAN2 bootloader
CAN2
Разрешен
Как только CAN2 инициализирован, у него устанавливается конфигурация 125 kbps, 11-бит ID (стандартный идентификатор). Внимание: CAN1 тактируется во время работы CAN2 bootloader, потопу что CAN1 управляет обменом между CAN2 и SRAM.
Ножка CAN2_RX
Вход
Порт PB5: CAN2 в режиме приема.
Ножка CAN2_TX
Выход
Порт PB13: CAN2 в режиме передачи.
I2C1 bootloader
I2C1
Разрешен
Конфигурация I2C1 следующая: скорость до 400 кГц, адрес 7 бит, режим slave, аналоговый фильтр включен. 7-битный slave-адрес 0b0111000x (здесь x=0 для записи и x=1 для чтения).
Ножка I2C1_SCL
Вход/выход
Порт PB6: такты I2C, драйвер порта работает в режиме открытого стока (open-drain).
Ножка I2C1_SDA
Вход/выход
Порт PB9: данные I2C, драйвер порта работает в режиме открытого стока (open-drain).
I2C2 bootloader
I2C2
Разрешен
Конфигурация I2C2 следующая: скорость до 400 кГц, адрес 7 бит, режим slave, аналоговый фильтр включен. 7-битный slave-адрес 0b0111000x (здесь x=0 для записи и x=1 для чтения).
Ножка I2C2_SCL
Вход/выход
Порт PF1: такты I2C, драйвер порта работает в режиме открытого стока (open-drain).
Ножка I2C2_SDA
Вход/выход
Порт PF0: данные I2C, драйвер порта работает в режиме открытого стока (open-drain).
I2C3 bootloader
I2C3
Разрешен
Конфигурация I2C1 следующая: скорость до 400 кГц, адрес 7 бит, режим slave, аналоговый фильтр включен. 7-битный slave-адрес 0b0111000x (здесь x=0 для записи и x=1 для чтения).
Ножка I2C1_SCL
Вход/выход
Порт PA8: такты I2C, драйвер порта работает в режиме открытого стока (open-drain).
Ножка I2C1_SDA
Вход/выход
Порт PC9: данные I2C, драйвер порта работает в режиме открытого стока (open-drain).
SPI1 bootloader
SPI1
Разрешен
Конфигурация SPI1: режим slave, Full Duplex, 8-бит MSB, скорость до 8 МГц, полярность CPOL Low/CPHA Low, аппаратная выборка NSS.
Ножка SPI1_MOSI
Вход
Порт PA7: вход данных подчиненного устройства шины SPI.
Ножка SPI1_MISO
Выход
Порт PA6: выход данных подчиненного устройства шины SPI, работающая в режиме двухтактного выхода (push-pull/pull-down).
Ножка SPI1_SCK
Вход
Порт PA5: вход тактов подчиненного устройства шины SPI.
Ножка SPI1_NSS
Вход
Порт PA4: вход выборки подчиненного устройства шины SPI.
SPI2 bootloader
SPI2
Разрешен
Конфигурация SPI2: режим slave, Full Duplex, 8-бит MSB, скорость до 8 МГц, полярность CPOL Low/CPHA Low, аппаратная выборка NSS.
Ножка SPI2_MOSI
Вход
Порт PI3: вход данных подчиненного устройства шины SPI.
Ножка SPI2_MISO
Выход
Порт PI2: выход данных подчиненного устройства шины SPI, работающая в режиме двухтактного выхода (push-pull/pull-down).
Ножка SPI2_SCK
Вход
Порт PI1: вход тактов подчиненного устройства шины SPI.
Ножка SPI2_NSS
Вход
Порт PI0: вход выборки подчиненного устройства шины SPI.
SPI3 bootloader
SPI3
Разрешен
Конфигурация SPI3: режим slave, Full Duplex, 8-бит MSB, скорость до 8 МГц, полярность CPOL Low/CPHA Low, аппаратная выборка NSS.
Ножка SPI3_MOSI
Вход
Порт PE14: вход данных подчиненного устройства шины SPI.
Ножка SPI3_MISO
Выход
Порт PE13: выход данных подчиненного устройства шины SPI, работающая в режиме двухтактного выхода (push-pull/pull-down).
Ножка SPI3_SCK
Вход
Порт PE12: вход тактов подчиненного устройства шины SPI.
Ножка SPI3_NSS
Вход
Порт PE11: вход выборки подчиненного устройства шины SPI.
DFU bootloader
USB
Разрешен
USB OTG FS [5] принудительно сконфигурирован в режиме устройства USB.
Ножка USB_DM
Вход/выход
Порт PA11: сигнал USB DM (D-).
Ножка USB_DP
Вход/выход
Порт PA12: сигнал USB DP (D+). Внешний верхний подтягивающий резистор (pull-up) не нужен.
Относится к загрузчикам CAN2 и DFU
TIM11
Разрешен
Этот таймер используется для определения частоты HSE. Как только частота генератора HSE определена, системные такты настраиваются на частоту 60 МГц от HSE с использованием PLL.
Для загрузчиков USARTx, I2Cx и SPIx системная тактовая частота формируется от внутреннего высокоскоростного RC-генератора (HSI). Эта внутренняя тактовая частота также используется для CAN и DFU (USB FS Device), но только на фазе выбора интерфейса загрузки. Внешняя тактовая частота (кварц) должна нацело делиться на 1 МГц (должна быть в пределах от 4 до 26 МГц), это необходимо для работы загрузчиков CAN и DFU после фазы выбора интерфейса.
Выбор загрузчика. Рисунки 36 (см. выше описание версии V7.x) и 39 показывают механизм выбора загрузчика.
Рис. 39. Алгоритм выбора варианта загрузки для Bootloader V9.x STM32F42xxx/43xxx. Красным выделены отличия от версии V7.x (добавлена поддержка SPIx).
Особенности версий загрузчика V9.x. В следующей таблице перечислены версии загрузчика STM32F42xxx/43xxx V7.x.
Таблица 69. Версии STM32F42xxx/43xxx bootloader V9.x (для [1] AN2606 Rev 42, декабрь 2019 года).
Версия
Описание
Известные ограничения
V9.0
Это обновление загрузчика от версии bootloader v7.0. Новая версия загрузчика поддерживает теперь интерфейсы I2C2, I2C3, SPI1, SPI2 и SPI4 interfaces.
Размер памяти RAM, используемый загрузчиком, увеличился с 8 до 12 килобайт. ID этого загрузчика 0x90. Увеличено время соединения с хостом.
Для интерфейса USB DFU, в режиме Dual Bank, операция Erase для второго банка не функциональна. Вместо этого Вы можете вернутся в режим Single Bank, стереть нужный сектор (секторы), и затем заново активировать режим Dual Bank.
После выполнения команды Go (jump в код пользователя) загрузчик сбрасывает значение AHB1ENR в 0x00000000, и таким образом CCM RAM, когда она имеется, не активна (должна быть разрешена повторно в коде пользователя на стадии начального запуска startup).
V9.1
Это обновление загрузчика от версии bootloader v9.0. Новая версия улучшила новые команды I2C No-stretch (протокол I2C v1.1). Добавлена возможность запрета PcROP, когда RDP1 разрешена командой ReadOutUnprotect для всех протоколов (USB, USART, CAN, I2C и SPI). ID этого загрузчика 0x90.
Для интерфейса CAN команда Write Unprotect не функциональна. Вместо этого Вы можете использовать команду Write Memory и напрямую записывать байты опций, чтобы запретить защиту от записи.
Для интерфейса USB DFU, в режиме Dual Bank, операция Erase для второго банка не функциональна. Вместо этого Вы можете вернутся в режим Single Bank, стереть нужный сектор (секторы), и затем заново активировать режим Dual Bank.
После выполнения команды Go (jump в код пользователя) загрузчик сбрасывает значение AHB1ENR в 0x00000000, и таким образом CCM RAM, когда она имеется, не активна (должна быть разрешена повторно в коде пользователя на стадии начального запуска startup).
[Параметры загрузчика, зависимые от используемого MCU]
Набор команд протокола загрузчика и последовательности команд для каждого последовательного интерфейса одинаковые для всех MCU STM32. Однако некоторые параметры зависят от используемого MCU и версии загрузчика:
• PID (Product ID, идентификатор продукта). • Допустмые адреса памяти RAM (недоступна область RAM, используемая во время выполнения загрузчика), принимаемые загрузчиком в командах Read Memory, Go и Write Memory. • Область System Memory.
Таблица ниже показывает значения этих параметров загрузчиков для каждого MCU STM32, находящегося в производстве.
Таблица 136. Параметры загрузчика, зависящие от используемого микроконтроллера.
Серия
MCU
PID
BL ID
RAM
System Memory
F0
STM32F05xxx и STM32F030x8
0x440
0x21
0x20000800-0x20001FFF
0x1FFFEC00-0x1FFFF7FF
STM32F03xx4/6
0x444
0x10
0x20000800-0x20000FFF
STM32F030xC
0x442
0x52
0x20001800-0x20007FFF
0x1FFFD800-0x1FFFF7FF
STM32F04xxx
0x445
0xA1
-
0x1FFFC400-0x1FFFF7FF
STM32F070x6
0xA2
-
STM32F070xB
0x448
-
0x1FFFC800-0x1FFFF7FF
STM32F071xx/072xx
0xA1
0x20001800-0x20003FFF
STM32F09xxx
0x442
0x50
-
0x1FFFD800-0x1FFFF7FF
F1
STM32F10xxx
Low-density
0x412
-
0x20000200-0x200027FF
0x1FFFF000-0x1FFFF7FF
Medium-density
0x410
-
0x20000200-0x20004FFF
High-density
0x414
-
0x20000200-0x2000FFFF
Medium-density value line
0x420
0x10
0x20000200-0x20001FFF
High-density value line
0x428
0x20000200-0x20007FFF
STM32F105xx/107xx
0x418
-
0x20001000-0x2000FFFF
0x1FFFB000-0x1FFFF7FF
STM32F10xxx XL-density
0x430
0x21
0x20000800-0x20017FFF
0x1FFFE000-0x1FFFF7FF
F2
STM32F2xxxx
0x411
0x20
0x20002000-0x2001FFFF
0x1FFF0000-0x1FFF77FF
0x33
F3
STM32F373xx
0x432
0x41
0x20001400-0x20007FFF
0x1FFFD800-0x1FFFF7FF
STM32F378xx
0x50
0x20001000-0x20007FFF
STM32F302xB(C)/303xB(C)
0x422
0x41
0x20001400-0x20009FFF
STM32F358xx
0x50
STM32F301xx/302x4(6/8)
0x439
0x40
0x20001800-0x20003FFF
STM32F318xx
0x50
STM32F303x4(6/8)/334xx/328xx
0x438
0x20001800-0x20002FFF
STM32F302xD(E)/303xD(E)
0x446
0x40
0x20001800-0x2000FFFF
STM32F398xx
0x50
F4
STM32F40xxx/41xxx
0x413
0x31
0x20002000-0x2001FFFF
0x1FFF0000-0x1FFF77FF
0x90
0x20003000-0x2001FFFF
STM32F42xxx/43xxx
0x419
0x70
0x20003000-0x2002FFFF
0x91
STM32F401xB(C)
0x423
0xD1
0x20003000-0x2000FFFF
STM32F401xD(E)
0x433
0x20003000-0x20017FFF
STM32F410xx
0x458
0xB1
0x20003000-0x20007FFF
STM32F411xx
0x431
0xD0
0x20003000-0x2001FFFF
STM32F412xx
0x441
0x90
0x20003000-0x2003FFFF
STM32F446xx
0x421
0x20003000-0x2001FFFF
STM32F469xx/479xx
0x434
0x20003000-0x2005FFFF
STM32F413xx/423xx
0x463
0x20003000-0x2004FFFF
F7
STM32F72xxx/73xxx
0x452
0x20004000-0x2003FFFF
0x1FF00000-0x1FF0EDBF
STM32F74xxx/75xxx
0x449
0x70
0x20004000-0x2004FFFF
0x90
STM32F76xxx/77xxx
0x451
0x93
0x20004000-0x2007FFFF
G0
STM32G03xxx/04xxx
0x466
0x52
0x20000000-0x20000FFF
0x1FFF0000-0x1FFF1FFF
STM32G07xxx/08xxx
0x460
0xB2
0x20000000-0x200026FF
0x1FFF0000-0x1FFF6FFF
G4
STM32G431xx/441xx
0x468
0xD3
0x20000000-0x20004000
0x1FFF0000-0x1FFF7000
STM32G47xxx/48xxx
0x469
0xD4
H7
STM32H74xxx/75xxx
0x450
0x90
0x20004100-0x2001FFFF 0x24034000-0x2407FFFF
0x1FF00000-0x1FF1E7FF
STM32H7A3xx/7B3xx
0x480
0x1FF00000-0x1FF13FFF
L0
STM32L01xxx/02xxx
0x457
0xC3
-
0x1FF00000-0x1FF00FFF
STM32L031xx/041xx
0x425
0xC0
0x20001000-0x20001FFF
STM32L05xxx/06xxx
0x417
STM32L07xxx/08xxx
0x447
0x41
0x20001000-0x20004FFF
0x1FF00000-0x1FF01FFF
0xB2
0x20001400-0x20004FFF
L1
STM32L1xxx6(8/B)
0x416
0x20
0x20000800-0x20003FFF
STM32L1xxx6(8/B)A
0x429
0x20001000-0x20007FFF
STM32L1xxxC
0x427
0x40
STM32L1xxxD
0x436
0x45
0x20001000-0x2000BFFF
STM32L1xxxE
0x437
0x40
0x20001000-0x20013FFF
L4
STM32L412xx/422xx
0x464
0xD1
0x20000000-0x200020FF
0x1FFF0000-0x1FFF6FFF
STM32L43xxx/44xxx
0x435
0x91
0x20003100-0x2000BFFF
STM32L45xxx/46xxx
0x462
0x92
0x20003100-0x2001FFFF
STM32L47xxx/48xxx
0x415
0xA3
0x20003000-0x20017FFF
0x92
0x20003100-0x20017FFF
STM32L496xx/4A6xx
0x461
0x93
0x20003100-0x2003FFFF
STM32L4Rxx/4Sxx
0x470
0x95
0x20003200-0x2009FFFF
STM32L4P5xx/4Q5xx
0x471
0x90
0x20004000-0x2004FFFF
L5
STM32L552xx/L562xx
0x472
0x91
0x20000000-0x20004000
0x0BF90000-0x0BF97FFF
WB
STM32WB50xx/WB55xx
0x495
0xD5
0x20000000-0x20005000
0x1FFF0000-0x1FFF7000
WL
STM32WLE5xx
0x497
0xC2
0x20000000-0x20001FFF
0x1FFF0000-0x1FFF3FFF
[Интервалы времени и таймауты]
В этом разделе показаны типичные интервалы времени firmware загрузчика, которые должны учитываться для корректной синхронизации между хостом и программируемым MCU STM32.
Здесь описаны 2 типа таких интервалов времени:
• Задержка, необходимая на инициализацию ресурсов STM32 загрузчика. • Длительность выбора коммуникационного интерфейса.
После этих интервалов времени загрузчик готов принять и выполнить команды хоста.
Задержка на запуске загрузчика (Bootloader Startup). После сброса и входа в код загрузчика, хост должен подождать, пока загрузчик STM32 будет готов запустить фазу детектирования коммуникации по определенному интерфейсу. Это время соответствует времени запуска загрузчика (bootloader startup timing), в течение которого загрузчик инициализирует необходимые ему ресурсы MCU.
Рис. 86. Интервал времени запуска загрузчика (Bootloader Startup).
В таблице ниже содержится информация по времени запуска каждого представителя MCU STM32.
Таблица 137. Времена запуска загрузчика для микроконтроллеров STM32.
Время соединения USART, в течение которого хост должен подождать между отправкой данных синхронизации (0x7F) и приемом первого ответа подтверждения (0x79). Подробное описание протокола USART см. в [2].
Рис. 87. Интервалы времени соединения USART.
Примечания:
1. Загрузчик пытается автоматически определить скорость соединения USART. Прием любого другого символа, не совпадающего с 0x7F (это может быть из-за помех на линии приема) приведет к тому, что загрузчик может запустить обмен с неправильной скоростью. Загрузчик измеряет длительность сигнала между фронтом нарастания уровня бита первой единички в символе 0x7F до спада последней единички в этом символе, чтобы определить значение скорости. 2. Загрузчик не выравнивает вычисленную скорость обмена USART со стандартным рядом скоростей RS-232 (т. е. 1200, 9600, 115200, и т. д.).
Для микроконтроллеров линейки STM32F105xx/107xx ножка порта PA9 pin (USB_VBUS) используется для определения подключения хоста USB. Инициализация периферии USB выполняется только в том случае, когда на фазе детектирования соединения PA9 == лог. 1, что означает, что хост подключен к порту, и подает напряжение 5V на шину USB. Когда на фазе детектирования PA9 == лог. 1, требуется больше времени для инициализации и выключения периферийного устройства USB. Чтобы уменьшить время детектирования загрузчика, когда ножка порта PA9 не используется, удерживайте уровень порта PA9 в лог. 0 на фазе детектирования USART от момента сброса MCU до ответа ACK от MCU.
Таблица 138. Минимальные интервалы времени загрузчика USART микроконтроллеров STM32.
MCU
Отправка 1 байта USART, мс
Конфигурация USART, мс
Соединение USART, мс
STM32F05xxx и STM32F030x8
0.078125
0.0095
0.16575
STM32F03xx4/6
0.078125
0.0064
0.16265
STM32F030xC
0.078125
0.07
0.22
STM32F04xxx
0.078125
0.007
0.16325
STM32F070x6
0.078125
0.014
0.17
STM32F070xB
0.078125
0.08
0.23
STM32F071xx/072xx
0.078125
0.007
0.16325
STM32F09xxx
0.078125
0.07
0.22
STM32F10xxx
0.078125
0.002
0.15825
STM32F105xx/107xx
PA9 == лог. 0
0.078125
0.007
0.16325
PA9 == лог. 1
105
105.15625
STM32F10xxx XL-density
0.078125
0.006
0.16225
STM32F2xxxx
V2.x
0.078125
0.009
0.16525
V3.x
STM32F373xx
HSE подключен
0.078125
0.002
0.15825
HSE не подключен
STM32F378xx
0.15625
0.001
0.3135
STM32F302xB(C)/303xB(C)
HSE подключен
0.078125
0.002
0.15825
HSE не подключен
STM32F358xx
0.15625
0.001
0.3135
STM32F301xx/302x4(6/8)
HSE подключен
0.078125
0.002
0.15825
HSE не подключен
STM32F318xx
0.078125
0.002
0.15825
STM32F303x4(6/8)/334xx/328xx
0.078125
0.002
0.15825
STM32F302xD(E)/303xD
0.078125
0.002
0.15885
STM32F398xx
0.078125
0.002
0.15885
STM32F40xxx/41xxx
V3.x
0.078125
0.009
0.16525
V9.x
0.0035
0.15975
STM32F401xB(C)
0.078125
0.00326
0.15951
STM32F401xD(E)
0.078125
0.00326
0.15951
STM32F410xx
0.078125
0.002
0.158
STM32F411xx
0.078125
0.00326
0.15951
STM32F412xx
0.078125
0.002
0.158
STM32F446xx
0.078125
0.004
0.16
STM32F469xx/479xx
0.078125
0.003
0.159
STM32F413xx/423xx
0.078125
0.002
0.158
STM32F429xx/439xx
V7.x
0.078125
0.007
0.16325
V9.x
0.00326
0.15951
STM32F72xxx/73xxx
0.078125
0.070
0.22
STM32F74xxx/75xxx
0.078125
0.065
0.22
STM32G03xxx/04xxx
0.078125
0.01
0.11
STM32G07xxx/08xxx
0.078125
0.01
0.11
STM32G4xxxx
0.078125
0.003
0.159
STM32H74xxx/75xxx
0.078125
0.072
0.22825
STM32H7A3xx/7B3xx
0.078125
0.072
0.22825
STM32L01xxx/02xxx
0.078125
0.016
0.17
STM32L031xx/041xx
0.078125
0.018
0.174
STM32L05xxx/06xxx
0.078125
0.018
0.17425
STM32L07xxx/08xxx
V4.x
0.078125
0.017
0.173
V11.x
0.078125
0.017
0.158
STM32L1xxx6(8/B)
0.078125
0.008
0.16425
STM32L1xxx6(8/B)A
0.078125
0.008
0.16425
STM32L1xxxC
0.078125
0.008
0.16425
STM32L1xxxD
0.078125
0.008
0.16425
STM32L1xxxE
0.078125
0.008
0.16425
STM32L412xx/422xx
0.078125
0.005
0.2
STM32L43xxx/44xxx
0.078125
0.003
0.159
STM32L45xxx/46xxx
0.078125
0.07
0.22
STM32L47xxx/48xxx
V10.x
0.078125
0.003
0.159
V9.x
0.078125
0.003
0.159
STM32L496xx/4A6xx
0.078125
0.003
0.159
STM32L4Rxx/4Sxx
-
-
-
STM32L4P5xx/4Q5xx
-
-
-
STM32L552xx/L562xx
0.078125
0.01
0.11
STM32WB50xx/WB55xx
0.078125
0.003
0.159
STM32WLE5xx
0.078125
0.001
0.110
Время соединения USB это время, которое хост должен подождать от момента подключения кабеля USB до момента корректного соединения с MCU. В это время входит энуперация устройства USB DFU и конфигурация компонентов DFU. Из-за процедуры энумерации время соединения USB может в значительной степени зависеть от хоста.
Рис. 88. Время соединения USB.
Для устройств STM32F105xx/107xx: если частота внешнего кварцевого резонатора отличается от 25 МГц (равна к примеру 14.7456 МГц или 8 МГц), то устройство выполнит несколько неудачных энумераций USB (с эффектом подключений и отключений) до того, как произойдет корректное соединение с хостом. Это происходит из-за механизма автоматического определения частоты HSE на основе измерения длительности импульса начала фрейма (Start Of Frame, SOF).
Таблица 139. Минимальные интервалы времени загрузчика USB микроконтроллеров STM32.
Время соединения I2C это время, в течение которого хост должен ждать от момента отправки адреса устройства I2C до отправки кода первой команды загрузчика. Это время включает длительность ожидания готовности на линии (I2C stretching duration).
Рис. 89. Интервалы времени соединения I2C.
Для обмена через I2C реализован механизм таймаута, и он должен соблюдаться для корректного выполнения команд загрузчика. Этот таймаут реализован между двумя фреймами I2C в одной и той же команде (например, для команды Write Memory таймаут вставляется между фреймом отправки команды и фреймом отправки адреса памяти). Также тот же самый период таймаута вставляется между двумя следующими друг за другом приемом или передачей в одном и том же фрейме I2C. Если период таймаута истек, генерируется системный сброс, чтобы избежать сбоя загрузчика.
Для команд стирания памяти (Erase Memory) и снятия защиты чтения (Read-out Unprotect) на стороне хоста нужно учитывать длительность операции с Flash. После отправки кода стираемых страниц хост должен подождать завершения стирания страницы, чтобы выполнить остальные шаги команды Erase.
Таблица 140. Минимальные интервалы времени загрузчика I2C микроконтроллеров STM32.
Время соединения SPI это время, в течение которого хост должен ждать от момента отправки данных синхронизации (0xA5) до приема первого ответа подтверждения (0x79).
Рис. 90. Интервалы времени соединения SPI.
Таблица 141. Минимальные интервалы времени загрузчика SPI микроконтроллеров STM32.