Загрузчик STM32F42xxx и STM32F43xxx Печать
Добавил(а) microsin   

Загрузчик (bootloader) находится во внутренней постоянной системной памяти (internal boot ROM) микроконтроллеров STM32. Он программируется во время производства микроконтроллера (MCU). Основная задача загрузчика - записать в память Flash программу приложения через один из доступных периферийных устройств (USART, CAN, USB, I2C, SPI и т. п.). Для каждого последовательного интерфейса определен протокол, с совместимым набором команд и их последовательностью. Документ [1] применим к микроконтроллерам, перечисленным в таблице 1. Все эти микроконтроллеры в приведенном описании сокращенно упоминаются как STM32 или MCU.

Таблица 1. Микроконтроллеры STM32, на борту которых есть загрузчик.

Серия Представители MCU STM32
STM32F0 STM32F03xxx, STM32F04xxx, STM32F05xxx, STM32F07xxx, STM32F09xxx
STM32F1 STM32F10xxx
STM32F2  
STM32F3 STM32F301xx, STM32F302xx, STM32F303xx, STM32F318xx, STM32F328xx, STM32F334xx, STM32F358xx, STM32F373xx, STM32F378xx, STM32F398xx
STM32F4 STM32F401xx, STM32F405xx, STM32F407xx, STM32F410xx, STM32F411xx, STM32F412xx, STM32F413xx, STM32F415xx, STM32F417xx, STM32F423xx, STM32F427xx, STM32F429xx, STM32F437xx, STM32F439xx, STM32F446xx, STM32F469xx, STM32F479xx
STM32F7 STM32F722xx, STM32F723xx, STM32F732xx, STM32F733xx, STM32F745xx, STM32F746xx, STM32F756xx, STM32F765xx, STM32F767xx, STM32F769xx, STM32F777xx, STM32F779xx
STM32G0 STM32G030xx, STM32G031xx, STM32G041xx, STM32G07xxx, STM32G08xxx
STM32G4 STM32G431xx, STM32G441xx, STM32G47xxx, STM32G48xxx
STM32H7 STM32H743xx, STM32H753xx, STM32H7A3xx, STM32H7B3xx
STM32L0, STM32L1 STM32L100xx, STM32L151xx, STM32L152xx, STM32L162xx
STM32L4 STM32L431xx, STM32L432xx, STM32L433xx, STM32L442xx, STM32L443xx, STM32L451xx, STM32L452xx, STM32L462xx, STM32L471xx, STM32L475xx, STM32L476xx, STM32L486xx, STM32L496xx, STM32L4A6xx, STM32L4R5xx, STM32L4R7xx, STM32L4R9xx, STM32L4S5xx, STM32L4S7xx, STM32L4S9xx, STM32L412xx, STM32L422xx, STM32L4P5xx, STM32L4Q5xx, STM32L431xx, STM32L432xx, STM32L433xx, STM32L442xx, STM32L443xx, STM32L451xx, STM32L452xx, STM32L462xx, STM32L471xx, STM32L475xx, STM32L476xx, STM32L486xx, STM32L496xx, STM32L4A6xx, STM32L4R5xx, STM32L4R7xx, STM32L4R9xx, STM32L4S5xx, STM32L4S7xx, STM32L4S9xx, STM32L412xx, STM32L422xx, STM32L4P5xx, STM32L4Q5xx
STM32L5 STM32L552xx, STM32L562xx
STM32WB STM32WB50xx, STM32WB55xx
STM32WL STM32WLE5xx

