SRAM (статическое ОЗУ)
Вся оперативная память микроконтроллера — переменные, стек, куча, буферы DMA — это SRAM, статическое ОЗУ. Его мало, оно быстрое и теряет содержимое без питания. Разберём, чем статическая ячейка отличается от динамической и как SRAM устроена в AVR и STM32.
Обновлено Редакция GAW
SRAM (static random-access memory, статическое ОЗУ) — оперативная память, в которой каждый бит хранит триггер. Пока есть питание, ячейка держит значение сама, без регенерации, поэтому SRAM проста в использовании и работает на частоте процессора. Платой за это служит низкая плотность: на одну ячейку нужно несколько транзисторов, тогда как динамическому ОЗУ (DRAM) хватает одного транзистора и конденсатора, заряд которого приходится периодически восстанавливать (Kuphaldt, т. IV, гл. 15). Поэтому SRAM в микроконтроллерах измеряется килобайтами, а не мегабайтами, и при отключении питания её содержимое пропадает.
SRAM в AVR
У ATmega328P 2048 байт внутренней SRAM. Она идёт в общем адресном пространстве памяти данных сразу за регистрами: сначала 32 рабочих регистра, затем 64 регистра ввода-вывода и 160 регистров расширенного ввода-вывода, а с адреса 0x0100 — сама SRAM (DS40002061B, разд. 8.3). Всё это пространство доступно через пять режимов адресации с указателями X, Y и Z. В SRAM живут глобальные переменные из секций .data и .bss, куча и стек, растущий от вершины памяти вниз.
SRAM в STM32F4
| Блок | STM32F405/407 | STM32F42x/43x | Адрес | Кто обращается |
|---|---|---|---|---|
| SRAM1 | 112 Кбайт | 112 Кбайт | 0x2000 0000 | все мастера AHB |
| SRAM2 | 16 Кбайт | 16 Кбайт | сразу за SRAM1 | все мастера AHB |
| SRAM3 | — | 64 Кбайт | 0x2002 0000 | все мастера AHB |
| CCM | 64 Кбайт | 64 Кбайт | 0x1000 0000 | только процессор |
| Резервная SRAM | 4 Кбайт | 4 Кбайт | в резервном домене | питается и от VBAT |
По RM0090, разд. 2.1 и 2.3.1: системной SRAM у STM32F405/407 — 192 Кбайт, у STM32F42x/43x — 256 Кбайт, плюс 4 Кбайт резервной; размер SRAM2 — наш расчёт из этих сумм. Память доступна байтами, полусловами и словами без тактов ожидания. Блоки подключены к матрице шин отдельно, поэтому, например, Ethernet MAC может писать в SRAM2, пока процессор работает с SRAM1. CCM к матрице не подключена: DMA её не видит, и буферы DMA там размещать нельзя. Как блоки ложатся в адресное пространство ядра, показано в термине «Карта памяти Cortex-M».
Когда данные теряются
SRAM энергозависима. У STM32F4 в режиме Stop содержимое SRAM сохраняется, а в Standby стабилизатор ядра выключен, и SRAM теряется целиком — кроме 4 Кбайт резервной SRAM в резервном домене, которая может питаться от батарейки VBAT (RM0090, разд. 5.1.3). Если встроенной SRAM не хватает, добавляют внешнюю: статическую или псевдостатическую PSRAM через контроллер внешней памяти или QSPI.
Частые вопросы
Чем SRAM отличается от DRAM?
Ячейка SRAM — триггер, который держит бит, пока есть питание, и не требует обслуживания. Ячейка DRAM — крошечный конденсатор с одним транзистором: заряд утекает, и микросхема должна периодически перечитывать и перезаряжать ячейки (Kuphaldt, т. IV, гл. 15). DRAM плотнее и дешевле на бит, SRAM проще в использовании и быстрее, поэтому внутренняя память микроконтроллеров — статическая.
Почему у ATmega328P SRAM начинается с адреса 0x0100?
Первые 256 адресов памяти данных занимают регистры: 32 рабочих регистра, 64 регистра ввода-вывода и 160 регистров расширенного ввода-вывода. Внутренняя SRAM объёмом 2048 байт идёт следом, с 0x0100 до 0x08FF (DS40002061B, разд. 8.3; конечный адрес — наш расчёт). Поэтому стек при старте ставят на 0x08FF, вершину SRAM.
Сохраняется ли SRAM в режимах сна STM32?
В Stop — да: стабилизатор продолжает питать ядро и память, содержимое регистров и SRAM сохраняется. В Standby стабилизатор выключен, и SRAM теряется; остаются только схемы Standby и резервный домен с 4 Кбайт резервной SRAM у STM32F4 (RM0090, разд. 5.1.3 и 2.3.1). Данные, нужные после Standby, кладут туда или во флеш.
Источники
- Kuphaldt T. R. Lessons In Electric Circuits, Volume IV — Digital, ch. 15 «Digital Storage (Memory)» (CC BY) — простая схема памяти на триггерах — энергозависимое ОЗУ с произвольным доступом, технически это статическое ОЗУ; на ячейку нужно много вентилей и транзисторов, отсюда низкая плотность и заметное потребление, КМОП снизила потребление, но плотность осталась низкой; динамическое ОЗУ хранит бит в крошечном конденсаторе с одним MOSFET-ключом, заряд утекает, и микросхема периодически читает и перезаряжает ячейки — регенерация; флеш-память хранит заряд на изолированном затворе MOSFET
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P megaAVR Data Sheet (DS40002061B, 2020) — Features: 512 / 1K / 1K / 2K байт внутренней SRAM; разд. 8.3 SRAM Data Memory и рис. 8-3: младшие 768 / 1280 / 1280 / 2303 адреса памяти данных — 32 регистра, 64 регистра ввода-вывода, 160 регистров расширенного ввода-вывода (0x60–0xFF), затем 512 / 1024 / 1024 / 2048 байт внутренней SRAM; расширенный ввод-вывод доступен только командам ST/STS/STD и LD/LDS/LDD; пять режимов адресации, указатели X, Y, Z в R26–R31
- STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439 (Rev 21, June 2024) — разд. 2.1, рис. 1: SRAM1 112 Кбайт, CCM 64 Кбайт вне матрицы шин, доступна только процессору; разд. 2.3.1: STM32F405/407 — 4 Кбайт резервной SRAM и 192 Кбайт системной SRAM, STM32F42x/43x — 4 и 256 Кбайт; доступ байтами, полусловами и словами на частоте процессора без тактов ожидания; SRAM1 и SRAM2 с адреса 0x2000 0000 доступны всем мастерам AHB, SRAM3 (F42x/43x) с 0x2002 0000, CCM с 0x1000 0000 только через D-bus; одновременный доступ мастеров, например Ethernet MAC к SRAM2 и процессора к SRAM1; разд. 5.1.3: в Stop содержимое регистров и SRAM сохраняется, в Standby теряется, кроме схем Standby и резервного домена
Нашли ошибку?
Смотрите также
- CCM RAM (память ядра)ОЗУ, подключённое к ядру напрямую, без доступа для DMA
- PSRAMВнешняя оперативная память на шине SPI: размеры, режимы, выводы
- Резервный домен (backup domain)Часть STM32 с питанием от VBAT: RTC, LSE и резервные регистры
- Карта памяти Cortex-MФиксированные области адресного пространства ядра Cortex-M
- СтекОбласть ОЗУ для адресов возврата и локальных переменных