Регистры TIMER RP2350
Регистры двух системных таймеров RP2350 — TIMER0 и TIMER1: 64-битные счётчики с шагом от генератора тиков или от системной частоты, по четыре будильника, пауза при отладке и блокировка записи.
В RP2350 два одинаковых системных таймера — TIMER0 по адресу 0x400B 0000 и TIMER1 по адресу 0x400B 8000, — чтобы у разных доменов защиты было по своему. Каждый — 64-битный счётчик; при тике раз в микросекунду переполнения не наступит тысячи лет (даташит RP2350, раздел 12.8).
Отличия от RP2040: тик каждому таймеру даёт свой генератор в блоке TICKS, регистр SOURCE позволяет считать вместо тиков такты clk_sys, а LOCKED запрещает запись в таймер до сброса. Без запущенного генератора тиков таймер стоит — pico-sdk запускает его при инициализации.
Время читают парой TIMELR, затем TIMEHR, но с двух ядер так нельзя: защёлка старшей половины общая. Функция time_us_64 из pico-sdk читает TIMERAWH, TIMERAWL и снова TIMERAWH, пока старшая половина не совпадёт. Будильники ALARM0–ALARM3 сравнивают младшие 32 бита счётчика и срабатывают не дальше чем через 2³² мкс — около 72 минут; для более долгих интервалов есть таймер AON блока POWMAN.
| Экземпляр | Базовый адрес |
|---|---|
| TIMER0 | 0x400B 0000 |
| TIMER1 | 0x400B 8000 |
В RP2040 блок TIMER устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры TIMER RP2040».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| TIMER_TIMEHW | 0x00 | Запись старших 32 бит времени — после TIMELW | 0x0000 0000 |
| TIMER_TIMELW | 0x04 | Запись младших 32 бит времени; в счётчик попадает после записи TIMEHW | 0x0000 0000 |
| TIMER_TIMEHR | 0x08 | Чтение старших 32 бит времени — после TIMELR | 0x0000 0000 |
| TIMER_TIMELR | 0x0C | Чтение младших 32 бит времени; защёлкивает старшую половину | 0x0000 0000 |
| TIMER_ALARMn | 0x10 + n · 0x04 | Будильник n: момент срабатывания по младшим 32 битам | 0x0000 0000 |
| TIMER_ARMED | 0x20 | Взведённые будильники; запись 1 снимает будильник | 0x0000 0000 |
| TIMER_TIMERAWH | 0x24 | Старшие 32 бита времени без защёлки | 0x0000 0000 |
| TIMER_TIMERAWL | 0x28 | Младшие 32 бита времени без защёлки | 0x0000 0000 |
| TIMER_DBGPAUSE | 0x2C | Пауза при отладке | 0x0000 0007 |
| TIMER_PAUSE | 0x30 | Пауза таймера | 0x0000 0000 |
| TIMER_LOCKED | 0x34 | Запрет записи в таймер; снимается только сбросом | 0x0000 0000 |
| TIMER_SOURCE | 0x38 | Источник счёта: тик или clk_sys | 0x0000 0000 |
| TIMER_INTR | 0x3C | Необработанные флаги прерываний | 0x0000 0000 |
| TIMER_INTE | 0x40 | Разрешение прерываний | 0x0000 0000 |
| TIMER_INTF | 0x44 | Принудительная установка прерываний | 0x0000 0000 |
| TIMER_INTS | 0x48 | Флаги прерываний после маски и принуждения | 0x0000 0000 |
TIMER_TIMEHW — запись старших 32 бит времени — после TIMELW
Смещение 0x00, после сброса 0x0000 0000, запись с побочным действием. Макросы pico-sdk: TIMER_TIMEHW_…
Значение занимает регистр целиком, отдельных полей нет.
TIMER_TIMELW — запись младших 32 бит времени; в счётчик попадает после записи TIMEHW
Смещение 0x04, после сброса 0x0000 0000, запись с побочным действием. Макросы pico-sdk: TIMER_TIMELW_…
Значение занимает регистр целиком, отдельных полей нет.
TIMER_TIMEHR — чтение старших 32 бит времени — после TIMELR
Смещение 0x08, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TIMER_TIMEHR_…
Значение занимает регистр целиком, отдельных полей нет.
TIMER_TIMELR — чтение младших 32 бит времени; защёлкивает старшую половину
Смещение 0x0C, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TIMER_TIMELR_…
Значение занимает регистр целиком, отдельных полей нет.
TIMER_ALARMn — будильник n: момент срабатывания по младшим 32 битам
4 регистра, n = 0…3: смещение 0x10 + n · 0x04, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: TIMER_ALARMn_…
Значение занимает регистр целиком, отдельных полей нет.
TIMER_ARMED — взведённые будильники; запись 1 снимает будильник
Смещение 0x20, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: TIMER_ARMED_…
Отдельных полей нет: значение занимает биты 3:0, остальные биты не используются.
TIMER_TIMERAWH — старшие 32 бита времени без защёлки
Смещение 0x24, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TIMER_TIMERAWH_…
Значение занимает регистр целиком, отдельных полей нет.
TIMER_TIMERAWL — младшие 32 бита времени без защёлки
Смещение 0x28, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TIMER_TIMERAWL_…
Значение занимает регистр целиком, отдельных полей нет.
TIMER_DBGPAUSE — пауза при отладке
Смещение 0x2C, после сброса 0x0000 0007. Макросы pico-sdk: TIMER_DBGPAUSE_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DBG1 | DBG0 | — | ||||||||||||
- DBG1 (бит 2, чтение и запись, после сброса 0x1) — Останавливать таймер, пока ядро 1 в режиме отладки.
- DBG0 (бит 1, чтение и запись, после сброса 0x1) — Останавливать таймер, пока ядро 0 в режиме отладки.
TIMER_PAUSE — пауза таймера
Смещение 0x30, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: TIMER_PAUSE_…
Отдельных полей нет: значение занимает бит 0, остальные биты не используются.
TIMER_LOCKED — запрет записи в таймер; снимается только сбросом
Смещение 0x34, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: TIMER_LOCKED_…
Отдельных полей нет: значение занимает бит 0, остальные биты не используются.
TIMER_SOURCE — источник счёта: тик или clk_sys
Смещение 0x38, после сброса 0x0000 0000. Макросы pico-sdk: TIMER_SOURCE_…
- CLK_SYS (бит 0, чтение и запись, после сброса 0x0) — 0 — тик из блока TICKS, 1 — такты clk_sys.
TIMER_INTR — необработанные флаги прерываний
Смещение 0x3C, после сброса 0x0000 0000. Макросы pico-sdk: TIMER_INTR_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ALARM_3 | ALARM_2 | ALARM_1 | ALARM_0 | |||||||||||
- ALARM_n, n = 0…3 (биты 0, 1, 2, 3; сброс записью 1, после сброса 0x0) — Сработал будильник n; сбрасывается записью 1.
TIMER_INTE — разрешение прерываний
Смещение 0x40, после сброса 0x0000 0000. Макросы pico-sdk: TIMER_INTE_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ALARM_3 | ALARM_2 | ALARM_1 | ALARM_0 | |||||||||||
- ALARM_n, n = 0…3 (биты 0, 1, 2, 3; чтение и запись, после сброса 0x0) — Разрешение прерывания будильника n.
TIMER_INTF — принудительная установка прерываний
Смещение 0x44, после сброса 0x0000 0000. Макросы pico-sdk: TIMER_INTF_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ALARM_3 | ALARM_2 | ALARM_1 | ALARM_0 | |||||||||||
- ALARM_n, n = 0…3 (биты 0, 1, 2, 3; чтение и запись, после сброса 0x0) — Принудительная установка прерывания будильника n.
TIMER_INTS — флаги прерываний после маски и принуждения
Смещение 0x48, после сброса 0x0000 0000. Макросы pico-sdk: TIMER_INTS_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ALARM_3 | ALARM_2 | ALARM_1 | ALARM_0 | |||||||||||
- ALARM_n, n = 0…3 (биты 0, 1, 2, 3; только чтение, после сброса 0x0) — Прерывание будильника n после маски и принуждения.
Частые вопросы
Зачем в RP2350 два системных таймера?
Чтобы защищённый и незащищённый код имели по собственному таймеру: TIMER0 и TIMER1 одинаковы, у каждого свой 64-битный счётчик, четыре будильника и свой генератор тиков в блоке TICKS. Права доступа к ним задают регистры TIMER0 и TIMER1 блока ACCESSCTRL.
Почему таймер RP2350 не считает?
Нужен запущенный генератор тиков: в блоке TICKS для TIMER0 или TIMER1 задают число тактов clk_ref на 1 мкс и включают ENABLE. Кроме того, таймер стоит, пока установлен PAUSE или пока ядро остановлено отладчиком при включённом DBGPAUSE.
Как считать таймером RP2350 такты процессора?
Запишите 1 в поле CLK_SYS регистра SOURCE: таймер будет увеличиваться с каждым тактом clk_sys вместо тика 1 мкс. После сброса SOURCE = 0 — счёт тиков из блока TICKS.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.8.5: список регистров, назначение полей, тип доступа и значения после сброса
- 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
- WATCHDOG — сторожевой таймерWATCHDOG_CTRL, WATCHDOG_LOAD, WATCHDOG_REASON, WATCHDOG_SCRATCHn
- ADC — аналого-цифровой преобразовательADC_CS, ADC_RESULT, ADC_FCS, ADC_FIFO, ADC_DIV, ADC_INTR
- 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