Регистры XOSC RP2040
Регистры кварцевого генератора RP2040: включение и выключение защитными кодами, ожидание устойчивой генерации, задержка запуска, остановка генератора в режиме DORMANT и счётчик для коротких задержек.
Кварцевый генератор XOSC даёт точную опорную частоту для PLL и генераторов тактов. RP2040 работает с кварцами от 1 до 15 МГц; эталонная схема и Raspberry Pi Pico используют кварц 12 МГц. Вместо кварца на вход XIN можно подать готовый тактовый сигнал до 50 МГц (даташит RP2040, раздел 2.16).
После включения питания XOSC выключен, и чип работает от кольцевого генератора ROSC. Чтобы включить XOSC, в поле ENABLE регистра CTRL записывают код 0xFAB, а затем ждут флага STABLE в регистре STATUS: генератор считает до значения STARTUP.DELAY, умноженного на 256 тактов кварца, — Raspberry Pi советует около 1 мс.
Запись числа 0x636F6D61 в регистр DORMANT останавливает генератор для глубокого сна; запись 0x77616B65 означает пробуждение. Перед остановкой, как требуют комментарии pico-sdk, выключают PLL и заранее настраивают прерывание, которое разбудит чип.
| Экземпляр | Базовый адрес |
|---|---|
| XOSC | 0x4002 4000 |
В RP2350 блок XOSC устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры XOSC RP2350».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| XOSC_CTRL | 0x00 | Включение и диапазон частот | 0x0000 0000 |
| XOSC_STATUS | 0x04 | Состояние генератора | 0x0000 0000 |
| XOSC_DORMANT | 0x08 | Остановка генератора для сна: 0x636F6D61 — остановить, 0x77616B65 — работа | не определено |
| XOSC_STARTUP | 0x0C | Задержка запуска | 0x0000 0000 |
| XOSC_COUNT | 0x1C | Счётчик вниз на частоте кварца | 0x0000 0000 |
XOSC_CTRL — включение и диапазон частот
Смещение 0x00, адрес 0x4002 4000, после сброса 0x0000 0000. Макросы pico-sdk: XOSC_CTRL_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | ENABLE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ENABLE | FREQ_RANGE | ||||||||||||||
- ENABLE (биты 23:12, чтение и запись, после сброса не определено) — Включение кодом: 0xFAB — включить, 0xD1E — выключить; другой код тоже включает. После сброса генератор выключен, чип работает от ROSC.
Значение Имя в pico-sdk 0xD1E disable 0xFAB enable - FREQ_RANGE (биты 11:0, чтение и запись, после сброса не определено) — Диапазон частот: единственное допустимое значение 0xAA0 — от 1 до 15 МГц.
Значение Имя в pico-sdk 0xAA0 1_15mhz 0xAA1 reserved_1 0xAA2 reserved_2 0xAA3 reserved_3
XOSC_STATUS — состояние генератора
Смещение 0x04, адрес 0x4002 4004, после сброса 0x0000 0000. Макросы pico-sdk: XOSC_STATUS_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| STABLE | — | BADWRITE | — | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ENABLED | — | FREQ_RANGE | ||||||||||||
- STABLE (бит 31, только чтение, после сброса 0x0) — Генератор работает устойчиво, частотой можно пользоваться.
- BADWRITE (бит 24, сброс записью 1, после сброса 0x0) — В CTRL.ENABLE, CTRL.FREQ_RANGE или DORMANT записано недопустимое значение; сбрасывается записью 1.
- ENABLED (бит 12, только чтение, после сброса не определено) — Генератор включён, но ещё может не выйти на устойчивую генерацию.
- FREQ_RANGE (биты 1:0, только чтение, после сброса не определено) — Текущий диапазон частот; всегда читается как 0.
Значение Имя в pico-sdk 0x0 1_15mhz 0x1 reserved_1 0x2 reserved_2 0x3 reserved_3
XOSC_DORMANT — остановка генератора для сна: 0x636F6D61 — остановить, 0x77616B65 — работа
Смещение 0x08, адрес 0x4002 4008, после сброса не определено, чтение и запись. Макросы pico-sdk: XOSC_DORMANT_…
Значение занимает регистр целиком, отдельных полей нет.
XOSC_STARTUP — задержка запуска
Смещение 0x0C, адрес 0x4002 400C, после сброса 0x0000 0000. Макросы pico-sdk: XOSC_STARTUP_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | X4 | — | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DELAY | ||||||||||||||
- X4 (бит 20, чтение и запись, после сброса не определено) — Умножить задержку запуска на 4.
- DELAY (биты 13:0, чтение и запись, после сброса не определено) — Задержка запуска в единицах по 256 периодов кварца; значение 0xC4 — около 50 000 периодов.
XOSC_COUNT — счётчик вниз на частоте кварца
Смещение 0x1C, адрес 0x4002 401C, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: XOSC_COUNT_…
Отдельных полей нет: значение занимает биты 7:0, остальные биты не используются.
Частые вопросы
Как включить кварцевый генератор RP2040 через регистры?
Запишите в STARTUP.DELAY число, равное нужной задержке в тактах кварца, делённой на 256 (для 1 мс при 12 МГц — 47), затем в CTRL поле FREQ_RANGE = 0xAA0 и ENABLE = 0xFAB. Дождитесь, пока бит STABLE регистра STATUS станет 1, — после этого XOSC можно использовать как источник clk_ref и опорную частоту PLL.
Зачем в регистре CTRL генератора XOSC 12-битные коды?
Чтобы случайная запись не выключила генератор: включает только код 0xFAB, выключает только 0xD1E. Неверный код в поле ENABLE включает генератор, а неверное значение FREQ_RANGE не меняет текущего — так записано в описании регистра pico-sdk.
Источники
- Raspberry Pi. RP2040 Datasheet (build 2025-02-20) — раздел 2.16.7: список регистров, назначение полей, тип доступа и значения после сброса
- 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
- 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
- XIP — кэш выполнения из флеш-памятиXIP_CTRL, XIP_FLUSH, XIP_STAT, XIP_CTR_HIT, XIP_CTR_ACC, XIP_STREAM_ADDR
- 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
Статьи и термины
- Кварцевый резонаторКварц у микроконтроллера: подключение, конденсаторы, часовой кварц
- Нагрузочная ёмкость кварцаCL кварца и подбор конденсаторов C1 и C2
- Конденсаторы для кварцаC1 и C2 по CL, запас генерации, уход частоты
- RP2040: выводы и функции GPIO30 GPIO: выводы QFN-56, функции F1–F9, АЦП, QSPI, SWD, питание, токи