Перейти к содержанию

Двухбанковая флеш-память (dual bank)

Пока флеш-память STM32 стирается или пишется, процессор не может читать из неё код и ждёт. У микроконтроллеров с двумя банками этого ограничения нет между банками: программа работает из одного банка и в это время записывает новую прошивку в другой.

Обновлено Редакция GAW

Двухбанковая флеш-память (dual bank) — организация встроенной флеш-памяти микроконтроллера в виде двух независимых банков со своими контроллерами записи. Пока один банк стирается или программируется, из другого можно читать и выполнять код — это называют read-while-write, RWW (RM0090, разд. 3.4; RM0008, разд. 3.3.3). В однобанковой памяти процессору приходится ждать, пока стирание или запись закончатся.

Где это есть в STM32

СерияОрганизация
STM32F1 XL-density (768 КБ – 1 МБ)банк 1 — 512 КБ, банк 2 — до 512 КБ с адреса 0x0808 0000
STM32F405/407один банк до 1 МБ
STM32F42x/43x, 2 МБдва банка по 1 МБ, банк 2 с 0x0810 0000, сектора 12–23
STM32F42x/43x, 1 МБодин банк или два по 512 КБ при DB1M = 1
STM32G4 категории 3один банк 512 КБ или два по 256 КБ при DBANK = 1

По RM0008 (табл. 8), RM0090 (разд. 3.3–3.4, табл. 6–9) и RM0440 (разд. 3.3.1). Двухбанковый режим меняет и нумерацию: у STM32F42x с DB1M = 1 сектора банка 2 идут с номера 12, у STM32G4 с DBANK = 1 страница становится 2 КБ вместо 4 КБ. Поэтому адреса и номера секторов для стирания берут из таблицы своего режима — их можно проверить в калькуляторе секторов флеш-памяти STM32.

Обновление прошивки с откатом

Главное применение — надёжное обновление по сети. Программа работает из банка 1, принимает новый образ в банк 2, проверяет контрольную сумму и только потом переключает загрузку. Для переключения у STM32F42x/43x и STM32G4 есть бит BFB2 в байтах конфигурации, а у STM32G4 — ещё бит FB_MODE в SYSCFG_MEMRMP, который меняет банки местами в адресном пространстве (RM0440). Если запись оборвалась, старая прошивка в банке 1 цела, и устройство не превращается в «кирпич».

Второй сценарий — хранение данных: банк 2 используют под журнал или настройки и стирают его страницы, не останавливая код в банке 1. В памяти с ECC у STM32G4 режим банков влияет и на ширину чтения: 128 бит в однобанковом режиме и 64 бита в двухбанковом (RM0440, разд. 3.3.1). Как устроены загрузка и программирование флеш-памяти STM32 — в статье «Flash-память и загрузчик STM32».

Частые вопросы

Зачем два банка, если флеш-память и так одна?

Чтобы стирать и писать одну часть, не останавливая выполнение кода из другой. В однобанковой памяти процессор, обратившийся к флеш-памяти во время стирания, ждёт его окончания. При двух банках программа живёт в банке 1 и в это время принимает новую прошивку в банк 2 — так обновление по радио или по сети не прерывает работу.

Как переключиться на новую прошивку во втором банке?

У STM32F42x/43x и STM32G4 для этого есть бит BFB2 в байтах конфигурации: он разрешает загрузку из банка 2 (RM0090; RM0440, разд. 3.3.1). У STM32G4 ещё есть бит FB_MODE в SYSCFG_MEMRMP, который меняет банки местами в адресном пространстве. Если новая прошивка не запустилась, загрузчик возвращается к старому банку.

Есть ли два банка у STM32F407 и STM32F103C8?

Нет. У STM32F405/407 флеш-память однобанковая, двухбанковая организация появляется у STM32F42x/43x (RM0090, разд. 3.3–3.4). У STM32F1 два банка есть только у XL-density с объёмом от 768 КБ (RM0008, разд. 3.3.3); у STM32F103C8 с 64 КБ банк один.

Источники

  1. STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439 (Rev 22) — разд. 3.3: у STM32F405/407 один банк до 1 МБ, 12 секторов; разд. 3.4: у STM32F42x/43x до 2 МБ в двух банках с чтением во время записи (RWW), стирание сектора, банка или всей памяти; двухбанковая организация только у вариантов на 1 и 2 МБ; у 1-мегабайтных её включает бит DB1M, последние 512 КБ перестраиваются как первые, банк 2 получает сектора 12–19; табл. 6: банк 2 у 2-мегабайтных — сектора 12–23 с адреса 0x0810 0000; бит BFB2 — загрузка из банка 2, при DB1M = 0 у 1-мегабайтных должен быть сброшен
  2. STMicroelectronics. RM0440 Reference manual STM32G4 Series (Rev 9) — разд. 3.3.1 (категория 3): 512 КБ в одном банке (чтение 128 бит, страница 4 КБ) или при DBANK = 1 в двух банках по 256 КБ (чтение 64 бита, страница 2 КБ); двойная загрузка через BFB2 только в режиме двух банков; табл. 7: банк 2 с адреса 0x0804 0000; SYSCFG_MEMRMP бит FB_MODE меняет банки местами в адресном пространстве
  3. STMicroelectronics. RM0008 Reference manual STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx (Rev 21) — разд. 3.3.3: у STM32F1 XL-density (768 КБ – 1 МБ) двухбанковая архитектура с чтением во время записи: банк 1 — 512 КБ, банк 2 — до 512 КБ; табл. 8: банк 2 — страницы 256–511 с адреса 0x0808 0000; отдельные регистры FLASH_KEYR2, FLASH_SR2, FLASH_CR2, FLASH_AR2

Нашли ошибку?