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

Регистры DMA RP2350

Регистры контроллера DMA RP2350: шестнадцать каналов с адресами, счётчиками и управлением, бесконечные и самоперезапускающиеся пересылки, обратный ход адресов, четыре линии прерываний, назначение каналов доменам защиты и собственный блок защиты памяти.

Контроллер 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.

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

В RP2040 блок DMA устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры DMA RP2040».

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

РегистрСмещениеНазначениеПосле сброса
DMA_CHn_READ_ADDR0x00 + n · 0x40Адрес чтения канала n0x0000 0000
DMA_CHn_WRITE_ADDR0x04 + n · 0x40Адрес записи канала n0x0000 0000
DMA_CHn_TRANS_COUNT0x08 + n · 0x40Режим и число пересылок канала n0x0000 0000
DMA_CHn_CTRL_TRIG0x0C + n · 0x40Управление и состояние канала n; запись запускает канал0x0000 0000
DMA_CHn_AL1_CTRL0x10 + n · 0x40Псевдоним 1: управление канала nне определено
DMA_CHn_AL1_READ_ADDR0x14 + n · 0x40Псевдоним 1: адрес чтения канала nне определено
DMA_CHn_AL1_WRITE_ADDR0x18 + n · 0x40Псевдоним 1: адрес записи канала nне определено
DMA_CHn_AL1_TRANS_COUNT_TRIG0x1C + n · 0x40Псевдоним 1: число пересылок канала n; запись запускает каналне определено
DMA_CHn_AL2_CTRL0x20 + n · 0x40Псевдоним 2: управление канала nне определено
DMA_CHn_AL2_TRANS_COUNT0x24 + n · 0x40Псевдоним 2: число пересылок канала nне определено
DMA_CHn_AL2_READ_ADDR0x28 + n · 0x40Псевдоним 2: адрес чтения канала nне определено
DMA_CHn_AL2_WRITE_ADDR_TRIG0x2C + n · 0x40Псевдоним 2: адрес записи канала n; запись запускает каналне определено
DMA_CHn_AL3_CTRL0x30 + n · 0x40Псевдоним 3: управление канала nне определено
DMA_CHn_AL3_WRITE_ADDR0x34 + n · 0x40Псевдоним 3: адрес записи канала nне определено
DMA_CHn_AL3_TRANS_COUNT0x38 + n · 0x40Псевдоним 3: число пересылок канала nне определено
DMA_CHn_AL3_READ_ADDR_TRIG0x3C + n · 0x40Псевдоним 3: адрес чтения канала n; запись запускает каналне определено
DMA_INTR0x0400Необработанные прерывания каналов; сброс записью 10x0000 0000
DMA_INTEn0x0404 + n · 0x10Каналы, которые выставляют прерывание DMA_IRQ_n0x0000 0000
DMA_INTFn0x0408 + n · 0x10Принудительная установка прерываний DMA_IRQ_n0x0000 0000
DMA_INTS00x040CПрерывания каналов на DMA_IRQ_0; сброс записью 10x0000 0000
DMA_INTS10x041CПрерывания каналов на DMA_IRQ_1; сброс записью 10x0000 0000
DMA_INTS20x042CПрерывания каналов на DMA_IRQ_2; сброс записью 10x0000 0000
DMA_INTS30x043CПрерывания каналов на DMA_IRQ_3; сброс записью 10x0000 0000
DMA_TIMERn0x0440 + n · 0x04Таймер темпа n: запросы с частотой clk_sys × X / Y0x0000 0000
DMA_MULTI_CHAN_TRIGGER0x0450Одновременный запуск нескольких каналов0x0000 0000
DMA_SNIFF_CTRL0x0454Управление вычислением контрольной суммы0x0000 0000
DMA_SNIFF_DATA0x0458Начальное значение и результат контрольной суммы0x0000 0000
DMA_FIFO_LEVELS0x0460Заполнение внутренних FIFO адресов и данных0x0000 0000
DMA_CHAN_ABORT0x0464Обрыв пересылок каналов0x0000 0000
DMA_N_CHANNELS0x0468Число каналов контроллеране определено
DMA_SECCFG_CHn0x0480 + n · 0x04Домен защиты канала n0x0000 0003
DMA_SECCFG_IRQn0x04C0 + n · 0x04Домен защиты линии прерывания n0x0000 0003
DMA_SECCFG_MISC0x04D0Домены защиты таймеров темпа и вычислителя CRC0x0000 03FF
DMA_MPU_CTRL0x0500MPU контроллера DMA: управление0x0000 0000
DMA_MPU_BARn0x0504 + n · 0x08MPU: начальный адрес области n0x0000 0000
DMA_MPU_LARn0x0508 + n · 0x08MPU: конечный адрес и атрибуты области n0x0000 0000
DMA_CHn_DBG_CTDREQ0x0800 + n · 0x40Счётчик запросов DREQ канала n0x0000 0000
DMA_CHn_DBG_TCR0x0804 + n · 0x40Перезагружаемое число пересылок канала n0x0000 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_…

