По какому адресу исполнять код на STM32F7: 0x0800 0000 или 0x0020 0000?
Обновлено Редакция GAW
У STM32F746 и F756 встроенная флеш-память подключена к ядру Cortex-M7 двумя путями. Один — шина ITCM, тесно связанная с ядром (термин «TCM»); перед ней стоит ускоритель ART. Второй — шина AXIM через матрицу шин; на этом пути работает собственный кэш L1 ядра.
Два адреса одной памяти
| ITCM | AXIM | |
|---|---|---|
| Адреса (RM0385, разд. 2.2.2) | 0x0020 0000 – 0x002F FFFF | 0x0800 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 не подключена.
Источники
- 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
- STMicroelectronics. cmsis-device-f7, Include/stm32f746xx.h (commit 2352e88) — FLASHAXI_BASE = 0x08000000, FLASHITCM_BASE = 0x00200000; FLASH_ACR_ARTEN — бит 9
Нашли ошибку?
Смотрите также
- STM32F7Cortex-M7 до 216 МГц: F72x/F73x, F74x/F75x, F76x/F77x — линейки, память, загрузка и распиновки
- TCM (ITCM, DTCM)ОЗУ на прямых интерфейсах ядра Cortex-M7: предсказуемый доступ без кэша
- ART Accelerator (кэш флеш STM32)Предвыборка и кэш, скрывающие такты ожидания флеш-памяти
- Сколько тактов ожидания FLASH нужно STM32F746 на 216 МГц?216 МГц: 7 тактов при 2,7–3,6 В, 8 — при 2,4–2,7 В, 9 — при 2,1–2,4 В
- Скрипт компоновщикаФайл .ld с картой памяти и правилами размещения секций прошивки