Регистры RP2040
Регистры периферии RP2040: базовые адреса блоков, назначение каждого регистра и поля, тип доступа и значение после сброса — по заголовкам pico-sdk 2.1.1 и даташиту Raspberry Pi.
Периферия RP2040 управляется 32-битными регистрами, расположенными в адресном пространстве чипа: блоки APB начинаются с 0x4000 0000, контроллеры DMA, USB и PIO — с 0x5000 0000, быстрый ввод-вывод SIO — с 0xD000 0000. У каждого блока свой набор регистров; у блоков из нескольких экземпляров — UART0 и UART1, SPI0 и SPI1 — набор одинаковый, отличается только базовый адрес.
Описания составлены по заголовкам hardware_regs из pico-sdk, которые Raspberry Pi генерирует из описания чипа, и по разделам «List of Registers» даташита RP2040. Для каждого поля указаны биты, тип доступа (RW — чтение и запись, RO — только чтение, WC — сброс записью 1, SC — сбрасывается сам, RF и WF — чтение и запись с побочным действием) и значение после сброса.
Блоки периферии
- ADC — аналого-цифровой преобразовательADC_CS, ADC_RESULT, ADC_FCS, ADC_FIFO, ADC_DIV, ADC_INTR, ADC_INTE, ADC_INTF, ADC_INTS
- TIMER — системный таймерTIMER_TIMEHW, TIMER_TIMELW, TIMER_TIMEHR, TIMER_TIMELR, TIMER_ALARMn, TIMER_ARMED, TIMER_TIMERAWH, TIMER_TIMERAWL, TIMER_DBGPAUSE, TIMER_PAUSE, TIMER_INTR, TIMER_INTE, TIMER_INTF, TIMER_INTS
- WATCHDOG — сторожевой таймерWATCHDOG_CTRL, WATCHDOG_LOAD, WATCHDOG_REASON, WATCHDOG_SCRATCHn, WATCHDOG_TICK
- UART — последовательные порты UARTUART_UARTDR, UART_UARTRSR, UART_UARTFR, UART_UARTILPR, UART_UARTIBRD, UART_UARTFBRD, UART_UARTLCR_H, UART_UARTCR, UART_UARTIFLS, UART_UARTIMSC, UART_UARTRIS, UART_UARTMIS, UART_UARTICR, UART_UARTDMACR, UART_UARTPERIPHID0, UART_UARTPERIPHID1, UART_UARTPERIPHID2, UART_UARTPERIPHID3, UART_UARTPCELLID0, UART_UARTPCELLID1, UART_UARTPCELLID2, UART_UARTPCELLID3
- SPI — интерфейсы SPISPI_SSPCR0, SPI_SSPCR1, SPI_SSPDR, SPI_SSPSR, SPI_SSPCPSR, SPI_SSPIMSC, SPI_SSPRIS, SPI_SSPMIS, SPI_SSPICR, SPI_SSPDMACR, SPI_SSPPERIPHID0, SPI_SSPPERIPHID1, SPI_SSPPERIPHID2, SPI_SSPPERIPHID3, SPI_SSPPCELLID0, SPI_SSPPCELLID1, SPI_SSPPCELLID2, SPI_SSPPCELLID3
- PWM — широтно-импульсная модуляцияPWM_CHn_CSR, PWM_CHn_DIV, PWM_CHn_CTR, PWM_CHn_CC, PWM_CHn_TOP, PWM_EN, PWM_INTR, PWM_INTE, PWM_INTF, PWM_INTS
- 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, RTC_RTC_1, RTC_RTC_0, RTC_INTR, RTC_INTE, RTC_INTF, RTC_INTS
- 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, ROSC_STATUS, ROSC_RANDOMBIT, ROSC_COUNT
- 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, SYSCFG_MEMPOWERDOWN
- XIP — кэш выполнения из флеш-памятиXIP_CTRL, XIP_FLUSH, XIP_STAT, XIP_CTR_HIT, XIP_CTR_ACC, XIP_STREAM_ADDR, XIP_STREAM_CTR, XIP_STREAM_FIFO
- 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, I2C_IC_FS_SCL_HCNT, I2C_IC_FS_SCL_LCNT, I2C_IC_INTR_STAT, I2C_IC_INTR_MASK, I2C_IC_RAW_INTR_STAT, I2C_IC_RX_TL, I2C_IC_TX_TL, I2C_IC_CLR_INTR, I2C_IC_CLR_RX_UNDER, I2C_IC_CLR_RX_OVER, I2C_IC_CLR_TX_OVER, I2C_IC_CLR_RD_REQ, I2C_IC_CLR_TX_ABRT, I2C_IC_CLR_RX_DONE, I2C_IC_CLR_ACTIVITY, I2C_IC_CLR_STOP_DET, I2C_IC_CLR_START_DET, I2C_IC_CLR_GEN_CALL, I2C_IC_ENABLE, I2C_IC_STATUS, I2C_IC_TXFLR, I2C_IC_RXFLR, I2C_IC_SDA_HOLD, I2C_IC_TX_ABRT_SOURCE, I2C_IC_SLV_DATA_NACK_ONLY, I2C_IC_DMA_CR, I2C_IC_DMA_TDLR, I2C_IC_DMA_RDLR, I2C_IC_SDA_SETUP, I2C_IC_ACK_GENERAL_CALL, I2C_IC_ENABLE_STATUS, I2C_IC_FS_SPKLEN, I2C_IC_CLR_RESTART_DET, I2C_IC_COMP_PARAM_1, I2C_IC_COMP_VERSION, I2C_IC_COMP_TYPE
- PIO — программируемый ввод-выводPIO_CTRL, PIO_FSTAT, PIO_FDEBUG, PIO_FLEVEL, PIO_TXFn, PIO_RXFn, PIO_IRQ, PIO_IRQ_FORCE, PIO_INPUT_SYNC_BYPASS, PIO_DBG_PADOUT, PIO_DBG_PADOE, PIO_DBG_CFGINFO, PIO_INSTR_MEMn, PIO_SMn_CLKDIV, PIO_SMn_EXECCTRL, PIO_SMn_SHIFTCTRL, PIO_SMn_ADDR, PIO_SMn_INSTR, PIO_SMn_PINCTRL, PIO_INTR, PIO_IRQ0_INTE, PIO_IRQ0_INTF, PIO_IRQ0_INTS, PIO_IRQ1_INTE, PIO_IRQ1_INTF, PIO_IRQ1_INTS
- 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, DMA_CHn_AL1_WRITE_ADDR, DMA_CHn_AL1_TRANS_COUNT_TRIG, DMA_CHn_AL2_CTRL, DMA_CHn_AL2_TRANS_COUNT, DMA_CHn_AL2_READ_ADDR, DMA_CHn_AL2_WRITE_ADDR_TRIG, DMA_CHn_AL3_CTRL, DMA_CHn_AL3_WRITE_ADDR, DMA_CHn_AL3_TRANS_COUNT, DMA_CHn_AL3_READ_ADDR_TRIG, DMA_INTR, DMA_INTE0, DMA_INTF0, DMA_INTS0, DMA_INTE1, DMA_INTF1, DMA_INTS1, DMA_TIMERn, DMA_MULTI_CHAN_TRIGGER, DMA_SNIFF_CTRL, DMA_SNIFF_DATA, DMA_FIFO_LEVELS, DMA_CHAN_ABORT, DMA_N_CHANNELS, DMA_CHn_DBG_CTDREQ, DMA_CHn_DBG_TCR
- IO_BANK0 — функции и прерывания GPIOIO_BANK0_GPIOn_STATUS, IO_BANK0_GPIOn_CTRL, IO_BANK0_INTR0, IO_BANK0_INTR1, IO_BANK0_INTR2, IO_BANK0_INTR3, IO_BANK0_PROC0_INTE0, IO_BANK0_PROC0_INTE1, IO_BANK0_PROC0_INTE2, IO_BANK0_PROC0_INTE3, IO_BANK0_PROC0_INTF0, IO_BANK0_PROC0_INTF1, IO_BANK0_PROC0_INTF2, IO_BANK0_PROC0_INTF3, IO_BANK0_PROC0_INTS0, IO_BANK0_PROC0_INTS1, IO_BANK0_PROC0_INTS2, IO_BANK0_PROC0_INTS3, IO_BANK0_PROC1_INTE0, IO_BANK0_PROC1_INTE1, IO_BANK0_PROC1_INTE2, IO_BANK0_PROC1_INTE3, IO_BANK0_PROC1_INTF0, IO_BANK0_PROC1_INTF1, IO_BANK0_PROC1_INTF2, IO_BANK0_PROC1_INTF3, IO_BANK0_PROC1_INTS0, IO_BANK0_PROC1_INTS1, IO_BANK0_PROC1_INTS2, IO_BANK0_PROC1_INTS3, IO_BANK0_DORMANT_WAKE_INTE0, IO_BANK0_DORMANT_WAKE_INTE1, IO_BANK0_DORMANT_WAKE_INTE2, IO_BANK0_DORMANT_WAKE_INTE3, IO_BANK0_DORMANT_WAKE_INTF0, IO_BANK0_DORMANT_WAKE_INTF1, IO_BANK0_DORMANT_WAKE_INTF2, IO_BANK0_DORMANT_WAKE_INTF3, IO_BANK0_DORMANT_WAKE_INTS0, IO_BANK0_DORMANT_WAKE_INTS1, IO_BANK0_DORMANT_WAKE_INTS2, IO_BANK0_DORMANT_WAKE_INTS3
- 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, IO_QSPI_INTR, IO_QSPI_PROC0_INTE, IO_QSPI_PROC0_INTF, IO_QSPI_PROC0_INTS, IO_QSPI_PROC1_INTE, IO_QSPI_PROC1_INTF, IO_QSPI_PROC1_INTS, IO_QSPI_DORMANT_WAKE_INTE, IO_QSPI_DORMANT_WAKE_INTF, IO_QSPI_DORMANT_WAKE_INTS
- 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, CLOCKS_CLK_REF_CTRL, CLOCKS_CLK_REF_DIV, CLOCKS_CLK_REF_SELECTED, CLOCKS_CLK_SYS_CTRL, CLOCKS_CLK_SYS_DIV, CLOCKS_CLK_SYS_SELECTED, CLOCKS_CLK_PERI_CTRL, CLOCKS_CLK_PERI_SELECTED, CLOCKS_CLK_USB_CTRL, CLOCKS_CLK_USB_DIV, CLOCKS_CLK_USB_SELECTED, CLOCKS_CLK_ADC_CTRL, CLOCKS_CLK_ADC_DIV, CLOCKS_CLK_ADC_SELECTED, CLOCKS_CLK_RTC_CTRL, CLOCKS_CLK_RTC_DIV, CLOCKS_CLK_RTC_SELECTED, CLOCKS_CLK_SYS_RESUS_CTRL, CLOCKS_CLK_SYS_RESUS_STATUS, CLOCKS_FC0_REF_KHZ, CLOCKS_FC0_MIN_KHZ, CLOCKS_FC0_MAX_KHZ, CLOCKS_FC0_DELAY, CLOCKS_FC0_INTERVAL, CLOCKS_FC0_SRC, CLOCKS_FC0_STATUS, CLOCKS_FC0_RESULT, CLOCKS_WAKE_EN0, CLOCKS_WAKE_EN1, CLOCKS_SLEEP_EN0, CLOCKS_SLEEP_EN1, CLOCKS_ENABLED0, CLOCKS_ENABLED1, CLOCKS_INTR, CLOCKS_INTE, CLOCKS_INTF, CLOCKS_INTS
- SIO — однотактный ввод-вывод ядерSIO_CPUID, SIO_GPIO_IN, SIO_GPIO_HI_IN, SIO_GPIO_OUT, SIO_GPIO_OUT_SET, SIO_GPIO_OUT_CLR, SIO_GPIO_OUT_XOR, SIO_GPIO_OE, SIO_GPIO_OE_SET, SIO_GPIO_OE_CLR, SIO_GPIO_OE_XOR, SIO_GPIO_HI_OUT, SIO_GPIO_HI_OUT_SET, SIO_GPIO_HI_OUT_CLR, SIO_GPIO_HI_OUT_XOR, SIO_GPIO_HI_OE, SIO_GPIO_HI_OE_SET, SIO_GPIO_HI_OE_CLR, SIO_GPIO_HI_OE_XOR, SIO_FIFO_ST, SIO_FIFO_WR, SIO_FIFO_RD, SIO_SPINLOCK_ST, SIO_DIV_UDIVIDEND, SIO_DIV_UDIVISOR, SIO_DIV_SDIVIDEND, SIO_DIV_SDIVISOR, SIO_DIV_QUOTIENT, SIO_DIV_REMAINDER, SIO_DIV_CSR, SIO_INTERP0_ACCUM0, SIO_INTERP0_ACCUM1, SIO_INTERP0_BASE0, SIO_INTERP0_BASE1, SIO_INTERP0_BASE2, SIO_INTERP0_POP_LANE0, SIO_INTERP0_POP_LANE1, SIO_INTERP0_POP_FULL, SIO_INTERP0_PEEK_LANE0, SIO_INTERP0_PEEK_LANE1, SIO_INTERP0_PEEK_FULL, SIO_INTERP0_CTRL_LANE0, SIO_INTERP0_CTRL_LANE1, SIO_INTERP0_ACCUM0_ADD, SIO_INTERP0_ACCUM1_ADD, SIO_INTERP0_BASE_1AND0, SIO_INTERP1_ACCUM0, SIO_INTERP1_ACCUM1, SIO_INTERP1_BASE0, SIO_INTERP1_BASE1, SIO_INTERP1_BASE2, SIO_INTERP1_POP_LANE0, SIO_INTERP1_POP_LANE1, SIO_INTERP1_POP_FULL, SIO_INTERP1_PEEK_LANE0, SIO_INTERP1_PEEK_LANE1, SIO_INTERP1_PEEK_FULL, SIO_INTERP1_CTRL_LANE0, SIO_INTERP1_CTRL_LANE1, SIO_INTERP1_ACCUM0_ADD, SIO_INTERP1_ACCUM1_ADD, SIO_INTERP1_BASE_1AND0, SIO_SPINLOCKn
- SSI — контроллер QSPI-флешSSI_CTRLR0, SSI_CTRLR1, SSI_SSIENR, SSI_MWCR, SSI_SER, SSI_BAUDR, SSI_TXFTLR, SSI_RXFTLR, SSI_TXFLR, SSI_RXFLR, SSI_SR, SSI_IMR, SSI_ISR, SSI_RISR, SSI_TXOICR, SSI_RXOICR, SSI_RXUICR, SSI_MSTICR, SSI_ICR, SSI_DMACR, SSI_DMATDLR, SSI_DMARDLR, SSI_IDR, SSI_SSI_VERSION_ID, SSI_DR0, SSI_RX_SAMPLE_DLY, SSI_SPI_CTRLR0, SSI_TXD_DRIVE_EDGE
- USB — контроллер USBUSB_ADDR_ENDP, USB_ADDR_ENDPn, USB_MAIN_CTRL, USB_SOF_WR, USB_SOF_RD, USB_SIE_CTRL, USB_SIE_STATUS, USB_INT_EP_CTRL, USB_BUFF_STATUS, USB_BUFF_CPU_SHOULD_HANDLE, USB_EP_ABORT, USB_EP_ABORT_DONE, USB_EP_STALL_ARM, USB_NAK_POLL, USB_EP_STATUS_STALL_NAK, USB_USB_MUXING, USB_USB_PWR, USB_USBPHY_DIRECT, USB_USBPHY_DIRECT_OVERRIDE, USB_USBPHY_TRIM, USB_INTR, USB_INTE, USB_INTF, USB_INTS
- 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, M0PLUS_NVIC_ISPR, M0PLUS_NVIC_ICPR, M0PLUS_NVIC_IPR0, M0PLUS_NVIC_IPR1, M0PLUS_NVIC_IPR2, M0PLUS_NVIC_IPR3, M0PLUS_NVIC_IPR4, M0PLUS_NVIC_IPR5, M0PLUS_NVIC_IPR6, M0PLUS_NVIC_IPR7, M0PLUS_CPUID, M0PLUS_ICSR, M0PLUS_VTOR, M0PLUS_AIRCR, M0PLUS_SCR, M0PLUS_CCR, M0PLUS_SHPR2, M0PLUS_SHPR3, M0PLUS_SHCSR, M0PLUS_MPU_TYPE, M0PLUS_MPU_CTRL, M0PLUS_MPU_RNR, M0PLUS_MPU_RBAR, M0PLUS_MPU_RASR
Адреса всех блоков
Базовые адреса блоков периферии по файлу addressmap.h pico-sdk. Страницы с описанием регистров есть у блоков со ссылкой; у TBMAN слишком мало регистров для отдельной страницы.
| Блок | Экземпляры и адреса | Регистров |
|---|---|---|
| ADC | ADC 0x4004 C000 | 9 |
| BUSCTRL | BUSCTRL 0x4003 0000 | 10 |
| CLOCKS | CLOCKS 0x4000 8000 | 49 |
| DMA | DMA 0x5000 0000 | 233 |
| I2C | I2C0 0x4004 4000, I2C1 0x4004 8000 | 42 |
| IO_BANK0 | IO_BANK0 0x4001 4000 | 100 |
| IO_QSPI | IO_QSPI 0x4001 8000 | 22 |
| M0PLUS | PPB 0xE000 0000 | 30 |
| PADS_BANK0 | PADS_BANK0 0x4001 C000 | 33 |
| PADS_QSPI | PADS_QSPI 0x4002 0000 | 7 |
| PIO | PIO0 0x5020 0000, PIO1 0x5030 0000 | 81 |
| PLL | PLL_SYS 0x4002 8000, PLL_USB 0x4002 C000 | 4 |
| PSM | PSM 0x4001 0000 | 4 |
| PWM | PWM 0x4005 0000 | 45 |
| RESETS | RESETS 0x4000 C000 | 3 |
| ROSC | ROSC 0x4006 0000 | 9 |
| RTC | RTC 0x4005 C000 | 12 |
| SIO | SIO 0xD000 0000 | 94 |
| SPI | SPI0 0x4003 C000, SPI1 0x4004 0000 | 18 |
| SSI | XIP_SSI 0x1800 0000 | 28 |
| SYSCFG | SYSCFG 0x4000 4000 | 7 |
| SYSINFO | SYSINFO 0x4000 0000 | 3 |
| TBMAN | TBMAN 0x4006 C000 | 1 |
| TIMER | TIMER 0x4005 4000 | 17 |
| UART | UART0 0x4003 4000, UART1 0x4003 8000 | 22 |
| USB | USBCTRL_REGS 0x5011 0000 | 38 |
| USB_DEVICE_DPRAM | USBCTRL_DPRAM 0x5010 0000 | 64 |
| VREG_AND_CHIP_RESET | VREG_AND_CHIP_RESET 0x4006 4000 | 3 |
| WATCHDOG | WATCHDOG 0x4005 8000 | 12 |
| XIP | XIP_CTRL 0x1400 0000 | 8 |
| XOSC | XOSC 0x4002 4000 | 5 |
Выводы чипа и функции GPIO — на странице RP2040.
Частые вопросы
Что означают типы доступа RW, RO, WC и SC в регистрах RP2040?
RW — поле читается и записывается, RO — только читается, WC — сбрасывается записью единицы, SC — сбрасывается само после действия (например, бит запуска). RF и WF — чтение или запись с побочным действием: чтение FIFO забирает из него значение, запись в регистр загрузки запускает счёт.
Как обратиться к регистру RP2040 из программы на C?
В pico-sdk для каждого блока есть структура и указатель на экземпляр, например adc_hw->cs, а макросы полей вида ADC_CS_EN_BITS задают маски. Те же адреса можно использовать и без SDK: базовый адрес блока плюс смещение регистра.
Источники
- Raspberry Pi. RP2040 Datasheet (build 2025-02-20) — разделы «List of Registers»: назначение регистров и полей, значения после сброса; раздел 2.2 — карта адресов
- Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2040/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause
Нашли ошибку в регистрах?