Узнал, что оказывается, у RP2040 на каждом пине есть программируемые модули ввода-вывода (PIO).
Чтобы узнать, как ими пользоваться, надо разбираться в структуре чипа RP2040.
На первый взгляд ничего сложного:
.
Вложение:
01 RC2040 chip.png [ 123.4 КБ | 160 просмотров ]
.
Начнём с питания.
Питается чип от +3,3 В (в некоторых случаях от +1,8 В), и имеет встроенный регулятор напряжения питания ядра = 1,10 В.
В нормальных условиях ядро питается от 1,05 до 1,16 В, но можно регулировать от 0,85 до 1,30 В с шагом 0,05 В, т.е. возможен разгон
Тактовые генераторы PLL, их два:
- фиксированный на 48 МГц для АЦП и шины USB,
- перестраиваемый до 133 МГц для ядра.
Эти генераторы получают сигнал от VCO - высокочастотного перестраиваемого генератора, который работает на частотах 750...1600 МГц и стабилизирован внешним опорным кварцевым генератором (от 1 до 15 МГц, обычно на 12 МГц).
Для уменьшения дрожания фазы, тактовая частота ядер по умолчанию установлена 125 МГц (133 МГц максимальная).
Но, если поднять питание ядер до 1.15 В, то можно разогнать частоту до 200 МГц.
Ядра, ОЗУ, DMA, шинная матрица (bus fabric)
Матрица позволяет обоим ядрам Cortex-M0+ и контроллеру DMA обращаться к разным банкам памяти SRAM одновременно.
Для четырёх мастеров (ядро 0, ядро 1, DMA чтение, DMA запись), которые могут генерировать адреса обращения, через AHB-Lite Crossbar создаются 4 независимых канала доступа к 10 портам.
Ширина шины 32 бита.
.
Вложение:
02 BUS Fabric.png [ 96.7 КБ | 160 просмотров ]
.
Один из этих портов - AHB-Lite Splitter - может подключить мастера к PIO0, PIO1 или USB.
Вот PIO0 и PIO1 нас интересуют!
Один из блоков PIO:
Вложение:
03 PIO.png [ 90.77 КБ | 159 просмотров ]
.
Каждый блок PIO состоит из 8 буферов, 4 стейт-машин, и мультиплексор пинов (к какому пину какую стейт-машину подключить).
Мастера обращаются к пинам через буферы FIFO. Процессор (или DMA) «кидает» данные в очередь, а стейт-машина PIO забирает их и превращает в электрические сигналы на пинах.
Стейт-машины - это высокоскоростные крошечные процессоры, которые могут выполнять свои программы параллельно основным ядрам Cortex-M0+.
У каждой стейт-машины имеется:
- два 32-разрядных регистра общего назначения (X и Y),
- два 32-битных сдвиговых регистра (ISR и OSR),
- FIFO-буферы (входной и выходной),
- Контроллер управления пинами (Mapping Logic),
- Блок гибкого деления частоты (Clock Divider),
- Счетчик команд (PC - Program Counter).
В каждом блоке (PIO0 и PIO1) есть своя память на 32 инструкции. Эти 32 ячейки делятся между всеми четырьмя стейт-машинами этого блока.
Вы можете загрузить одну программу на 32 инструкции и запустить её на всех четырёх машинах одновременно, либо загрузить четыре разные программы по 8 инструкций для каждой машины.
Стейт-машины и память инструкций работают на частоте системной шины (по умолчанию - 125 МГц), что позволяет считывать и выполнять одну инструкцию за один такт без задержек.
Кстати, у PIO нет АЛУ (арифметико-логического устройства) в привычном понимании — она не умеет складывать или умножать, зато умеет молниеносно двигать биты и проверять условия.