Карта памяти Cortex-M
Почему flash STM32 начинается с 0x0800 0000, ОЗУ — с 0x2000 0000, а регистры периферии — с 0x4000 0000? Эти адреса не выбирает производитель кристалла: их задаёт ядро Cortex-M, у которого карта памяти фиксирована.
Обновлено Редакция GAW
Карта памяти Cortex-M — фиксированное деление 4-гигабайтного адресного пространства ядра на области с заданным назначением и типом памяти. Её определяет архитектура, а не производитель кристалла: у любого Cortex-M3 и M4 ОЗУ находится в области SRAM, периферия — в области периферии, а регистры ядра — в PPB (DUI 0552A, разд. 2.2). Производитель лишь решает, какую память и периферию поместить внутрь этих областей.
Области
| Адреса | Область | Тип памяти | Выполнение кода |
|---|---|---|---|
| 0x0000 0000–0x1FFF FFFF | Code, 0,5 ГБ | Normal | да |
| 0x2000 0000–0x3FFF FFFF | SRAM, 0,5 ГБ | Normal | да |
| 0x4000 0000–0x5FFF FFFF | периферия, 0,5 ГБ | Device | нет (XN) |
| 0x6000 0000–0x9FFF FFFF | внешнее ОЗУ, 1 ГБ | Normal | да |
| 0xA000 0000–0xDFFF FFFF | внешние устройства, 1 ГБ | Device | нет |
| 0xE000 0000–0xE00F FFFF | PPB, 1 МБ | Strongly-ordered | нет |
| 0xE010 0000–0xFFFF FFFF | зависит от производителя | Device | нет |
По табл. 2-11 DUI 0552A. Тип памяти определяет поведение обращений: к Normal ядро может обращаться не по порядку программы и читать спекулятивно, к Device и Strongly-ordered — сохраняет порядок, а запись в Strongly-ordered не буферизует (разд. 2.2.1). Когда порядок обращений важен, ставят барьеры памяти. В областях SRAM и периферии есть зоны bit-banding, а в PPB — NVIC, SysTick и блок управления системой. Блок защиты памяти может переопределить эти свойства.
Пример: STM32F407
| Адрес | Что лежит | Область |
|---|---|---|
| 0x0800 0000 | flash-память | Code |
| 0x1000 0000 | CCM, 64 КБ | Code |
| 0x1FFF 0000 | системная память с загрузчиком | Code |
| 0x2000 0000 | SRAM1 и SRAM2 | SRAM |
| 0x4000 0000 | регистры периферии | периферия |
| 0xE000 E000 | NVIC, SysTick, SCB | PPB |
По RM0090, разд. 2.2–2.3. По адресу 0x0000 0000 STM32 показывает ту память, с которой выбрана загрузка — flash, системную память или SRAM1, — и она остаётся доступной и по своему адресу (табл. 3). CCM-память хоть и лежит в области Code, доступна только ядру по шине данных, поэтому DMA к ней не обращается.
Arm рекомендует держать программу в области Code: у ядра отдельные шины для выборки команд и данных, и они работают одновременно (разд. 2.2.3). Как эти адреса задают в скрипте компоновщика, а ядро использует их после сброса, — в статье «Cortex-M3».
Частые вопросы
Почему у STM32 flash начинается с 0x0800 0000, а не с нуля?
Адрес 0x0000 0000 — начало области Code, откуда ядро после сброса читает указатель стека и вектор сброса. STM32 отображает туда ту память, с которой выбрана загрузка: flash, системный загрузчик или SRAM. Сама flash постоянно лежит по адресу 0x0800 0000 той же области Code и доступна там всегда, поэтому прошивку компонуют на этот адрес.
Можно ли выполнять код из ОЗУ?
Да, область SRAM исполняемая. Но Arm рекомендует держать код в области Code: у Cortex-M3 и M4 для неё отдельные шины команд и данных, и выборка команд не мешает обращениям к данным. Из SRAM код работает медленнее, зато его можно менять на ходу — так работают загрузчики и функции стирания flash.
Что такое PPB?
Private Peripheral Bus — область 0xE000 0000–0xE00F FFFF, где лежат регистры самого ядра: NVIC, SysTick, блок управления системой, отладочные блоки. Тип памяти Strongly-ordered, выполнять код оттуда нельзя. Адреса в ней одинаковы у всех микроконтроллеров на одном ядре, поэтому заголовки CMSIS для неё общие.
Источники
- Arm. Cortex-M3 Devices Generic User Guide, DUI 0552A, 2010 — разд. 2.2: у процессора фиксированная карта памяти по умолчанию до 4 ГБ, области SRAM и периферии включают области bit-band, в PPB лежат регистры периферии ядра; разд. 2.2.1: типы Normal (ядро может переупорядочивать обращения и читать спекулятивно), Device и Strongly-ordered (порядок сохраняется, запись в Strongly-ordered не буферизуется), атрибут XN запрещает выполнение; табл. 2-11: 0x00000000–0x1FFFFFFF Code (Normal), 0x20000000–0x3FFFFFFF SRAM (Normal), 0x40000000–0x5FFFFFFF периферия (Device, XN), 0x60000000–0x9FFFFFFF внешнее ОЗУ (Normal), 0xA0000000–0xDFFFFFFF внешние устройства (Device, XN), 0xE0000000–0xE00FFFFF PPB (Strongly-ordered, XN: NVIC, SysTick, SCB), 0xE0100000–0xFFFFFFFF Device, зависит от реализации; разд. 2.2.3: программы можно размещать в Code, SRAM и внешнем ОЗУ, но Arm рекомендует Code — у процессора отдельные шины для выборки команд и данных; MPU может переопределить поведение по умолчанию
- STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439 (Rev 21) — разд. 2.2: программа, данные, регистры и порты в одном линейном пространстве 4 ГБ, порядок байт little endian, восемь блоков по 512 МБ; разд. 2.3, табл. 1: адреса периферии; разд. 2.3.1: SRAM1 и SRAM2 с адреса 0x2000 0000, SRAM3 (F42x/F43x) с 0x2002 0000, CCM с 0x1000 0000 доступна только ядру по шине D; табл. 3: flash 0x0800 0000, системная память 0x1FFF 0000–0x1FFF 77FF, в зависимости от режима загрузки по адресу 0x0000 0000 видна flash, SRAM1 или системная память, при этом память доступна и по своему адресу
- Arm. ARMv7-M Architecture Reference Manual, ARM DDI 0403C_errata_v3, 2010 — B3.1: системная карта адресов ARMv7-M с областями Code, SRAM, Peripheral, внешней памятью и системной областью, атрибуты памяти по умолчанию
Нашли ошибку?
Смотрите также
- Cortex-M3Регистры, карта памяти, bit-banding, NVIC, SysTick, MPU, старт, пример
- Bit-bandingАтомарная запись одного бита через область-алиас
- Скрипт компоновщикаФайл .ld с картой памяти и правилами размещения секций прошивки
- CCM RAM (память ядра)ОЗУ, подключённое к ядру напрямую, без доступа для DMA
- Барьер памятиГраница, через которую нельзя переставлять обращения к памяти
- SRAM (статическое ОЗУ)Статическая оперативная память: устройство и размещение в AVR и STM32
- TCM (ITCM, DTCM)ОЗУ на прямых интерфейсах ядра Cortex-M7: предсказуемый доступ без кэша