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

Регистры TICKS RP2350

Регистры генераторов тиков RP2350: шесть независимых делителей опорной частоты clk_ref, которые задают шаг счёта системным таймерам, SysTick обоих ядер, сторожевому таймеру и таймеру платформы RISC-V.

Тик — периодический сигнал, задающий шаг счёта таймера. В отличие от тактовой частоты он не тактирует регистры, поэтому системные таймеры считают раз в микросекунду, даже когда системная частота меняется. В RP2040 тик таймеру давал блок WATCHDOG, а в RP2350 для этого есть отдельный блок TICKS с генератором на каждого получателя (даташит RP2350, раздел 8.5).

Каждый генератор делит clk_ref: число тактов на один тик задаёт регистр …_CYCLES (до 511), остаток до следующего тика показывает …_COUNT, бит ENABLE в …_CTRL запускает генератор. При clk_ref 12 МГц от кварца CYCLES = 12 даёт тик раз в 1 мкс. pico-sdk рассчитывает на тик 1 мкс у системных таймеров и таймера RISC-V, а калибровка SysTick ядер Cortex-M33 — тоже на 1 мкс.

Число тактов меняют только у остановленного генератора: сбрасывают ENABLE, записывают CYCLES и включают снова. Генераторы независимы — SysTick можно замедлить, чтобы 24-битный счётчик давал более длинные задержки, не трогая системные таймеры.

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

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

РегистрСмещениеНазначениеПосле сброса
TICKS_PROC0_CTRL0x00Пуск генератора тиков SysTick ядра 00x0000 0000
TICKS_PROC0_CYCLES0x04Тактов clk_ref на один тик SysTick ядра 00x0000 0000
TICKS_PROC0_COUNT0x08Тактов до следующего тика SysTick ядра 0не определено
TICKS_PROC1_CTRL0x0CПуск генератора тиков SysTick ядра 10x0000 0000
TICKS_PROC1_CYCLES0x10Тактов clk_ref на один тик SysTick ядра 10x0000 0000
TICKS_PROC1_COUNT0x14Тактов до следующего тика SysTick ядра 1не определено
TICKS_TIMER0_CTRL0x18Пуск генератора тиков системного таймера TIMER00x0000 0000
TICKS_TIMER0_CYCLES0x1CТактов clk_ref на один тик системного таймера TIMER00x0000 0000
TICKS_TIMER0_COUNT0x20Тактов до следующего тика системного таймера TIMER0не определено
TICKS_TIMER1_CTRL0x24Пуск генератора тиков системного таймера TIMER10x0000 0000
TICKS_TIMER1_CYCLES0x28Тактов clk_ref на один тик системного таймера TIMER10x0000 0000
TICKS_TIMER1_COUNT0x2CТактов до следующего тика системного таймера TIMER1не определено
TICKS_WATCHDOG_CTRL0x30Пуск генератора тиков сторожевого таймера0x0000 0000
TICKS_WATCHDOG_CYCLES0x34Тактов clk_ref на один тик сторожевого таймера0x0000 0000
TICKS_WATCHDOG_COUNT0x38Тактов до следующего тика сторожевого таймеране определено
TICKS_RISCV_CTRL0x3CПуск генератора тиков таймера платформы RISC-V0x0000 0000
TICKS_RISCV_CYCLES0x40Тактов clk_ref на один тик таймера платформы RISC-V0x0000 0000
TICKS_RISCV_COUNT0x44Тактов до следующего тика таймера платформы RISC-Vне определено

TICKS_PROC0_CTRL — пуск генератора тиков SysTick ядра 0

Смещение 0x00, адрес 0x4010 8000, после сброса 0x0000 0000. Макросы pico-sdk: TICKS_PROC0_CTRL_…

1514131211109876543210
—RUNNINGENABLE
  • RUNNING (бит 1, только чтение, после сброса не определено) — Генератор работает.
  • ENABLE (бит 0, чтение и запись, после сброса 0x0) — Пуск и остановка генератора; CYCLES меняют только при остановленном.

TICKS_PROC0_CYCLES — тактов clk_ref на один тик SysTick ядра 0

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

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

TICKS_PROC0_COUNT — тактов до следующего тика SysTick ядра 0

Смещение 0x08, адрес 0x4010 8008, после сброса не определено, только чтение. Макросы pico-sdk: TICKS_PROC0_COUNT_…

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

TICKS_PROC1_CTRL — пуск генератора тиков SysTick ядра 1

Смещение 0x0C, адрес 0x4010 800C, после сброса 0x0000 0000. Макросы pico-sdk: TICKS_PROC1_CTRL_…

