Регистры DMA RP2350
Регистры контроллера DMA RP2350: шестнадцать каналов с адресами, счётчиками и управлением, бесконечные и самоперезапускающиеся пересылки, обратный ход адресов, четыре линии прерываний, назначение каналов доменам защиты и собственный блок защиты памяти.
Содержание
- Регистры блока
- 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
- DMA_CHn_AL1_WRITE_ADDR
- DMA_CHn_AL1_TRANS_COUNT_TRIG
- DMA_CHn_AL2_CTRL
- DMA_CHn_AL2_TRANS_COUNT
- DMA_CHn_AL2_READ_ADDR
- DMA_CHn_AL2_WRITE_ADDR_TRIG
- DMA_CHn_AL3_CTRL
- DMA_CHn_AL3_WRITE_ADDR
- DMA_CHn_AL3_TRANS_COUNT
- DMA_CHn_AL3_READ_ADDR_TRIG
- DMA_INTR
- DMA_INTEn
- DMA_INTFn
- DMA_INTS0
- DMA_INTS1
- DMA_INTS2
- DMA_INTS3
- DMA_TIMERn
- DMA_MULTI_CHAN_TRIGGER
- DMA_SNIFF_CTRL
- DMA_SNIFF_DATA
- DMA_FIFO_LEVELS
- DMA_CHAN_ABORT
- DMA_N_CHANNELS
- DMA_SECCFG_CHn
- DMA_SECCFG_IRQn
- DMA_SECCFG_MISC
- DMA_MPU_CTRL
- DMA_MPU_BARn
- DMA_MPU_LARn
- DMA_CHn_DBG_CTDREQ
- DMA_CHn_DBG_TCR
Контроллер DMA RP2350 получил 16 каналов вместо 12 и четыре линии прерываний вместо двух. Как и в RP2040, канал запускают записью в регистр-триггер, каналы сцепляют через CHAIN_TO, темп задают сигналом DREQ, таймерами или постоянным запросом, а по пересылаемым данным можно считать CRC (даташит RP2350, раздел 12.6).
Старшие четыре бита TRANS_COUNT стали полем MODE: 0 — как в RP2040, канал останавливается в конце; 1 — перезапускает сам себя, что удобно для кольцевых буферов с прерыванием на каждом круге; 0xF — работает бесконечно, не уменьшая счётчик. Поэтому наибольшее число пересылок за раз — 2²⁸ − 1 вместо 2³² − 1. Биты INCR_READ_REV и INCR_WRITE_REV позволяют уменьшать адрес или увеличивать его через одну пересылку.
Каналы и линии прерываний назначают доменам защиты регистрами SECCFG_CHn и SECCFG_IRQn, таймеры темпа и вычислитель CRC — SECCFG_MISC; встроенный MPU на 8 областей с шагом 32 байта отклоняет пересылки по адресам, к которым у канала нет прав. Исправлены эрраты RP2040-E12 и E13: адреса кольцевых пересылок читаются правильно, а завершения обрыва можно ждать по CHAN_ABORT.
| Экземпляр | Базовый адрес |
|---|---|
| DMA | 0x5000 0000 |
В RP2040 блок DMA устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры DMA RP2040».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| DMA_CHn_READ_ADDR | 0x00 + n · 0x40 | Адрес чтения канала n | 0x0000 0000 |
| DMA_CHn_WRITE_ADDR | 0x04 + n · 0x40 | Адрес записи канала n | 0x0000 0000 |
| DMA_CHn_TRANS_COUNT | 0x08 + n · 0x40 | Режим и число пересылок канала n | 0x0000 0000 |
| DMA_CHn_CTRL_TRIG | 0x0C + n · 0x40 | Управление и состояние канала n; запись запускает канал | 0x0000 0000 |
| DMA_CHn_AL1_CTRL | 0x10 + n · 0x40 | Псевдоним 1: управление канала n | не определено |
| DMA_CHn_AL1_READ_ADDR | 0x14 + n · 0x40 | Псевдоним 1: адрес чтения канала n | не определено |
| DMA_CHn_AL1_WRITE_ADDR | 0x18 + n · 0x40 | Псевдоним 1: адрес записи канала n | не определено |
| DMA_CHn_AL1_TRANS_COUNT_TRIG | 0x1C + n · 0x40 | Псевдоним 1: число пересылок канала n; запись запускает канал | не определено |
| DMA_CHn_AL2_CTRL | 0x20 + n · 0x40 | Псевдоним 2: управление канала n | не определено |
| DMA_CHn_AL2_TRANS_COUNT | 0x24 + n · 0x40 | Псевдоним 2: число пересылок канала n | не определено |
| DMA_CHn_AL2_READ_ADDR | 0x28 + n · 0x40 | Псевдоним 2: адрес чтения канала n | не определено |
| DMA_CHn_AL2_WRITE_ADDR_TRIG | 0x2C + n · 0x40 | Псевдоним 2: адрес записи канала n; запись запускает канал | не определено |
| DMA_CHn_AL3_CTRL | 0x30 + n · 0x40 | Псевдоним 3: управление канала n | не определено |
| DMA_CHn_AL3_WRITE_ADDR | 0x34 + n · 0x40 | Псевдоним 3: адрес записи канала n | не определено |
| DMA_CHn_AL3_TRANS_COUNT | 0x38 + n · 0x40 | Псевдоним 3: число пересылок канала n | не определено |
| DMA_CHn_AL3_READ_ADDR_TRIG | 0x3C + n · 0x40 | Псевдоним 3: адрес чтения канала n; запись запускает канал | не определено |
| DMA_INTR | 0x0400 | Необработанные прерывания каналов; сброс записью 1 | 0x0000 0000 |
| DMA_INTEn | 0x0404 + n · 0x10 | Каналы, которые выставляют прерывание DMA_IRQ_n | 0x0000 0000 |
| DMA_INTFn | 0x0408 + n · 0x10 | Принудительная установка прерываний DMA_IRQ_n | 0x0000 0000 |
| DMA_INTS0 | 0x040C | Прерывания каналов на DMA_IRQ_0; сброс записью 1 | 0x0000 0000 |
| DMA_INTS1 | 0x041C | Прерывания каналов на DMA_IRQ_1; сброс записью 1 | 0x0000 0000 |
| DMA_INTS2 | 0x042C | Прерывания каналов на DMA_IRQ_2; сброс записью 1 | 0x0000 0000 |
| DMA_INTS3 | 0x043C | Прерывания каналов на DMA_IRQ_3; сброс записью 1 | 0x0000 0000 |
| DMA_TIMERn | 0x0440 + n · 0x04 | Таймер темпа n: запросы с частотой clk_sys × X / Y | 0x0000 0000 |
| DMA_MULTI_CHAN_TRIGGER | 0x0450 | Одновременный запуск нескольких каналов | 0x0000 0000 |
| DMA_SNIFF_CTRL | 0x0454 | Управление вычислением контрольной суммы | 0x0000 0000 |
| DMA_SNIFF_DATA | 0x0458 | Начальное значение и результат контрольной суммы | 0x0000 0000 |
| DMA_FIFO_LEVELS | 0x0460 | Заполнение внутренних FIFO адресов и данных | 0x0000 0000 |
| DMA_CHAN_ABORT | 0x0464 | Обрыв пересылок каналов | 0x0000 0000 |
| DMA_N_CHANNELS | 0x0468 | Число каналов контроллера | не определено |
| DMA_SECCFG_CHn | 0x0480 + n · 0x04 | Домен защиты канала n | 0x0000 0003 |
| DMA_SECCFG_IRQn | 0x04C0 + n · 0x04 | Домен защиты линии прерывания n | 0x0000 0003 |
| DMA_SECCFG_MISC | 0x04D0 | Домены защиты таймеров темпа и вычислителя CRC | 0x0000 03FF |
| DMA_MPU_CTRL | 0x0500 | MPU контроллера DMA: управление | 0x0000 0000 |
| DMA_MPU_BARn | 0x0504 + n · 0x08 | MPU: начальный адрес области n | 0x0000 0000 |
| DMA_MPU_LARn | 0x0508 + n · 0x08 | MPU: конечный адрес и атрибуты области n | 0x0000 0000 |
| DMA_CHn_DBG_CTDREQ | 0x0800 + n · 0x40 | Счётчик запросов DREQ канала n | 0x0000 0000 |
| DMA_CHn_DBG_TCR | 0x0804 + n · 0x40 | Перезагружаемое число пересылок канала n | 0x0000 0000 |
DMA_CHn_READ_ADDR — адрес чтения канала n
16 регистров, n = 0…15: смещение 0x00 + n · 0x40, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: DMA_CHn_READ_ADDR_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_WRITE_ADDR — адрес записи канала n
16 регистров, n = 0…15: смещение 0x04 + n · 0x40, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: DMA_CHn_WRITE_ADDR_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_TRANS_COUNT — режим и число пересылок канала n
16 регистров, n = 0…15: смещение 0x08 + n · 0x40, после сброса 0x0000 0000. Макросы pico-sdk: DMA_CHn_TRANS_COUNT_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| MODE | COUNT | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| COUNT | |||||||||||||||
- MODE (биты 31:28, чтение и запись, после сброса 0x0) — Что делать, когда счётчик дошёл до нуля: остановиться, перезапустить канал или не считать вовсе.
Значение Имя в pico-sdk Что значит 0x0 normal Остановиться, как в RP2040 0x1 trigger_self Перезапустить себя и выполнить CHAIN_TO 0xF endless Не уменьшать счётчик — пересылки без конца - COUNT (биты 27:0, чтение и запись, после сброса 0x0000000) — Число пересылок, до 2²⁸ − 1; во время работы — сколько осталось.
DMA_CHn_CTRL_TRIG — управление и состояние канала n; запись запускает канал
16 регистров, n = 0…15: смещение 0x0C + n · 0x40, после сброса 0x0000 0000. Макросы pico-sdk: DMA_CHn_CTRL_TRIG_…
- AHB_ERROR (бит 31, только чтение, после сброса 0x0) — Ошибка шины при чтении или записи; канал останавливается и выставляет прерывание.
- READ_ERROR (бит 30, сброс записью 1, после сброса 0x0) — Ошибка шины при чтении; адрес ошибки — около READ_ADDR; сброс записью 1.
- WRITE_ERROR (бит 29, сброс записью 1, после сброса 0x0) — Ошибка шины при записи; адрес ошибки — около WRITE_ADDR; сброс записью 1.
- BUSY (бит 26, только чтение, после сброса 0x0) — Идёт последовательность пересылок; сброс EN ставит её на паузу, оборвать — через CHAN_ABORT.
- SNIFF_EN (бит 25, чтение и запись, после сброса 0x0) — Учитывать пересылки канала в контрольной сумме.
- BSWAP (бит 24, чтение и запись, после сброса 0x0) — Перестановка байтов: у полуслов меняются два байта, у слов — порядок всех четырёх.
- IRQ_QUIET (бит 23, чтение и запись, после сброса 0x0) — Тихий режим: прерывание не после каждого блока, а когда в регистр-триггер записан ноль — конец цепочки блоков управления.
- TREQ_SEL (биты 22:17, чтение и запись, после сброса 0x00) — Источник запросов, задающий темп: 0x00–0x3A — сигнал DREQ периферии с этим номером, а также таймеры или постоянный запрос.
Значение Имя в pico-sdk Что значит 0x3B timer0 Таймер темпа 0 0x3C timer1 Таймер темпа 1 0x3D timer2 Таймер темпа 2 0x3E timer3 Таймер темпа 3 0x3F permanent Постоянный запрос — пересылки без ожидания - CHAIN_TO (биты 16:13, чтение и запись, после сброса 0x0) — Канал, который запустится после окончания этого; номер самого канала — без цепочки.
- RING_SEL (бит 12, чтение и запись, после сброса 0x0) — К чему применяется кольцевой буфер: 0 — к адресу чтения, 1 — к адресу записи.
- RING_SIZE (биты 11:8, чтение и запись, после сброса 0x0) — Размер кольцевого буфера 2^n байт: меняются только n младших бит адреса; 0 — без кольца, наибольший — 32 768 байт.
Значение Имя в pico-sdk 0x0 ring_none - INCR_WRITE_REV (бит 7, чтение и запись, после сброса 0x0) — При INCR_WRITE = 1 — уменьшать адрес записи; при INCR_WRITE = 0 — увеличивать его на два размера пересылки.
- INCR_WRITE (бит 6, чтение и запись, после сброса 0x0) — Увеличивать адрес записи после каждой пересылки; для записи в периферию обычно 0.
- INCR_READ_REV (бит 5, чтение и запись, после сброса 0x0) — При INCR_READ = 1 — уменьшать адрес чтения; при INCR_READ = 0 — увеличивать его на два размера пересылки.
- INCR_READ (бит 4, чтение и запись, после сброса 0x0) — Увеличивать адрес чтения после каждой пересылки; для чтения из периферии обычно 0.
- DATA_SIZE (биты 3:2, чтение и запись, после сброса 0x0) — Размер пересылки: байт, полуслово или слово; адреса растут на 1, 2 или 4.
Значение Имя в pico-sdk 0x0 size_byte 0x1 size_halfword 0x2 size_word - HIGH_PRIORITY (бит 1, чтение и запись, после сброса 0x0) — Высокий приоритет при выборе канала: в каждом круге сначала все такие каналы, потом один обычный; приоритет на шине не меняется.
- EN (бит 0, чтение и запись, после сброса 0x0) — Включение канала: при 0 запуски игнорируются, а идущая последовательность ставится на паузу.
DMA_CHn_AL1_CTRL — псевдоним 1: управление канала n
16 регистров, n = 0…15: смещение 0x10 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL1_CTRL_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL1_READ_ADDR — псевдоним 1: адрес чтения канала n
16 регистров, n = 0…15: смещение 0x14 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL1_READ_ADDR_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL1_WRITE_ADDR — псевдоним 1: адрес записи канала n
16 регистров, n = 0…15: смещение 0x18 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL1_WRITE_ADDR_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL1_TRANS_COUNT_TRIG — псевдоним 1: число пересылок канала n; запись запускает канал
16 регистров, n = 0…15: смещение 0x1C + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL1_TRANS_COUNT_TRIG_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL2_CTRL — псевдоним 2: управление канала n
16 регистров, n = 0…15: смещение 0x20 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL2_CTRL_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL2_TRANS_COUNT — псевдоним 2: число пересылок канала n
16 регистров, n = 0…15: смещение 0x24 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL2_TRANS_COUNT_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL2_READ_ADDR — псевдоним 2: адрес чтения канала n
16 регистров, n = 0…15: смещение 0x28 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL2_READ_ADDR_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL2_WRITE_ADDR_TRIG — псевдоним 2: адрес записи канала n; запись запускает канал
16 регистров, n = 0…15: смещение 0x2C + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL2_WRITE_ADDR_TRIG_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL3_CTRL — псевдоним 3: управление канала n
16 регистров, n = 0…15: смещение 0x30 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL3_CTRL_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL3_WRITE_ADDR — псевдоним 3: адрес записи канала n
16 регистров, n = 0…15: смещение 0x34 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL3_WRITE_ADDR_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL3_TRANS_COUNT — псевдоним 3: число пересылок канала n
16 регистров, n = 0…15: смещение 0x38 + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL3_TRANS_COUNT_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_CHn_AL3_READ_ADDR_TRIG — псевдоним 3: адрес чтения канала n; запись запускает канал
16 регистров, n = 0…15: смещение 0x3C + n · 0x40, после сброса не определено, чтение и запись. Макросы pico-sdk: DMA_CHn_AL3_READ_ADDR_TRIG_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_INTR — необработанные прерывания каналов; сброс записью 1
Смещение 0x0400, адрес 0x5000 0400, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: DMA_INTR_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_INTEn — каналы, которые выставляют прерывание DMA_IRQ_n
4 регистра, n = 0…3: смещение 0x0404 + n · 0x10, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: DMA_INTEn_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_INTFn — принудительная установка прерываний DMA_IRQ_n
4 регистра, n = 0…3: смещение 0x0408 + n · 0x10, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: DMA_INTFn_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_INTS0 — прерывания каналов на DMA_IRQ_0; сброс записью 1
Смещение 0x040C, адрес 0x5000 040C, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: DMA_INTS0_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_INTS1 — прерывания каналов на DMA_IRQ_1; сброс записью 1
Смещение 0x041C, адрес 0x5000 041C, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: DMA_INTS1_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_INTS2 — прерывания каналов на DMA_IRQ_2; сброс записью 1
Смещение 0x042C, адрес 0x5000 042C, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: DMA_INTS2_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_INTS3 — прерывания каналов на DMA_IRQ_3; сброс записью 1
Смещение 0x043C, адрес 0x5000 043C, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: DMA_INTS3_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_TIMERn — таймер темпа n: запросы с частотой clk_sys × X / Y
4 регистра, n = 0…3: смещение 0x0440 + n · 0x04, после сброса 0x0000 0000. Макросы pico-sdk: DMA_TIMERn_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| X | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Y | |||||||||||||||
- X (биты 31:16, чтение и запись, после сброса 0x0000) — Делимое X дробного таймера.
- Y (биты 15:0, чтение и запись, после сброса 0x0000) — Делитель Y дробного таймера.
DMA_MULTI_CHAN_TRIGGER — одновременный запуск нескольких каналов
Смещение 0x0450, адрес 0x5000 0450, после сброса 0x0000 0000, сбрасывается сам. Макросы pico-sdk: DMA_MULTI_CHAN_TRIGGER_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_SNIFF_CTRL — управление вычислением контрольной суммы
Смещение 0x0454, адрес 0x5000 0454, после сброса 0x0000 0000. Макросы pico-sdk: DMA_SNIFF_CTRL_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | OUT_INV | OUT_REV | BSWAP | CALC | DMACH | EN | |||||||||
- OUT_INV (бит 11, чтение и запись, после сброса 0x0) — Читать результат инвертированным; на сам расчёт не влияет.
- OUT_REV (бит 10, чтение и запись, после сброса 0x0) — Читать результат с обратным порядком бит; на сам расчёт не влияет.
- BSWAP (бит 9, чтение и запись, после сброса 0x0) — Переставлять байты данных перед расчётом; вместе с BSWAP канала их действия взаимно отменяются.
- CALC (биты 8:5, чтение и запись, после сброса 0x0) — Вид контрольной суммы.
Значение Имя в pico-sdk Что значит 0x0 crc32 CRC-32 с полиномом IEEE 802.3 0x1 crc32r CRC-32 с полиномом IEEE 802.3 по данным с обратным порядком бит 0x2 crc16 CRC-16-CCITT 0x3 crc16r CRC-16-CCITT по данным с обратным порядком бит 0xE even Исключающее ИЛИ всех бит: 1, если число единиц нечётное 0xF sum Простая 32-битная сумма - DMACH (биты 4:1, чтение и запись, после сброса 0x0) — Номер канала, пересылки которого учитываются.
- EN (бит 0, чтение и запись, после сброса 0x0) — Включение вычисления контрольной суммы.
DMA_SNIFF_DATA — начальное значение и результат контрольной суммы
Смещение 0x0458, адрес 0x5000 0458, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: DMA_SNIFF_DATA_…
Значение занимает регистр целиком, отдельных полей нет.
DMA_FIFO_LEVELS — заполнение внутренних FIFO адресов и данных
Смещение 0x0460, адрес 0x5000 0460, после сброса 0x0000 0000. Макросы pico-sdk: DMA_FIFO_LEVELS_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | RAF_LVL | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| WAF_LVL | TDF_LVL | ||||||||||||||
- RAF_LVL (биты 23:16, только чтение, после сброса 0x00) — Заполнение FIFO адресов чтения.
- WAF_LVL (биты 15:8, только чтение, после сброса 0x00) — Заполнение FIFO адресов записи.
- TDF_LVL (биты 7:0, только чтение, после сброса 0x00) — Заполнение FIFO данных.
DMA_CHAN_ABORT — обрыв пересылок каналов
Смещение 0x0464, адрес 0x5000 0464, после сброса 0x0000 0000, сбрасывается сам. Макросы pico-sdk: DMA_CHAN_ABORT_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
DMA_N_CHANNELS — число каналов контроллера
Смещение 0x0468, адрес 0x5000 0468, после сброса не определено, только чтение. Макросы pico-sdk: DMA_N_CHANNELS_…
Отдельных полей нет: значение занимает биты 4:0, остальные биты не используются.
DMA_SECCFG_CHn — домен защиты канала n
16 регистров, n = 0…15: смещение 0x0480 + n · 0x04, после сброса 0x0000 0003. Макросы pico-sdk: DMA_SECCFG_CHn_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | LOCK | S | P | ||||||||||||
- LOCK (бит 2, чтение и запись, после сброса 0x0) — Устанавливается сам после первой успешной записи в регистры канала; после этого SECCFG_CHn только читается.
- S (бит 1, чтение и запись, после сброса 0x1) — Канал делает защищённые обращения и управляется только из защищённого режима.
- P (бит 0, чтение и запись, после сброса 0x1) — Канал делает привилегированные обращения и управляется только из привилегированного режима или более защищённого домена.
DMA_SECCFG_IRQn — домен защиты линии прерывания n
4 регистра, n = 0…3: смещение 0x04C0 + n · 0x04, после сброса 0x0000 0003. Макросы pico-sdk: DMA_SECCFG_IRQn_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | S | P | |||||||||||||
- S (бит 1, чтение и запись, после сброса 0x1) — Регистры линии доступны только защищённому коду; при 0 прерывания защищённых каналов на ней скрыты.
- P (бит 0, чтение и запись, после сброса 0x1) — Регистры линии доступны только привилегированному коду; при 0 прерывания привилегированных каналов скрыты.
DMA_SECCFG_MISC — домены защиты таймеров темпа и вычислителя CRC
Смещение 0x04D0, адрес 0x5000 04D0, после сброса 0x0000 03FF. Макросы pico-sdk: DMA_SECCFG_MISC_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TIMER3_S | TIMER3_P | TIMER2_S | TIMER2_P | TIMER1_S | TIMER1_P | TIMER0_S | TIMER0_P | SNIFF_S | SNIFF_P | |||||
- TIMERn_S, n = 0…3 (биты 3, 5, 7, 9; чтение и запись, после сброса 0x1) — Таймер темпа n и его DREQ — только для защищённого кода и каналов.
- TIMERn_P, n = 0…3 (биты 2, 4, 6, 8; чтение и запись, после сброса 0x1) — Таймер темпа n и его DREQ — только для привилегированного кода и каналов.
- SNIFF_S (бит 1, чтение и запись, после сброса 0x1) — Вычислитель CRC видит пересылки защищённых каналов и доступен только защищённому коду.
- SNIFF_P (бит 0, чтение и запись, после сброса 0x1) — Вычислитель CRC видит пересылки привилегированных каналов и доступен только привилегированному коду.
DMA_MPU_CTRL — mPU контроллера DMA: управление
Смещение 0x0500, адрес 0x5000 0500, после сброса 0x0000 0000. Макросы pico-sdk: DMA_MPU_CTRL_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | NS_HIDE_ADDR | S | P | — | |||||||||||
- NS_HIDE_ADDR (бит 3, чтение и запись, после сброса 0x0) — Скрывать адреса областей от незащищённого чтения, чтобы не раскрывать карту SAU.
- S (бит 2, чтение и запись, после сброса 0x0) — Адреса вне областей MPU — защищённые (1) или незащищённые (0).
- P (бит 1, чтение и запись, после сброса 0x0) — Адреса вне областей MPU — привилегированные (1) или нет (0).
DMA_MPU_BARn — mPU: начальный адрес области n
8 регистров, n = 0…7: смещение 0x0504 + n · 0x08, после сброса 0x0000 0000. Макросы pico-sdk: DMA_MPU_BARn_…
- ADDR (биты 31:5, чтение и запись, после сброса 0x0000000) — Биты 31:5 начального адреса области n — шаг 32 байта.
DMA_MPU_LARn — mPU: конечный адрес и атрибуты области n
8 регистров, n = 0…7: смещение 0x0508 + n · 0x08, после сброса 0x0000 0000. Макросы pico-sdk: DMA_MPU_LARn_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| ADDR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ADDR | — | S | P | EN | |||||||||||
- ADDR (биты 31:5, чтение и запись, после сброса 0x0000000) — Биты 31:5 конечного адреса области n, включительно.
- S (бит 2, чтение и запись, после сброса 0x0) — Адреса области — защищённые.
- P (бит 1, чтение и запись, после сброса 0x0) — Адреса области — привилегированные.
- EN (бит 0, чтение и запись, после сброса 0x0) — Включение области; при совпадении нескольких действует область с меньшим номером.
DMA_CHn_DBG_CTDREQ — счётчик запросов DREQ канала n
16 регистров, n = 0…15: смещение 0x0800 + n · 0x40, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: DMA_CHn_DBG_CTDREQ_…
Отдельных полей нет: значение занимает биты 5:0, остальные биты не используются.
DMA_CHn_DBG_TCR — перезагружаемое число пересылок канала n
16 регистров, n = 0…15: смещение 0x0804 + n · 0x40, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: DMA_CHn_DBG_TCR_…
Значение занимает регистр целиком, отдельных полей нет.
Частые вопросы
Как сделать бесконечную пересылку DMA на RP2350?
Запишите в поле MODE регистра CHn_TRANS_COUNT значение 0xF и ненулевое COUNT: счётчик перестанет уменьшаться, и канал будет работать, пока его не остановят. Для кольцевого буфера с прерыванием на каждом круге подходит MODE = 1 — канал перезапускает себя по окончании счёта.
Совместим ли код DMA для RP2040 с RP2350?
Почти: MODE = 0 повторяет поведение RP2040, если за раз пересылается меньше 2²⁸ слов. Но в CHn_CTRL_TRIG часть полей сдвинулась — например, BUSY и TREQ_SEL, — поэтому пользуйтесь макросами pico-sdk, а не номерами бит из RP2040.
Зачем DMA RP2350 собственный MPU?
Чтобы незащищённый канал не мог читать или писать защищённую память: MPU на 8 областей повторяет разметку SAU или PMP процессора для SRAM и XIP. Права на отдельные блоки периферии задаёт не он, а ACCESSCTRL.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.6.10: список регистров, назначение полей, тип доступа и значения после сброса
- 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
- 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
- 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