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

Регистры PWM RP2350

Регистры двенадцати слайсов ШИМ RP2350: режим счёта и коррекция фазы, дробный делитель, счётчик, уровни двух каналов, значение перезагрузки, одновременный запуск и две независимые линии прерываний.

Блок ШИМ RP2350 — 12 одинаковых слайсов, по два выхода A и B у каждого: до 24 каналов в корпусе QFN-80. Четыре новых по сравнению с RP2040 слайса, 8–11, выведены на GPIO32–47, поэтому в корпусе QFN-60 доступны слайсы 0–7. У каждого слайса 16-битный счётчик и дробный делитель 8.4 (даташит RP2350, раздел 12.5).

Второе отличие от RP2040 — две линии прерываний: у каждой свои регистры разрешения, принуждения и состояния (IRQ0_… и IRQ1_…), а общий флаг окончания периода — в INTR. Так одни слайсы удобно использовать как простые периодические таймеры на отдельной линии.

Выводы и слайсы: GPIO0–15 и GPIO16–31 повторяют слайсы 0–7, GPIO32–39 и GPIO40–47 — слайсы 8–11; канал A — на чётном выводе, B — на нечётном. Регистры TOP и CC буферизованы и меняются на ходу, вход B позволяет мерить частоту и скважность внешнего сигнала.

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

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

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

РегистрСмещениеНазначениеПосле сброса
PWM_CHn_CSR0x00 + n · 0x14Управление и состояние слайса n0x0000 0000
PWM_CHn_DIV0x04 + n · 0x14Дробный делитель частоты слайса n0x0000 0010
PWM_CHn_CTR0x08 + n · 0x14Счётчик слайса n0x0000 0000
PWM_CHn_CC0x0C + n · 0x14Уровни переключения каналов A и B слайса n0x0000 0000
PWM_CHn_TOP0x10 + n · 0x14Значение перезагрузки счётчика слайса n0x0000 FFFF
PWM_EN0xF0Одновременное включение слайсов0x0000 0000
PWM_INTR0xF4Необработанные флаги прерываний0x0000 0000
PWM_IRQ0_INTE0xF8Разрешение прерываний слайсов на линии IRQ00x0000 0000
PWM_IRQ0_INTF0xFCПринудительные прерывания слайсов на линии IRQ00x0000 0000
PWM_IRQ0_INTS0x0100Прерывания слайсов на линии IRQ0 после маски0x0000 0000
PWM_IRQ1_INTE0x0104Разрешение прерываний слайсов на линии IRQ10x0000 0000
PWM_IRQ1_INTF0x0108Принудительные прерывания слайсов на линии IRQ10x0000 0000
PWM_IRQ1_INTS0x010CПрерывания слайсов на линии IRQ1 после маски0x0000 0000

PWM_CHn_CSR — управление и состояние слайса n

12 регистров, n = 0…11: смещение 0x00 + n · 0x14, после сброса 0x0000 0000. Макросы pico-sdk: PWM_CHn_CSR_…

1514131211109876543210
—PH_ADVPH_RETDIVMODEB_INVA_INVPH_CORRECTEN
  • PH_ADV (бит 7, сбрасывается сам, после сброса 0x0) — Сдвиг фазы вперёд на один отсчёт на ходу: запишите 1 и ждите сброса; счётчик должен идти медленнее предельной скорости (INT + FRAC / 16 > 1).
  • PH_RET (бит 6, сбрасывается сам, после сброса 0x0) — Сдвиг фазы назад на один отсчёт на ходу: запишите 1 и ждите сброса; счётчик должен работать.
  • DIVMODE (биты 5:4, чтение и запись, после сброса 0x0) — Источник счёта: делитель частоты или вход B.
    ЗначениеИмя в pico-sdkЧто значит
    0x0divСчёт с частотой от дробного делителя
    0x1levelДелитель работает, пока на входе B высокий уровень
    0x2riseСчёт по каждому нарастающему фронту на входе B
    0x3fallСчёт по каждому спадающему фронту на входе B
  • B_INV (бит 3, чтение и запись, после сброса 0x0) — Инверсия выхода B.
  • A_INV (бит 2, чтение и запись, после сброса 0x0) — Инверсия выхода A.
  • PH_CORRECT (бит 1, чтение и запись, после сброса 0x0) — Коррекция фазы: 1 — счёт вверх и вниз, период вдвое длиннее; 0 — счёт вверх с перезагрузкой.
  • EN (бит 0, чтение и запись, после сброса 0x0) — Включение слайса.

PWM_CHn_DIV — дробный делитель частоты слайса n

12 регистров, n = 0…11: смещение 0x04 + n · 0x14, после сброса 0x0000 0010. Макросы pico-sdk: PWM_CHn_DIV_…

