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

Регистры 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 и заранее настраивают прерывание, которое разбудит чип.

ЭкземплярБазовый адрес
XOSC0x4002 4000

В RP2350 блок XOSC устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры XOSC RP2350».

Регистры блока

РегистрСмещениеНазначениеПосле сброса
XOSC_CTRL0x00Включение и диапазон частот0x0000 0000
XOSC_STATUS0x04Состояние генератора0x0000 0000
XOSC_DORMANT0x08Остановка генератора для сна: 0x636F6D61 — остановить, 0x77616B65 — работане определено
XOSC_STARTUP0x0CЗадержка запуска0x0000 0000
XOSC_COUNT0x1CСчётчик вниз на частоте кварца0x0000 0000

XOSC_CTRL — включение и диапазон частот

Смещение 0x00, адрес 0x4002 4000, после сброса 0x0000 0000. Макросы pico-sdk: XOSC_CTRL_…

31302928272625242322212019181716
—ENABLE
1514131211109876543210
ENABLEFREQ_RANGE
  • ENABLE (биты 23:12, чтение и запись, после сброса не определено) — Включение кодом: 0xFAB — включить, 0xD1E — выключить; другой код тоже включает. После сброса генератор выключен, чип работает от ROSC.
    ЗначениеИмя в pico-sdk
    0xD1Edisable
    0xFABenable
  • FREQ_RANGE (биты 11:0, чтение и запись, после сброса не определено) — Диапазон частот: единственное допустимое значение 0xAA0 — от 1 до 15 МГц.
    ЗначениеИмя в pico-sdk
    0xAA01_15mhz
    0xAA1reserved_1
    0xAA2reserved_2
    0xAA3reserved_3

XOSC_STATUS — состояние генератора

Смещение 0x04, адрес 0x4002 4004, после сброса 0x0000 0000. Макросы pico-sdk: XOSC_STATUS_…

31302928272625242322212019181716
STABLE—BADWRITE—
1514131211109876543210
—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
    0x01_15mhz
    0x1reserved_1
    0x2reserved_2
    0x3reserved_3

XOSC_DORMANT — остановка генератора для сна: 0x636F6D61 — остановить, 0x77616B65 — работа

Смещение 0x08, адрес 0x4002 4008, после сброса не определено, чтение и запись. Макросы pico-sdk: XOSC_DORMANT_…

Значение занимает регистр целиком, отдельных полей нет.

XOSC_STARTUP — задержка запуска

Смещение 0x0C, адрес 0x4002 400C, после сброса 0x0000 0000. Макросы pico-sdk: XOSC_STARTUP_…

31302928272625242322212019181716
—X4—
1514131211109876543210
—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.

Источники

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

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

Другие регистры RP2040

Статьи и термины