В документе [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
Pattern2 Boot0(ножка корпуса) = 1 и nBoot1(бит) = 1
Pattern3 Boot0(ножка корпуса) = 1, Boot1(ножка корпуса) = 0 и BFB2(бит) = 1
Boot0(ножка корпуса) = 0, BFB2(бит) = 0, и оба банка не содержат допустимый код
Boot0(ножка корпуса) = 1, Boot1(ножка корпуса) = 0, BFB2(бит) = 0, и оба банка не содержат допустимый код
Pattern4 Boot0(ножка корпуса) = 1, Boot1(ножка корпуса) = 0 и BFB2(бит) = 1
Boot0(ножка корпуса) = 0, BFB2(бит) = 0, и оба банка не содержат допустимый код
Boot0(ножка корпуса) = 1, Boot1(ножка корпуса) = 0 и BFB2(бит) = 0
Pattern5 Boot0(ножка корпуса) = 1, Boot1(ножка корпуса) = 0 и BFB2(бит) = 0
Boot0(ножка корпуса) = 0, BFB2(бит) = 1, и оба банка не содержат допустимый код
Boot0(ножка корпуса) = 1, Boot1(ножка корпуса) = 0 и BFB2(бит) = 1
Pattern6 Boot0(ножка корпуса) = 1, nBoot1(бит) = 1 и nBoot0_SW(бит) = 1
nBoot0(бит) = 0, nBoot1(бит) = 1 и nBoot0_SW(бит) = 0
Boot0(ножка корпуса) = 0, nBoot0_SW(бит) = 1, и основная память flash пуста
nBoot0(бит) = 1, nBoot0_SW(бит)=0 и основная память flash пуста
Pattern7 Boot0(ножка корпуса) = 1, nBoot1(бит) = 1 и BFB2(бит) = 0
Boot0(ножка корпуса) = 0, BFB2(бит) = 1, и оба банка не содержат допустимый код
Boot0(ножка корпуса) = 1, nBoot1(бит) = 1 и BFB2(бит) = 1
Pattern8 Boot(ножка корпуса) = 0 и BOOT_ADD0(байт опций) = 0x0040
Boot(ножка корпуса) = 1 и BOOT_ADD1(байт опций) = 0x0040
Pattern9 nDBANK(бит) = 1, Boot(ножка корпуса) = 0 и BOOT_ADD0(байт опций) = 0x0040
nDBANK(бит) = 1, Boot(ножка корпуса) = 1 и BOOT_ADD1(байт опций) = 0x0040
nDBANK(бит) = 0, nDBOOT(бит) = 1, Boot(ножка корпуса) = 0 и BOOT_ADD0(байт опций) = 0x0040
nDBANK(бит) = 0, nDBOOT(бит) = 1, Boot(ножка корпуса) = 1 и BOOT_ADD1(байт опций) = 0x0040
nDBANK(бит) = 0, nDBOOT(бит) = 0, BOOT_ADDx(байт опций) с выходом за пределы области памяти или в области памяти ICP
nDBANK(бит) = 0, nDBOOT(бит) = 0, BOOT_ADDx(байт опций) в области памяти Flash, и оба банка не содержат допустимый код
Pattern10 Boot(ножка корпуса) = 0 и BOOT_ADD0(байт опций) = 0x1FF0
Boot(ножка корпуса) = 1 и BOOT_ADD1(байт опций) = 0x1FF0
Pattern11 nBoot0(бит) = 0, nBoot1(бит) = 1, USE_BOOT0_OPT(бит) = 1 и BOOT_EP(бит) = 0
Boot0(ножка корпуса) = 1, nBoot1(бит) = 1 и USE_BOOT0_OPT(бит) = 1
nBoot0(бит) = 1, USE_BOOT0_OPT(бит) = 1, BOOT_EP(бит) = 0, и основная память Flash пуста
Boot0(ножка корпуса) = 0, USE_BOOT0_OPT(бит) = 0, BOOT_EP(бит) = 0, и основная память Flash пуста
BOOT_EP(бит) = 1 и основная память Flash пуста
Pattern12 TZen = 0, Boot0(ножка корпуса) = 0, nSWBoot0(бит) = 1 и NSBOOTADD0[24:0] = 0x017F200
TZen = 0, Boot0(ножка корпуса) = 1, nSWBoot0 (бит) = 1 и NSBOOTADD1[24:0] = 0x017F200
TZen = 0, nBoot0(бит) = 0, nSWBoot0 (бит) = 0 и NSBOOTADD1[24:0] = 0x017F200
TZen = 0, nBoot0(бит) = 1, nSWBoot0 (бит) = 0 и NSBOOTADD0[24:0] = 0x017F200
TZen = 1, Boot0(ножка корпуса) = 0, nSWBoot0 (бит) = 1 и SECBOOTADD0[24:0] = 0x01FF000 и RSSCMD = 0
TZen = 1, Boot0(ножка корпуса) = 1, nSWBoot0 (бит) = 1 и RSSCMD = 0, BOOT_LOCK=0 или (BOOT_LOCK = 1 и SECBOOTADD0[24:0] = 0x01FF000)
TZen = 1, nBoot0(бит) = 1, nSWBoot0 (бит) = 0 и SECBOOTADD0[24:0] = 0x01FF000 и RSSCMD = 0, BOOT_LOCK=0 или (BOOT_LOCK = 1 и SECBOOTADD0[24:0] = 0x01FF000)
TZen = 1, nBoot0(бит) = 0, nSWBoot0 (бит) = 0 и RSSCMD = 0, BOOT_LOCK=0 или BOOT_LOCK = 1 и SECBOOTADD1[24:0] = 0x01FF000
TZen = 1, RSSCMD = 0x1C0, BOOT_LOCK=0 или (BOOT_LOCK = 1 и SECBOOTADD0[24:0] = 0x01FF000)
Pattern13 nBoot0(бит) = 0, nBoot1(бит) = 1 и nSWBoot0(бит) = 0
nBoot0(бит) = 1, nBoot1(бит) = 1, nSWBoot0(бит) = 0 и память Flash пользователя пуста
nBoot1(бит) = 1, nSWBoot0(бит) = 1 и Boot0(ножка корпуса) = 1
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.

Таблица 3. Встроенные загрузчики STM32.

Серия
MCU
Поддерживаемые устройства загрузки
ID загрузчика Версия загрузчика (протокол)
ID Область памяти
F0 STM32F05xxx/STM32F030x8 USART1, USART2 0x21 0x1FFFF7A6 USART(V3.1)
STM32F03xx4/6 USART1 0x10 0x1FFFF7A6
STM32F030xC USART1, I2C1 0x52 0x1FFFF796 USART(V3.1), I2C1(V1.0)
STM32F04xxx USART1, USART2, I2C1, DFU(USB Device FS) 0xA1 0x1FFFF6A6 USART(V3.1), DFU(V2.2), I2C(V1.0)
STM32F071xx/072xx
STM32F070x6 0xA2
STM32F070xB 0xA3
STM32F09xxx USART1, USART2, I2C1 0x50 0x1FFFF796 USART(V3.1), I2C(V1.0)
F1 STM32F10xxx Low-density USART1 - - USART(V2.2)
Medium-density
High-density
Medium-density value line 0x10 0x1FFFF7D6
High-density value line
STM32F105xx/107xx USART1, USART2(remapped), CAN2(remapped), DFU(USB Device) - - USART(V2.2(1)), CAN(V2.0), DFU(V2.2)
STM32F10xxx XL-density USART1, USART2(remapped) 0x21 0x1FFFF7D6 USART(V3.0)
F2 STM32F2xxxx USART1, USART3 0x20 0x1FFF77DE USART(V3.0)
USART1, USART3, CAN2, DFU(USB Device FS) 0x33 0x1FFF77DE USART(V3.1), CAN(V2.0), DFU(V2.2)
F3 STM32F373xx USART1, USART2, DFU(USB Device FS) 0x41 0x1FFFF7A6 USART(V3.1), DFU(V2.2)
STM32F378xx USART1, USART2, I2C1 0x50 USART(V3.1), I2C(V1.0)
STM32F302xB(C)/303xB(C) USART1, USART2, DFU(USB Device FS) 0x41 0x1FFFF796 USART(V3.1), DFU(V2.2)
STM32F358xx USART1, USART2, I2C1 0x50 USART(V3.1), I2C(V1.0)
STM32F301xx/302x4(6/8) USART1, USART2, DFU (USB Device FS) 0x40 USART(V3.1), DFU(V2.2)
STM32F318xx USART1, USART2, I2C1, I2C3 0x50 USART(V3.1), I2C(V1.0)
STM32F302xD(E)/303xD(E) USART1, USART2, DFU(USB Device FS) 0x40 USART(V3.1), DFU(V2.2)
STM32F303x4(6/8)/334xx/328xx USART1, USART2, I2C1 0x50 USART(V3.1), I2C(V1.0)
STM32F398xx USART1, USART2, I2C1, I2C3
F4 STM32F40xxx/41xxx USART1, USART3, CAN2, DFU(USB Device FS) 0x31 0x1FFF77DE USART(V3.1), CAN(V2.0), DFU(V2.2)
USART1, USART3, CAN2, DFU(USB Device FS), I2C1, I2C2, I2C3, SPI1, SPI2 0x90 USART(V3.1), CAN (V2.0), DFU(V2.2), SPI(V1.1), I2C(V1.0)
STM32F42xxx/43xxx USART1, USART3, CAN2, DFU(USB Device FS), I2C1 0x70 0x1FFF76DE USART(V3.1), CAN(V2.0), DFU(V2.2), I2C(V1.0)
USART1, USART3, CAN2, DFU(USB Device FS), I2C1, I2C2, I2C3, SPI1, SPI2, SPI4 0x91 USART(V3.1), CAN(V2.0), DFU(V2.2), SPI(V1.1), I2C(V1.0)
STM32F401xB(C) USART1, USART2, DFU(USB Device FS), I2C1, I2C2, I2C3, SPI1, SPI2, SPI3 0xD1 USART(V3.1), DFU(V2.2), SPI(V1.1), I2C(V1.0)
STM32F401xD(E) USART(V3.1), DFU(V2.2), SPI(V1.1), I2C(V1.1)
STM32F410xx USART1, USART2, I2C1, I2C2, I2C4, SPI1, SPI2 0xB1 USART(V3.1), I2C(V1.2), SPI(V1.1)
STM32F411xx USART1, USART2, DFU(USB Device FS), I2C1, I2C2, I2C3, SPI1, SPI2, SPI3 0xD0 USART(V3.1), DFU(V2.2), SPI(V1.1), I2C(V1.1)
STM32F412xx USART1, USART2, USART3, CAN2, DFU(USB Device FS), I2C1, I2C2, I2C3, I2C4, SPI1, SPI3, SPI4 0x91 USART(V3.1), CAN(V2.0), DFU(V2.2), SPI(V1.1), I2C(V1.2)
STM32F413xx/423xx 0x90
STM32F446xx USART1, USART3, CAN2, DFU(USB Device FS), I2C1, I2C2, I2C3, SPI1, SPI2, SPI4
STM32F469xx/479xx USART1, USART3, I2C1, I2C2, I2C3, CAN2, DFU(USB Device FS), SPI1, SPI2, SPI4
F7 STM32F72xxx/73xxx USART1, USART3, CAN1, DFU(USB Device FS), I2C1, I2C2, I2C3, SPI1, SPI2, SPI4 0x90 0x1FF0EDBE USART(V3.1), CAN(V2.0), DFU(V2.2), I2C(V1.2), SPI(V1.2)
STM32F74xxx/75xxx USART1, USART3, I2C1, I2C2, I2C3, CAN2, DFU(USB Device FS) 0x70 USART(V3.1), I2C(V1.2), CAN(V2.0), DFU(V2.2)
USART1, USART3, I2C1, I2C2, I2C3, CAN2, DFU(USB Device FS), SPI1, SPI2, SPI4 0x90 USART(V3.1), I2C(V1.2), CAN(V2.0), DFU(V2.2), SPI(V1.2)
STM32F76xxx/77xxx 0x93
G0 STM32G07xxx/08xxx USART1, USART2, USART3, I2C1, I2C2, SPI1, SPI2 0xB2 0x1FFF6FFE USART(V3.1), I2C(V1.2), SPI(V1.1)
STM32G03xxx/04xxx USART1, USART2, I2C1, I2C2 0x53 0x1FFF1FFE USART(V3.1), I2C(V1.2)
G4 STM32G431xx/441xx USART1, USART2, USART3, I2C2, I2C3, SPI1, SPI2, DFU(USB Device FS) 0xD3 0x1FFF6FFE USART(V3.1), I2C(V1.2), SPI(V1.1), DFU(V2.2)
STM32G47xxx/48xxx USART1, USART2, USART3, I2C2, I2C3, I2C4, SPI1, SPI2, DFU(USB Device FS) 0xD4
H7 STM32H74xxx/75xxx USART1, USART2, USART3, I2C1, I2C2, I2C3, DFU(USB Device FS), SPI1, SPI2, SPI3, SPI4, FDCAN1 0x90 0x1FF1E7FE USART(V3.1), I2C(V1.1), DFU(V2.2), SPI(V1.2), FDCAN(V1.0)
STM32H7A3xx/7B3xx 0x1FF13FFE
L0 STM32L01xxx/02xxx USART2, SPI1 0xC3 0x1FF00FFE USART(V3.1), SPI (V1.1)
STM32L031xx/041xx 0xC0
STM32L05xxx/06xxx USART1, USART2, SPI1, SPI2
STM32L07xxx/08xxx USART1, USART2, DFU(USB Device FS) 0x41 0x1FF01FFE USART(V3.1), DFU(V2.2)
USART1, USART2, SPI1, SPI2, I2C1, I2C2 0xB2 USART(V3.1), SPI(V1.1), I2C(V1.2)
L1 STM32L1xxx6(8/B) USART1, USART2 0x20 0x1FF00FFE USART (V3.0)
STM32L1xxx6(8/B)A USART (V3.1)
STM32L1xxxC USART1, USART2, DFU(USB Device FS) 0x40 0x1FF01FFE USART(V3.1), DFU(V2.2)
STM32L1xxxD 0x45
STM32L1xxxE 0x40
L4 STM32L412xx/422xx USART1, USART2, USART3, I2C1, I2C2, I2C3, DFU(USB Device FS), SPI1, SPI2 0xD1 0x1FFF6FFE USART(V3.1), I2C(V1.2), DFU(V2.2), SPI(V1.1)
STM32L43xxx/44xxx USART1, USART2, USART3, I2C1, I2C2, I2C3, CAN1, DFU(USB Device FS), SPI1, SPI2 0x91 USART(V3.1), I2C(V1.2), CAN(V2.0), DFU(V2.2), SPI(V1.1)
STM32L45xxx/46xxx USART1, USART2, I2C1, I2C2, I2C3, CAN1, DFU(USB Device FS), SPI1, SPI2 0x92
STM32L47xxx/48xxx USART1, USART2, USART3, I2C1, I2C2, I2C3, DFU(USB Device FS) 0xA3 USART(V3.1), I2C(V1.2), DFU(V2.2)
USART1, USART2, USART3, I2C, I2C2, I2C3, SPI1, SPI2, CAN1, DFU(USB Device FS) 0x92 USART(V3.1), I2C(V1.2), SPI(V1.1), CAN(V2.0), DFU(V2.2)
STM32L496xx/4A6xx USART1, USART2, I2C1, I2C2, I2C3, CAN1, DFU(USB Device FS), SPI1, SPI2 0x93 USART(V3.1), I2C(V1.2), CAN(V2.0), DFU(V2.2), SPI(V1.1)
STM32L4Rxxx/STM32L4Sxxx 0x95
STM32L4P5xx/4Q5xx USART1, USART2, USART3, I2C1, I2C2, I2C3, CAN1, DFU(USB Device FS), SPI1, SPI2 0x90
L5 STM32L552xx/L562xx USART1, USART2, USART3, I2C1, I2C2, I2C3, SPI1, SPI2, SPI3, DFU(USB Device FS), FDCAN1 0x91 0x0BF97FFE USART(V3.1), I2C(V1.2), SPI(V1.1), DFU(V2.2), FDCAN(V1.0)
WB STM32WB50xx/55xx USART1, I2C1, I2C3, SPI1, SPI2, DFU(USB Device FS) 0xD5 0x1FFF6FFE USART(V3.2), I2C(V1.2), SPI(V1.1), DFU(V2.2)
WL STM32WLE5xx USART1, USART2, SPI1, SPI2 0xC2 0x1FF36EFE USART(V3.1), SPI(V1.1)

Примечание (1): MCU connectivity line загрузчик USART для версии протокола возвратит V2.0 вместо V2.2. Более подробную информацию см. в документации с описанием ошибок (errata sheet) "STM32F105xx и STM32F107xx revision Z" на сайте st.com.

Требования к каналу связи. Для использования загрузчика USART хост должен быть подключен к ножкам приема (RX) и передачи (TX) нужного интерфейса USARTx.

STM32 bootloader USART connection fig01

Рис. 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).

