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

Регистры 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 — чтение и запись с побочным действием) и значение после сброса.

Блоки периферии

Адреса всех блоков

Базовые адреса блоков периферии по файлу addressmap.h pico-sdk. Страницы с описанием регистров есть у блоков со ссылкой; у TBMAN слишком мало регистров для отдельной страницы.

БлокЭкземпляры и адресаРегистров
ADCADC 0x4004 C0009
BUSCTRLBUSCTRL 0x4003 000010
CLOCKSCLOCKS 0x4000 800049
DMADMA 0x5000 0000233
I2CI2C0 0x4004 4000, I2C1 0x4004 800042
IO_BANK0IO_BANK0 0x4001 4000100
IO_QSPIIO_QSPI 0x4001 800022
M0PLUSPPB 0xE000 000030
PADS_BANK0PADS_BANK0 0x4001 C00033
PADS_QSPIPADS_QSPI 0x4002 00007
PIOPIO0 0x5020 0000, PIO1 0x5030 000081
PLLPLL_SYS 0x4002 8000, PLL_USB 0x4002 C0004
PSMPSM 0x4001 00004
PWMPWM 0x4005 000045
RESETSRESETS 0x4000 C0003
ROSCROSC 0x4006 00009
RTCRTC 0x4005 C00012
SIOSIO 0xD000 000094
SPISPI0 0x4003 C000, SPI1 0x4004 000018
SSIXIP_SSI 0x1800 000028
SYSCFGSYSCFG 0x4000 40007
SYSINFOSYSINFO 0x4000 00003
TBMANTBMAN 0x4006 C0001
TIMERTIMER 0x4005 400017
UARTUART0 0x4003 4000, UART1 0x4003 800022
USBUSBCTRL_REGS 0x5011 000038
USB_DEVICE_DPRAMUSBCTRL_DPRAM 0x5010 000064
VREG_AND_CHIP_RESETVREG_AND_CHIP_RESET 0x4006 40003
WATCHDOGWATCHDOG 0x4005 800012
XIPXIP_CTRL 0x1400 00008
XOSCXOSC 0x4002 40005

Выводы чипа и функции 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: базовый адрес блока плюс смещение регистра.

Источники

  1. Raspberry Pi. RP2040 Datasheet (build 2025-02-20) — разделы «List of Registers»: назначение регистров и полей, значения после сброса; раздел 2.2 — карта адресов
  2. Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2040/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause

Нашли ошибку в регистрах?