1514131211109876543210
—RUNNINGENABLE
  • RUNNING (бит 1, только чтение, после сброса не определено) — Генератор работает.
  • ENABLE (бит 0, чтение и запись, после сброса 0x0) — Пуск и остановка генератора; CYCLES меняют только при остановленном.

TICKS_PROC1_CYCLES — тактов clk_ref на один тик SysTick ядра 1

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

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

TICKS_PROC1_COUNT — тактов до следующего тика SysTick ядра 1

Смещение 0x14, адрес 0x4010 8014, после сброса не определено, только чтение. Макросы pico-sdk: TICKS_PROC1_COUNT_…

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

TICKS_TIMER0_CTRL — пуск генератора тиков системного таймера TIMER0

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

1514131211109876543210
—RUNNINGENABLE
  • RUNNING (бит 1, только чтение, после сброса не определено) — Генератор работает.
  • ENABLE (бит 0, чтение и запись, после сброса 0x0) — Пуск и остановка генератора; CYCLES меняют только при остановленном.

TICKS_TIMER0_CYCLES — тактов clk_ref на один тик системного таймера TIMER0

Смещение 0x1C, адрес 0x4010 801C, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: TICKS_TIMER0_CYCLES_…

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

TICKS_TIMER0_COUNT — тактов до следующего тика системного таймера TIMER0

Смещение 0x20, адрес 0x4010 8020, после сброса не определено, только чтение. Макросы pico-sdk: TICKS_TIMER0_COUNT_…

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

TICKS_TIMER1_CTRL — пуск генератора тиков системного таймера TIMER1

Смещение 0x24, адрес 0x4010 8024, после сброса 0x0000 0000. Макросы pico-sdk: TICKS_TIMER1_CTRL_…

1514131211109876543210
—RUNNINGENABLE
  • RUNNING (бит 1, только чтение, после сброса не определено) — Генератор работает.
  • ENABLE (бит 0, чтение и запись, после сброса 0x0) — Пуск и остановка генератора; CYCLES меняют только при остановленном.

TICKS_TIMER1_CYCLES — тактов clk_ref на один тик системного таймера TIMER1

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

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

TICKS_TIMER1_COUNT — тактов до следующего тика системного таймера TIMER1

Смещение 0x2C, адрес 0x4010 802C, после сброса не определено, только чтение. Макросы pico-sdk: TICKS_TIMER1_COUNT_…

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

TICKS_WATCHDOG_CTRL — пуск генератора тиков сторожевого таймера

Смещение 0x30, адрес 0x4010 8030, после сброса 0x0000 0000. Макросы pico-sdk: TICKS_WATCHDOG_CTRL_…

1514131211109876543210
—RUNNINGENABLE
  • RUNNING (бит 1, только чтение, после сброса не определено) — Генератор работает.
  • ENABLE (бит 0, чтение и запись, после сброса 0x0) — Пуск и остановка генератора; CYCLES меняют только при остановленном.

TICKS_WATCHDOG_CYCLES — тактов clk_ref на один тик сторожевого таймера

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

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

TICKS_WATCHDOG_COUNT — тактов до следующего тика сторожевого таймера

Смещение 0x38, адрес 0x4010 8038, после сброса не определено, только чтение. Макросы pico-sdk: TICKS_WATCHDOG_COUNT_…

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

TICKS_RISCV_CTRL — пуск генератора тиков таймера платформы RISC-V

Смещение 0x3C, адрес 0x4010 803C, после сброса 0x0000 0000. Макросы pico-sdk: TICKS_RISCV_CTRL_…

1514131211109876543210
—RUNNINGENABLE
  • RUNNING (бит 1, только чтение, после сброса не определено) — Генератор работает.
  • ENABLE (бит 0, чтение и запись, после сброса 0x0) — Пуск и остановка генератора; CYCLES меняют только при остановленном.

TICKS_RISCV_CYCLES — тактов clk_ref на один тик таймера платформы RISC-V

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

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

TICKS_RISCV_COUNT — тактов до следующего тика таймера платформы RISC-V

Смещение 0x44, адрес 0x4010 8044, после сброса не определено, только чтение. Макросы pico-sdk: TICKS_RISCV_COUNT_…

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

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

Почему таймер RP2350 не считает микросекунды?

Скорее всего, не настроен его генератор тиков: в TIMER0_CYCLES блока TICKS (или TIMER1_CYCLES) должно быть число тактов clk_ref на 1 мкс — 12 при кварце 12 МГц, — а в TIMER0_CTRL должен быть установлен ENABLE.

Как изменить шаг SysTick на RP2350?

Остановите генератор PROC0 или PROC1 сбросом ENABLE в его регистре CTRL, запишите новое число тактов clk_ref на тик в CYCLES и снова установите ENABLE. Генераторы независимы, так что системные и сторожевой таймеры продолжат считать с прежним шагом.

Источники

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

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

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

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