STM32 bootloader USB connection fig02

Рис. 2. Соединение через USB.

Примечание: дополнительная схема на транзисторе подключает резистор pull-up 1.5 кОм к сигналу DP с использованием при необходимости сигнала VBus. Чтобы узнать, должен ли быть подключен этот внешний резистор, см. секцию с описанием используемого MCU (таблица, описывающая конфигурацию STM32 в режиме загрузки системной памяти. Типовое значение для +V равно +3.3V, значение зависит от приложения и используемого оборудования.

Для использования загрузчика I2C подключите хост (мастер шины I2C) к желаемому интерфейсу I2Cx микроконтроллера (он работает как slave-устройство I2C) сигналами данных (SDA) и тактов (SCL). На оба этих сигнала должен быть подключен pull-up резистор 1.8 кОм.

STM32 bootloader I2C connection fig03

Рис. 3. Соединение через I2C.

Для использования загрузчика SPI соедините хост (мастер шины SPI) и желаемый интерфейс SPIx микроконтроллера (он работает как slave-устройство SPI) сигналами MOSI, MISO и SCK. Ножка NSS микроконтроллера должна быть соединена с землей (GND). На линии SCK должен присутствовать нижний подтягивающий резистор R (pull-down).

STM32 bootloader SPI connection fig04

Рис. 4. Соединение через SPI.

Примечание: типовое значение для R pull-down составляет 100 кОм. Это значение зависит от приложения и используемого оборудования.

Для использования интерфейса CAN хост шины должен быть подключен к ножкам приема (RX) и передачи (TX) желаемого интерфейса CANx микроконтроллера через трансиверы и физическую линию шины CAN. На обоих концах линии CAN должны присутствовать терминирующие резисторы 120 Ом.

STM32 bootloader CAN connection fig05

Рис. 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 показывают механизм выбора загрузчика.

STM32 bootloader Dual Bank fig36

Рис. 36. Алгоритм Dual Bank Boot для STM32F42xxx/43xxx Bootloader версий V7.x и V9.x.

Примечание (1): содержимое CCM RAM не считается достоверным как адрес указателя стека для механизма dual bank boot.

STM32 bootloader STM32F42xxx V7x selection fig37

Рис. 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 показывают механизм выбора загрузчика.

STM32 bootloader STM32F42xxx V9x selection fig39

Рис. 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.

STM32 bootloader startup timing fig86

Рис. 86. Интервал времени запуска загрузчика (Bootloader Startup).

В таблице ниже содержится информация по времени запуска каждого представителя MCU STM32.

Таблица 137. Времена запуска загрузчика для микроконтроллеров STM32.

MCU
Минимальное время запуска, мс Таймаут HSE, мс
STM32F05xxx и STM32F030x8 1.612 -
STM32F03xx4/6 1.62 -
STM32F030xC 2 -
STM32F04xxx 0.058 -
STM32F070x6 HSE подключен 3 200
HSE не подключен 230
STM32F070xB HSE подключен 6 200
HSE не подключен 230
STM32F071xx/072xx 0.058 -
STM32F09xxx 2 -
STM32F10xxx 1.227 -
STM32F105xx/107xx PA9 == лог. 0 1.396 -
PA9 == лог. 1 524.376
STM32F10xxx XL-density 1.227 -
STM32F2xxxx V2.x 134 -
V3.x 84.59 0.790
STM32F373xx HSE подключен 43.4 2.236
HSE не подключен 2.36
STM32F378xx 1.542 -
STM32F302xB(C)/303xB(C) HSE подключен 43.4 2.236
HSE не подключен 2.36
STM32F358xx 1.542 -
STM32F301xx/302x4(6/8) HSE подключен 45 560.5
HSE не подключен 560.8
STM32F318xx 0.182 -
STM32F303x4(6/8)/334xx/328xx 0.155 -
STM32F302xD(E)/303xD HSE подключен 7.53 -
HSE не подключен 146.71
STM32F398xx 1.72 -
STM32F40xxx/41xxx V3.x 84.59 0.790
V9.x 74 96
STM32F401xB(C) 74.5 85
STM32F401xD(E) 74.5 85
STM32F410xx 0.614 -
STM32F411xx 74.5 85
STM32F412xx 0.614 180
STM32F446xx 73.61 96
STM32F469xx/479xx 73.68 230
STM32F413xx/423xx 0.642 165
STM32F429xx/439xx V7.x 82 97
V9.x 74
STM32F72xxx/73xxx 17.93 50
STM32F74xxx/75xxx 16.63 50
STM32G03xxx/04xxx 0.390 -
STM32G07xxx/08xxx 0.390 -
STM32G4xxxx 0.390 -
STM32H74xxx/75xxx 53.975 2
STM32H7A3xx/7B3xx 53.975 -
STM32L01xxx/02xxx 0.63 -
STM32L031xx/041xx 0.62 -
STM32L05xxx/06xxx 0.22 -
STM32L07xxx/08xxx V4.x 0.61 -
V11.x 0.71
STM32L1xxx6(8/B) 0.542 -
STM32L1xxx6(8/B)A
STM32L1xxxC 0.708 80
STM32L1xxxD 0.708 80
STM32L1xxxE 0.708 200
STM32L412xx/422xx 0.12 -
STM32L43xxx/44xxx 0.3335 100
STM32L45xxx/46xxx 50.93 -
STM32L47xxx/48xxx V10.x LSE подключен 55 100
LSE не подключен 2560
V9.x LSE подключен 55.40 100
LSE не подключен 2560.51
STM32L496xx/4A6xx 76.93 100
STM32L4Rxx/4Sxx - -
STM32L4P5xx/4Q5xx - -
STM32L552xx/L562xx 0.390 -
STM32WB50xx/WB55xx 0.390 -
STM32WLE5xx 0.390 -

Время соединения USART, в течение которого хост должен подождать между отправкой данных синхронизации (0x7F) и приемом первого ответа подтверждения (0x79). Подробное описание протокола USART см. в [2].

STM32 bootloader USART connection timing fig87

Рис. 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 может в значительной степени зависеть от хоста.

STM32 bootloader USB connection timing fig88

Рис. 88. Время соединения USB.

Для устройств STM32F105xx/107xx: если частота внешнего кварцевого резонатора отличается от 25 МГц (равна к примеру 14.7456 МГц или 8 МГц), то устройство выполнит несколько неудачных энумераций USB (с эффектом подключений и отключений) до того, как произойдет корректное соединение с хостом. Это происходит из-за механизма автоматического определения частоты HSE на основе измерения длительности импульса начала фрейма (Start Of Frame, SOF).

Таблица 139. Минимальные интервалы времени загрузчика USB микроконтроллеров STM32.

MCU
Соединение USB, мс
STM32F04xxx 350
STM32F070x6 Должно быть определено
STM32F070xB 320
STM32F105xx/107xx HSE = 25 МГц 460
HSE = 14.7465 МГц 4500
HSE = 8 МГц 13700
STM32F2xxxx 270
STM32F373xx 300
STM32F302xB(C)/303xB(C) 300
STM32F301xx/302x4(6/8) 300
STM32F302xD(E)/303xD 100
STM32F40xxx/41xxx V3.x 270
V9.x 250
STM32F401xB(C) 250
STM32F401xD(E) 250
STM32F411xx 250
STM32F412xx 380
STM32F446xx 200
STM32F469xx/479xx 270
STM32F413xx/423xx 350
STM32F429xx/439xx V7.x 250
V9.x
STM32F72xxx/73xxx 320
STM32F74xxx/75xxx 230
STM32G4xxxx 300
STM32H74xxx/75xxx 53.9764
STM32H7A3xx/7B3xx 53.9764
STM32L07xxx/08xxx 140
STM32L1xxxC 849
STM32L1xxxD 849
STM32L412xx/422xx 820
STM32L43xxx/44xxx 820
STM32L45xxx/46xxx 330
STM32L47xxx/48xxx V10.x 300
V9.x
STM32L496xx/4A6xx 430
STM32L4Rxx/4Sxx -
STM32L4P5xx/4Q5xx -
STM32L552xx/L562xx 300
STM32WB50xx/WB55xx 300

Время соединения I2C это время, в течение которого хост должен ждать от момента отправки адреса устройства I2C до отправки кода первой команды загрузчика. Это время включает длительность ожидания готовности на линии (I2C stretching duration).

STM32 bootloader I2C connection timing fig89

Рис. 89. Интервалы времени соединения I2C.

Для обмена через I2C реализован механизм таймаута, и он должен соблюдаться для корректного выполнения команд загрузчика. Этот таймаут реализован между двумя фреймами I2C в одной и той же команде (например, для команды Write Memory таймаут вставляется между фреймом отправки команды и фреймом отправки адреса памяти). Также тот же самый период таймаута вставляется между двумя следующими друг за другом приемом или передачей в одном и том же фрейме I2C. Если период таймаута истек, генерируется системный сброс, чтобы избежать сбоя загрузчика.

Для команд стирания памяти (Erase Memory) и снятия защиты чтения (Read-out Unprotect) на стороне хоста нужно учитывать длительность операции с Flash. После отправки кода стираемых страниц хост должен подождать завершения стирания страницы, чтобы выполнить остальные шаги команды Erase.

Таблица 140. Минимальные интервалы времени загрузчика I2C микроконтроллеров STM32.

MCU
Отправка START + 1 байта адреса I2C, мс Удерживание в лог. 0 сигнала SCL, мс Соединение I2C, мс Таймаут I2C, мс
STM32F030xC 0.0225 0.0025 0.0250 1000
STM32F04xxx 0.0225 0.0025 0.0250 1000
STM32F070x6 0.0225 0.0025 0.0245 1000
STM32F070xB 0.0225 0.0025 0.0245 1000
STM32F071xx/072xx 0.0225 0.0025 0.0250 1000
STM32F09xxx 0.0225 0.0025 0.0245 1000
STM32F378xx 0.0225 0.0055 0.0280 10
STM32F358xx 0.0225 0.0055 0.0280 10
STM32F318xx 0.0225 0.0027 0.0252 1000
STM32F303x4(6/8)/334xx/328xx 0.0225 0.0027 0.0252 1000
STM32F398xx 0.0225 0.0020 0.0245 1500
STM32F40xxx/41xxx 0.0225 0.0022 0.0247 1000
STM32F401xB(C) 0.0225 0.0022 0.0247 1000
STM32F401xD(E) 0.0225 0.0022 0.0247 1000
STM32F410xx 0.0225 0.0020 0.0245 1000
STM32F411xx 0.0225 0.0022 0.0247 1000
STM32F412xx 0.0225 0.0020 0.0245 1000
STM32F446xx 0.0225 0.0020 0.0245 1000
STM32F469xx/479xx 0.0225 0.0020 0.0245 1000
STM32F413xx/423xx 0.0225 0.0020 0.0245 1000
STM32F42xxx/43xxx V7.x 0.0225 0.0033 0.0258 1000
V9.x 0.0225 0.0022 0.0247 1000
STM32F72xxx/73xxx 0.0225 0.0020 0.0245 1000
STM32F74xxx/75xxx 0.0225 0.0020 0.0245 500
STM32G03xxx/04xxx 0.0225 0.0020 0.0245 1000
STM32G07xxx/08xxx 0.0225 0.0020 0.0245 1000
STM32G4xxxx 0.0225 0.0020 0.0245 1000
STM32H74xxx/75xxx 0.0225 0.05 0.0725 1000
STM32H7A3xx/7B3xx 0.0225 0.05 0.0745 1000
STM32L07xxx/08xxx 0.0225 0.0020 0.0245 1000
STM32L412xx/422xx 0.0225 0.0020 0.0245 1000
STM32L43xxx/44xxx 0.0225 0.0020 0.0245 1000
STM32L45xxx/46xxx 0.0225 0.0020 0.0245 1000
STM32L47xxx/48xxx V10.x 0.0225 0.0020 0.0245 1000
V9.x 0.0225 0.0020 0.0245 1000
STM32L496xx/4A6xx 0.0225 0.0020 0.0245 1000
STM32L4Rxx/4Sxx - - - -
STM32L4P5xx/4Q5xx - - - -
STM32L552xx/L562xx 0.0225 0.0020 0.0245 1000
STM32WB50xx/WB55xx 0.0225 0.0020 0.0245 1000

Время соединения SPI это время, в течение которого хост должен ждать от момента отправки данных синхронизации (0xA5) до приема первого ответа подтверждения (0x79).

STM32 bootloader SPI connection timing fig90

Рис. 90. Интервалы времени соединения SPI.

Таблица 141. Минимальные интервалы времени загрузчика SPI микроконтроллеров STM32.

MCU
Отправка 1 байта SPI, мс Задержка между двумя байтами, мс Соединение SPI, мс
Относится ко всем MCU, где есть поддержка SPI 0.001 0.008 0.01

[Ссылки]

1. AN2606 STM32 microcontroller system memory boot mode site:st.com.
2. AN3155: протокол загрузчика USART STM32.
3. AN4736: How to calibrate STM32L4 Series microcontrollers internal RC oscillator site:st.com.
4Плата FT232R-Breakout.
5STM32: контроллер USB OTG full-speed.
6STM32: аббревиатуры и термины.
7STMFlashLoader Demo.
8Обновление прошивки ST-LINK на плате STM32 DISCOVERY.