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/417 | 64 КБ | 0x1000 0000 |
| STM32F427/437, F429/439 | 64 КБ | 0x1000 0000 |
| STM32F303 | по модели, см. STM32F3 | 0x1000 0000 |
| STM32G431 | 10 КБ (CCM SRAM) | 0x1000 0000 |
| STM32G491 | 16 КБ (CCM SRAM) | 0x1000 0000 |
| STM32G474 | 32 КБ (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.
Источники
- 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
- 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)
Нашли ошибку?
Смотрите также
- STM32F4Cortex-M4 с FPU: от F401 и F411 до F429 и F469 — линейки и распиновки
- DMAПрямой доступ к памяти без участия ядра
- Секции .data и .bssГде лежат глобальные переменные: копирование и обнуление при старте
- Шины AHB и APBБыстрая шина ядра и шины периферии STM32
- СтекОбласть ОЗУ для адресов возврата и локальных переменных