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

CCM RAM — память, связанная с ядром

Из 192 КБ ОЗУ STM32F407 только 128 КБ — обычная память, доступная всем. Ещё 64 КБ лежат отдельно, по адресу 0x1000 0000, и работают только с ядром. Это CCM RAM: быстрый, но ограниченный кусок памяти.

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

CCM RAM (core coupled memory, память, связанная с ядром) — область ОЗУ в некоторых STM32, подключённая к процессору отдельной шиной в обход матрицы шин. У STM32F405/407/42x это 64 КБ по адресу 0x1000 0000, к которым имеет доступ только процессор через шину данных D-bus; контроллеры DMA, Ethernet и USB её не видят (RM0090, разд. 2.1, 2.3.1). Взамен процессор обращается к ней без соперничества с другими ведущими шины.

Где она есть

СемействоОбъём CCMАдрес
STM32F405/415, F407/41764 КБ0x1000 0000
STM32F427/437, F429/43964 КБ0x1000 0000
STM32F303по модели, см. STM32F30x1000 0000
STM32G43110 КБ (CCM SRAM)0x1000 0000
STM32G49116 КБ (CCM SRAM)0x1000 0000
STM32G47432 КБ (CCM SRAM)0x1000 0000

Таблица — примеры, не полный список. Данные — по RM0090 и CMSIS-заголовкам ST (stm32f407xx.h, stm32f429xx.h, stm32f303x8.h, stm32f303xc.h — адрес CCMDATARAM_BASE без объёма, stm32g431xx.h, stm32g474xx.h, stm32g491xx.h). У STM32F401, F411 и F446 адресов CCM в заголовках нет. Тактирование CCM у STM32F4 включает бит CCMDATARAMEN в RCC_AHB1ENR.

Что туда класть

Удачные кандидаты — всё, что нужно только программе: стек, куча, буферы фильтров и рабочие массивы вычислений. Неудачные — буферы DMA, USB и Ethernet: доступа к CCM у этих контроллеров нет, и передача просто не произойдёт. Наш вывод из того, что CCM подключена только к шине данных: код из неё у STM32F4 не выполнить.

Чтобы переменная оказалась в CCM, в скрипте компоновщика описывают отдельную область памяти и секцию, а в коде помечают переменную атрибутом секции. Наш вывод из устройства стартового кода: стандартный код запуска копирует начальные значения и обнуляет только обычные секции .data и .bss, поэтому для секции в CCM это нужно сделать отдельно или считать её неинициализированной. Шины и их связи — в статье о шинах AHB и APB; остальная память STM32F4 — на странице STM32F4.

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

Почему DMA не работает с буфером в CCM RAM?

Потому что CCM не подключена к матрице шин, через которую работают контроллеры DMA, Ethernet и USB: по RM0090 она доступна только процессору (разд. 2.1, 2.3.1). Буферы для DMA кладут в SRAM1 или SRAM2, а в CCM — данные, с которыми работает только программа: стек, кучу, рабочие массивы вычислений.

Можно ли выполнять код из CCM RAM у STM32F4?

RM0090 подключает CCM только к шине данных D-bus, а выборка команд у Cortex-M4 идёт по шине I-bus. Наш вывод: исполнять код из CCM у STM32F405/407 нельзя, её используют только для данных. Код в ОЗУ размещают в SRAM1.

Есть ли CCM у всех STM32F4?

Нет. По RM0090 она есть у STM32F405/415, F407/417, F427/437 и F429/439. В CMSIS-заголовках STM32F401, F411 и F446 адреса CCM нет. У STM32G4 похожая память называется CCM SRAM и в зависимости от модели занимает 10, 16 или 32 КБ с того же адреса 0x1000 0000.

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 2.1 — 64 КБ CCM data RAM не входит в матрицу шин и доступна только процессору; шина D-bus соединяет шину данных Cortex-M4 с CCM; разд. 2.3.1 — CCM по адресу 0x1000 0000 доступна только процессору через D-bus; SRAM1, SRAM2 (и SRAM3 у F42x/43x) доступны всем ведущим AHB; разд. 2.3.1 — у F405/407/415/417 всего 192 КБ системного ОЗУ вместе с CCM, у F42x/43x — 256 КБ; 6.3.10 — бит CCMDATARAMEN в RCC_AHB1ENR включает тактирование CCM
  2. STMicroelectronics. CMSIS device headers: cmsis-device-f4 (commit 9192c7b) и cmsis-device-g4 (commit 626ee41) — stm32f407xx.h, stm32f429xx.h: CCMDATARAM_BASE 0x10000000, CCMDATARAM_END 0x1000FFFF (64 КБ); в stm32f401xc.h, stm32f411xe.h, stm32f446xx.h адреса CCM нет; cmsis-device-g4: CCMSRAM_BASE 0x10000000, CCMSRAM_SIZE 10 КБ (G431), 16 КБ (G491), 32 КБ (G474)

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