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

Регистры PLL RP2350

Регистры двух PLL RP2350 — системной и USB: делитель опорной частоты, множитель, два выходных делителя, флаг захвата, обход PLL, отключение питания узлов и прерывание при потере захвата.

В RP2350 две одинаковые PLL: PLL_SYS тактирует систему до 150 МГц, PLL_USB даёт 48 МГц для USB. Выходная частота равна (FREF / REFDIV) × FBDIV / (POSTDIV1 × POSTDIV2), где VCO должен быть от 750 до 1600 МГц, FBDIV — от 16 до 320, каждый выходной делитель — от 1 до 7, а частота на входе фазового детектора — не меньше 5 МГц (даташит RP2350, раздел 8.6).

Пример из даташита: кварц 12 МГц и FBDIV = 100 дают VCO 1200 МГц, а POSTDIV1 = 6 и POSTDIV2 = 2 — ровные 100 МГц. При разных делителях больший ставят в POSTDIV1 — так меньше потребление; чем выше VCO, тем меньше дрожание выходной частоты.

Новое по сравнению с RP2040 — флаг LOCK_N в регистре CS: он устанавливается, если PLL теряет захват, и через регистры INTR, INTE, INTF и INTS может вызвать прерывание.

ЭкземплярБазовый адрес
PLL_SYS0x4005 0000
PLL_USB0x4005 8000

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

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

РегистрСмещениеНазначениеПосле сброса
PLL_CS0x00Управление и состояние: делитель опорной частоты, захват, обход0x0000 0001
PLL_PWR0x04Отключение питания узлов PLL0x0000 002D
PLL_FBDIV_INT0x08Множитель частоты (делитель обратной связи)0x0000 0000
PLL_PRIM0x0CВыходные делители0x0007 7000
PLL_INTR0x10Необработанные флаги прерываний0x0000 0000
PLL_INTE0x14Разрешение прерываний0x0000 0000
PLL_INTF0x18Принудительная установка прерываний0x0000 0000
PLL_INTS0x1CФлаги прерываний после маски и принуждения0x0000 0000

PLL_CS — управление и состояние: делитель опорной частоты, захват, обход

Смещение 0x00, после сброса 0x0000 0001. Макросы pico-sdk: PLL_CS_…

31302928272625242322212019181716
LOCKLOCK_N—
1514131211109876543210
—BYPASS—REFDIV
  • LOCK (бит 31, только чтение, после сброса 0x0) — PLL захватила частоту, выходом можно пользоваться.
  • LOCK_N (бит 30, сброс записью 1, после сброса 0x0) — PLL потеряла захват; в нормальной работе не устанавливается, сбрасывается записью 1.
  • BYPASS (бит 8, чтение и запись, после сброса 0x0) — Обход: на выход идёт опорная частота вместо поделённой VCO; VCO продолжает работать, но при переключении на выходе возможны сбои.
  • REFDIV (биты 5:0, чтение и запись, после сброса 0x01) — Делитель опорной частоты; 0 не допускается, после изменения ждут LOCK = 1.

PLL_PWR — отключение питания узлов PLL

Смещение 0x04, после сброса 0x0000 002D. Макросы pico-sdk: PLL_PWR_…

1514131211109876543210
—VCOPD—POSTDIVPDDSMPD—PD
  • VCOPD (бит 5, чтение и запись, после сброса 0x1) — Отключение VCO — когда выход PLL не нужен или включён обход.
  • POSTDIVPD (бит 3, чтение и запись, после сброса 0x1) — Отключение выходных делителей — когда выход PLL не нужен или включён обход.
  • DSMPD (бит 2, чтение и запись, после сброса 0x1) — Отключение дельта-сигма-модулятора; сброс этого бита ничего не даёт: дробного деления у PLL нет.
  • PD (бит 0, чтение и запись, после сброса 0x1) — Отключение всей PLL, когда её выход не нужен.

PLL_FBDIV_INT — множитель частоты (делитель обратной связи)

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

Отдельных полей нет: значение занимает биты 11:0, остальные биты не используются.

PLL_PRIM — выходные делители

Смещение 0x0C, после сброса 0x0007 7000. Макросы pico-sdk: PLL_PRIM_…

31302928272625242322212019181716
—POSTDIV1
1514131211109876543210
—POSTDIV2—
  • POSTDIV1 (биты 18:16, чтение и запись, после сброса 0x7) — Первый выходной делитель, от 1 до 7.
  • POSTDIV2 (биты 14:12, чтение и запись, после сброса 0x7) — Второй выходной делитель, от 1 до 7.

PLL_INTR — необработанные флаги прерываний

Смещение 0x10, после сброса 0x0000 0000. Макросы pico-sdk: PLL_INTR_…

  • LOCK_N_STICKY (бит 0, сброс записью 1, после сброса 0x0) — Потеря захвата PLL.

PLL_INTE — разрешение прерываний

Смещение 0x14, после сброса 0x0000 0000. Макросы pico-sdk: PLL_INTE_…

  • LOCK_N_STICKY (бит 0, чтение и запись, после сброса 0x0) — Разрешение прерывания при потере захвата.

PLL_INTF — принудительная установка прерываний

Смещение 0x18, после сброса 0x0000 0000. Макросы pico-sdk: PLL_INTF_…

  • LOCK_N_STICKY (бит 0, чтение и запись, после сброса 0x0) — Принудительное прерывание потери захвата.

PLL_INTS — флаги прерываний после маски и принуждения

Смещение 0x1C, после сброса 0x0000 0000. Макросы pico-sdk: PLL_INTS_…

  • LOCK_N_STICKY (бит 0, только чтение, после сброса 0x0) — Прерывание потери захвата после маски.

Частые вопросы

Как получить 150 МГц на PLL RP2350 с кварцем 12 МГц?

Например, REFDIV = 1, FBDIV = 125 — VCO 1500 МГц, — POSTDIV1 = 5 и POSTDIV2 = 2: 1500 / 10 = 150 МГц. Все величины в допустимых пределах: VCO от 750 до 1600 МГц, делители от 1 до 7.

Как узнать, что PLL RP2350 потеряла захват?

По флагу LOCK_N регистра CS: он устанавливается при потере захвата и сбрасывается записью 1. Чтобы реагировать сразу, разрешите прерывание LOCK_N_STICKY в INTE.

Источники

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

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

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

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