31302928272625242322212019181716
MODECOUNT
1514131211109876543210
COUNT
  • MODE (биты 31:28, чтение и запись, после сброса 0x0) — Что делать, когда счётчик дошёл до нуля: остановиться, перезапустить канал или не считать вовсе.
    ЗначениеИмя в pico-sdkЧто значит
    0x0normalОстановиться, как в RP2040
    0x1trigger_selfПерезапустить себя и выполнить CHAIN_TO
    0xFendlessНе уменьшать счётчик — пересылки без конца
  • 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Что значит
    0x3Btimer0Таймер темпа 0
    0x3Ctimer1Таймер темпа 1
    0x3Dtimer2Таймер темпа 2
    0x3Etimer3Таймер темпа 3
    0x3FpermanentПостоянный запрос — пересылки без ожидания
  • CHAIN_TO (биты 16:13, чтение и запись, после сброса 0x0) — Канал, который запустится после окончания этого; номер самого канала — без цепочки.
  • RING_SEL (бит 12, чтение и запись, после сброса 0x0) — К чему применяется кольцевой буфер: 0 — к адресу чтения, 1 — к адресу записи.
  • RING_SIZE (биты 11:8, чтение и запись, после сброса 0x0) — Размер кольцевого буфера 2^n байт: меняются только n младших бит адреса; 0 — без кольца, наибольший — 32 768 байт.
    ЗначениеИмя в pico-sdk
    0x0ring_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
    0x0size_byte
    0x1size_halfword
    0x2size_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_…

31302928272625242322212019181716
X
1514131211109876543210
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_…

1514131211109876543210
—OUT_INVOUT_REVBSWAPCALCDMACHEN
  • OUT_INV (бит 11, чтение и запись, после сброса 0x0) — Читать результат инвертированным; на сам расчёт не влияет.
  • OUT_REV (бит 10, чтение и запись, после сброса 0x0) — Читать результат с обратным порядком бит; на сам расчёт не влияет.
  • BSWAP (бит 9, чтение и запись, после сброса 0x0) — Переставлять байты данных перед расчётом; вместе с BSWAP канала их действия взаимно отменяются.
  • CALC (биты 8:5, чтение и запись, после сброса 0x0) — Вид контрольной суммы.
    ЗначениеИмя в pico-sdkЧто значит
    0x0crc32CRC-32 с полиномом IEEE 802.3
    0x1crc32rCRC-32 с полиномом IEEE 802.3 по данным с обратным порядком бит
    0x2crc16CRC-16-CCITT
    0x3crc16rCRC-16-CCITT по данным с обратным порядком бит
    0xEevenИсключающее ИЛИ всех бит: 1, если число единиц нечётное
    0xFsumПростая 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_…

31302928272625242322212019181716
—RAF_LVL
1514131211109876543210
WAF_LVLTDF_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_…

1514131211109876543210
—LOCKSP
  • 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_…

1514131211109876543210
—SP
  • S (бит 1, чтение и запись, после сброса 0x1) — Регистры линии доступны только защищённому коду; при 0 прерывания защищённых каналов на ней скрыты.
  • P (бит 0, чтение и запись, после сброса 0x1) — Регистры линии доступны только привилегированному коду; при 0 прерывания привилегированных каналов скрыты.

DMA_SECCFG_MISC — домены защиты таймеров темпа и вычислителя CRC

Смещение 0x04D0, адрес 0x5000 04D0, после сброса 0x0000 03FF. Макросы pico-sdk: DMA_SECCFG_MISC_…

1514131211109876543210
—TIMER3_STIMER3_PTIMER2_STIMER2_PTIMER1_STIMER1_PTIMER0_STIMER0_PSNIFF_SSNIFF_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_…

1514131211109876543210
—NS_HIDE_ADDRSP—
  • 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_…

31302928272625242322212019181716
ADDR
1514131211109876543210
ADDR—SPEN
  • 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.

Источники

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

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

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

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