Регистры ADC RP2350
Регистры 12-битного АЦП RP2350: до восьми внешних входов в корпусе QFN-80, датчик температуры, одиночные и непрерывные преобразования, поочерёдный опрос каналов, FIFO результатов для DMA и прерывания.
АЦП RP2350 — 12-битный преобразователь последовательного приближения на 500 тысяч выборок в секунду с эффективной разрядностью 9,2 бита. В корпусе QFN-60 у него четыре внешних входа на GPIO26–29 и датчик температуры на канале 4, как у RP2040; в QFN-80 — восемь входов на GPIO40–47 и датчик на канале 8 (даташит RP2350, раздел 12.4).
Регистры устроены как у RP2040, но поля CS шире: AINSEL — 4 бита, RROBIN — 9 бит, по одному на канал. Исправлены и скачки дифференциальной нелинейности на кодах 0x200, 0x600, 0xA00 и 0xE00 из эрраты RP2040-E11 — это прибавило около 0,5 эффективного бита.
Датчик температуры измеряет напряжение перехода биполярного диода: около 0,706 В при 27 °C с наклоном −1,721 мВ/°C. Перед измерением включают его смещение битом TS_EN — это добавляет около 40 мкА потребления от ADC_AVDD. Точность сильно зависит от опорного напряжения: ошибка 1 % при 3,3 В сдвигает результат больше чем на 4 °C.
| Экземпляр | Базовый адрес |
|---|---|
| ADC | 0x400A 0000 |
В RP2040 блок ADC устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры ADC RP2040».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| ADC_CS | 0x00 | Управление и состояние АЦП | 0x0000 0000 |
| ADC_RESULT | 0x04 | Результат последнего преобразования | 0x0000 0000 |
| ADC_FCS | 0x08 | Управление и состояние FIFO | 0x0000 0000 |
| ADC_FIFO | 0x0C | FIFO результатов | 0x0000 0000 |
| ADC_DIV | 0x10 | Делитель частоты выборок | 0x0000 0000 |
| ADC_INTR | 0x14 | Необработанные флаги прерываний | 0x0000 0000 |
| ADC_INTE | 0x18 | Разрешение прерываний | 0x0000 0000 |
| ADC_INTF | 0x1C | Принудительная установка прерываний | 0x0000 0000 |
| ADC_INTS | 0x20 | Флаги прерываний после маски и принуждения | 0x0000 0000 |
ADC_CS — управление и состояние АЦП
Смещение 0x00, адрес 0x400A 0000, после сброса 0x0000 0000. Макросы pico-sdk: ADC_CS_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | RROBIN | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| AINSEL | — | ERR_STICKY | ERR | READY | — | START_MANY | START_ONCE | TS_EN | EN | ||||||
- RROBIN (биты 24:16, чтение и запись, после сброса 0x000) — Поочерёдный опрос: по биту на канал 0–8. Все нули — опрос выключен; иначе АЦП по кругу переходит между отмеченными каналами, начиная с AINSEL, и после каждого преобразования обновляет AINSEL.
- AINSEL (биты 15:12, чтение и запись, после сброса 0x0) — Выбор входа: в QFN-60 0–3 — GPIO26–29, 4 — датчик температуры; в QFN-80 0–7 — GPIO40–47, 8 — датчик.
- ERR_STICKY (бит 10, сброс записью 1, после сброса 0x0) — Ошибка была в одном из прошлых преобразований; сбрасывается записью 1.
- ERR (бит 9, только чтение, после сброса 0x0) — Ошибка в последнем преобразовании: результат не определён или зашумлён.
- READY (бит 8, только чтение, после сброса 0x0) — 1 — АЦП готов к новому преобразованию, предыдущее завершено; 0 — идёт преобразование.
- START_MANY (бит 3, чтение и запись, после сброса 0x0) — Непрерывные преобразования, пока бит равен 1: следующее начинается сразу после предыдущего или по делителю DIV.
- START_ONCE (бит 2, сбрасывается сам, после сброса 0x0) — Запуск одного преобразования; сбрасывается сам и не действует при START_MANY = 1.
- TS_EN (бит 1, чтение и запись, после сброса 0x0) — Включение датчика температуры: 1 — включён.
- EN (бит 0, чтение и запись, после сброса 0x0) — Включение питания и тактирования АЦП: 1 — включён.
ADC_RESULT — результат последнего преобразования
Смещение 0x04, адрес 0x400A 0004, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: ADC_RESULT_…
Отдельных полей нет: значение занимает биты 11:0, остальные биты не используются.
ADC_FCS — управление и состояние FIFO
Смещение 0x08, адрес 0x400A 0008, после сброса 0x0000 0000. Макросы pico-sdk: ADC_FCS_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | THRESH | — | LEVEL | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | OVER | UNDER | FULL | EMPTY | — | DREQ_EN | ERR | SHIFT | EN | ||||||
- THRESH (биты 27:24, чтение и запись, после сброса 0x0) — Порог FIFO: запрос DMA и прерывание, когда в FIFO не меньше значений.
- LEVEL (биты 19:16, только чтение, после сброса 0x0) — Сколько результатов сейчас лежит в FIFO.
- OVER (бит 11, сброс записью 1, после сброса 0x0) — FIFO переполнилось; сбрасывается записью 1.
- UNDER (бит 10, сброс записью 1, после сброса 0x0) — Чтение из пустого FIFO; сбрасывается записью 1.
- FULL (бит 9, только чтение, после сброса 0x0) — FIFO заполнено.
- EMPTY (бит 8, только чтение, после сброса 0x0) — FIFO пусто.
- DREQ_EN (бит 3, чтение и запись, после сброса 0x0) — Запрос DMA, когда в FIFO есть данные.
- ERR (бит 2, чтение и запись, после сброса 0x0) — Записывать в FIFO вместе с результатом бит ошибки преобразования.
- SHIFT (бит 1, чтение и запись, после сброса 0x0) — Сдвигать результаты в FIFO вправо до 8 бит — для DMA в массив байтов.
- EN (бит 0, чтение и запись, после сброса 0x0) — Записывать результат каждого преобразования в FIFO.
ADC_FIFO — fIFO результатов
Смещение 0x0C, адрес 0x400A 000C, после сброса 0x0000 0000. Макросы pico-sdk: ADC_FIFO_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ERR | — | VAL | |||||||||||||
- ERR (бит 15, чтение с побочным действием, после сброса не определено) — 1 — при этой выборке была ошибка преобразования; бит остаётся на месте и при сдвиге SHIFT.
- VAL (биты 11:0, чтение с побочным действием, после сброса не определено) — Результат преобразования.
ADC_DIV — делитель частоты выборок
Смещение 0x10, адрес 0x400A 0010, после сброса 0x0000 0000. Макросы pico-sdk: ADC_DIV_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | INT | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| INT | FRAC | ||||||||||||||
- INT (биты 23:8, чтение и запись, после сброса 0x0000) — Целая часть делителя.
- FRAC (биты 7:0, чтение и запись, после сброса 0x00) — Дробная часть делителя в 1/256: дробь получается дельта-сигма-модуляцией первого порядка.
ADC_INTR — необработанные флаги прерываний
Смещение 0x14, адрес 0x400A 0014, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTR_…
- FIFO (бит 0, только чтение, после сброса 0x0) — Прерывание по уровню FIFO: число значений достигло порога FCS.THRESH.
ADC_INTE — разрешение прерываний
Смещение 0x18, адрес 0x400A 0018, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTE_…
- FIFO (бит 0, чтение и запись, после сброса 0x0) — Разрешение прерывания по уровню FIFO.
ADC_INTF — принудительная установка прерываний
Смещение 0x1C, адрес 0x400A 001C, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTF_…
- FIFO (бит 0, чтение и запись, после сброса 0x0) — Принудительная установка прерывания по уровню FIFO.
ADC_INTS — флаги прерываний после маски и принуждения
Смещение 0x20, адрес 0x400A 0020, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTS_…
- FIFO (бит 0, только чтение, после сброса 0x0) — Прерывание по уровню FIFO после маски и принуждения.
Частые вопросы
Сколько входов АЦП у RP2350?
В корпусе QFN-60 (RP2350A) — четыре внешних входа на GPIO26–29, в QFN-80 (RP2350B) — восемь на GPIO40–47. Ещё один канал — встроенный датчик температуры: AINSEL = 4 или 8 соответственно.
Как измерить температуру встроенным датчиком RP2350?
Включите АЦП и датчик битами EN и TS_EN регистра CS, выберите AINSEL = 4 (QFN-60) или 8 (QFN-80) и запустите START_ONCE. При опорном 3,3 В напряжение U = RESULT × 3,3 / 4096, температура ≈ 27 − (U − 0,706) / 0,001721 °C; для точности нужна калибровка.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.4.7: список регистров, назначение полей, тип доступа и значения после сброса
- 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
- PWM — широтно-импульсная модуляцияPWM_CHn_CSR, PWM_CHn_DIV, PWM_CHn_CTR, PWM_CHn_CC, PWM_CHn_TOP, PWM_EN
- 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
Статьи и термины
- АЦП последовательного приближенияВыборка и подбор кода бит за битом: такты, скорость, источник сигнала
- DMAПрямой доступ к памяти без участия ядра
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи
- RP2040 и RP2350RP2040 и RP2350: ядра, память, GPIO, PIO, АЦП, 5 В на выводах, эрраты