Регистры XIP RP2040
Регистры блока XIP RP2040, через который программа выполняется прямо из внешней флеш-памяти: управление кэшем, его сброс, счётчики попаданий и потоковое чтение флеш-памяти в FIFO для DMA.
Программа RP2040 хранится во внешней флеш-памяти на QSPI и выполняется прямо из неё. Чтобы не ждать флеш-память на каждом обращении, блок XIP держит кэш объёмом 16 КБ — двухканальный, с попаданием за один такт (даташит RP2040, раздел 2.6.3).
Если кэш выключить, его память становится ещё одним банком SRAM на 16 КБ по адресу 0x1500 0000. Сброс кэша регистром FLUSH очищает только теги, а данные в памяти остаются, поэтому содержимое такой SRAM переживает сброс кэша.
Для больших объёмов есть потоковое чтение: адрес задают в STREAM_ADDR, число слов — в STREAM_CTR, и блок в свободных тактах шины QSPI перекладывает данные в FIFO, откуда их забирает DMA.
| Экземпляр | Базовый адрес |
|---|---|
| XIP_CTRL | 0x1400 0000 |
В RP2350 блок XIP устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры XIP_CTRL RP2350».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| XIP_CTRL | 0x00 | Управление кэшем | 0x0000 0003 |
| XIP_FLUSH | 0x04 | Сброс кэша | 0x0000 0000 |
| XIP_STAT | 0x08 | Состояние кэша и FIFO потокового чтения | 0x0000 0002 |
| XIP_CTR_HIT | 0x0C | Счётчик попаданий в кэш | 0x0000 0000 |
| XIP_CTR_ACC | 0x10 | Счётчик обращений к XIP | 0x0000 0000 |
| XIP_STREAM_ADDR | 0x14 | Адрес потокового чтения | 0x0000 0000 |
| XIP_STREAM_CTR | 0x18 | Число слов потокового чтения | 0x0000 0000 |
| XIP_STREAM_FIFO | 0x1C | FIFO потокового чтения | 0x0000 0000 |
XIP_CTRL — управление кэшем
Смещение 0x00, адрес 0x1400 0000, после сброса 0x0000 0003. Макросы pico-sdk: XIP_CTRL_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | POWER_DOWN | — | ERR_BADWRITE | EN | |||||||||||
- POWER_DOWN (бит 3, чтение и запись, после сброса 0x0) — Отключение питания памяти кэша: содержимое сохраняется, но недоступно; заодно выключает кэш.
- ERR_BADWRITE (бит 1, чтение и запись, после сброса 0x1) — Запись в кэшируемые области, кроме основной, вызывает ошибку шины; при 0 такие записи игнорируются.
- EN (бит 0, чтение и запись, после сброса 0x1) — Включение кэша; без кэша все обращения идут прямо во флеш-память, а сам кэш доступен как SRAM.
XIP_FLUSH — сброс кэша
Смещение 0x04, адрес 0x1400 0004, после сброса 0x0000 0000, сбрасывается сам. Макросы pico-sdk: XIP_FLUSH_…
Отдельных полей нет: значение занимает бит 0, остальные биты не используются.
XIP_STAT — состояние кэша и FIFO потокового чтения
Смещение 0x08, адрес 0x1400 0008, после сброса 0x0000 0002. Макросы pico-sdk: XIP_STAT_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | FIFO_FULL | FIFO_EMPTY | FLUSH_READY | ||||||||||||
- FIFO_FULL (бит 2, только чтение, после сброса 0x0) — FIFO потокового чтения заполнено (в нём два слова).
- FIFO_EMPTY (бит 1, только чтение, после сброса 0x1) — FIFO потокового чтения пусто.
- FLUSH_READY (бит 0, только чтение, после сброса 0x0) — Сброс кэша завершён; 0 — сброс идёт.
XIP_CTR_HIT — счётчик попаданий в кэш
Смещение 0x0C, адрес 0x1400 000C, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: XIP_CTR_HIT_…
Значение занимает регистр целиком, отдельных полей нет.
XIP_CTR_ACC — счётчик обращений к XIP
Смещение 0x10, адрес 0x1400 0010, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: XIP_CTR_ACC_…
Значение занимает регистр целиком, отдельных полей нет.
XIP_STREAM_ADDR — адрес потокового чтения
Смещение 0x14, адрес 0x1400 0014, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: XIP_STREAM_ADDR_…
Отдельных полей нет: значение занимает биты 31:2, остальные биты не используются.
XIP_STREAM_CTR — число слов потокового чтения
Смещение 0x18, адрес 0x1400 0018, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: XIP_STREAM_CTR_…
Отдельных полей нет: значение занимает биты 21:0, остальные биты не используются.
XIP_STREAM_FIFO — fIFO потокового чтения
Смещение 0x1C, адрес 0x1400 001C, после сброса 0x0000 0000, чтение с побочным действием. Макросы pico-sdk: XIP_STREAM_FIFO_…
Значение занимает регистр целиком, отдельных полей нет.
Частые вопросы
Как использовать кэш XIP RP2040 как обычную память?
Сбросьте бит EN регистра CTRL — кэш выключится, и его 16 КБ будут доступны по адресу 0x1500 0000 как дополнительная SRAM. Программа при этом продолжит выполняться из флеш-памяти, но медленнее, без кэша.
Как измерить эффективность кэша XIP?
Обнулите счётчики CTR_HIT и CTR_ACC записью любого значения, выполните нужный участок программы и разделите CTR_HIT на CTR_ACC — это доля обращений, которые обслужил кэш. Счётчики 32-битные и насыщаются, а не переполняются.
Источники
- Raspberry Pi. RP2040 Datasheet (build 2025-02-20) — раздел 2.6.3.6: список регистров, назначение полей, тип доступа и значения после сброса
- Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2040/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause
Нашли ошибку в регистрах?
Другие регистры RP2040
- Все регистры RP2040Блоки периферии и базовые адреса
- ADC — аналого-цифровой преобразовательADC_CS, ADC_RESULT, ADC_FCS, ADC_FIFO, ADC_DIV, ADC_INTR
- TIMER — системный таймерTIMER_TIMEHW, TIMER_TIMELW, TIMER_TIMEHR, TIMER_TIMELR, TIMER_ALARMn, TIMER_ARMED
- WATCHDOG — сторожевой таймерWATCHDOG_CTRL, WATCHDOG_LOAD, WATCHDOG_REASON, WATCHDOG_SCRATCHn, WATCHDOG_TICK
- UART — последовательные порты UARTUART_UARTDR, UART_UARTRSR, UART_UARTFR, UART_UARTILPR, UART_UARTIBRD, UART_UARTFBRD
- SPI — интерфейсы SPISPI_SSPCR0, SPI_SSPCR1, SPI_SSPDR, SPI_SSPSR, SPI_SSPCPSR, SPI_SSPIMSC
- PWM — широтно-импульсная модуляцияPWM_CHn_CSR, PWM_CHn_DIV, PWM_CHn_CTR, PWM_CHn_CC, PWM_CHn_TOP, PWM_EN
- XOSC — кварцевый генераторXOSC_CTRL, XOSC_STATUS, XOSC_DORMANT, XOSC_STARTUP, XOSC_COUNT
- PLL — умножители частотыPLL_CS, PLL_PWR, PLL_FBDIV_INT, PLL_PRIM
- SYSINFO — сведения о чипеSYSINFO_CHIP_ID, SYSINFO_PLATFORM, SYSINFO_GITREF_RP2040
- VREG — стабилизатор ядра и сброс чипаVREG_AND_CHIP_RESET_VREG, VREG_AND_CHIP_RESET_BOD, VREG_AND_CHIP_RESET_CHIP_RESET
- BUSCTRL — управление шинойBUSCTRL_BUS_PRIORITY, BUSCTRL_BUS_PRIORITY_ACK, BUSCTRL_PERFCTRn, BUSCTRL_PERFSELn
- RTC — часы реального времениRTC_CLKDIV_M1, RTC_SETUP_0, RTC_SETUP_1, RTC_CTRL, RTC_IRQ_SETUP_0, RTC_IRQ_SETUP_1
- RESETS — сброс подсистемRESETS_RESET, RESETS_WDSEL, RESETS_RESET_DONE
- PSM — автомат включения питанияPSM_FRCE_ON, PSM_FRCE_OFF, PSM_WDSEL, PSM_DONE
- ROSC — кольцевой генераторROSC_CTRL, ROSC_FREQA, ROSC_FREQB, ROSC_DORMANT, ROSC_DIV, ROSC_PHASE
- SYSCFG — системная конфигурацияSYSCFG_PROC0_NMI_MASK, SYSCFG_PROC1_NMI_MASK, SYSCFG_PROC_CONFIG, SYSCFG_PROC_IN_SYNC_BYPASS, SYSCFG_PROC_IN_SYNC_BYPASS_HI, SYSCFG_DBGFORCE
- PADS_BANK0 — электрические настройки GPIOPADS_BANK0_VOLTAGE_SELECT, PADS_BANK0_GPIOn, PADS_BANK0_SWCLK, PADS_BANK0_SWD
- PADS_QSPI — электрические настройки выводов QSPIPADS_QSPI_VOLTAGE_SELECT, PADS_QSPI_GPIO_QSPI_SCLK, PADS_QSPI_GPIO_QSPI_SDn, PADS_QSPI_GPIO_QSPI_SS
- I2C — интерфейсы I²CI2C_IC_CON, I2C_IC_TAR, I2C_IC_SAR, I2C_IC_DATA_CMD, I2C_IC_SS_SCL_HCNT, I2C_IC_SS_SCL_LCNT
- PIO — программируемый ввод-выводPIO_CTRL, PIO_FSTAT, PIO_FDEBUG, PIO_FLEVEL, PIO_TXFn, PIO_RXFn
- DMA — контроллер прямого доступа к памятиDMA_CHn_READ_ADDR, DMA_CHn_WRITE_ADDR, DMA_CHn_TRANS_COUNT, DMA_CHn_CTRL_TRIG, DMA_CHn_AL1_CTRL, DMA_CHn_AL1_READ_ADDR
- IO_BANK0 — функции и прерывания GPIOIO_BANK0_GPIOn_STATUS, IO_BANK0_GPIOn_CTRL, IO_BANK0_INTR0, IO_BANK0_INTR1, IO_BANK0_INTR2, IO_BANK0_INTR3
- IO_QSPI — функции и прерывания выводов QSPIIO_QSPI_GPIO_QSPI_SCLK_STATUS, IO_QSPI_GPIO_QSPI_SCLK_CTRL, IO_QSPI_GPIO_QSPI_SS_STATUS, IO_QSPI_GPIO_QSPI_SS_CTRL, IO_QSPI_GPIO_QSPI_SDn_STATUS, IO_QSPI_GPIO_QSPI_SDn_CTRL
- CLOCKS — тактированиеCLOCKS_CLK_GPOUT0_CTRL, CLOCKS_CLK_GPOUTn_DIV, CLOCKS_CLK_GPOUTn_SELECTED, CLOCKS_CLK_GPOUT1_CTRL, CLOCKS_CLK_GPOUT2_CTRL, CLOCKS_CLK_GPOUT3_CTRL
- SIO — однотактный ввод-вывод ядерSIO_CPUID, SIO_GPIO_IN, SIO_GPIO_HI_IN, SIO_GPIO_OUT, SIO_GPIO_OUT_SET, SIO_GPIO_OUT_CLR
- SSI — контроллер QSPI-флешSSI_CTRLR0, SSI_CTRLR1, SSI_SSIENR, SSI_MWCR, SSI_SER, SSI_BAUDR
- USB — контроллер USBUSB_ADDR_ENDP, USB_ADDR_ENDPn, USB_MAIN_CTRL, USB_SOF_WR, USB_SOF_RD, USB_SIE_CTRL
- USB DPRAM — память конечных точек USBUSB_DEVICE_DPRAM_SETUP_PACKET_LOW, USB_DEVICE_DPRAM_SETUP_PACKET_HIGH, USB_DEVICE_DPRAM_EPn_IN_CONTROL, USB_DEVICE_DPRAM_EPn_OUT_CONTROL, USB_DEVICE_DPRAM_EPn_IN_BUFFER_CONTROL, USB_DEVICE_DPRAM_EPn_OUT_BUFFER_CONTROL
- M0PLUS — системные регистры Cortex-M0+M0PLUS_SYST_CSR, M0PLUS_SYST_RVR, M0PLUS_SYST_CVR, M0PLUS_SYST_CALIB, M0PLUS_NVIC_ISER, M0PLUS_NVIC_ICER