Регистры 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 позволяет мерить частоту и скважность внешнего сигнала.
| Экземпляр | Базовый адрес |
|---|---|
| PWM | 0x400A 8000 |
В RP2040 блок PWM устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры PWM RP2040».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| PWM_CHn_CSR | 0x00 + n · 0x14 | Управление и состояние слайса n | 0x0000 0000 |
| PWM_CHn_DIV | 0x04 + n · 0x14 | Дробный делитель частоты слайса n | 0x0000 0010 |
| PWM_CHn_CTR | 0x08 + n · 0x14 | Счётчик слайса n | 0x0000 0000 |
| PWM_CHn_CC | 0x0C + n · 0x14 | Уровни переключения каналов A и B слайса n | 0x0000 0000 |
| PWM_CHn_TOP | 0x10 + n · 0x14 | Значение перезагрузки счётчика слайса n | 0x0000 FFFF |
| PWM_EN | 0xF0 | Одновременное включение слайсов | 0x0000 0000 |
| PWM_INTR | 0xF4 | Необработанные флаги прерываний | 0x0000 0000 |
| PWM_IRQ0_INTE | 0xF8 | Разрешение прерываний слайсов на линии IRQ0 | 0x0000 0000 |
| PWM_IRQ0_INTF | 0xFC | Принудительные прерывания слайсов на линии IRQ0 | 0x0000 0000 |
| PWM_IRQ0_INTS | 0x0100 | Прерывания слайсов на линии IRQ0 после маски | 0x0000 0000 |
| PWM_IRQ1_INTE | 0x0104 | Разрешение прерываний слайсов на линии IRQ1 | 0x0000 0000 |
| PWM_IRQ1_INTF | 0x0108 | Принудительные прерывания слайсов на линии IRQ1 | 0x0000 0000 |
| PWM_IRQ1_INTS | 0x010C | Прерывания слайсов на линии IRQ1 после маски | 0x0000 0000 |
PWM_CHn_CSR — управление и состояние слайса n
12 регистров, n = 0…11: смещение 0x00 + n · 0x14, после сброса 0x0000 0000. Макросы pico-sdk: PWM_CHn_CSR_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | PH_ADV | PH_RET | DIVMODE | B_INV | A_INV | PH_CORRECT | EN | ||||||||
- PH_ADV (бит 7, сбрасывается сам, после сброса 0x0) — Сдвиг фазы вперёд на один отсчёт на ходу: запишите 1 и ждите сброса; счётчик должен идти медленнее предельной скорости (INT + FRAC / 16 > 1).
- PH_RET (бит 6, сбрасывается сам, после сброса 0x0) — Сдвиг фазы назад на один отсчёт на ходу: запишите 1 и ждите сброса; счётчик должен работать.
- DIVMODE (биты 5:4, чтение и запись, после сброса 0x0) — Источник счёта: делитель частоты или вход B.
Значение Имя в pico-sdk Что значит 0x0 div Счёт с частотой от дробного делителя 0x1 level Делитель работает, пока на входе B высокий уровень 0x2 rise Счёт по каждому нарастающему фронту на входе B 0x3 fall Счёт по каждому спадающему фронту на входе 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | INT | FRAC | |||||||||||||
- 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_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| B | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH11 | CH10 | CH9 | CH8 | CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | CH0 | |||
- 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.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.5.3: список регистров, назначение полей, тип доступа и значения после сброса
- Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2350/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause
Нашли ошибку в регистрах?
Другие регистры RP2350
- Все регистры RP2350Блоки периферии и базовые адреса
- SHA256 — ускоритель SHA-256SHA256_CSR, SHA256_WDATA, SHA256_SUMn
- TICKS — генераторы тиковTICKS_PROC0_CTRL, TICKS_PROC0_CYCLES, TICKS_PROC0_COUNT, TICKS_PROC1_CTRL, TICKS_PROC1_CYCLES, TICKS_PROC1_COUNT
- TRNG — генератор случайных чиселTRNG_RNG_IMR, TRNG_RNG_ISR, TRNG_RNG_ICR, TRNG_TRNG_CONFIG, TRNG_TRNG_VALID, TRNG_EHR_DATA0
- GLITCH_DETECTOR — детектор сбоевGLITCH_DETECTOR_ARM, GLITCH_DETECTOR_DISARM, GLITCH_DETECTOR_SENSITIVITY, GLITCH_DETECTOR_LOCK, GLITCH_DETECTOR_TRIG_STATUS, GLITCH_DETECTOR_TRIG_FORCE
- HSTX — быстрый последовательный выводHSTX_CTRL_CSR, HSTX_CTRL_BITn, HSTX_CTRL_EXPAND_SHIFT, HSTX_CTRL_EXPAND_TMDS
- HSTX_FIFO — FIFO быстрого выводаHSTX_FIFO_STAT, HSTX_FIFO_FIFO
- QMI — интерфейс QSPI-памятиQMI_DIRECT_CSR, QMI_DIRECT_TX, QMI_DIRECT_RX, QMI_M0_TIMING, QMI_M0_RFMT, QMI_M0_RCMD
- XIP_AUX — быстрый порт FIFO XIPXIP_AUX_STREAM, XIP_AUX_QMI_DIRECT_TX, XIP_AUX_QMI_DIRECT_RX
- BOOTRAM — регистры загрузочной памятиBOOTRAM_WRITE_ONCE0, BOOTRAM_WRITE_ONCE1, BOOTRAM_BOOTLOCK_STAT, BOOTRAM_BOOTLOCKn
- CORESIGHT_TRACE — FIFO трассировкиCORESIGHT_TRACE_CTRL_STATUS, CORESIGHT_TRACE_TRACE_CAPTURE_FIFO
- EPPB — регистры ядра от Raspberry PiM33_EPPB_NMI_MASK0, M33_EPPB_NMI_MASK1, M33_EPPB_SLEEPCTRL
- OTP — однократно программируемая памятьOTP_SW_LOCKn, OTP_SBPI_INSTR, OTP_SBPI_WDATA_0, OTP_SBPI_WDATA_1, OTP_SBPI_WDATA_2, OTP_SBPI_WDATA_3
- POWMAN — менеджер питанияPOWMAN_BADPASSWD, POWMAN_VREG_CTRL, POWMAN_VREG_STS, POWMAN_VREG, POWMAN_VREG_LP_ENTRY, POWMAN_VREG_LP_EXIT
- ACCESSCTRL — права доступа к шинеACCESSCTRL_LOCK, ACCESSCTRL_FORCE_CORE_NS, ACCESSCTRL_CFGRESET, ACCESSCTRL_GPIO_NSMASK0, ACCESSCTRL_GPIO_NSMASK1, ACCESSCTRL_ROM
- TIMER — системные таймерыTIMER_TIMEHW, TIMER_TIMELW, TIMER_TIMEHR, TIMER_TIMELR, TIMER_ALARMn, TIMER_ARMED
- WATCHDOG — сторожевой таймерWATCHDOG_CTRL, WATCHDOG_LOAD, WATCHDOG_REASON, WATCHDOG_SCRATCHn
- ADC — аналого-цифровой преобразовательADC_CS, ADC_RESULT, ADC_FCS, ADC_FIFO, ADC_DIV, ADC_INTR
- XOSC — кварцевый генераторXOSC_CTRL, XOSC_STATUS, XOSC_DORMANT, XOSC_STARTUP, XOSC_COUNT
- PLL — умножители частотыPLL_CS, PLL_PWR, PLL_FBDIV_INT, PLL_PRIM, PLL_INTR, PLL_INTE
- 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_SD0, PADS_QSPI_GPIO_QSPI_SD1, PADS_QSPI_GPIO_QSPI_SD2, PADS_QSPI_GPIO_QSPI_SD3
- RESETS — сброс подсистемRESETS_RESET, RESETS_WDSEL, RESETS_RESET_DONE
- PSM — автомат включения питанияPSM_FRCE_ON, PSM_FRCE_OFF, PSM_WDSEL, PSM_DONE
- SYSINFO — сведения о чипеSYSINFO_CHIP_ID, SYSINFO_PACKAGE_SEL, SYSINFO_PLATFORM, SYSINFO_GITREF_RP2350
- BUSCTRL — управление шинойBUSCTRL_BUS_PRIORITY, BUSCTRL_BUS_PRIORITY_ACK, BUSCTRL_PERFCTR_EN, BUSCTRL_PERFCTRn, BUSCTRL_PERFSELn
- ROSC — кольцевой генераторROSC_CTRL, ROSC_FREQA, ROSC_FREQB, ROSC_RANDOM, ROSC_DORMANT, ROSC_DIV
- SYSCFG — системные настройкиSYSCFG_PROC_CONFIG, SYSCFG_PROC_IN_SYNC_BYPASS, SYSCFG_PROC_IN_SYNC_BYPASS_HI, SYSCFG_DBGFORCE, SYSCFG_MEMPOWERDOWN, SYSCFG_AUXCTRL
- XIP_CTRL — кеш выполнения из флеш-памятиXIP_CTRL, XIP_STAT, XIP_CTR_HIT, XIP_CTR_ACC, XIP_STREAM_ADDR, XIP_STREAM_CTR
- USB — контроллер USBUSB_ADDR_ENDP, USB_ADDR_ENDPn, USB_MAIN_CTRL, USB_SOF_WR, USB_SOF_RD, USB_SIE_CTRL
- 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
- SIO — однотактный ввод-вывод ядерSIO_CPUID, SIO_GPIO_IN, SIO_GPIO_HI_IN, SIO_GPIO_OUT, SIO_GPIO_HI_OUT, SIO_GPIO_OUT_SET
- 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
- IO_BANK0 — мультиплексор GPIOIO_BANK0_GPIOn_STATUS, IO_BANK0_GPIOn_CTRL, IO_BANK0_IRQSUMMARY_PROC0_SECURE0, IO_BANK0_IRQSUMMARY_PROC0_SECURE1, IO_BANK0_IRQSUMMARY_PROC0_NONSECURE0, IO_BANK0_IRQSUMMARY_PROC0_NONSECURE1
- IO_QSPI — мультиплексор выводов QSPI и USBIO_QSPI_USBPHY_DP_STATUS, IO_QSPI_USBPHY_DP_CTRL, IO_QSPI_USBPHY_DM_STATUS, IO_QSPI_USBPHY_DM_CTRL, IO_QSPI_GPIO_QSPI_SCLK_STATUS, IO_QSPI_GPIO_QSPI_SCLK_CTRL
- M33 — системные регистры Cortex-M33M33_ITM_STIMn, M33_ITM_TER0, M33_ITM_TPR, M33_ITM_TCR, M33_INT_ATREADY, M33_INT_ATVALID