ESP32: устройство системы и памяти |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ESP32 это микроконтроллер, основанный двух на ядрах Xtensa LX6 CPU с Гарвардской архитектурой (память инструкций и память данных физически разделены). Вся встроенная память, внешняя память и периферийные устройства расположены на шине данных и/или команд этих CPU. Примечание: здесь приведен перевод раздела "System and Memory" технического руководства esp32_technical_reference_manual_en.pdf [1]. Незнакомые термины и сокращения см. в Словарике, в конце статьи. С некоторыми небольшими исключениями (см. описание далее) карта памяти этих двух CPU симметрична, т. е. они используют одно и то же адресное пространство одной и той же памяти. Несколько периферийных устройств в системе могут обращаться к памяти через DMA [2]. В этом руководстве оба CPU условно именуются как PRO_CPU и APP_CPU (т. е. один предназначен для "протоколов", и другой для "приложения"), однако для большинства применений они равноправны и взаимозаменяемы. Особенности адресации: – Симметричное для двух CPU отображение на карту памяти блоков RAM и периферийных устройств. Встроенная память: – 448 KB Internal ROM. Внешняя память. Находящаяся вне кристалла последовательная память SPI может быть отображена на доступное адресное пространство как внешняя память. Части встроенной памяти могут использоваться как прозрачный кэш для этой внешней памяти: – Поддерживается до 16 MB внешней SPI Flash. На рис. 1 показана блок-схема структуры системы, блок-схема рис. 2 иллюстрирует структуру адресного пространства. Рис. 1. Общая структура системы. Рис. 2. Распределение адресного пространства. [Карта памяти] Каждый из двух Xtensa LX6 CPU Гарвардской архитектуры имеет 4 GB адресного пространства (32-разрядный адрес) address space. Адресные пространства симметричны между этими двумя CPU (т. е. оно общее). Адреса ниже 0x40000000 обслуживаются через шину данных. Адреса в диапазоне 0x40000000 .. 0x4FFFFFFF обслуживаются с использованием шины инструкций. И наконец, адреса выше и включая 0x50000000 совместно используются шинами данных и инструкций. И шина данных, и шина инструкций, обе используют принцип порядка байт little-endian [3]. Например, значения байтовых адресов 0, 1, 2, 3 соответственно обращаются к наименее значимому, второму наименее значимому, второму более значимому и самому значимому байту 32-разрядного слова, сохраненному по адресу 0 (т. е. чем больше адрес, тем более значимый байт слова). CPU может обращаться к шине данных через операции не выровненного байтового доступа, доступа к половине слова и к полному слову для операций чтение и запись. CPU может читать и записывать данные через шину инструкций, однако только через доступ к словам (по байтовому адресу, нацело делящемуся на 4). Не выровненный доступ через шину инструкций приведет к ошибке исключения (CPU exception). Каждый CPU может напрямую обращаться к встроенной памяти как через шину данных, так и через шину инструкций, к внешней памяти, которая отображена на адресной пространство (через систему прозрачного кэширования и MMU), и к периферийным устройствам. Таблица 1 показывает диапазоны адресов, которые могут быть доступны через шину данных и шину инструкций каждого CPU. Некоторые области встроенной памяти и некоторые области внешней памяти могут быть доступны через шину данных, или через шину инструкций. В этих случаях одна и та же паять доступна для любого CPU в двух диапазонах адресов. Таблица 1. Address Mapping.
Эта память состоит из 4 сегментов: internal ROM (448 KB), internal SRAM (520 KB), RTC FAST memory (8 KB) и RTC SLOW memory (8 KB). 448 KB internal ROM поделено на 2 части: Internal ROM 0 (384 KB) и Internal ROM 1 (64 KB). 520 KB internal SRAM поделено на 3 части: Internal SRAM 0 (192 KB), Internal SRAM 1 (128 KB) и Internal SRAM 2 (200 KB). Области RTC FAST Memory и RTC SLOW Memory обе реализованы как SRAM. В таблице 2 перечислены встроенные области памяти и их диапазоны адресов на шинах данных и инструкций. Таблица 2. Embedded Memory Address Mapping.
Internal ROM 0. Емкость Internal ROM 0 составляет 384 KB. Она доступна для обоих CPU через диапазон адресов 0x40000000 .. 0x4005FFFF, которые находятся на шине инструкций. Диапазон адресов первых 32 KB ROM 0 (0x40000000 .. 0x40007FFF) могут быть перенаправлены (remap), чтобы получить доступ к части Internal SRAM 1, которая нормально находится в диапазоне адресов 0x400B0000 .. 0x400B7FFF. При переназначении 32 KB SRAM больше не будут доступны через диапазон адресов 0x400B0000 .. 0x400B7FFF, однако эти 32 KB SRAM все еще будут доступны через шину данных (0x3FFE8000 .. 0x3FFEFFFF). Это можно делать на каждом CPU: установка бита 0 регистра DPORT_PRO_BOOT_REMAP_CTRL_REG или DPORT_APP_BOOT_REMAP_CTRL_REG будет перенаправлять (remap) SRAM для PRO_CPU и APP_CPU соответственно. Internal ROM 1. Емкость Internal ROM 1 составляет 64 KB. Его можно прочитать любым CPU в адресном диапазоне 0x3FF90000 .. 0x3FF9FFFF шины данных. Internal SRAM 0. Емкость Internal SRAM 0 составляет 192 KB. Аппаратура может быть сконфигурирована для использования первых 64 KB для кэша доступа к внешней памяти. Когда первые 64 KB не используются как кэш, их можно читать и записывать любым CPU по адресам 0x40070000 .. 0x4007FFFF шины инструкций. Остальные 128 KB можно всегда читать и записывать любым CPU по адресам 0x40080000 .. 0x4009FFFF шины инструкций. Internal SRAM 1. Емкость Internal SRAM 1 составляет 128 KB. Любой CPU может читать и записывать эту память по адресам 0x3FFE0000 .. 0x3FFFFFFF шины данных, и также по адресам 0x400A0000 .. 0x400B_FFFF шины инструкций. Диапазон адресов, доступ к которому осуществляется через шину инструкций в обратном порядке (по словам) по сравнению с доступом через шину данных. То есть, обращение по адресам: 0x3FFE0000 и 0x400BFFFC осуществляется к одному и тому же слову Шина данных и шина инструкций все еще обе little-endian, так что порядок байт отдельных слов не становится обратным между адресными пространствами. Например, байтовый доступ по адресу: 0x3FFE0000 дает доступ к самому младшему значащему байту слова, доступного по адресу 0x400BFFFC. Часть этой памяти может быть перенаправлена (remap) на адресное пространство ROM 0, см. "Internal Rom 0" для дополнительной информации. Internal SRAM 2. Емкость Internal SRAM 2 составляет 200 KB. Она может быть прочитана и записана любым CPU по адресам 0x3FFAE000 .. 0x3FFDFFFF шины данных. DMA. DMA использует ту же самую схему адресации, что и шина данных CPU для чтения и записи Internal SRAM 1 и Internal SRAM 2. Это значит, что DMA использует диапазон адресов 0x3FFE0000 .. 0x3FFFFFFF для чтения и записи Internal SRAM 1, и диапазон адресов 0x3FFAE000 .. 0x3FFD_FFFF для чтения и записи Internal SRAM 2. В ESP32 блоками DMA оборудованы 13 периферийных устройств, в таблице 3 перечислены эти устройства. Таблица 3. Периферийные устройства с модулями DMA.
RTC FAST Memory. RTC FAST Memory занимает 8 KB SRAM. Она может быть прочитана и записана только ядром PRO_CPU через диапазон адресов 0x3FF80000 .. 0x3FF81FFF шины данных, или через диапазон адресов 0x400C0000 .. 0x400C1FFF шины инструкций. В отличие от большинства других областей памяти, к памяти RTC FAST нельзя получить доступ из ядра APP_CPU. Два диапазона адресов доступа PRO_CPU к памяти RTC FAST имеют одинаковый порядок. Так, например, адреса 0x3FF80000 и 0x400C0000 обращаются к одному и тому же слову. На APP_CPU эти адреса не предоставляют доступ к RTC FAST Memory или к любой другой области памяти. RTC SLOW Memory. RTC SLOW Memory занимает 8 KB SRAM, и эта область может быть прочитана и записана любым CPU в диапазоне адресов 0x50000000 .. 0x50001FFF. Этот диапазон адресов одинаковый и для шины данных, и для шины инструкций. ESP32 может получить доступ к внешней памяти SPI Flash и SPI SRAM в качестве внешней памяти. Таблица 4 предоставляет список областей внешней памяти, к которым может получить доступ любой CPU через шину данных и шину инструкций. Когда CPU осуществляет доступ к внешней памяти через кэш и MMU, кэш будет отображать адрес CPU на внешний физический адрес памяти (адресном пространстве внешней памяти), в соответствии с настройками MMU. С помощью этого отображения адресов ESP32 может адресовать 16 MB External Flash и 8 MB External SRAM. Таблица 4. External Memory Address Mapping.
Кэш. Как показано на рис. 3, каждый из двух CPU имеет 32 KB кэша для доступа к внешней памяти. PRO_CPU использует бит PRO_CACHE_ENABLE в регистре DPORT_PRO_CACHE_CTRL_REG, чтобы разрешить кэш, в то время как APP_CPU использует бит APP_CACHE_ENABLE в регистре DPORT_APP_CACHE_CTRL_REG для разрешения той же самой функции. Рис. 3. Блок-схема кэша. ESP32 использует двусторонний ассоциативный кэш (two-way set-associative cache). Когда функция кэша используется либо PRO_CPU, либо APP_CPU, биты CACHE_MUX_MODE[1:0] в регистре DPORT_CACHE_MUX_MODE_REG можно установить для выбора POOL0 или POOL1 в памяти Internal SRAM0 для использования в качестве кэша. Когда оба PRO_CPU и APP_CPU используют функцию кэширования, POOL0 и POOL1 в памяти Internal SRAM0 будут использоваться одновременно в качестве кэша, хотя они также могут использоваться шиной инструкций. Это показано ниже в таблице 5. Таблица 5. Режим кэша памяти.
Как показано в таблице 5, когда биты CACHE_MUX_MODE установлены в 1 или 2, PRO_CPU и APP_CPU не могут разрешить функцию кэша одновременно. Когда функция кэша разрешена, POOL0 или POOL1 могут использоваться только в качестве памяти кэша, и не могут также использоваться шиной инструкций. Кэш ESP32 поддерживает функцию Flush. Когда используется Flush, то данные, которые записаны в кэше, перезаписываются в External SRAM, и становятся в кэше не актуальными. Чтобы разрешить функцию Flush, сначала очистите бит x_CACHE_FLUSH_ENA в регистре DPORT_x_CACHE_CTRL_REG, затем установите этот бит в 1. После этого аппаратура системы установит в 1 бит x_CACHE_FLUSH_DONE. Здесь буквой x обозначено "PRO" или "APP", показывая принадлежность операции flush к определенному ядру CPU. Для дополнительной информации по адресации кэша ESP32 см. врезки "Внутренняя память" и "Внешняя память". Скорость памяти. Память ROM, как и память SRAM, обе тактируются от CPU_CLK, и к ним CPU может получить доступ за один такт. Память RTC FAST тактируется от APB_CLOCK, и память RTC SLOW тактируется от FAST_CLOCK, так что доступ к этим двум областям памяти может быть медленнее. Для доступа к памяти DMA использует APB_CLK. Внутри SRAM организована в виде банков по 32K. Каждый CPU и канал DMA может одновременно обращаться к SRAM на полной скорости при условии, что они имеют доступ к адресам в различных банках памяти. [Периферийные устройства] У ESP32 есть 41 периферийных устройства. В таблице 6 показаны эти устройства и их соответствующие диапазоны адресов. Почти все модули периферийных устройств могут быть доступны для любого CPU по одному и тому же адресу за только одним исключением: PID-контроллер. Таблица 6. Peripheral Address Mapping.
Замечания: • Периферийные устройства, к которым CPU осуществляет доступ через адреса 0x3FF40000 .. 0x3FF7FFFF (DPORT адрес), также могут быть доступны через адреса 0x60000000 ~ 0x6003FFFF (AHB адрес). Адрес (0x3FF40000 + n) и (0x60000000 + n) производят доступ к одному и тому же содержимому, где n = 0 .. 0x3FFFF. Асимметричный PID-контроллер. В системе ESP32 есть два PID-контроллера. Они обслуживают соответственно ядра PRO_CPU и APP_CPU. PRO_CPU и APP_CPU могут получить доступ только к своему PID-контроллеру, но не к чужому. Каждый CPU использует одинаковый диапазон памяти 0x3FF1F000 .. 3FF1FFFF для доступа к своему PID-контроллеру. Несмежные (прерывистые) диапазоны адресов периферийных устройств. Периферийное устройство SDIO Slave состоит из трех частей, и два CPU используют несмежные адреса для доступа к ним. Три части доступны в диапазонах адресов 0x3FF4B000 .. 3FF4BFFF, 0x3FF55000 .. 3FF55FFF и 0x3FF58000 .. 3FF58FFF шины данных каждого CPU. Подобно другим периферийным устройствам, доступ к этим периферийным устройствам идентичен для обоих CPU. [Словарик] AHB Advanced High-speed Bus, продвинутая высокоскоростная шина. APB Advanced Peripheral Bus, продвинутая шина периферийных устройств. DPORT порт шины данных. CPU Central Processor Unit, вычислительное ядро. ECO Engineering Change Orders, указания по исправлению ошибок кристалла в зависимости от его версии [4]. IO ввод/вывод. MMU Memory Management Unit, блок управления памятью. MUX мультиплексор. PID пропорциональный интегрально-дифференциальный (ПИД) регулятор. ROM Read-Only Memory, память только для чтения, ПЗУ. RTC Real Tile Clock, часы реального времени. SRAM внутреннее ОЗУ с ускоренным доступом. [Ссылки] 1. ESP32 Technical Reference Manual site:docs.espressif.com. |