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

Нужно ли включать тактирование 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

БитИмяПосле сбросаЧто разрешает
31SRAM3EN0интерфейс SRAM3 (0x3004 0000)
30SRAM2EN0интерфейс SRAM2 (0x3002 0000)
29SRAM1EN0интерфейс 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, ищите в коде инициализации запись именно в этот регистр.

Источники

  1. 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: адреса и атрибуты областей памяти
  2. 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 и т. д.

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