1514131211109876543210
—INTFRAC
  • INT (биты 11:4, чтение и запись, после сброса 0x01) — Целая часть делителя частоты.
  • FRAC (биты 3:0, чтение и запись, после сброса 0x0) — Дробная часть делителя в 1/16.

PWM_CHn_CTR — счётчик слайса n

12 регистров, n = 0…11: смещение 0x08 + n · 0x14, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: PWM_CHn_CTR_…

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

PWM_CHn_CC — уровни переключения каналов A и B слайса n

12 регистров, n = 0…11: смещение 0x0C + n · 0x14, после сброса 0x0000 0000. Макросы pico-sdk: PWM_CHn_CC_…

31302928272625242322212019181716
B
1514131211109876543210
A
  • B (биты 31:16, чтение и запись, после сброса 0x0000) — Уровень переключения канала B.
  • A (биты 15:0, чтение и запись, после сброса 0x0000) — Уровень переключения канала A.

PWM_CHn_TOP — значение перезагрузки счётчика слайса n

12 регистров, n = 0…11: смещение 0x10 + n · 0x14, после сброса 0x0000 FFFF, чтение и запись. Макросы pico-sdk: PWM_CHn_TOP_…

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

PWM_EN — одновременное включение слайсов

Смещение 0xF0, адрес 0x400A 80F0, после сброса 0x0000 0000. Макросы pico-sdk: PWM_EN_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; чтение и запись, после сброса 0x0) — Включение слайса n — тот же бит, что EN в CHn_CSR.

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

Смещение 0xF4, адрес 0x400A 80F4, после сброса 0x0000 0000. Макросы pico-sdk: PWM_INTR_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; сброс записью 1, после сброса 0x0) — Слайс n закончил период; сбрасывается записью 1.

PWM_IRQ0_INTE — разрешение прерываний слайсов на линии IRQ0

Смещение 0xF8, адрес 0x400A 80F8, после сброса 0x0000 0000. Макросы pico-sdk: PWM_IRQ0_INTE_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; чтение и запись, после сброса 0x0) — Разрешение прерывания слайса n на линии IRQ0.

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

Смещение 0xFC, адрес 0x400A 80FC, после сброса 0x0000 0000. Макросы pico-sdk: PWM_IRQ0_INTF_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; чтение и запись, после сброса 0x0) — Принудительное прерывание слайса n на линии IRQ0.

PWM_IRQ0_INTS — прерывания слайсов на линии IRQ0 после маски

Смещение 0x0100, адрес 0x400A 8100, после сброса 0x0000 0000. Макросы pico-sdk: PWM_IRQ0_INTS_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; только чтение, после сброса 0x0) — Прерывание слайса n на линии IRQ0 после маски и принуждения.

PWM_IRQ1_INTE — разрешение прерываний слайсов на линии IRQ1

Смещение 0x0104, адрес 0x400A 8104, после сброса 0x0000 0000. Макросы pico-sdk: PWM_IRQ1_INTE_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; чтение и запись, после сброса 0x0) — Разрешение прерывания слайса n на линии IRQ1.

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

Смещение 0x0108, адрес 0x400A 8108, после сброса 0x0000 0000. Макросы pico-sdk: PWM_IRQ1_INTF_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; чтение и запись, после сброса 0x0) — Принудительное прерывание слайса n на линии IRQ1.

PWM_IRQ1_INTS — прерывания слайсов на линии IRQ1 после маски

Смещение 0x010C, адрес 0x400A 810C, после сброса 0x0000 0000. Макросы pico-sdk: PWM_IRQ1_INTS_…

1514131211109876543210
—CH11CH10CH9CH8CH7CH6CH5CH4CH3CH2CH1CH0
  • CHn, n = 0…11 (биты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; только чтение, после сброса 0x0) — Прерывание слайса n на линии IRQ1 после маски и принуждения.

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

Сколько каналов ШИМ у RP2350?

12 слайсов по два выхода — 24 канала, но все доступны только в корпусе QFN-80: слайсы 8–11 выведены на GPIO32–47. В корпусе QFN-60 остаются слайсы 0–7, как у RP2040.

Зачем у ШИМ RP2350 две линии прерываний?

Чтобы разделить слайсы между обработчиками: например, часть слайсов работает простыми периодическими таймерами на линии IRQ1, остальные — на IRQ0. У каждой линии свои регистры IRQn_INTE, IRQn_INTF и IRQn_INTS, флаг окончания периода общий — в INTR.

Какой слайс ШИМ у вывода GPIO RP2350?

Для GPIO0–31 номер слайса — (GPIO / 2) mod 8, для GPIO32–47 — 8 + ((GPIO − 32) / 2) mod 4; канал A у чётного вывода, B у нечётного. Например, GPIO41 — слайс 8, канал B.

Источники

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

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

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

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