Нужно ли включать тактирование SRAM1–SRAM3 на STM32H743?
Обновлено Редакция GAW
У STM32H742, H743 и H750 оперативная память разбита на области в разных доменах питания. SRAM1, SRAM2 и SRAM3 лежат в домене D2 по адресам 0x3000 0000, 0x3002 0000 и 0x3004 0000, и ST рекомендует их как буферы DMA — ведь к DTCM контроллеры DMA1 и DMA2 доступа не имеют (почему, разобрано в ответе «Почему DMA1 на STM32H743 не передаёт данные»). Но у этих памятей есть особенность, которой нет у обычной SRAM младших STM32: их интерфейсы после сброса не тактируются.
Регистр RCC_AHB2ENR
| Бит | Имя | После сброса | Что разрешает |
|---|---|---|---|
| 31 | SRAM3EN | 0 | интерфейс SRAM3 (0x3004 0000) |
| 30 | SRAM2EN | 0 | интерфейс SRAM2 (0x3002 0000) |
| 29 | SRAM1EN | 0 | интерфейс SRAM1 (0x3000 0000) |
Регистр находится по смещению 0x0DC в блоке RCC, второй его адрес — RCC_C1_AHB2ENR со смещением 0x13C. Значение после сброса — 0x0000 0000 (RM0433, разд. 8.7.42).
// Enable D2 SRAM1..SRAM3 interface clocks before the first access (RM0433, 8.7.42)
RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN | RCC_AHB2ENR_SRAM2EN | RCC_AHB2ENR_SRAM3EN;
__DSB(); // make sure the write has completed before using the memories
Когда включать
- Буфер DMA, который заполняется в программе. Достаточно включить тактирование в начале
main()или в функции инициализации, до запуска DMA. - Переменные с начальными значениями или обнуляемые — секции
.dataи.bssв SRAM1–SRAM3. Стартовый код копирует и обнуляет их доmain(), поэтому биты ставят раньше: вSystemInit()или в начале обработчика сброса. Какие секции куда попадают, задаёт скрипт компоновщика.
Карта памяти и объёмы для разных линеек — на странице STM32H7.
Похожие вопросы
А у DTCM и AXI SRAM тоже нужно включать тактирование?
В RCC_AHB2ENR биты есть только у SRAM1–SRAM3. DTCM подключена к ядру собственной шиной, и RM0433 предлагает держать в ней критичные данные — стек и кучу. Для остальных областей смотрите регистры разрешения тактирования соответствующих шин в разделе 8.7 RM0433.
Что меняет этот бит, кроме тактирования?
По RM0433 установленный бит говорит, что память выделена ядру: домен D2 начинает учитывать режимы работы процессора и остаётся в рабочем режиме DRun, пока ядро в CRun. Без этого бита домен D2 режимы процессора не учитывает.
Как проверить, что тактирование включилось?
Прочитать RCC_AHB2ENR в отладчике: биты 29–31 должны быть равны 1, то есть в регистре установлены маски 0x20000000, 0x40000000 и 0x80000000 из заголовка stm32h743xx.h. Если используете HAL, ищите в коде инициализации запись именно в этот регистр.
Источники
- STMicroelectronics. RM0433 Reference manual STM32H742, STM32H743/753 and STM32H750 Value line, Rev 9 — разд. 8.7.42 RCC AHB2 clock register (RCC_AHB2ENR): смещение 0x0DC (и RCC_C1_AHB2ENR 0x13C), значение после сброса 0x0000 0000; бит 31 SRAM3EN, бит 30 SRAM2EN, бит 29 SRAM1EN — разрешение блока SRAM: 0 — тактирование интерфейса выключено (по умолчанию после сброса), 1 — включено; установленный бит означает, что память выделена ядру, и домен D2 учитывает режимы работы CPU — остаётся в DRun, пока CPU в CRun; разд. 2.4: SRAM1 — 0x3000 0000, SRAM2 — 0x3002 0000, SRAM3 — 0x3004 0000, рекомендованы для буферов DMA домена D2; табл. 7: адреса и атрибуты областей памяти
- STMicroelectronics. cmsis-device-h7, Include/stm32h743xx.h (commit 81db1ec) — RCC_AHB2ENR_SRAM1EN — бит 29 (0x20000000), RCC_AHB2ENR_SRAM2EN — бит 30 (0x40000000), RCC_AHB2ENR_SRAM3EN — бит 31 (0x80000000); синонимы RCC_AHB2ENR_D2SRAM1EN и т. д.
Нашли ошибку?
Смотрите также
- Почему DMA1 на STM32H743 не передаёт данные из буфера?Буфер лежит в DTCM, куда DMA1, DMA2 и BDMA доступа не имеют; перенести в AXI SRAM или SRAM1–3
- STM32H7Cortex-M7 от 280 до 600 МГц, двухъядерные H745/H747 — линейки, память, загрузка и распиновки
- SRAM (статическое ОЗУ)Статическая оперативная память: устройство и размещение в AVR и STM32
- Скрипт компоновщикаФайл .ld с картой памяти и правилами размещения секций прошивки
- TCM (ITCM, DTCM)ОЗУ на прямых интерфейсах ядра Cortex-M7: предсказуемый доступ без кэша