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

По какому адресу исполнять код на STM32F7: 0x0800 0000 или 0x0020 0000?

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

У STM32F746 и F756 встроенная флеш-память подключена к ядру Cortex-M7 двумя путями. Один — шина ITCM, тесно связанная с ядром (термин «TCM»); перед ней стоит ускоритель ART. Второй — шина AXIM через матрицу шин; на этом пути работает собственный кэш L1 ядра.

Два адреса одной памяти

ITCMAXIM
Адреса (RM0385, разд. 2.2.2)0x0020 0000 – 0x002F FFFF0x0800 0000 – 0x080F FFFF
УскорениеART, 64 строки по 256 биткэш инструкций и данных L1 ядра
Запись и стираниенетда
DMAчерез AHBчерез AHB
Загрузка по умолчаниюBOOT_ADD0 = 0x0080 (заводское)BOOT_ADD0 = 0x2000

Что выбрать

  • Код без кэша или с жёсткими требованиями ко времени — разместить в области ITCM: ART по оценке ST на CoreMark даёт скорость исполнения без тактов ожидания до 216 МГц (ответ «Сколько тактов ожидания нужно STM32F746», термин «ART Accelerator»).
  • Обычный проект с включёнными кэшами — можно оставить адрес 0x0800 0000, как делают шаблоны CubeMX. Кэш L1 включают функциями CMSIS SCB_EnableICache() и SCB_EnableDCache().
  • Данные для DMA во флеш-памяти — доступ всё равно через AHB, адрес для ядра на это не влияет.

Адрес исполнения задаёт скрипт компоновщика: область FLASH с ORIGIN = 0x00200000 переносит код на ITCM. Вектор сброса при этом читается по адресу из байта опций BOOT_ADD0, а таблицу векторов программа указывает в регистре VTOR. Карта памяти и линейки — на странице STM32F7.

Похожие вопросы

Почему проект из CubeMX собран на 0x0800 0000, хотя загрузка идёт с 0x0020 0000?

Обе области — одна и та же флеш-память, поэтому вектор сброса читается по адресу ITCM, а дальше код исполняется оттуда, куда его разместил компоновщик. Если в скрипте компоновщика область FLASH начинается с 0x0800 0000, программа работает через AXIM, и её скорость зависит от включённого I-кэша.

Можно ли писать во флеш-память по адресу 0x0020 0000?

Нет: по RM0385 интерфейс ITCM поддерживает только чтение и исполнение. Программирование и стирание выполняются через интерфейс AHB, то есть по адресам с 0x0800 0000.

Видит ли DMA таблицы, лежащие во флеш-памяти?

Да, но всегда через интерфейс AHB: RM0385 указывает, что DMA обращаются к флеш-памяти через AHB независимо от того, через какой интерфейс к ней обращается ядро. Шина ITCM к матрице шин для DMA не подключена.

Источники

  1. STMicroelectronics. RM0385: STM32F75xxx and STM32F74xxx advanced Arm-based 32-bit MCUs. Reference manual, Rev 9 — разд. 2.1.4: шина ITCM — выборка инструкций и чтение данных из флеш-памяти на интерфейсе ITCM; разд. 2.1.6: шина ITCM недоступна через AHBS, DMA с флеш-памятью на ITCM идёт через AHB; разд. 2.2.2: флеш-память на AXIM — 0x0800 0000–0x080F FFFF, на ITCM — 0x0020 0000–0x002F FFFF; разд. 2.5, табл. 2: загрузка по BOOT_ADD0, заводское значение — флеш-память на ITCM с 0x0020 0000, BOOT_ADD1 — системный загрузчик 0x0010 0000; разд. 3.2: 64-битный интерфейс ITCM — исполнение и чтение, запись не поддерживается, ART 64 строки по 256 бит; 64-битный интерфейс AHB — исполнение, чтение и запись, DMA всегда через AHB; разд. 3.3.2: ART только для ITCM, по CoreMark эквивалентен 0 WS до 216 МГц; разд. 3.4.1: BOOT_ADD0 = 0x0080 — загрузка с ITCM, 0x2000 — с AXIM
  2. STMicroelectronics. cmsis-device-f7, Include/stm32f746xx.h (commit 2352e88) — FLASHAXI_BASE = 0x08000000, FLASHITCM_BASE = 0x00200000; FLASH_ACR_ARTEN — бит 9

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